as before, i'm working on a vocoder. i added some features since my last
thread, and they're what this is about
here's my program so far:
import("stdfaust.lib");
select4(s) = *(s==0),*(s==1),*(s==2),*(s==3):>_;
clip(x,a,b) = min(max(x,a),b);
n = 16;
time(x) = hgroup("[0]time controls",x);
attack = time(vslider("[0]attack[style:knob][unit:ms]",50,0,2000,0.1));
release = time(vslider("[1]release[style:knob][unit:ms]",50,0,2000,0.1));
op(x) = hgroup("[1]operator controls",x);
car(x) = op(hgroup("[0]carrier controls",x));
mod(x) = op(hgroup("[0]modulator controls",x));
mod_order = mod(nentry("[0]modulator
order[style:menu{'-12db':0;'-24db':1;'-36db':2;'-48db':3}}]",0,0,3,1));
mod_bw = mod(vslider("[1]modulator bw[style:knob]",0.5,0.1,2,0.001));
car_order = car(nentry("[0]carrier
order[style:menu{'-12db':0;'-24db':1;'-36db':2;'-48db':3}}]",0,0,3,1));
car_bw = car(vslider("[1]carrier bw[style:knob]",0.5,0.1,2,0.001));
fx(x) = vgroup("[2]effects",x);
self_mod = fx(checkbox("[0]self-modulate"));
form_shift = fx(hslider("[1]formant shift[unit:%]",1,0.5,3,0.01));
range = fx(hslider("[1]range",1,0.01,1,0.01));
misc(x) = hgroup("[3]misc controls",x);
out_gain = misc(hslider("output gain[unit:db]",0,-48,48,0.01));
bp(freq,q,gain) = fi.resonbp(freq,q,gain/q);
multi_bp(freq,q,gain,order) =
_<:bp(freq,q,gain),(bp(freq,q,gain):bp(freq,q,gain)),(bp(freq,q,gain):bp(freq,q,gain):bp(freq,q,gain)),(bp(freq,q,gain):bp(freq,q,gain):bp(freq,q,gain):bp(freq,q,gain)):>select4(order):_*((order)+1);
voc_band(band_num,bands_num,shift,bw_ratio,order,bg,x) = x :
multi_bp(band_freq, band_q, bg, order) : _ with {
band_freq = (25*pow(2,(band_num+1)*(9/bands_num)))*shift;
bw = (band_freq - 25*pow(2,(band_num)*(9/bands_num)))*bw_ratio;
band_q = band_freq/bw;
};
voc(bands_num,att,rel,form_shift,range,mod_bw,mod_order,car_bw,car_order,carrier,modulator)
= carrier <: par(i,bands_num,voc_band(i,bands_num,range,mod_bw,mod_order,1) :
an.amp_follower_ar(att,rel) : _,modulator :
voc_band(i,bands_num,form_shift*range,car_bw,car_order)) :> _;
x = _,_ <: !,_,_,!;
process =
_,_,_,_<:(_,x,_),((_<:_,_),(_<:_,_),!,!):(par(i,4,_*(1-self_mod)),par(i,
4,_*(self_mod))):>par(i,2,voc(n,attack/1000,release/1000,form_shift,range,mod_bw,mod_order,car_bw,car_order)):par(i,2,_*ba.db2linear(out_gain));
when i run the program and adjust the "formant shift" and "range" sliders with
audio input and the "self-modulate" checkbox enabled, at certain values a very
loud signal is produced. it seems to depend on the value of either of the
bandwidth parameters
i think it might have to do with the resonbp q taking some value it shouldn't,
but i don't know how to fix it
incidentally, the "range" slider is meant to scale down the frequencies of both
the modulator and carrier bands. and the "formant shift" scales up or down the
frequencies of the carrier band only
thanks for any help in advance
a
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users