doppler — A fast and robust method for approximating sound propagation, achieving convincing Doppler shifts without having to solve equations.
A fast and robust method for approximating sound propagation, achieving convincing Doppler shifts without having to solve equations. The method computes frequency shifts based on reading an input delay line at a delay time computed from the distance between source and mic and the speed of sound. One instance of the opcode is required for each dimension of space through which the sound source moves. If the source sound moves at a constant speed from in front of the microphone, through the microphone, to behind the microphone, then the output will be frequency shifted above the source frequency at a constant frequency while the source approaches, then discontinuously will be shifted below the source frequency at a constant frequency as the source recedes from the microphone. If the source sound moves at a constant speed through a point to one side of the microphone, then the rate of change of position will not be constant, and the familiar Doppler frequency shift typical of a siren or engine approaching and receding along a road beside a listener will be heard.
isoundspeed (optional, default=340.29) -- Speed of sound in meters/second.
ifiltercutoff (optional, default=6) -- Rate of updating the position smoothing filter, in cycles/second.
asource -- Input signal at the sound source.
ksourceposition -- Position of the source sound in meters. The distance between source and mic should not be changed faster than about 3/4 the speed of sound.
kmicposition -- Position of the recording microphone in meters. The distance between source and mic should not be changed faster than about 3/4 the speed of sound.
Here is an example of the doppler opcode. It uses the file doppler.csd.
Example 202. Example of the doppler opcode.
See the sections Real-time Audio and Command Line Flags for more information on using command line flags.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;RT audio out ;-iadc ;;;uncomment -iadc if RT audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o doppler.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 48000 ksmps = 128 nchnls = 2 0dbfs = 1 instr 1 iattack init 0.05 irelease init 0.05 isustain init p3 p3 init iattack + isustain + irelease kdamping linseg 0.0, iattack, 1.0, isustain, 1.0, irelease, 0.0 kmic init 4 ; Position envelope, with a changing rate of change of position. ; transeg a dur ty b dur ty c dur ty d kposition transeg 4, p3*.4, 0, 120, p3*.3, -3, 50, p3*.3, 2, 4 ismoothinghz init 6 ispeedofsound init 340.29 asignal vco2 0.5, 110 aoutput doppler asignal, kposition, kmic, ispeedofsound, ismoothinghz outs aoutput*kdamping, aoutput * kdamping endin </CsInstruments> <CsScore> i1 0.0 20 e1 </CsScore> </CsoundSynthesizer>