struct

(**

Liste d'appareils testés

  1. Evolution electronics MK-249C2
    Détection sous FreeBSD :
    ugen1.2: <Evolution Electronics Ltd.> at usbus1
    uaudio0: <Evolution Electronics Ltd. MK-249C USB MIDI keyboard, class 0/0, rev 1.00/2.52, addr 2> on usbus1
    uaudio0: No playback.
    uaudio0: No recording.
    uaudio0: MIDI sequencer.
    uaudio0: No HID volume keys found.
Copyright Stéphane Grognet
IREM des Pays de la Loire - Université de Nantes
Laboratoire de mathématiques Jean Leray UMR 6629 CNRS
version 0.9
@version 0.9 @author Stéphane Grognet @since 2014 *)




(**

Données universelles

*)



let masque_entete = 0xF0 ;;
let numero_de_canal = 0x0F ;;

(** Note off event *)

let touche_relachee = 0x80 ;;

(** Note on event *)

let touche_appuyee = 0x90 ;;

(** Controle change *)

let mode = 0xB0 ;;

(** Program change *)

let instru = 0xC0 ;;

(** Pitch bend change. La molette de pitch est centrée sur la valeur 64. *)

let pitch = 0xE0 ;;

(** System messages *)

let sys = 0xF0 ;;


(**

Numéros de controleurs

*)



let bank_select = 0x00 ;;
let modulation = 0x01 ;;
let swell = 0x0B ;;
let sustain_pedal = 0x40 ;;


(**

Données locales

*)



let message_vide = 0xFE ;;
let canal_vide = 0x0E ;;

let bouton1 = 0x0A ;;(*pan*)
let bouton2 = 0x0B ;;(*expression*)
let bouton3 = 0x0C ;;(*effect1*)
let bouton4 = 0x0D ;;(*effect2*)
let bouton5 = 0x5B ;;(*reverb*)
let bouton6 = 0x5D ;;(*chorus*)
let bouton7 = 0x5E ;;(*delay*)
let bouton8 = 0x46 ;;(*phaser*)
let bouton9 = 0x49 ;;(*attack*)
let bouton10 = 0x48 ;;(*release*)
let bouton11 = 0x4A ;;(*cut off*)
let bouton12 = 0x47 ;;(*resonance*)

let master_volume = 0x07 ;;

(** Poussoirs particuliers. Les neuf boutons poussoirs situés sous les curseurs envoient les signaux MIDI suivants : b0 00 00 b0 20 00 c0 0X

avec X = 0 à 9.

Ces signaux sont envoyés seulement à l'enfoncement et rien n'est envoyé au relâchement.*)



let instru_0 = 0x00 ;;
let instru_1 = 0x01 ;;
let instru_2 = 0x02 ;;
let instru_3 = 0x03 ;;
let instru_4 = 0x04 ;;
let instru_5 = 0x05 ;;
let instru_6 = 0x3F ;;
let instru_7 = 0x07 ;;
let instru_8 = 0x58 ;;
let instru_9 = 0x31 ;;



(**

Traduction

*)




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 ;;

scrute stdin stdout ;;

end