p-fields:
/* SPECTEQ - FFT-based EQ
p0 = output start time
p1 = input start time
p2 = input duration
p3 = amplitude multiplier
p4 = ring-down duration (can set to 0)
p5 = FFT length (power of 2, usually 1024)
p6 = window length (power of 2, usually FFT length * 2)
p7 = window type (0: Hamming; see below for others)
p8 = overlap - how much FFT windows overlap (any power of 2)
1: no overlap, 2: hopsize=FFTlen/2, 4: hopsize=FFTlen/4, etc.
2 or 4 is usually fine; 1 is fluttery; the higher the more CPU time
p9 = input channel [optional, default is 0]
p10 = percent to left channel [optional, default is .5]
The following function tables control amplitude.
Function table 1 is the input amplitude, spanning just the input
duration.
Function table 2 is the output amplitude, spanning the entire
note, including ring-down duration.
Function table 3 is the EQ table (i.e., amplitude scaling of each band),
in dB (0 dB means no change, + dB boost, - dB cut).
NOTES:
p7 - window type:
0: Hamming, 1: Hanning, 2: Rectangle, 3: Triangle, 4: Blackman,
5: Kaiser
When in doubt, use Hamming.
p8 - overlap:
1: no overlap, 2: hopsize=FFTlen/2, 4: hopsize=FFTlen/4, etc.
2 or 4 is usually fine; 1 is fluttery; higher overlaps use more CPU.
Also possible to use negative powers of 2, e.g., .5, .25, .125, etc.
This leaves a gap between successive FFTs, creating ugly robotic
effects -- beware of clipping.
Sample scorefile:
sr = 44100
nyquist = sr / 2
rtsetparams(sr, 2)
load("SPECTEQ")
/* ftp://presto.music.virginia.edu/pub/rtcmix/snd/ah.snd */
rtinput("/snd/Public_Sounds/vccm_old/ah.snd")
inchan = 0
inskip = .4
indur = 2
ringdur = 0
amp = 15
fftlen = 1024 /* yielding 512 frequency bands */
winlen = fftlen * 2 /* the standard window length is twice FFT size */
overlap = 2 /* 2 hops per fftlen (4 per window) */
wintype = 0 /* use Hamming window */
/* input envelope (covering ) */
makegen(1, 18, 1000, 0,0, 1,1, 19,1, 20,0)
/* output envelope (covering + ) */
copygen(2, 1)
/* EQ curve: -90 dB at 0 Hz, ramping up to -10 dB at 400 Hz, etc. */
makegen(3, 18, nyquist/10,
0, -90,
300, -90,
400, -10,
800, -20,
1000, -90,
2000, -90,
5000, 0,
nyquist, -40)
//fplot(3, 5, "with lines")
/* do it for the left chan! */
start = 0
SPECTEQ(start, inskip, indur, amp, ringdur, fftlen, winlen, wintype, overlap,
inchan, pctleft=1)
/* do it for the right chan! */
SPECTEQ(start, inskip, indur, amp, ringdur, fftlen, winlen, wintype, overlap,
inchan, pctleft=0)