Recently there has been some interest within the VCV community about Risset Rhythms - something I had never heard of before. They are a compositional technique that gives the illusion of a constantly accelerating or decelerating rhythm, very similar to a Shepard tone, or Shepard scale, or Risset - Shepard glissando.
There is a decent Wikipedia article about Shepard tones that includes the following example of a Risset rhythm - the best and most musical example I have been able to find.
So I decided to take a stab at creating a Risset rhythm within VCV Rack, and I will share what I have discovered so far.
The Shepard tone and Risset rhythm are closely aligned, one involves looped rising (or falling) pitch, the other accelerating (or decelerating) tempo. Think of a rising or falling ramp wave to represent the pitch or tempo. Both have two or more voices that are out of phase with each other, with each voice fading out around the discontinuity of the ramp wave, so that both extremes of the loop fade away. When one voice is silent, there is always another voice in the middle of the ramp that is full volume. The pitch/tempo extremes fade in/out, and your brain perceives the louder section of each voice constantly and smoothly changing in one direction.
Both Risset rhythm and Shepard tone keep the parallel voices at octave intervals.
Remember that there is a close relationship between rhythm and harmony. For example, polyrhythms become harmonic chords when sped up to audio rates. So I think it intuitively makes sense that the underlying mechanism behind a Shepard tone and Risset rhythm is the same.
So my first goal was to create a Shepard tone (actually a Risset-Shepard Glissando). This is by far the simplest construct because we donāt have to worry about the relative phase of the polyphonic VCO voices. We only have to worry about the phases of the LFO ramp waves driving pitch and the sine/triangle waves driving the VCA.
The Count Modula Shepard Generator works great, but it is limited to rising tones. Also the Count Modula module uses a triangle wave for the VCA envelopes, whereas I think most implementations use either a Bell curve or a sine wave (actually cosine).
The Count Modula module provides the saw and unipolar triangle waves at multiple phase intervals, and for each pair, the triangle is -90 degrees (+270) out of phase with the saw so that the low (0) point of the triangle corresponds to the saw wave discontinutity.
I found that a pair of Bogaudio 4 FO LFOs can easily do the same as long as you sync them using the RESET input. I chose the 4 FO because I only wanted four voices, but if you want 8 voices you can use the 8 FO instead. The Bogaudio modules give you the option of a rising or falling ramp, as well as sine or triangle for the VCA. It was just a bit confusing getting the right ramp/sine phase relationships until I got used to it.
I offset the VCA (sine or triangle) LFO so that it goes from 0 to 10. For the ramp I used a 40% scale and offset by 2V so that it goes from 0 to 4, and each voice is effectively 1 octave apart from its +/- 90 degree phase neighbor at any given time.
Here is the result. Within the video, roughly 1/4 of the time is spent on each waveform combination. It starts out with a rising pitch ramp and sine VCA envelope. It then switches to rising ramp and triangle. Then falling ramp and triangle, and then finally falling ramp and sine. The difference between triangle and sine is subtle, but definitely audible.
Risset Shepard Glissando.vcv (1.8 KB)
Next I tackled creating a Risset rhythm using 3 drum voices playing 1/4 (kick), 1/8 (higher tom), and 1/16 (closed hat) notes that accelerate or decelerate. The intent is for your brain to transition concentration from one voice to the next over time. Say for the accelerating case, you might here the 1/4 kick accelerating, and as it fades out and the next voice fades in, the 1/8 tom should be at the same tempo as the fading out kick. Likewise as the 1/8 fades out, it aligns with the next 1/16 fading in. It doesnāt work out exactly like that, but I still think it is effective.
So the ramp drives an LFO functioning as a 1/16 note clock. The clock is subdivided by flip flops to provide 1/8 and 1/4 note pulses as well. The main problem I have not solved is how to set the frequency of the ramp in relationship to the starting frequency of the LFO clock such that every ramp cycle corresponds to the LFO clock starting on a down beat. I have not achieved that, and I think it takes some basic calculus to figure it out (Iām going to guess differential equations, but Iām not sure).
It has been many decades since I worked with calculus, so I punted, and instead decided to reset each LFO clock voice when the ramp rolls over and the voice is silent. In this way the rhythms should be consistent, and the reset glitch will not be heard.
I use a Bogaudio CMP with input B one sample behind input A. It generates a reset trigger whenever the B and A differ by 1 V, which coincides with the end of cycle that I want. And this technique works equally well with rising and falling ramps.
Here is the Risset rhythm drumming result. Again, each waveform combination gets roughly 1/4 of the video time, in the same sequence as before.
Risset Rhythm Drums.vcv (2.9 KB)
Lastly I attempted a melodic Risset rhythm. I opted to use two melodic lines, one a high pitch using 1/8 notes, and the other a bass line using mostly 1/4 notes. Each line has two voices 180 degrees out of phase, and the melodic lines are 90 degrees out of phase. I ended up using two VCAs for each voice, first applying the broad Risset sine or triangle envelope, and then applying an AD envelope for each note. Iām sure I could have combined signals and used one VCA per voice, but I like being able to monitor the two envelopes separately.
I chose to use a pentatonic D minor scale so that overlapping notes would always be harmonious.
Risset Rhythm Melody.vcv (4.5 KB)
All in all, Iām very happy with the results - I definitely get the illusion of constant acceleration or deceleration. But the examples are not particularly interesting or satisfying in a musical sense. They really just demonstrate the concepts.
I encourage others to take a stab at creating their own Risset rhythms, and posting the results here.
You could use one of my patches as a starting point, or come up with your own patch from scratch.
I would love to hear a more musical example implemented in VCV Rack.
I would also love to see an implementation that does not require a clock reset every time the ramp completes a cycle.