something i've coded...
(defun binary-filter (alist bin-list)
(let ((event-list (cond ((omn-formp alist)
(single-events alist))
(t alist))))
(flatten
(loop
for i in event-list
for j in bin-list
when (= j 1)
collect i
else append (cond ((omn-formp i)
(list (length-invert (car i))))
((lengthp i)
(neg! (omn :length (list i)))))))))
(binary-filter '(q -q -q q) '(0 1 0 1))
=> (-1/4 -q -1/4 q)
(binary-filter '(q q q q -q) '(0 1 0 1 1))
=> (-1/4 q -1/4 q -q)
(binary-filter '(c4 d4 e4 f4) '(1 1 0 1))
=> (c4 d4 f4)
(binary-filter '(q c4 mf d4 e4 e f4 ppp g4 a4 b4) '(1 0 1 1 0 1 1))
=> (q c4 mf -1/4 q e4 mf e f4 ppp -1/8 e a4 ppp e b4 ppp)