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 ->
     note := input_byte ic ;
     if !note = 0x7F then
      begin
       for i = 1 to 4 do
        ignore ( input_byte ic ) ;
       done ;
       valeur := input_byte ic ;
       ignore ( input_byte ic ) ;
       output_byte oc mode ;
       output_byte oc swell ;
       output_byte oc !valeur ;
       flush_all () ;
      end
     else if !note = 0x42 then
      begin
       for i = 1 to 7 do
        ignore ( input_byte ic ) ;
       done ;
       valeur := input_byte ic ;
       ignore ( input_byte ic ) ;
       begin
        note := match !valeur with
        | 0 -> Omega.pad1
        | 1 -> Omega.pad2
        | 2 -> Omega.pad3
        | _ -> Omega.pad4
       end ;
       let z = touche_appuyee + 9 in
        output_byte oc z ;
        output_byte oc !note ;
        output_byte oc 0x7F ;
        output_byte oc z ;
        output_byte oc !note ;
        output_byte oc 0x00 ;
        flush_all () ;
      end
    | x when x = instru ->
     begin
      valeur := input_byte ic ;
      output_byte oc mode ;
      output_byte oc Omega.bouton_8bis ;
      output_byte oc !valeur ;
      flush_all () ;
     end
    | 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 = bouton_1 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_2 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_3 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_4 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_4 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_5 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_5 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_6 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_6 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_7 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_7 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_8 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_8 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_8bis ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_8bis ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_1 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_2 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_3 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_4 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_4 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_5 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_5 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_6 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_6 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_7 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_7 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_8 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_8 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = curseur_9 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.curseur_9 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_boucle ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_boucle ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_rembobine ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_rembobine ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_avance_rapide ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_avance_rapide ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_arret ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_arret ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_lecture ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_lecture ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_enregistrement ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_enregistrement ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_1 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_2 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_3 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_4 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_4 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_5 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_5 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_6 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_6 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_7 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_7 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_8 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_8 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_9 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_9 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_a ->
       begin
        output_byte oc ( touche_appuyee + 9 ) ;
        output_byte oc Omega.pad1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_b ->
       begin
        output_byte oc ( touche_appuyee + 9 ) ;
        output_byte oc Omega.pad2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_c ->
       begin
        output_byte oc ( touche_appuyee + 9 ) ;
        output_byte oc Omega.pad3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = poussoir_d ->
       begin
        output_byte oc ( touche_appuyee + 9 ) ;
        output_byte oc Omega.pad4 ;
        output_byte oc !valeur ;
        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