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 = 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
      | y when y = bouton1 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_1 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton2 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_2 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton3 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_3 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton4 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_4 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton5 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_5 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton6 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_6 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton7 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_7 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = bouton8 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.bouton_8 ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_13 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_boucle ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_14 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_rembobine ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_15 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_avance_rapide ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_16 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_arret ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_9 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_debut ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_10 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_fin ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_11 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_lecture ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | y when y = pad_12 ->
       begin
        output_byte oc !c ;
        output_byte oc Omega.poussoir_enregistrement ;
        output_byte oc !valeur ;
        flush_all () ;
       end
      | _ -> flush_all ()
     end
    | _ -> flush_all ()
   done
  with _ ->
   close_out_noerr oc