Hi,
I have been thinking about random pattern generation since quite a while (and also did some coding ). SP does provide a whole bunch of options. I especially favor the (active) use of
random_seed
because it introduces a way to let SP create patterns, decide what should stay and be used (let’s say for a current session) or what you would like to discard.
The moment I began to realize the potential of this feature (= let SP invent on the fly and use these random generations in a controlled/repeatable way) was a Patreon video session Sam gave on the topic ‘randomness in SP’ a while ago.
To start a discussion about that I created a little sketch involving a function which sort of generically makes use of this idea as well as a small ambient example to demonstrate a possible use case:
# Pattern Generator
# Generate a random pattern based on proveded seed
# @param ptn_len integer: number of pattern items
# @param pool list: notes; time, amp or other values
# @seed seed integer: random seed value
# @param downbeat list: leave downbeat empty or e. g. [4, :r]
# fill in 1st and every 4th item with pause
define :generate_ptn do | ptn_len, pool, seed, downbeat=nil |
ptn = []
use_random_seed seed
ptn_len.times do | i |
if downbeat
if i % downbeat[0] != 0
ptn.push(pool.choose)
else
ptn.push(downbeat[1])
end
else
ptn.push(pool.choose)
end
end
return ptn
end
live_loop :clock do
sleep 4
end
live_loop :kick, sync: :clock do
sample :bd_ada
sleep 1
end
live_loop :ambi, sync: :clock do
amp = generate_ptn(16, [0, 0.25, 0.5, 0.75, 1], 27988, [2, 0])
cursor = generate_ptn(16, [0.5, 0.75, 0.25], 18898)
with_fx :reverb do
sample :guit_harmonics, amp: amp.tick, start: cursor.look, finish: cursor.look * -1
end
sleep 0.25
end
live_loop :background, sync: :clock do
with_fx :reverb, room: 1 do
sample :guit_e_fifths, amp: 0.25, attack: 2, release: [2, 4].choose, rpitch: [0.25, 0, 0, -0.25].choose
end
sleep 2
end
The following example explores this idea to generate a syncopating kick drum and join some found patterns in order to get a longer sequence (ticking through a ring of seeds
):
# Pattern Generator
# Generate a random pattern based on proveded seed
# @param ptn_len integer: number of pattern items
# @param pool list: notes; time, amp or other values
# @seed seed integer: random seed value
# @param downbeat list: leave downbeat empty or e. g. [4, :r]
# fill in 1st and every 4th item with pause
define :generate_ptn do | ptn_len, pool, seed, downbeat=nil |
ptn = []
use_random_seed seed
ptn_len.times do | i |
if downbeat
if i % downbeat[0] != 0
ptn.push(pool.choose)
else
ptn.push(downbeat[1])
end
else
ptn.push(pool.choose)
end
end
return ptn
end
use_bpm 120
live_loop :clock do
sleep 4
end
live_loop :kick, sync: :clock do
#stop
sample :bd_ada
sleep 1
end
live_loop :syncopating_kick, sync: :clock do
amp = generate_ptn(16, [0, 0, 0, 0, 0.125, 0.25], (ring 1, 2, 345, 289).tick, [4, 0])
16.times do
sample :bd_ada, amp: amp.tick(:kick)
sleep 0.25
end
end
What are your ideas about that?