convolve — Convolution based on a uniformly partitioned overlap-save algorithm
Convolution based on a uniformly partitioned overlap-save algorithm. Compared to the convolve opcode, pconvolve has these benefits:
small delay
possible to run in real-time for shorter impulse files
no pre-process analysis pass
can often render faster than convolve
ifilcod -- integer or character-string denoting an impulse response soundfile. Multichannel files are supported, the file must have the same sample-rate as the orc. [Note: cvanal files cannot be used!] Keep in mind that longer files require more calculation time [and probably larger partition sizes and more latency]. At current processor speeds, files longer than a few seconds may not render in real-time.
ipartitionsize (optional, defaults to the output buffersize [-b]) -- the size in samples of each partition of the impulse file. This is the parameter that needs tweaking for best performance depending on the impulse file size. Generally, a small size means smaller latency but more computation time. If you specify a value that is not a power-of-2 the opcode will find the next power-of-2 greater and use that as the actual partition size.
ichannel (optional) -- which channel to use from the impulse response data file.
ain -- input audio signal.
The overall latency of the opcode can be calculated as such [assuming ipartitionsize is a power of 2]
ilatency = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr
Instrument 1 shows an example of real-time convolution.
Instrument 2 shows how to do file-based convolution with a 'look ahead' method to remove all delay.
NOTE | |
---|---|
You can download impulse response files from noisevault.com or replace the filenames with your own impulse files. |
Here is an example of the pconvolve opcode. It uses the file pconvolve.csd.
Example 613. Example of the pconvolve 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 ;;;realtime audio out -iadc ;;;uncomment -iadc if real audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o pconvolve.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 instr 1 kmix = .5 ; Wet/dry mix. Vary as desired. kvol = .05*kmix ; Overall volume level of reverb. May need to adjust ; when wet/dry mix is changed, to avoid clipping. ; do some safety checking to make sure we the parameters a good kmix = (kmix < 0 || kmix > 1 ? .5 : kmix) kvol = (kvol < 0 ? 0 : .5*kvol*kmix) ; size of each convolution partion -- for best performance, this parameter needs to be tweaked ipartitionsize = p4 ; calculate latency of pconvolve opcode idel = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr prints "Convolving with a latency of %f seconds%n", idel ; actual processing al, ar ins ;get live input awetl, awetr pconvolve kvol*(al+ar), "kickroll.wav", ipartitionsize ; Delay dry signal, to align it with the convoled sig adryl delay (1-kmix)*al, idel adryr delay (1-kmix)*al, idel outs adryl+awetl, adryr+awetr endin instr 2 imix = 0.5 ; Wet/dry mix. Vary as desired. ivol = .05*imix ; Overall volume level of reverb. May need to adjust ; when wet/dry mix is changed, to avoid clipping. ipartitionsize = 1024 ; size of each convolution partion idel = (ksmps < ipartitionsize ? ipartitionsize + ksmps : ipartitionsize)/sr ; latency of pconvolve opcode kcount init idel*kr ; since we are using a soundin [instead of ins] we can ; do a kind of "look ahead" by looping during one k-pass ; without output, creating zero-latency loop: asig soundin p4, 0 awetl, awetr pconvolve ivol*(asig),"rv_stereo.wav", ipartitionsize adry delay (1-imix)*asig,idel ; Delay dry signal, to align it with kcount = kcount - 1 if kcount > 0 kgoto loop outs awetl+adry, awetr+adry endin </CsInstruments> <CsScore> i 1 0 20 1024 ;play live for 20 seconds i 2 20 5 "fox.wav" i 2 25 5 "flute.aiff" e </CsScore> </CsoundSynthesizer>