Skip to content

diff

Modify a signal by differentiation.

Syntax

ares = diff(asig [, iskip])
kres = diff(ksig [, iskip])
ares diff asig [, iskip]
kres diff ksig [, iskip]

Initialization

iskip (optional, default=0) -- zero clears the saved input at initialization. A non-zero value keeps the previous input.

Performance

diff subtracts the previous input from the current input. It does this once per audio sample or control cycle, and saves the current input for the next step. After a reset, the previous input is zero.

For a sine wave at frequency f, the amplitude gain is 2 * sin(pi * f / sr) at audio rate, or 2 * sin(pi * f / kr) at control rate. The approximation 2 * pi * f / sr applies only at frequencies much lower than sr; use kr for the control-rate form.

integ and diff reverse each other's operations in exact arithmetic. Rounding can prevent exact reconstruction of the input.

Examples

Here is an example of the diff opcode. It uses the file diff.csd.

Example of the diff opcode.
<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 diff.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2
0dbfs = 1

instr 1

asig diskin2 "fox.wav", 1
     outs asig, asig

endin

instr 2 ; with diff

asig diskin2 "fox.wav", 1
ares diff asig
     outs ares, ares

endin

instr 3 ; with integ

asig diskin2 "fox.wav", 1
aint integ asig
aint = aint*.05                 ;way too loud
     outs aint, aint

endin

instr 4 ; with diff and integ

asig diskin2 "fox.wav", 1
ares diff asig
aint integ ares
     outs aint, aint

endin

</CsInstruments>
<CsScore>

i 1 0 1
i 2 1 1
i 3 2 1
i 4 3 1

e

</CsScore>
</CsoundSynthesizer>

See also

Sample Level Operators