let scrute = fun ic oc ->
 let c = ref 0
 and entete = ref 0
 and canal = ref 0
 and note = ref 0
 and controleur = ref 0
 and valeur = ref 0 in
  try
   while true do
    c := input_byte ic ;
    entete := !c land masque_entete ;
    canal := !c land numero_de_canal ;
    match !entete with
    | x when x = sys && !canal = canal_vide -> flush_all ()
    | x when x = pitch || x = touche_relachee || x = touche_appuyee ->
     begin
      note := input_byte ic ;
      valeur := input_byte ic ;
      output_byte oc !c ;
      output_byte oc !note ;
      output_byte oc !valeur ;
      flush_all () ;
     end
    | x when x land mode = mode ->
     begin
      controleur := input_byte ic ;
      valeur := input_byte ic ;
      match !controleur with

(** all notes off *)


      | y when ( 123 <= y ) && ( y <= 127 ) ->
       begin
        output_byte oc !c ;
        output_byte oc !controleur ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton1 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton2 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton3 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton4 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p4 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton5 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p5 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton6 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p6 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton7 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p7 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton8 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p8 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton9 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p9 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton10 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_p10 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton11 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_8bis ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton12 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.alter_swell ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = master_volume ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_0 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bank_select ->
       begin
        ignore ( input_byte ic ) ;
        ignore ( input_byte ic ) ;
        ignore ( input_byte ic ) ;
        ignore ( input_byte ic ) ;
        valeur := input_byte ic ;
        begin
         match !valeur with
         | z when z = instru_0 -> controleur := Omega.poussoir_boucle
         | z when z = instru_1 -> controleur := Omega.poussoir_rembobine
         | z when z = instru_2 -> controleur := Omega.poussoir_avance_rapide
         | z when z = instru_3 -> controleur := Omega.poussoir_arret
         | z when z = instru_4 -> controleur := Omega.poussoir_lecture
         | z when z = instru_5 -> controleur := Omega.poussoir_enregistrement
         | z when z = instru_6 -> controleur := Omega.poussoir_1
         | z when z = instru_7 -> controleur := Omega.poussoir_2
         | z when z = instru_8 -> controleur := Omega.poussoir_3
         | z when z = instru_9 -> controleur := Omega.poussoir_4
         | _ -> controleur := 0xFF
        end ;
        output_byte oc mode ;
        output_byte oc !controleur ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = modulation ->
       begin
        output_byte oc !c ;
        output_byte oc swell ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = sustain_pedal ->
       begin
        output_byte oc !c ;
        output_byte oc sustain_pedal ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | _ -> flush_all ()
     end
    | _ -> flush_all ()
   done
  with _ ->
   close_out_noerr oc