desc:fx_formant :: ccernn.2009 :: v0.0.1

slider1:  650    <  100, 1000, 1    > formant.freq 1
slider2: 1300    <  500, 4000, 1    > 2
slider3: 2050    < 1000, 6000, 1    > 3
slider4:  100    <    0,  999, 0.01 > formant bw 1
slider5:  150    <    0,  999, 0.01 > 2
slider6:  200    <    0,  999, 0.01 > 3
slider7:    1    <    0,    1, 0.01 > formant ampl 1
slider8:    0.5  <    0,    1, 0.01 > 2
slider9:    0.25 <    0,    1, 0.01 > 3
slider10: 100    <    1, 1000, 1    > speed
slider11: 0.5    <    0,    1, 0.01 > volume

@init

  Ta    = 1/srate;
  PiTa  = $pi*Ta;
  PiTa2 = Pita*2;
  phase = 0;
  // speed = 5; // ms, should be a slider

@slider

  FR1_t = slider1;  // formant filter freq 1
  FR2_t = slider2;  // filter 2..
  FR3_t = slider3;  // ..and 3
  FB1_t = slider4;  // bw
  FB2_t = slider5;  // 
  FB3_t = slider6;  //
  FA1_t = slider7;  // ampl
  FA2_t = slider8;  //
  FA3_t = slider9;  //
  speed = slider10;
  volume = slider11;

@sample

  speed>0 ? mul=Ta/(speed/1000) : mul=1;
  out = 0;

  FR1 += (FR1_t-FR1)*mul;
  FB1 += (FB1_t-FB1)*mul;
  FA1 += (FA1_t-FA1)*mul;

  in = (spl0 + spl1) * 0.5;
  
  F1_x = -(PiTa*FB1);
  F1_r = (pow(2,F1_x*1.442695041));
  F1_c = -F1_r*F1_r;
  F1_b = F1_r*2*cos(PiTa2*FR1);
  F1_a = 1-F1_b-F1_c;
  F1_n  = (in*(F1_a*FA1))+(F1_b*F1_z1)+(F1_c*F1_z2);
  F1_z2 = F1_z1;
  F1_z1 = F1_n;
  out += F1_n;

  FR2 += (FR2_t-FR2)*mul;
  FB2 += (FB2_t-FB2)*mul;
  FA2 += (FA2_t-FA2)*mul;
  
  F2_x = -(PiTa*FB2);
  F2_r = (pow(2,F2_x*1.442695041));
  F2_c = -F2_r*F2_r;
  F2_b = F2_r*2*cos(PiTa2*FR2);
  F2_a = 1-F2_b-F2_c;
  F2_n  = (in*(F2_a*FA2))+(F2_b*F2_z1)+(F2_c*F2_z2);
  F2_z2 = F2_z1;
  F2_z1 = F2_n;
  out += F2_n;

  FR3 += (FR3_t-FR3)*mul;
  FB3 += (FB3_t-FB3)*mul;
  FA3 += (FA3_t-FA3)*mul;
  F3_x = -(PiTa*FB3);
  F3_r = (pow(2,F3_x*1.442695041));
  F3_c = -F3_r*F3_r;
  F3_b = F3_r*2*cos(PiTa2*FR3);
  F3_a = 1-F3_b-F3_c;
  F3_n  = (in*(F3_a*FA3))+(F3_b*F3_z1)+(F3_c*F3_z2);
  F3_z2 = F3_z1;
  F3_z1 = F3_n;
  out += F3_n;

  spl0 = spl1 = out * volume;;
