Elliptical filter.
in RTcmix/insts/jg
lowpass:
ellset(passband, stopband, 0, ripple, attenuation)
highpass:
ellset(passband, stopband, 0, ripple, attenuation)
bandpass:
ellset(passbandlow, passbandhigh, stopband, ripple, attenuation)
ELL(outsk, insk, dur, AMP, ringdowndur[, inputchan, PAN])
CAPITALIZED parameters are pfield-enabled for table or dynamic control (see the maketable or makeconnection scorefile commands). Parameters after the [bracket] are optional and default to 0 unless otherwise noted.
ELL has one subcommand (ellset) used to configure the filter.
ellset
For lowpass filter:
Param Field | Parameter | Units | Dynamic | Optional | Notes |
---|---|---|---|---|---|
p0 | passband cutoff | Hz | no | no | < stopband |
p1 | stopband cutoff | Hz | no | no | |
p2 | 0 | - | no | no | |
p3 | ripple | db | no | no | try 0.2 |
p4 | attenuation at stopband | db | no | no | try 90 for a steep filter |
For hipass filter:
Param Field | Parameter | Units | Dynamic | Optional | Notes |
---|---|---|---|---|---|
p0 | passband cutoff | Hz | no | no | > stopband |
p1 | stopband cutoff | Hz | no | no | |
p2 | 0 | - | no | no | |
p3 | ripple | db | no | no | try 0.2 |
p4 | attenuation at stopband | db | no | no | try 90 for a steep filter |
For bandpass filter:
Param Field | Parameter | Units | Dynamic | Optional | Notes |
---|---|---|---|---|---|
p0 | lower passband cutoff | Hz | no | no | |
p1 | higher passband cutoff | Hz | no | no | |
p2 | stopband cutoff, either higher or lower | Hz | no | no | higher seems more reliable |
p3 | ripple | db | no | no | try 0.2 |
p4 | attenuation at stopband | db | no | no | try 90 for a steep filter |
ELL
Param Field | Parameter | Units | Dynamic | Optional | Notes |
---|---|---|---|---|---|
p0 | output start time | seconds | no | no | |
p1 | input start time | seconds | no | no | |
p2 | duration | seconds | no | no | |
p3 | amplitude multiplier | relative multiplier of input signal | yes | no | |
p4 | ring-down duration | seconds | no | no | |
p5 | input channel | - | no | yes | default: 0 |
p6 | pan | 0-1 stereo; 0.5 is middle | yes | yes | default: 0 |
Parameters labled as Dynamic can receive dynamic updates from a table or real-time control source.
Author: Adapted by John Gibson from the original Cmix instrument. Thanks to Alistair Riddell and Ross Bencina for eliminating the f2c dependency
ELL implements cascaded IIR filters and a built-in elliptical filter design program. It can create filters with very steep slopes.
The ellset subcommand is used to design the kind of filter implemented by ELL. Depending on how the first three parameters are configured, ELL will do lowpass, hipass or bandpass filtering. The filters designed by ellset can have very steep cutoff slopes.
The “ripple” parameter (p3 of the ellset subcommand) controls the amount of ringing in the filter. A small ripple designs the filter to minimize ringing, whereas a large ripple (c. 20db) causes the filter to ring very noticeably. A large ripple can sound good with a tight bandpass, producing a fairly clear pitch.
The “ringdowndur” parameter (p4 of ELL) will add an amount in seconds to the duration of the note to allow this ringing to fade.
The “attenuation” (p4 of the ellset subcommand) determines how much suppression of the signal outside the passband will occur.
The filter design program (invoked by ellset) sometimes can’t fulfill the design criteria – a particular combination of cutoff freqs, ripple and attenuation. If this happens, the program will die with a “Filter design failed!” message, instead of running the job. If you ask for a very steep cutoff and very little ripple, you may see this.
ELL can produce both mono and stereo output
very basic:
rtsetparams(44100, 2)
load("ELL")
rtinput("mysound.aif")
outskip = 0
inskip = 0
endin = DUR()
dur = endin - inskip
amp = 0.9
ringdur = 0.1
p0 | 1600 | - | no | no |
p1 | 9000 | - | no | no |
p2 | 0 | - | no | no |
ripple = 0.1
attenuation = 90.0
ellset(p0, p1, p2, ripple, attenuation)
ELL(outskip, inskip, dur, amp, ringdur)
another one:
rtsetparams(44100, 2)
load("STEREO")
load("ELL")
rtinput("mysound.aif")
inchan = 0
inskip = 0
dur = DUR()
//----------------------------------------------
// unprocessed signal
amp = 2
STEREO(start=0, inskip, dur, amp, pan=.5)
//----------------------------------------------
// low-pass filter
pbcut = 400
sbcut = 800
ripple = .1
atten = 90
ellset(pbcut, sbcut, 0, ripple, atten)
amp = 8
ringdur = .1
ELL(start=dur+1, inskip, dur, amp, ringdur, inchan, pan=.5)
//----------------------------------------------
// high-pass filter
pbcut = 800
sbcut = 400
ripple = .1
atten = 90
ellset(pbcut, sbcut, 0, ripple, atten)
amp = 1.6
ringdur = .1
ELL(start=start+dur+1, inskip, dur, amp, ringdur, inchan, pan=.5)
slightly more advanced:
rtsetparams(44100, 2)
load("ELL")
rtinput("mysound.aif")
outskip = 0
inskip = 0
dur = DUR()
ringdur = 3
p0 = 500
p1 = 2000
p2 = 5000
ripple = 45.0
attenuation = 90.0
srand(29467)
amp = 0.05
numbeats = 10
bpm = 100
notesperbeat = 4
tempo(0, bpm * notesperbeat)
numnotes = numbeats * notesperbeat
for (i = 0; i < numnotes; i = i + 1) {
p0 = p0 + (rand() * 20)
p1 = p1 + (rand() * 20)
p2 = p2 + (rand() * 20)
ripple = ripple + (rand() * 5)
ellset(p0, p1, p2, ripple, attenuation)
spread = random()
outskip = tb(i)
ELL(outskip, inskip, dur, amp * random(), ringdur, inchan=0, spread)
}
fun stuff!
rtsetparams(44100, 2)
load("ELL")
rtinput("mysound.aif")
inchan = 0
inskip = 0
dur = DUR()
ripple = 20
atten = 90
ringdur = .2
env = maketable("line", 1000, 0,0, .01,1, dur/2,1, dur,0)
srand(9)
for (start = 0; start < 15; start = start + .12) {
pbcut = 400 + (rand() * 200)
sbcut = 900 + (rand() * 200)
ellset(pbcut, sbcut, 0, ripple, atten)
amp = .2
pan = random()
st = start + (random() * .01)
ELL(st, inskip, dur, amp * env, ringdur, inchan, pan)
pbcut = 900 + (rand() * 200)
sbcut = 400 + (rand() * 200)
ellset(pbcut, sbcut, 0, ripple, atten)
amp = .1
pan = random()
st = start + (random() * .01)
ELL(st, inskip, dur, amp * env, ringdur, inchan, pan)
}
BUTTER, EQ, FIR, FILTSWEEP, FILTERBANK, FOLLOWBUTTER, IIR, JFIR, MOOGVCF, MULTEQ, SPECTEQ, SPECTEQ2