In February I recorded myself playing a rhythm on mandolin, measured the subbeat timings, and
programmed them explicitly into my
rhythm stage
setup. In addition to being slow and annoying, this approach
doesn’t feel fluid. I can imitate one specific mandolin pattern, but
I can’t smoothly vary what I’m doing over time, or perform a new
pattern live.
I decided to try and make my system learn the rhythm from my piano
playing. My system divides the beat into 72 subbeats, so I started by
making counters for each subbeat, incremented whenever I play a note
starting there, and aging slowly over time:
This is essentially a probability distribution over subbeats: how
often have I started a note on each?
I initially thought that this would work well mapped to the volume of
a bass, and it sort of does. The curve is nice, but it ends up
sounding ahead of the beat, like it’s rushing. I think what’s going
wrong is that our brains place the note by when it first becomes
noticeable, and not by the timing of the peak.
Instead we want to look at the notes and find the peak. I thought
about a bunch of ways of processing the distribution to find peaks,
but ended up with something much simpler since I primarily care about
finding the upbeat: use the average timing of the last eight notes
that fell between 3⁄8 and 3⁄4 of the way through the beat. This will
cover everything from a robotic upbeat falling exactly at 1⁄2,
something pushing it a little at ~15/36, something swung at ~5/8,
down to a relaxed jig at ~2/3. Since this doesn’t need many notes to
make a decision, it can follow you smoothly if you start adding a bit
of swing or firm things up some.
The next thing I want to look at is whether this will let me let the
system maintain its idea of the current tempo. Right now I need to
tap every downbeat on a pedal, but instead I could do that for a
little bit to clarify the tempo and then it could follow the piano
from there. This would free up my feet a lot, and be easier on my
knees.
Learning Rhythms
Link post
In February I recorded myself playing a rhythm on mandolin, measured the subbeat timings, and programmed them explicitly into my rhythm stage setup. In addition to being slow and annoying, this approach doesn’t feel fluid. I can imitate one specific mandolin pattern, but I can’t smoothly vary what I’m doing over time, or perform a new pattern live.
I decided to try and make my system learn the rhythm from my piano playing. My system divides the beat into 72 subbeats, so I started by making counters for each subbeat, incremented whenever I play a note starting there, and aging slowly over time:
This is essentially a probability distribution over subbeats: how often have I started a note on each?
I initially thought that this would work well mapped to the volume of a bass, and it sort of does. The curve is nice, but it ends up sounding ahead of the beat, like it’s rushing. I think what’s going wrong is that our brains place the note by when it first becomes noticeable, and not by the timing of the peak.
Instead we want to look at the notes and find the peak. I thought about a bunch of ways of processing the distribution to find peaks, but ended up with something much simpler since I primarily care about finding the upbeat: use the average timing of the last eight notes that fell between 3⁄8 and 3⁄4 of the way through the beat. This will cover everything from a robotic upbeat falling exactly at 1⁄2, something pushing it a little at ~15/36, something swung at ~5/8, down to a relaxed jig at ~2/3. Since this doesn’t need many notes to make a decision, it can follow you smoothly if you start adding a bit of swing or firm things up some.
YouTube Demo
The next thing I want to look at is whether this will let me let the system maintain its idea of the current tempo. Right now I need to tap every downbeat on a pedal, but instead I could do that for a little bit to clarify the tempo and then it could follow the piano from there. This would free up my feet a lot, and be easier on my knees.