born Posted January 31 Share Posted January 31 Is there a function with which I can change randomly a defined number of lengths in a list to rests? Thanks, Achim Quote Link to comment Share on other sites More sharing options...
AM Posted January 31 Share Posted January 31 (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)) opmo 1 Quote Link to comment Share on other sites More sharing options...
born Posted January 31 Author Share Posted January 31 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) Quote Link to comment Share on other sites More sharing options...
AM Posted January 31 Share Posted January 31 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 Quote Link to comment Share on other sites More sharing options...
born Posted February 1 Author Share Posted February 1 Sometimes its correct, sometimes not ... Did you tried it with my seed? What was your result? Quote Link to comment Share on other sites More sharing options...
opmo Posted February 1 Share Posted February 1 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. Quote Link to comment Share on other sites More sharing options...
opmo Posted February 1 Share Posted February 1 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). Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.