Posted January 31, 20232 yr Is there a function with which I can change randomly a defined number of lengths in a list to rests? Thanks, Achim
January 31, 20232 yr (setf alist '(1/4 1/4 1/8 1/8 1/4 1/4)) (setf n 3) (length-invert '(1/4 1/4 1/8 1/8 1/4 1/4) :section (rnd-sample n (gen-integer 0 (1- (length alist))) :norep t))
January 31, 20232 yr Author Something like this: (defparameter durations '(15/16 15/32 1/32 1/32 1/32 61/32 1/32 1/2 1/32 5/32 1/32 13/16 17/32 3/2 9/16 7/16)) (defun length-to-rnd-rest (numb dur-lst) (let* ((llst (- (length dur-lst) 1)) (minnumb (min numb llst)) (posns (sort-asc (rnd-unique minnumb (gen-integer 0 llst))))) (loop for i in dur-lst for j from 0 collect (if (member j posns) (* -1 i) i )))) (length-to-rnd-rest 5 durations) I get only 4 rests in this example: (defparameter durations '(15/16 15/32 1/32 1/32 1/32 61/32 1/32 1/2 1/32 5/32 1/32 13/16 17/32 3/2 9/16 7/16)) (length-invert durations :section (rnd-sample 5 (gen-integer 0 (1- (length durations))) :norep t :seed 4)) ;; => (15/16 15/32 1/32 1/32 1/32 61/32 1/32 1/2 -5/32 -13/16 1/32 -9/16 17/32 3/2 -1/32 7/16)
January 31, 20232 yr test/evaluate it again... my output is => (-15/16 15/32 1/32 1/32 1/32 61/32 1/32 1/2 1/32 -5/32 -1/32 13/16 -17/32 3/2 9/16 -7/16) so it's correct
February 1, 20232 yr Author Sometimes its correct, sometimes not ... Did you tried it with my seed? What was your result?
February 1, 20232 yr The seed is not part of the function therefore it will return different output each time. Check the rnd-seed doc for how to apply seed function into your functions.
February 1, 20232 yr Here it is: (defun length-to-rnd-rest (n sequence &key seed) (let (state) (setf state *init-seed*) (setf seed (rnd-seed seed)) (do-verbose ("length-to-rnd-rest :seed ~s" seed) (let* ((len (length sequence)) (sel (rnd-order (append (gen-repeat n t) (gen-repeat (- len n) nil)) :seed (seed))) (result (loop for i in sel for j in sequence collect (if (null i) j (* j -1))))) (init-state state) result)))) (setf lengths '(15/16 15/32 1/32 1/32 1/32 61/32 1/32 1/2 1/32 5/32 1/32 13/16 17/32 3/2 9/16 7/16)) (length-to-rnd-rest 5 lengths) => (15/16 15/32 1/32 -1/32 1/32 61/32 1/32 -1/2 -1/32 -5/32 1/32 -13/16 17/32 3/2 9/16 7/16) (length-to-rnd-rest 5 lengths :seed 5) => (15/16 -15/32 1/32 1/32 1/32 61/32 1/32 -1/2 1/32 -5/32 1/32 13/16 -17/32 -3/2 9/16 7/16) I could make something more useful with steps, omitting existing rests and of course working with length symbols and events (omn).
Create an account or sign in to comment