Here is something I made over a year ago (!) and have started to revise, polish, and do something proper with:
Forgive the messy patching.
The big picture here is that I have so many oscillator voices whose frequencies are related to a specified fundamental. In this case my fundamental is 200Hz. Every voice’s frequency is either a whole number multiple of 200 (e.g., 200 * 2, 200 * 3, … 200 * n) or 200 divided by a whole number (e.g., 200 / 2, 200 / 3, … 200 / n).
I can turn each voice on or off at will. When a voice is turned on, it will sound at random intervals for random lengths of time. I can specify parameters for roughly how often each voice should sound, but a Poisson Event Generator, courtesy of Acreil (cf. this lecture) handles the actual scheduling. You specify a maximum amount of time to wait between events, a minimum amount of time to wait, and let the algorithm handle the rest, distributing events logarithmically. That event generator looks like this:
Each voice is a type of triangle wave pre-calculated and loaded into an array. In this patch, I’m using a triangle wave generated from sine waves whose respective amplitudes are related to each via phi, the golden ratio, as opposed to the usual way of generating triangle waves from a series of sine waves. I’ll write more about that in another post.
Finally, each voice gets its own reverb, using a simple reverb/echo I built based of the design of the reverb in the Super Nintendo Entertainment System. It looks like this:
There is a lot of tedious hands on performance required in this patch. Next steps will entail designing a more performable interface for this patch, probably using a piece of hardware like the 16n, to facilitate playing. I think I probably ought to think a little more about EQ here, and filtering or limiting some of the harsher high frequencies and rumbly low frequencies. The middle range of the audible spectrum is sounding pretty nice to my ears, though.