125 lines
3 KiB
Text
125 lines
3 KiB
Text
|
#lang scribble/manual
|
||
|
@(require (for-label racket))
|
||
|
|
||
|
@title{Ringz}
|
||
|
Ringing filter.@section{related}
|
||
|
Classes/Formlet, Classes/RHPF, Classes/RLPF, Classes/Resonz
|
||
|
@section{categories}
|
||
|
UGens>Filters>Linear
|
||
|
|
||
|
|
||
|
@section{description}
|
||
|
|
||
|
|
||
|
This is the same as link::Classes/Resonz:: , except that it is a constant skirt gain filter, meaning that the peak gain depends on the value of Q. Also, instead of the
|
||
|
resonance parameter in Resonz, the bandwidth is specified in a 60dB ring decay time. One Ringz is equivalent to one component of the
|
||
|
link::Classes/Klank:: UGen.
|
||
|
|
||
|
|
||
|
@section{classmethods}
|
||
|
|
||
|
|
||
|
@section{method}
|
||
|
ar, kr
|
||
|
|
||
|
@section{argument}
|
||
|
in
|
||
|
|
||
|
The input signal.
|
||
|
|
||
|
|
||
|
@section{argument}
|
||
|
freq
|
||
|
|
||
|
Resonant frequency in Hertz.
|
||
|
|
||
|
|
||
|
@section{argument}
|
||
|
decaytime
|
||
|
|
||
|
The 60 dB decay time of the filter.
|
||
|
|
||
|
|
||
|
@section{argument}
|
||
|
mul
|
||
|
|
||
|
Output will be multiplied by this value.
|
||
|
|
||
|
|
||
|
@section{argument}
|
||
|
add
|
||
|
|
||
|
This value will be added to the output.
|
||
|
|
||
|
|
||
|
@section{Examples}
|
||
|
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
{ Ringz.ar(Dust.ar(3, 0.3), 2000, 2) }.play
|
||
|
|
||
|
{ Ringz.ar(WhiteNoise.ar(0.005), 2000, 0.5) }.play
|
||
|
|
||
|
// modulate frequency
|
||
|
{ Ringz.ar(WhiteNoise.ar(0.005), XLine.kr(100,3000,10), 0.5) }.play
|
||
|
|
||
|
{ Ringz.ar(Impulse.ar(6, 0, 0.3), XLine.kr(100,3000,10), 0.5) }.play
|
||
|
|
||
|
// modulate ring time
|
||
|
{ Ringz.ar(Impulse.ar(6, 0, 0.3), 2000, XLine.kr(4, 0.04, 8)) }.play
|
||
|
|
||
|
// modulate ring time opposite direction
|
||
|
{ Ringz.ar(Impulse.ar(6, 0, 0.3), 2000, XLine.kr(0.04, 4, 8)) }.play
|
||
|
|
||
|
(
|
||
|
{
|
||
|
var exciter;
|
||
|
exciter = WhiteNoise.ar(0.001);
|
||
|
Mix.arFill(10, {
|
||
|
Ringz.ar(exciter,
|
||
|
XLine.kr(exprand(100.0,5000.0), exprand(100.0,5000.0), 20),
|
||
|
0.5)
|
||
|
})
|
||
|
}.play
|
||
|
)
|
||
|
::
|
||
|
|
||
|
]
|
||
|
@section{Section}
|
||
|
Interaction with sample rate
|
||
|
|
||
|
Ringz (and UGens that are based on it: link::Classes/Klank::, link::Classes/DynKlank:: and link::Classes/Formlet::) are "sample-rate independent" with respect to emphasis::impulses:: at the input. That is, given single-sample impulses, the output signal at different sample rates should be the same frequency and amplitude.
|
||
|
|
||
|
This design has a side effect: If the input is not made of impulses, the output amplitude is proportional to the sample rate.
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
(
|
||
|
a = {
|
||
|
// rectangular pulse exciter (deterministic input)
|
||
|
var exc = EnvGen.ar(Env([1, 1, 0], [0.01, 0], \lin)),
|
||
|
sig = Ringz.ar(exc, 440, decaytime: 0.2),
|
||
|
rms = sqrt(Integrator.ar(sig.squared) * (0.2 / SampleRate.ir)),
|
||
|
end = DetectSilence.ar(sig, doneAction: 2);
|
||
|
rms.poll(end);
|
||
|
Silent.ar(1)
|
||
|
}.play;
|
||
|
)
|
||
|
::
|
||
|
|
||
|
At 44.1 kHz, this prints a RMS amplitude of 1.0758. At 88.2 kHz, the amplitude doubles.
|
||
|
|
||
|
Modal synthesis (simulating the vibrating modes of a struck surface) feeds a short, decaying burst of noise into Ringz-style resonators. This is a common use case that emphasis::is:: subject to this amplitude effect.
|
||
|
|
||
|
If you will need the results to be compatible at different sample rates, make sure to scale the volume appropriately: if ]
|
||
|
|
||
|
@racketblock[sig:: is the Ringz, Klank or Formlet signal, use ]
|
||
|
|
||
|
@racketblock[sig * (originalSampleRate / SampleRate.ir):: and substitute the right value in place of ]
|
||
|
|
||
|
@racketblock[originalSampleRate::.
|
||
|
]
|
||
|
|
||
|
|