struct

(**

Liste d'appareils testés

  1. Eagletone Engineering tinycontrol
    Détection sous FreeBSD :
    ugen1.2: <WORLDE> at usbus1
    uaudio0: <WORLDE TINYCONTROL, class 0/0, rev 1.10/0.00, 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 curseur_1 = 0x03 ;;
let curseur_2 = 0x04 ;;
let curseur_3 = 0x05 ;;
let curseur_4 = 0x06 ;;
let curseur_5 = 0x07 ;;
let curseur_6 = 0x08 ;;
let curseur_7 = 0x09 ;;
let curseur_8 = 0x0A ;;
let curseur_9 = 0x0B ;;

let bouton_1 = 0x0E ;;
let bouton_2 = 0x0F ;;
let bouton_3 = 0x10 ;;
let bouton_4 = 0x11 ;;
let bouton_5 = 0x12 ;;
let bouton_6 = 0x13 ;;
let bouton_7 = 0x14 ;;
let bouton_8 = 0x15 ;;
let bouton_8bis = 0x16 ;;

let poussoir_boucle = 0x31 ;;
let poussoir_rembobine = 0x2F ;;
let poussoir_avance_rapide = 0x30 ;;
let poussoir_arret = 0x2E ;;
let poussoir_lecture = 0x2D ;;
let poussoir_enregistrement = 0x2C ;;

let poussoir_1 = 0x17 ;;
let poussoir_2 = 0x18 ;;
let poussoir_3 = 0x19 ;;
let poussoir_4 = 0x1A ;;
let poussoir_5 = 0x1B ;;
let poussoir_6 = 0x1C ;;
let poussoir_7 = 0x1D ;;
let poussoir_8 = 0x1E ;;
let poussoir_9 = 0x1F ;;

(** Les poussoirs autour de l'encodeur rotatif sont appelés a et b. Ceux sous le curseur de volumesont appelés c et d. à l'enfocement, ils envoient des messages avec valeur 127 puis 0. *)


let poussoir_a = 0x43 ;;
let poussoir_b = 0x40 ;;
let poussoir_c = 0x01 ;;
let poussoir_d = 0x02 ;;

(** L'encodeur rotatif envoie des messages "program change" (C0 xy). *)


(** Le curseur panoramique A-B envoie des messages F0 7F 7F 04 01 00 xy F7 avec xy variable. *)


(** Le poussoir BANK envoie des messages F0 42 40 00 01 04 00 5F 4F xy F7 avec xy qui cycle de 00 à 03 *)



(**

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

scrute stdin stdout ;;

end