# change randomly lengths to rests

## Recommended Posts

Is there a function with which I can change randomly a defined number of lengths in a list to rests?

Thanks, Achim

##### Share on other sites

```(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))```

##### Share on other sites

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)```

##### Share on other sites

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

##### Share on other sites

Sometimes its correct, sometimes not ...

Did you tried it with my seed? What was your result?

##### Share on other sites

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.

##### Share on other sites

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).

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

×   Pasted as rich text.   Paste as plain text instead

Only 75 emoji are allowed.

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
• #### Browser

• Video Gallery

• Lessons