I wanted to share an implementation of Julian Parker’s digital model of a Ring Modulator. The paper he wrote from DAFx 2011 [1][2] was also used by the BBC Radiophonic Workshop in the “Recreating the sounds of the BBC Radiophonic Workhop using the Web Audio API” [3].
I’ve implemented the ringmodulator as a UDO, available here:
Blue Project and CSD (ringmod.zip)
To run the CSD on the commandline, you can use:
csound -i adc -o dac -b 128 -B 512 ringmod.csd
The Blue project has knobs you can use to adjust the carrier’s amp and frequency. In the generated CSD, you can adjust gk_blue_auto0 for amp and gk_blue_auto1 for frequency, or just modify the poscil line in instr 1.
Note, the paper suggests using a high amount of oversampling (32x; 8x or 16x being reasonable for using sinusoidal carrier). This implementation does not do oversampling, which I believe the BBC version does do not as well.
As far as I’ve checked, the implementation matches the BBC one with the exception of using a limiter instead of a compressor. Also, I did one optimization to the wavetable generation to extract out a constant in the part where v > vl, but this is a minimal optimization as the wavetable generation is done only once really.
- [1] – http://www.acoustics.hut.fi/publications/papers/dafx11-ringmod/
- [2] – http://recherche.ircam.fr/pub/dafx11/Papers/66_e.pdf
- [3] – http://webaudio.prototyping.bbc.co.uk/ring-modulator/
UPDATE (2015-04-07): I found a coding bug in the table generation in the original version I posted. The zip file above has been updated with the corrected code.