A frequency-domain convolution UGen using two linearly interpolated fixed kernels. When a trigger is received, a linear fade will be performed from the previously used kernel (internally stored by the UGen) towards the snapshot of the current kernel content upon receiving the trigger.
The delay caused by the convolution when the kernel is a dirac impulse is equal
to frameSize - controlBlockSize
, so for a frameSize
of 2048 and a
control-block size of 64, this is 1984 sample frames.
'''Note''': If a trigger is received before the previous fade is complete, the interpolation is broken and the kernel instead jumps straight to one of the two buffers.
===Examples===
// three example kernels
def mkBuf(n: Int, amp: => Double): Buffer = {
val v = Vector.tabulate[FillValue](n) { i =>
(i.linLin(0, n, 0, 2048).toInt, amp)
}
val b = Buffer(s)
b.alloc(2048, completion = b.zeroMsg(b.setMsg(v: _*)))
b
}
val b = mkBuf(3, 1)
val c = mkBuf(50, math.random)
val d = mkBuf(20, 1)
val x = play {
val z = Impulse.ar(16)
val buf = "kernel".kr(b.id)
val tr = "trig" .tr
val dur = 4.0 // fade-time in seconds
val n = 2048
val block = SampleRate.ir / n
val p = dur * block // ... in periods
Convolution2L.ar(z, buf, tr, 2048, p) * 0.5
}
x.set("kernel" -> b.id, "trig" -> 1)
x.set("kernel" -> c.id, "trig" -> 1)
x.set("kernel" -> d.id, "trig" -> 1)
x.free(); b.free(); c.free(); d.free()
- See also
- Companion
- class
Type members
Value members
Concrete methods
- Value Params
- fadePeriods
fade duration expressed as number of convolved blocks. If the desired duration in seconds is
dur
, then the number of periods can be calculated asfadePeriods = dur * SampleRate.ir / frameSize
. ''(init-time only)''- frameSize
size of the kernel. this must be a power of two. the FFT calculated internally by the UGen has a size of twice this value. The maximum allowed
frameSize
is 16384. ''(init-time only)''- in
the realtime input to be convolved
- kernel
buffer identifier for the fixed kernel, which may be modulated in combination with the trigger. Even if the trigger input is initially zero, upon UGen initialization the kernel must point to a valid buffer, otherwise the UGen aborts.
- trig
begins a fade to update the kernel on a change from non-positive to positive (<= 0 to >0).