Off and on with different coded music environments (SC, Overtone and SP) I’ve enjoyed the challenge of unrolling time linearly whilst from my music background I treat time more as a constraint satisfaction problem with recursive subdivisions: however many notes might be in the fill, you still have to nail the downbeat on the next measure, etc, and when I’m playing a physical instrument, I either feel the downbeat coming and hit or I don’t and miss. With SP, I always calculating times which correspond to the layout in time.
This reminds me of the GUI layout problem: in old school GUI toolkits you have to figure out absolute positions in pixels by hand, while with something Qt you specify the layout as a tree and the toolkit figures out the mapping to pixels.
Not to knock the nice surprises that come from letting go of the downbeat but I wanted to try to get closer to how I feel time when playing e.g. jazz bass or percussion, and I was trying to find techniques to express something like a variable fill or ornamentation (with some probability) without having to explicitly compute the time intervals or worry about missing the downbeat:
The only thing I’ve come up with is to express note probabilities over the measure (or interval of interest, like a 4 measure line) and then evaluate the probability at every grid point. Since the probability can be expressed as a set of basis functions, one can choose radial basis functions or Fourier series to do different things. Here’s an example with just two basis functions (cosines)
use_bpm 90
nt = 16
live_loop :perc do
sample :bd_fat
nt.times do
t = tick/(1.0*nt)
b1 = Math.cos(t*8*6.28)
b2 = -Math.cos(t*6.28)
prob = Math.sqrt(Math.exp(b1 + b2))
sample :drum_cymbal_closed, amp: prob if prob > rrand(0.5,1.5)
sleep 0.125
end
end
I could imagine other algorithms based on trees or something more interesting, so I’d thought I’d ask around… any other cool ideas?
edit disclosure, I chose the basis functions using python snippet & plot like this: