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 3 do
        ignore ( input_byte ic ) ;
       done ;
       valeur := input_byte ic ;
       ignore ( input_byte ic ) ;
       output_byte oc mode ;
       output_byte oc Omega.curseur_9 ;
       output_byte oc !valeur ;
       flush_all () ;
      end
     else if !note = 0x7E then
      begin
       for i = 1 to 15 do
        ignore ( input_byte ic ) ;
       done ;
        output_byte oc ( mode + !canal ) ;
        output_byte oc 123 ;
        output_byte oc 0x00 ;
        flush_all () ;
      end
    | x when x = pitch || x = touche_relachee || x = touche_appuyee ->
     begin
      if !canal <> 9 then
       begin
        note := input_byte ic ;
        valeur := input_byte ic ;
        output_byte oc !c ;
        output_byte oc !note ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      else
       begin
        note := input_byte ic ;
        valeur := input_byte ic ;
        output_byte oc !c ;
        output_byte oc ( decalage_de_pad + !note ) ;
        output_byte oc !valeur ;
        flush_all () ;
       end
     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 = curseur_generique ->
       begin
        output_byte oc !entete ;
        canal := !canal mod 8 ;
        output_byte oc ( Omega.curseur_1 + !canal ) ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton_generique ->
       begin
        output_byte oc !entete ;
        canal := !canal mod 8 ;
        output_byte oc ( Omega.bouton_1 + !canal ) ;
        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 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_avance_rapide ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_avance_rapide ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_arret ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_arret ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_lecture ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_lecture ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_enregistrement ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_enregistrement ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_9 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_1 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_10 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_2 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_11 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_3 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_12 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_4 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_13 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_5 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_14 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_6 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_15 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_7 ;
        output_byte oc 0x7F ;
        flush_all () ;
       end
      | y when y = poussoir_16 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_boucle ;
        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 _ ->
   begin
    close_in_noerr ic ;
    close_out_noerr oc ;
   end