Channel vocoder.
in RTcmix/insts/jg
VOCODE3(outsk, insk, dur, AMP, MODCFREQS, CARCFREQS, BANDMAP, CAMPSCALE, MODCFTRANSP, CARCFTRANSP, MODFILTQ, CARFILTQ[, FILTRESPONSE, HOLD, 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.
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 output signal | yes | no | |
p4 | table of modulator center frequencies | reference to pfield table-handle (Hz or linear octaves) | yes | no | |
p5 | table of carrier center frequencies | reference to pfield table-handle (Hz or linear octaves) | yes | no | |
p6 | table mapping modulator to carrier filter bands | reference to pfield table-handle (0 == no mapping) | yes | no | |
p7 | carrier amplitude scaling table | reference to pfield table-handle (0 == no mapping) | yes | no | |
p8 | transposition of modulator center frequencies | linear octaves | yes | no | |
p9 | transposition of carrier center frequencies | linear octaves | yes | no | |
p10 | modulator filter Q | i.e., cf / bandwidth in Hz | yes | no | |
p11 | carrier filter Q | - | yes | no | |
p12 | filter response time | seconds | yes | yes | default: 0.01 |
p13 | hold | 0: normal, 1: modulator is disengaged and has no further effect on the carrier | yes | yes | default: 0 |
p14 | pan | 0-1 stereo; 0.5 is middle | yes | yes | default: 0.5 |
Parameters labled as Dynamic can receive dynamic updates from a table or real-time control source.
Author: John Gibson, 6/3/02
VOCODE3 performs a filter-bank analysis of the right input channel (the modulator), and uses the time-varying energy measured in the filter bands to control a corresponding filter bank that processes the left input channel (the carrier). You can configure independently the two filter banks, and you can map modulator bands to carrier bands freely.
The carrier/modulator approach used in VOCODE3 is highly similar to the scheme used in the older VOCODE2 instrument as well as the amplitude-envelope following instrument FOLLOWER. Currently in RTcmix it’s not possible for an instrument to take input from both an “in” bus and an “aux in” bus at the same time. So, for example, if you want the modulator to come from a microphone, which must enter via an “in” bus, and the carrier to come from a WAVETABLE instrument via an “aux” bus, then you must route the mic into the MIX instrument as a way to convert it from “in” to “aux in”. If you want the carrier to come from a file, then it must first go through MIX (or some other instrument) to send it into an aux bus. Since the instrument is usually taking input from an aux bus, the input start time for this instrument must be zero. The only exception would be if you’re taking the carrier and modulator signals from the left and right channels of the same sound file.
The “left” input channel comes from the bus with the lower number; the “right” input channel from the bus with the higher number.
This instrument is similar in some respects to PVOC, but it is a channel vocoder using a bank of band-pass filters instead of an FFT analysis (like with phase vocoders). This kind of instrument was originally designed for cross-synthesis work, but a wide range of effects are possible.
Parameters p4 (“MODCFREQS”) and p5 (“CARCFREQS”) are pfield references to tables giving center frequencies for the bandpass filters. The tables must be the same size; the size determines the number of filters. You can pass the same table to both pfields. Try using the “literal” variant of maketable to create the tables.
The table mapping modulator to carrier filter bands (p6, “BANDMAP”) must be the same size as the two center frequency tables. The indices of the table represent modulator bands; the values of the table represent carrier bands. So a table of { 2, 3, 0, 1 } connects the 0th modulator band to the 2nd carrier band, the 1st mod. to the 3rd carrier, the 2nd modulator to the 0th carrier, and the 3rd modulator to the 1st carrier. Note that more than one modulator band may map to the same carrier band, and that (in this case) a carrier band may have no modulator input. Use “0” to get the default linear mapping: 0->0, 1->1, 2->2, 3->3, etc
The carrier amplitude scaling table (p7, “CAMPSCALE”) must be the same size as the table of carrier center frequencies. Each element is a linear amplitude scaling factor applied to the corresponding carrier band output.
Parameters p8 (“MODCFTRANSP”) and p9 (“CARCFTRANSP”) transpose the modulator center frequencies and the carrier center frequencies respectively. This is specified using linear octaves (see the format conversion routines for scorefile conversion to different pitch specifiers).
p10 (“MODFILTQ”) and p11 (“CARFILTQ”) control the ‘sharpness’ of the filter bands used for the modulator and the carrier.
The output of VOCODE3 can be either mono or stereo.
one example:
rtsetparams(44100, 2, 256)
load("VOCODE3")
// CPU load: c. 70% running as root (without COMPLIMIT)
// with Obalance, it's 40% !! Must be conversion to floats and inline next()
totdur = 60
rtinput("mysound.wav")
rtinput("mysound2.aiff")
// modulator
bus_config("MIX", "in 0", "aux 1 out")
dur = DUR()
amp = 1
for (st = 0; st < totdur; st += dur)
MIX(st, 0, dur, amp, 0)
totdur = st
// carrier
noise = 0
if (noise) {
load("NOISE")
load("EQ")
bus_config("NOISE", "aux 2 out")
bus_config("EQ", "aux 2 in", "aux 0 out")
amp = 15000
NOISE(0, totdur, amp, 0)
EQ(0, 0, totdur, 1, "lowpass", 0, 0, bypass=0, cf=4000, q=0.5)
}
else {
load("WAVETABLE")
bus_config("WAVETABLE", "aux 0 out")
amp = 10000
pitch = 8.00
//wavet = maketable("wave", 20000, "buzz")
wavet = maketable("random", 40, "even", 0, 1, seed=1)
WAVETABLE(0, totdur, amp, pitch, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 0.02, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 0.021, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 0.05, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 0.07, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 0.069, 0, wavet)
WAVETABLE(0, totdur, amp, pitch + 1.00, 0, wavet)
}
// --------------------------------------------------------------------------
bus_config("VOCODE3", "aux 0-1 in", "aux 4-5 out")
env = maketable("line", 1000, 0,0, .1,1, totdur-.1,1, totdur,0)
if (1) {
numfilts = 64
numfilts = 32
tab = {}
oct = octpch(6.00)
incr = octpch(0.025)
for (i = 0; i < numfilts; i += 1) {
tab[i] = oct
oct += incr
}
modcf = maketable("literal", "nonorm", 0, tab)
}
else {
modcf = maketable("literal", "nonorm", 0,
octpch(7.00),
octpch(7.05),
octpch(7.07),
octpch(8.00),
octpch(8.02),
octpch(8.06),
octpch(8.09),
octpch(9.00),
octpch(9.04),
octpch(9.11),
octpch(10.06),
octpch(11.01)
)
}
numfilts = tablelen(modcf)
if (1) {
index = makeconnection("mouse", "x", min=0, max=numfilts, df=0, lag=50, "idx", "", 1)
//value = makeconnection("mouse", "y", min=5, max=10, df=min, lag=50, "val")
//modcf = modtable(modcf, "draw", "literal", index, value)
index = makerandom("even", lfreq=2, min=0, max=1, seed=1)
//index = makefilter(index, "smooth", lag=0)
value = makerandom("even", lfreq=.5, min=7, max=12, seed=1)
value = makefilter(value, "smooth", lag=80)
//value = makemonitor(value, "display", "value")
modcf = modtable(modcf, "draw", index, value)
}
carcf = modcf
if (1) {
maplist = {}
spray_init(1, numfilts, seed=1)
for (i = 0; i < numfilts; i += 1)
maplist[i] = get_spray(1)
map = maketable("literal", "nonorm", numfilts, maplist)
dumptable(map)
}
else
map = 0
scale = 0
//scale = maketable("curve", "nonorm", numfilts, 0,1,-1, 1,0)
//scale = maketable("curve", "nonorm", numfilts, 0,0,1, 1,1)
modtransp = 0.0
//modtransp = makeconnection("mouse", "x", min=-1, max=3, dflt=0, lag=50, "mtrns")
cartransp = 1.0
//cartransp = makeconnection("mouse", "y", min=-2, max=2, dflt=0, lag=50, "ctrns")
modq = 10.0
carq = 400.0
amp = 1.0
//amp = makeconnection("mouse", "y", min=0, max=1, dflt=0, 0, "amp")
response = 0.001
//response = makeconnection("mouse", "x", min=0, max=2, dflt=0.01, 0, "resp")
hold = 0
//hold = makeconnection("mouse", "y", min=0, max=2, dflt=0, 0, "hold")
hold = makeLFO("square2", freq=10, min=0, max=3)
//hold = makerandom("even", freq=2, min=0, max=1.5, seed=1)
VOCODE3(0, 0, totdur, amp * env, modcf, carcf, map, scale,
modtransp, cartransp, modq, carq, response, hold, pan=.9)
modtransp += 1
cartransp -= .03
hold = makeLFO("square2", freq=10, min=0, max=8)
VOCODE3(0, 0, totdur, amp * env, modcf, carcf, map, scale,
modtransp, cartransp, modq, carq, response, hold, pan=.1)
// --------------------------------------------------------------------------
load("COMPLIMIT")
ingain = 0
outgain = 0
atk = 0.01
rel = 0.01
thresh = -1
ratio = 100
look = atk
win = 128
bus_config("COMPLIMIT", "aux 4 in", "out 0")
COMPLIMIT(0, 0, totdur, ingain, outgain, atk, rel, thresh, ratio, look, win)
bus_config("COMPLIMIT", "aux 5 in", "out 1")
COMPLIMIT(0, 0, totdur, ingain, outgain, atk, rel, thresh, ratio, look, win)
maketable, CONVOLVE1, LPCIN, PVOC, SPECTACLE, SPECTACLE2, SPECTEQ, SPECTEQ2, SPECTACLE, VOCODE2, VOCODESYNTH