let scrute = fun ic ->
 let oc = open_out Data.adresse_etat_clavier
 and tirettes = Array.make 9 0
 and facteur_decalage = Data.nombre_de_parametres_clavier - Data.succ_nombre_de_curseurs
 and pred_facteur_decalage = Data.nombre_de_parametres_clavier - Data.succ_nombre_de_curseurs - 1
 and poussoir = ref 0
 and poussoir_mono = ref 0
 and poussoir_clic = ref 0
 and valeurs_clic = Data.valeurs_clic
 and poussoir_percu = ref 0
 and valeurs_percu = Data.valeurs_percu
 and poussoir_reverb = ref 0
 and valeurs_reverb = Data.valeurs_reverb
 and poussoir_forme = ref 0
 and valeurs_forme = Data.valeurs_forme
 and demi_lune = ref 0
 and c = ref 0
 and entete = ref 0
 and canal = ref 0
 and note = ref 0
 and controleur = ref 0
 and decalage = ref 0
 and selection = ref Vide in
  let reglages = Array.make facteur_decalage 0 in
   for i = 0 to 127 do
    output_byte oc haut ;
   done ;

(** pitch *)


   output_byte oc milieu ;

(** tirettes : modulation et curseurs *)


   for i = 0 to 8 do
    output_byte oc plein ;
   done ;

(** bouton rotatifs swell et saturation *)


   for i = 0 to 1 do
    output_byte oc vide ;
   done ;

(** bouton rotatif inflexion *)


   output_byte oc milieu ;

(** boutons rotatifs *)


   for i = 3 to 8 do
    output_byte oc vide ;
   done ;

(** bouton rotatifs différence grave-aigu pour enveloppe et niveau de percussion *)


   for i = 9 to 10 do
    output_byte oc milieu ;
   done ;

(** boutons rotatifs *)


   for i = 11 to 15 do
    output_byte oc vide ;
   done ;

(** bouton rotatif différence de déphasage grave-aigu pour la rotation *)


   output_byte oc milieu ;

(** boutons rotatifs *)


   for i = 17 to 19 do
    output_byte oc vide ;
   done ;

(** bouton rotatif diapason *)


   output_byte oc milieu ;

(** bouton rotatif octave *)


   output_byte oc vide ;

(** bouton rotatif rose *)


   output_byte oc milieu ;

(** boutons rotatifs *)


   for i = 23 to 24 do
    output_byte oc vide ;
   done ;

(** bouton rotatif équilibre *)


   output_byte oc milieu ;

(** boutons rotatifs *)


   for i = 26 to 31 do
    output_byte oc vide ;
   done ;

(** poussoirs boucles *)


   for i = 32 to 33 do
    output_byte oc vide ;
   done ;

(** demi-lune *)

    output_byte oc vide ;
   close_out_noerr oc ;
    begin
     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 = touche_appuyee ->
        begin
         note := input_byte ic ;

