denorm — Mixes low level noise to a list of a-rate signals
Mixes low level (~1e-20 for floats, and ~1e-56 for doubles) noise to a list of a-rate signals. Can be used before IIR filters and reverbs to avoid denormalized numbers which may otherwise result in significantly increased CPU usage.
a1[, a2[, a3[, ... ]]] -- signals to mix noise with
Some processor architectures (particularly Pentium IVs) are very slow at processing extremely small numbers. These small numbers can appear as a result of some decaying feedback process like reverb and IIR filters. Low level noise can be added so that very small numbers are never reached, and they are 'absorbed' by this 'noise floor'.
If CPU usage goes to 100% at the end of reverb tails, or you get audio glitches in processes that should not use too much CPU, using denorm before the culprit opcode or process might solve the problem.
Here is an example of the denorm opcode. It uses the file denorm.csd.
Example 232. Example of the denorm 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 denorm.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> ; slightly simplified example from Istvan Varga 2006 sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 garvb init 0 instr 1 a1 oscils 0.6, 440, 0 a2 linsegr 0, 0.005, 1, 3600, 1, 0.08, 0 a1 = a1 * a2 vincr garvb, a1 outs a1, a1 endin instr 99 ;"Always on" denorm garvb aL, aR reverbsc garvb * 0.5, garvb * 0.5, 0.92, 10000 clear garvb outs aL, aR endin </CsInstruments> <CsScore> i 99 0 -1 ;held by a negative p3, means "always on" i 1 0 0.5 i 1 4 0.5 e 8 ;8 extra seconds after the performance </CsScore> </CsoundSynthesizer>