let vibrato = fun (poussoir_vc:float) (tremolo:float) (expression:float) (basse_frequence:float) (dephasage:float) (cos_rot:float array) (sin_rot:float array) (phase_bf:float array) (phase_finale_bf:float array) (phase_bf_1:float array) (phase_finale_bf_1:float array) (precedent_echantillon:float array) (echantillon:float array) ->
 let facteur_s = ref 0.
 and facteur_v = ref 0.
 and ampleur = ref 0.
 and facteur_t = 0.0078125 *. tremolo
 and cos_a = cos dephasage
 and sin_a = sin dephasage
 and cos_diff = ref 0.
 and sin_diff = ref 0.
 and c = ref 0.
 and s = ref 0.
 and c_1 = ref 0.
 and s_1 = ref 0.
 and x = ref 1.
 and y = ref 0.
 and x_1 = ref 0.
 and y_1 = ref 0.
 and xx = ref 0.
 and yy = ref 0.
 and xx_1 = ref 0.
 and yy_1 = ref 0.
 and indice = ref 0
 and pred_indice = ref 0
 and excursion = ref 0.
 and deviation = ref 0.
 and difference = ref 0
 and alpha = ref 1.
 and beta = ref 0.
 and signal_gauche = Array.make Data.taille_d_echantillon 0.
 and signal_droit = Array.make Data.taille_d_echantillon 0.
 and vibrato_i = Array.make Data.taille_d_echantillon 0.
 and vibrato_ii = Array.make Data.taille_d_echantillon 0.
 and vibrato_q = Array.make Data.taille_d_echantillon 0.
 and vibrato_qq = Array.make Data.taille_d_echantillon 0. in
  for i = 0 to Data.pred_taille_d_echantillon do
   signal_gauche.(i) <- echantillon.(i) ;
  done ;
  if ( expression > 0. ) && ( poussoir_vc > 0. ) then
   begin
    let bf = max 1 ( min 127 ( int_of_float basse_frequence ) )
    and partie_fixe = 1. +. facteur_t in
     if poussoir_vc < 1.5 then
      begin
       facteur_s := 0. ;
       facteur_v := 1. ;
      end
     else
      begin
       facteur_s := 0.707106781186547573 ;
       facteur_v := !facteur_s ;
      end ;
     let jj = pred bf in
      c := cos_rot.(jj) ;
      s := sin_rot.(jj) ;
      c_1 := cos_rot.(bf) ;
      s_1 := sin_rot.(bf) ;
      x := phase_bf.(0) ;
      y := phase_bf.(1) ;
      x_1 := phase_bf_1.(0) ;
      y_1 := phase_bf_1.(1) ;
      for i = 0 to Data.pred_taille_d_echantillon do
       xx := !c *. !x -. !s *. !y ;
       yy := !s *. !x +. !c *. !y ;
       xx_1 := !c_1 *. !x_1 -. !s_1 *. !y_1 ;
       yy_1 := !s_1 *. !x_1 +. !c_1 *. !y_1 ;
       x := !xx ;
       y := !yy ;
       x_1 := !xx_1 ;
       y_1 := !yy_1 ;

(** Pour juguler les erreurs d'arrondi, procéder a posteriori à un battement de fréquences moyennes permet d'accéder avec une précision suffisante aux très basses fréquences.

Dans le cadre analogique, ce procédé a été utilisé au vingtième siècle dans les générateurs de fréquences Adret.

http://www.adret-electronique.fr *)



       cos_diff := tronque ( !xx_1 *. !xx +. !yy_1 *. !yy ) ;
       sin_diff := tronque ( !yy_1 *. !xx -. !xx_1 *. !yy ) ;
       excursion := 0.759934207678533147 *. !cos_diff -. 0.65 *. !sin_diff ;
       deviation := max 0. ( min 2. ( 1. -. !excursion ) ) ;
       ampleur := partie_fixe -. facteur_t *. !deviation ;
       deviation := expression *. !deviation ;
       difference := int_of_float !deviation ;
       indice := i - !difference ;
       pred_indice := pred !indice ;
       alpha := !deviation -. float !difference ;
       beta := 1. -. !alpha ;
       vibrato_i.(i) <- if !indice < 0 then !ampleur *. precedent_echantillon.( Data.taille_d_echantillon + !indice ) else !ampleur *. echantillon.(!indice) ;
       vibrato_ii.(i) <- if !pred_indice < 0 then !ampleur *. precedent_echantillon.( Data.taille_d_echantillon + !pred_indice ) else !ampleur *. echantillon.(!pred_indice) ;
       vibrato_i.(i) <- !alpha *. vibrato_ii.(i) +. !beta *. vibrato_i.(i) ;
       excursion := cos_a *. !excursion -. sin_a *. ( 0.65 *. !cos_diff +. 0.759934207678533147 *. !sin_diff ) ;
       deviation := max 0. ( min 2. ( 1. -. !excursion ) ) ;
       ampleur := partie_fixe -. facteur_t *. !deviation ;
       deviation := expression *. !deviation ;
       difference := int_of_float !deviation ;
       indice := i - !difference ;
       pred_indice := pred !indice ;
       alpha := !deviation -. float !difference ;
       beta := 1. -. !alpha ;
       vibrato_q.(i) <- if !indice < 0 then !ampleur *. precedent_echantillon.( Data.taille_d_echantillon + !indice ) else !ampleur *. echantillon.(!indice) ;
       vibrato_qq.(i) <- if !pred_indice < 0 then !ampleur *. precedent_echantillon.( Data.taille_d_echantillon + !pred_indice ) else !ampleur *. echantillon.(!pred_indice) ;
       vibrato_q.(i) <- !alpha *. vibrato_qq.(i) +. !beta *. vibrato_q.(i) ;
      done ;
      phase_finale_bf.(0) <- tronque ( !c *. !x -. !s *. !y ) ;
      phase_finale_bf.(1) <- tronque ( !s *. !x +. !c *. !y ) ;
      phase_finale_bf_1.(0) <- tronque ( !c_1 *. !x_1 -. !s_1 *. !y_1 ) ;
      phase_finale_bf_1.(1) <- tronque ( !s_1 *. !x_1 +. !c_1 *. !y_1 ) ;
      for i = 0 to Data.pred_taille_d_echantillon do
       let valeur = signal_gauche.(i) in
        signal_gauche.(i) <- !facteur_s *. valeur +. !facteur_v *. vibrato_i.(i) ;
        signal_droit.(i) <- !facteur_s *. valeur +. !facteur_v *. vibrato_q.(i) ;
      done ;
   end
  else
   begin
    for i = 0 to Data.pred_taille_d_echantillon do
     signal_droit.(i) <- signal_gauche.(i) ;
    done ;
   end ;
  ( signal_gauche , signal_droit )