(** vélocité *)


         c := input_byte ic ;
         if !c > 0 then
          begin
           if !canal = 9 then
            begin
             match !note with
             | z when z = C.pad1 ->
              begin
               if !selection = Special then
                begin
                 pouss_mono poussoir_mono reglages 1 ;
                 selection := Special ;
                end
               else if !selection = Lecture then
                clic poussoir_clic reglages valeurs_clic
               else
                lent selection poussoir demi_lune reglages
              end
             | z when z = C.pad2 ->
              begin
               if !selection = Special then
                begin
                 pouss_mono poussoir_mono reglages 2 ;
                 selection := Special ;
                end
               else if !selection = Lecture then
                percu poussoir_percu reglages valeurs_percu
               else
                frein selection poussoir demi_lune reglages
              end
             | z when z = C.pad3 ->
              begin
               if !selection = Special then
                begin
                 pouss_mono poussoir_mono reglages 3 ;
                 selection := Special ;
                end
               else if !selection = Lecture then
                reverb poussoir_reverb reglages valeurs_reverb
               else
                rapide selection poussoir demi_lune reglages
              end
             | z when z = C.pad4 ->
              begin
               if !selection = Special then
                begin
                 vc poussoir_mono reglages ;
                 selection := Special ;
                end
               else if !selection = Lecture then
                forme poussoir_forme reglages valeurs_forme
               else
                mono selection poussoir demi_lune reglages
              end
             | z when z = C.pad5 -> clic poussoir_clic reglages valeurs_clic
             | z when z = C.pad6 -> percu poussoir_percu reglages valeurs_percu
             | z when z = C.pad7 -> reverb poussoir_reverb reglages valeurs_reverb
             | z when z = C.pad8 -> forme poussoir_forme reglages valeurs_forme
             | _ -> () ;
            end
           else
            match !selection with
            | Rappel ->
             begin
              selection := Vide ;
              let ict = open_in_gen [Open_binary ; Open_rdonly] 0o400 Data.adresse_etat_jeux in
               decalage := 9 * !note ;
               seek_in ict !decalage ;
               for i = 0 to 8 do
                tirettes.(i) <- input_byte ict ;
               done ;
               close_in_noerr ict ;
               let oc = open_out_gen [Open_binary ; Open_wronly] 0o644 Data.adresse_etat_clavier in
                seek_out oc 129 ;
                for i = 0 to 8 do
                 output_byte oc tirettes.(i) ;
                done ;
                flush_all () ;
                close_out_noerr oc ;
                prerr_int !note ;
                prerr_newline () ;
                prerr_endline ( ( pourcent_cpu () ) ^ "mode vide" ) ;
             end
            | Rappel_boutons -> ( selection := Vide ; rappel_boutons decalage pred_facteur_decalage facteur_decalage reglages !note )
            | Sauvegarde ->
             begin
              selection := Vide ;
              let oc = open_out_gen [Open_binary ; Open_wronly] 0o644 Data.adresse_etat_jeux in
               decalage := 9 * !note ;
               seek_out oc !decalage ;
               for i = 0 to 8 do
                output_byte oc tirettes.(i) ;
               done ;
               flush_all () ;
               close_out_noerr oc ;
               prerr_int !note ;
               prerr_newline () ;
               prerr_endline ( ( pourcent_cpu () ) ^ "mode vide" ) ;
             end
            | Sauvegarde_boutons -> ( selection := Vide ; sauvegarde_boutons decalage pred_facteur_decalage facteur_decalage reglages !note )
            | _ -> aux Data.adresse_etat_clavier !note bas ;
           end

(** vélocité nulle *)


         else if !canal <> 9 then
          aux Data.adresse_etat_clavier !note haut ;
        end
       | x when x = touche_relachee ->
        begin
         note := input_byte ic ;

(** vélocité *)


         c := input_byte ic ;
         if !canal <> 9 then
          aux Data.adresse_etat_clavier !note haut ;
        end
       | x when x = pitch ->
        begin

(** valeur nulle *)


         c := input_byte ic ;
         c := input_byte ic ;
         aux Data.adresse_etat_clavier 128 !c ;
        end
       | x when x = mode ->
        begin
         controleur := input_byte ic ;

(** valeur *)


         c := input_byte ic ;
         match !controleur with

(** all notes off *)


         | y when ( 123 <= y ) && ( y <= 127 ) ->
          begin
           let oc = open_out_gen [Open_binary ; Open_wronly] 0o644 Data.adresse_etat_clavier
           and chaine = String.make 128 ( char_of_int haut ) in
            output oc chaine 0 128 ;
            flush_all () ;
            close_out_noerr oc ;
          end

(** boutons curseurs *)


         | y when y = C.curseur_1 ->
          begin
           tirettes.(0) <- !c ;
           aux Data.adresse_etat_clavier 129 !c ;
          end
         | y when y = C.curseur_2 ->
          begin
           tirettes.(1) <- !c ;
           aux Data.adresse_etat_clavier 130 !c ;
          end
         | y when y = C.curseur_3 ->
          begin
           tirettes.(2) <- !c ;
           aux Data.adresse_etat_clavier 131 !c ;
          end
         | y when y = C.curseur_4 ->
          begin
           tirettes.(3) <- !c ;
           aux Data.adresse_etat_clavier 132 !c ;
          end
         | y when y = C.curseur_5 ->
          begin
           tirettes.(4) <- !c ;
           aux Data.adresse_etat_clavier 133 !c ;
          end
         | y when y = C.curseur_6 ->
          begin
           tirettes.(5) <- !c ;
           aux Data.adresse_etat_clavier 134 !c ;
          end
         | y when y = C.curseur_7 ->
          begin
           tirettes.(6) <- !c ;
           aux Data.adresse_etat_clavier 135 !c ;
          end
         | y when y = C.curseur_8 ->
          begin
           tirettes.(7) <- !c ;
           aux Data.adresse_etat_clavier 136 !c ;
          end
         | y when y = C.curseur_9 ->
          begin
           tirettes.(8) <- !c ;
           aux Data.adresse_etat_clavier 137 !c ;
          end

(** swell *)


         | y when y = C.bouton_1 || y = swell || y = C.alter_swell || y = C.alter_modulation ->
          begin
           reglages.(0) <- !c ;
           aux Data.adresse_etat_clavier ( 128 + Data.bouton_swell ) !c
          end

(** saturation *)


         | y when y = C.bouton_8 || y = C.bouton_p10 ->
          begin
           reglages.(1) <- !c ;
           aux Data.adresse_etat_clavier ( 128 + Data.bouton_saturation ) !c
          end

(** boutons rotatifs *)


         | y when y = C.bouton_2 || y = C.bouton_p1 ->
          begin
           match !selection with
           | Forme -> ( reglages.(2) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_inflexion ) !c )
           | Percussion -> ( reglages.(8) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_longueur_clic ) !c )
           | Vibrato -> ( reglages.(14) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_excursion_vibrato ) !c )
           | Filtrage -> ( reglages.(20) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diapason ) !c )
           | Reverb -> ( reglages.(26) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_delai_reverb ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_3 || y = C.bouton_p2 ->
          begin
           match !selection with
           | Forme -> ( reglages.(3) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_dephasage_inflexion ) !c )
           | Percussion -> ( reglages.(9) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_enveloppe_percu ) !c )
           | Vibrato -> ( reglages.(15) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_basse_frequence ) !c )
           | Filtrage -> ( reglages.(21) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_octave ) !c )
           | Reverb -> ( reglages.(27) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_pli_haut ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_4 || y = C.bouton_p3 ->
          begin
           match !selection with
           | Forme -> ( reglages.(4) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_dephasage_creneaux ) !c )
           | Percussion -> ( reglages.(10) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_niveau_percu ) !c )
           | Vibrato -> ( reglages.(16) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_dephasage_rotation ) !c )
           | Filtrage -> ( reglages.(22) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_rose ) !c )
           | Reverb -> ( reglages.(28) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_tremolo ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_5 || y = C.bouton_p6 ->
          begin
           match !selection with
           | Forme -> ( reglages.(5) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_inflexion ) !c )
           | Percussion -> ( reglages.(11) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_clic ) !c )
           | Vibrato -> ( reglages.(17) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_excursion_vibrato ) !c )
           | Filtrage -> ( reglages.(23) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_coupure ) !c )
           | Reverb -> ( reglages.(29) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_reverb ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_6 || y = C.bouton_p7 ->
          begin
           match !selection with
           | Forme -> ( reglages.(6) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_triangle ) !c )
           | Percussion -> ( reglages.(12) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_enveloppe_percu ) !c )
           | Vibrato -> ( reglages.(18) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_basse_frequence ) !c )
           | Filtrage -> ( reglages.(24) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_timbre ) !c )
           | Reverb -> ( reglages.(30) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_pli_bas ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_7 || y = C.bouton_p8 ->
          begin
           match !selection with
           | Forme -> ( reglages.(7) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_creneaux ) !c )
           | Percussion -> ( reglages.(13) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_percu ) !c )
           | Vibrato -> ( reglages.(19) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_dephasage_rotation ) !c )
           | Filtrage -> ( reglages.(25) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_equilibre ) !c )
           | Reverb -> ( reglages.(31) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_tremolo ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_8bis || y = C.curseur_0 ->
          begin
           if !selection = Special then
            begin
             let position = ( min 125 !c ) / 18 in
              if !poussoir_mono <> position then
               begin
                poussoir_mono := ( 6 + position ) mod 7 ;
                vc poussoir_mono reglages ;
               end ;
            end
           else
            begin
             let position = !c / 32 in
              if !demi_lune <> position then
               match position with
               | 0 -> mono selection poussoir demi_lune reglages
               | 1 -> lent selection poussoir demi_lune reglages
               | 2 -> frein selection poussoir demi_lune reglages
               | _ -> rapide selection poussoir demi_lune reglages
            end
          end

(** Les claviers Arturia offrent plus de boutons. *)


         | y when y = C.bouton_p4 ->
          begin
           match !selection with
           | Percussion -> ( reglages.(26) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_delai_reverb ) !c )
           | Vibrato -> ( reglages.(28) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diff_tremolo ) !c )
           | Forme -> ( reglages.(20) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_diapason ) !c )
           | Filtrage -> ( reglages.(27) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_pli_haut ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_p5 ->
          begin
           match !selection with
           | Vibrato -> ( reglages.(25) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_equilibre ) !c )
           | Percussion -> ( reglages.(23) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_coupure ) !c )
           | Forme -> ( reglages.(22) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_rose ) !c )
           | _ -> () ;
          end
         | y when y = C.bouton_p9 ->
          begin
           match !selection with
           | Percussion -> ( reglages.(29) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_niveau_reverb ) !c )
           | Vibrato -> ( reglages.(31) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_tremolo ) !c )
           | Forme -> ( reglages.(24) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_timbre ) !c )
           | Filtrage -> ( reglages.(30) <- !c ; aux Data.adresse_etat_clavier ( 128 + Data.bouton_pli_bas ) !c )
           | _ -> () ;
          end

(** Les claviers Arturia offrent des coussinets percussifs (pads) qui envoient des trains de messages de contrôleurs. Un unique mot par manipulation du coussinet contient la valeur 0. *)


         | y when y = C.pad_5 && !c = 0 -> clic poussoir_clic reglages valeurs_clic
         | y when y = C.pad_6 && !c = 0 -> percu poussoir_percu reglages valeurs_percu
         | y when y = C.pad_7 && !c = 0 -> reverb poussoir_reverb reglages valeurs_reverb
         | y when y = C.pad_8 && !c = 0 -> forme poussoir_forme reglages valeurs_forme
(** boutons-poussoirs de transport *)


         | y when y = C.poussoir_boucle ->
          begin
           if !c > 0 then
            begin
             if !selection = Rembobine then
              begin
               prerr_endline "L'orgue est arrete." ;
               ignore ( Sys.command ( "killall ORGUE & killall " ^ C.nom_clavier ) ) ;
              end
             else if !selection = Special then
              begin
               selection := Reverb ;
               prerr_endline ( ( pourcent_cpu () ) ^ "mode reverberation" ) ;
              end
             else if !selection = Lecture then
              vc poussoir_mono reglages
             else
              begin
               selection := Vibrato ;
               demi_lune := 0 ;
               poussoir := ( succ !poussoir ) mod Data.modulo_vibrato ;
               reglages.(32) <- !poussoir ;
               reglages.(34) <- !demi_lune ;
               aux Data.adresse_etat_clavier ( 128 + Data.poussoir_vibrato_chorus ) !poussoir ;
               aux Data.adresse_etat_clavier ( 128 + Data.demi_lune ) !demi_lune ;
               let chaine = match !poussoir with
               | 0 -> "son droit"
               | 1 -> "vibrato"
               | _ -> "chorus" in
                prerr_endline ( ( pourcent_cpu () ) ^ chaine ) ;
              end ;
            end ;
          end
         | y when y = C.poussoir_rembobine ->
          begin
           if !c > 0 then
            begin
             if !selection = Avance_rapide then
              begin
               selection := Rembobine ;
               prerr_endline "Arret de l'orgue : taper sur BOUCLE." ;
              end
             else if !selection = Special then
              begin
               selection := Rappel_boutons ;
               prerr_endline ( ( pourcent_cpu () ) ^ "rappel de reglages" ) ;
              end
             else
              begin
               selection := Rappel ;
               prerr_endline ( ( pourcent_cpu () ) ^ "rappel de jeux" ) ;
              end
            end
          end
         | y when y = C.poussoir_avance_rapide ->
          begin
           if !c > 0 then
            begin
             if !selection = Arret then
              begin
               selection := Avance_rapide ;
               prerr_endline "Arret de l'orgue : taper sur REMBOBINAGE." ;
              end
             else if !selection = Special then
              begin
               selection := Sauvegarde_boutons ;
               prerr_endline ( ( pourcent_cpu () ) ^ "enregistrement de reglages" ) ;
              end
             else
              begin
               selection := Sauvegarde ;
               prerr_endline ( ( pourcent_cpu () ) ^ "enregistrement de jeux" ) ;
              end
            end
          end
         | y when y = C.poussoir_debut ->
          if !c > 0 then demande_rappel_boutons selection ;
         | y when y = C.poussoir_fin ->
          if !c > 0 then demande_sauvegarde_boutons selection ;
         | y when y = C.poussoir_arret ->
          begin
           if !c > 0 then
            begin
             if !selection = Lecture then
              begin
               selection := Arret ;
               prerr_endline "Arret de l'orgue : taper sur AVANCE RAPIDE." ;
              end
             else if !selection = Special then
              begin
               selection := Filtrage ;
               prerr_endline ( ( pourcent_cpu () ) ^ "mode filtrage-equilibrage" ) ;
              end
             else
              begin
               selection := Forme ;
               prerr_endline ( ( pourcent_cpu () ) ^ "mode forme" ) ;
              end
            end
          end
         | y when y = C.poussoir_lecture ->
          begin
           if !c > 0 then
            begin
             if !selection = Special then
              begin
               selection := Lecture ;
               prerr_endline ( ( pourcent_cpu () ) ^ "Mode lecture.\n Arret de l'orgue : taper sur ARRET.\n Vibrato/chorus mono 1, 2 ou 3 : taper sur BOUCLE.\n Clic : Pad1 ou bouton-poussoir 1 ; percussion : Pad2 ou bouton-poussoir 2 ; reverberation : Pad3 ou bouton-poussoir 3 ; forme : Pad4 ou bouton-poussoir 4." ) ;
              end
             else
              begin
               selection := Percussion ;
               prerr_endline ( ( pourcent_cpu () ) ^ "mode percussion" ) ;
              end
            end
          end
         | y when y = C.poussoir_enregistrement ->
          if !c > 0 then
           begin
            if !selection = Special then
             begin
              selection := Vide ;
              prerr_endline ( ( pourcent_cpu () ) ^ "mode vide" ) ;
             end
            else
             begin
              selection := Special ;
              prerr_endline ( ( pourcent_cpu () ) ^ "mode special" ) ;
             end
           end

(** boutons-poussoirs numérotés *)


         | y when y = C.poussoir_4 ->
          begin
           if !c > 0 then
            begin
             if !selection = Special then
              begin
               mono selection poussoir demi_lune reglages ;
               selection := Special ;
              end
             else if !selection = Lecture then
              forme poussoir_forme reglages valeurs_forme
             else
              vc poussoir_mono reglages
            end
          end
         | y when y = C.poussoir_1 ->
          begin
           if !c > 0 then
            begin
             if !selection = Special then
              begin
               lent selection poussoir demi_lune reglages ;
               selection := Special ;
              end
             else if !selection = Lecture then
              clic poussoir_clic reglages valeurs_clic
             else
              pouss_mono poussoir_mono reglages 1
            end
          end
         | y when y = C.poussoir_2 ->
          begin
           if !c > 0 then
            begin
             if !selection = Special then
              begin
               frein selection poussoir demi_lune reglages ;
               selection := Special ;
              end
             else if !selection = Lecture then
              percu poussoir_percu reglages valeurs_percu
             else
              pouss_mono poussoir_mono reglages 2
            end
          end
         | y when y = C.poussoir_3 ->
          begin
           if !c > 0 then
            begin
             if !selection = Special then
              begin
               rapide selection poussoir demi_lune reglages ;
               selection := Special ;
              end
             else if !selection = Lecture then
              reverb poussoir_reverb reglages valeurs_reverb
             else
              pouss_mono poussoir_mono reglages 3
            end
          end
         | y when y = C.poussoir_5 ->
          begin
           if !c > 0 then
            clic poussoir_clic reglages valeurs_clic
          end
         | y when y = C.poussoir_6 ->
          begin
           if !c > 0 then
            percu poussoir_percu reglages valeurs_percu
          end
         | y when y = C.poussoir_7 ->
          begin
           if !c > 0 then
            reverb poussoir_reverb reglages valeurs_reverb
          end
         | y when y = C.poussoir_8 ->
          begin
           if !c > 0 then
            forme poussoir_forme reglages valeurs_forme
          end
         | _ -> ()
        end
       | x when x = instru ->
        begin
         c := input_byte ic ;
         match !c with
         | 0 ->
          begin
           if !selection = Special then
            begin
             lent selection poussoir demi_lune reglages ;
             selection := Special ;
            end
           else if !selection = Lecture then
            clic poussoir_clic reglages valeurs_clic
           else
            pouss_mono poussoir_mono reglages 1
          end
         | 1 ->
          begin
           if !selection = Special then
            begin
             frein selection poussoir demi_lune reglages ;
             selection := Special ;
            end
           else if !selection = Lecture then
            percu poussoir_percu reglages valeurs_percu
           else
            pouss_mono poussoir_mono reglages 2
          end
         | 2 ->
          begin
           if !selection = Special then
            begin
             rapide selection poussoir demi_lune reglages ;
             selection := Special ;
            end
           else if !selection = Lecture then
            reverb poussoir_reverb reglages valeurs_reverb
           else
            pouss_mono poussoir_mono reglages 3
          end
         | 3 ->
          begin
           if !selection = Special then
            begin
             mono selection poussoir demi_lune reglages ;
             selection := Special ;
            end
           else if !selection = Lecture then
            forme poussoir_forme reglages valeurs_forme
           else
            vc poussoir_mono reglages
          end
         | 4 -> clic poussoir_clic reglages valeurs_clic
         | 5 -> percu poussoir_percu reglages valeurs_percu
         | 6 -> reverb poussoir_reverb reglages valeurs_reverb
         | 7 -> demande_rappel_boutons selection
         | 8 -> demande_sauvegarde_boutons selection
         | _ -> () ;
        end
       | _ -> ()
      done
     with End_of_file -> close_in_noerr ic ;
    end ;
    Sys.remove Data.adresse_etat_clavier