haha thanks a lot. yeah its a lot of fun and also a bit frustrating because im missing some of the math. but im learning a lot
I would also like to add the alising suppression described in chapter 3.2 and found this pseudo Ugen classes in Glitch free vowel synthesis test - #2 by Geoffroy. already another difficult task. lets see.
Nearest_Even {
*ar {
arg val;
var val_floor, val_ceil, res, distance;
val_floor = val.floor;
val_ceil = val.ceil;
res = Select.ar (val % 2,
[ val_floor, val_ceil ],
);
distance = (val - res).abs;
^ [ res, distance ];
}
}
Nearest_Odd {
*ar {
arg val;
var val_floor, val_ceil, res, distance;
val_floor = val.floor;
val_ceil = val.ceil;
res = Select.ar (val + 1 % 2,
[ val_floor, val_ceil ],
);
distance = (val - res).abs;
^ [ res, distance ];
}
}
Crossfade_Formant {
*ar {
arg phasor = 0, phase_mod = 0, harm = 1, pm_index = 1, amp = 1; // lag = 0;
var harm_even, harm_odd, sig_even, sig_odd, sig, phase;
phase = phase_mod * pm_index;
harm_even = Nearest_Even.ar (harm);
sig_even = cos (phasor * 2pi * harm_even[0] + phase);
harm_odd = Nearest_Odd.ar (harm);
sig_odd = cos (phasor * 2pi * harm_odd[0] + phase);
sig = XFade2.ar (sig_even, sig_odd, harm_even[1] * 2 - 1) * amp;
^ sig;
}
}