Présentation du contrôleur midi

Les musiciens qui utilisent des ordinateurs ou contrôleurs midi, se tiennent souvent debout penchés sur leurs machines dans des positions peu ergonomiques. Pourquoi ne pas créer un contrôleur midi qui leur permette de se tenir droit ou dans une position confortable pendant qu'ils jouent.

Le contrôleur midi pourrait être intégrer par exemple à un fauteuil, intégré à une structure verticale plutôt qu'horizontale, …

Les étapes

  1. Brainstorming : quelle serez la forme, le design du contrôleur midi le plus adapté à notre physionomie ?
  2. Réalisation d'un prototype de la structure porteuse
  3. Choix des différents capteur
  4. Programmation de l'Arduino
  5. Montage des capteurs sur la structure porteuse
  6. Premier essai du contrôleur midi avec Ableton Live et d'autres Daw (Digital Audio Workstation)

Structure porteuse et capteurs

Grace à Arnaud et Michel, on a fabriqué une première structure en forme de pyramide trapézoïdale pour le contrôleur midi. Cette pyramide, posée sur une table permet de jouer debout, avec le dos bien droit. Les pouces se posent sur le haut de la structure et les autres doigts bougent facilement sur toute la facade avant. on imagine aussi taper sur les cotés de la structure avec la paume de la main ou avec les doigts pour déclencher des sons.

structure.jpg

ça donne envie de prototyper un premier contrôleur midi qui sera équipé de :

  • une dizaine de touches de clavier disposés sur la face avant. Ces touches permettront par exemple de jouer une gamme avec un son de synthétiseur.
  • 3 à 4 capteurs piezo situés sur les côtés qui déclencheront des samples chaque fois que l’on tape dessus
  • 1 ou 2 joysticks sur la face avant pour filtrer les fréquences des sons de synthé ou des samples

facade.jpg

piezo_side.jpg

Les composants électroniques

Avec un kit Arduino de base, j’ai pu faire un premier montage avec 4 boutons, un buzzer piezo et des potentiomètres pour simuler les joysticks. Pour aller plus loin, j’ai fait un second prototype avec les composants suivants :

  • 12 Boutons-poussoirs Digitast type 1RT fugitif
  • 12 Leds vertes ou jaunes
  • 4 Buzzers piezo à fils son continu
  • 4 Résistances 1MΩ
  • 16 Résistances 220 KΩ
  • 4 Leds rouges
  • 2 Joysticks 2 axes Parallax
  • 1 Carte Arduino Mega 2560

circuit.jpg

Le circuit

Voici le montage électronique schématisé avec le logiciel Fritzing. Je n'ai représenté qu'un capteur de chaque type par souci de lisibilité du schéma : un bouton, un capteur piezo, un joystick. Je n'ai pas trouvé le joystick 2 axes de Parallax dans les composants disponibles de Fritzing. Pour consulter le schéma de cablage exact de ce joystick, vous pouvez vous rendre sur le lien : http://learn.parallax.com/tutorials/language/propeller-c/propeller-c-simple-devices/joystick

controleur_midi.jpg

Le code

/*
Midi controller made with an Arduino Mega connected to sensors like : buttons, Piezo and Joystick.
This code sends midi signals via the USB port in "serial format". You need to install Hairless-midiserial software on Mac or PC to translate that "serial" midi signal to your DAW (Digital Audio Workstation)
http://projectgus.github.io/hairless-midiserial/
For Windows users, you will also need to install Loopmidi
http://www.tobias-erichsen.de/software/loopmidi.html
This example code is in the public domain.
*/

// variables

byte NoteON = 144;         // NoteOn command ( cf. protocole midi) http://computermusicresource.com/MIDI.Commands.html
byte ControlChange = 176;  // Control Change command ( cf. protocole midi) http://computermusicresource.com/MIDI.Commands.html

int ButtonPin[] ={22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}; // Buttons Pin numbers (for the Arduino Mega)
byte NbButtons = 12; // Number of Buttons
int ButtonState[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // variable for reading the pushButton status
int PreviousButtonState[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  // Variable to reccord last button state
int FirstPitchButton = 36; // Lowest pitch of all the notes that can be played by the Buttons  36 => C2
int MajorKeyButton[] = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16};// Number of semitones for each note of a major Key

int LedButtonPin[] = {34, 35, 36, 37, 38 ,39 ,40, 41, 42, 43, 44, 45};   // LED Pin numbers (for the Arduino Mega)
byte NbLeds = NbButtons; // Number of Leds

int PiezoPin[] = {A12, A13, A14, A15}; // Piezo Sensors Pin numbers (using Arduino Mega)
int NbPiezo = 4; // Number of Piezo sensors
int FirstPitchPiezo = 103; // Pitch of the lowest note played by the Piezos 103 => G8
int MajorKeyPiezo[] = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16}; // Number of semitones for each note of a major Key
int ThresholdPiezo = 60; // Anything over fifty means we've hit a Piezo
int DelayPiezo = 150;  // Delay minimum between two knock on a piezo
int LedPiezoPin[] = {2, 3, 4, 5}; // Piezo's LED Pin numbers

int Joystick[] = {A8,A9,A10, A11}; // Joysticks Pin numbers
int NbJoystick = 2; // Number of Joysticks
int JoystickPin = 0; // Variable to record the Joystick current value
int JoystickValue[] = {0, 0, 0, 0}; // Joystick value mapped between 0 and 127 to be compatible with midi protocol
int PreviousJoystickValue[] = {0, 0, 0, 0}; // Variable to record the Joystick last value

// functions

//  This function send a MIDI message via the serial port to the Hairless-midiserial software
void MIDImessage(byte NoteOrCmd, byte Pitch, byte velocity)
    {
    Serial.write(NoteOrCmd);
    Serial.write(Pitch);
    Serial.write(velocity);
    }

// the setup function runs once when you press reset or power the board
void setup() {

//Serial.begin(31250); // 31250 bps rate if you communicate via a midi shield
  Serial.begin(9600);  // 9600 bps rate if you communicate  via USB port (serial)

// initialize digital pin i as an output for the Leds
  for (int i=0; i<NbLeds; i++) {
  pinMode(LedButtonPin[i], OUTPUT);}

// initialize digital pin i as an output for the Leds Piezo.
  for (int i=0; i<NbPiezo; i++) {
  pinMode(LedPiezoPin[i], OUTPUT);}

// initialize digital pin i as an input for the Buttons.
  for (int i=0; i<NbButtons; i++) {
  pinMode(ButtonPin[i], INPUT);}

} //end void setup()

void loop() {

// Buttons sensors part

  for (int i=0; i<NbButtons; i++){
    // Read the state of the pushButton value:
    ButtonState[i] = digitalRead(ButtonPin[i]);
    int PitchButton = FirstPitchButton+MajorKeyButton[i]; // Pitch of the note to play
    // Check if the pushButton is pressed. if it is, the ButtonState is HIGH:
    if(PreviousButtonState[i] != ButtonState[i]){
      if (ButtonState[i] == HIGH) {
         PreviousButtonState[i] = ButtonState[i]; // Backup the value of the button
        // turn LED on:
        digitalWrite(LedButtonPin[i], HIGH);
        // Play note from FirstPitchButton+MajorKeyButton[i]
        MIDImessage(NoteON,PitchButton, 127); // Send the corresponding midi message to the serial port
        }
        else {
          PreviousButtonState[i] = ButtonState[i];
          // turn LED off:
          digitalWrite(LedButtonPin[i], LOW);
          // Stop the note (note off)
           MIDImessage(NoteON,PitchButton, 0); // Send the corresponding midi message to the serial port
            }
   } else {digitalWrite(LedButtonPin[i], ButtonState[i]);};
 }; // End of Buttons sensors part

// Piezo sensors part

  for (int i=0; i<NbPiezo; i++) {
    int PitchPiezo = FirstPitchPiezo+MajorKeyPiezo[i];
    int PiezoVal = analogRead(PiezoPin[i]);
    if (PiezoVal>ThresholdPiezo){
      MIDImessage(NoteON, PitchPiezo, 127); // Play the midi note
      digitalWrite(LedPiezoPin[i], HIGH); // Turn on the led
      delay(DelayPiezo);
      MIDImessage(NoteON, PitchPiezo, 0); // Turn off the midi note
      digitalWrite(LedPiezoPin[i],LOW);
      }
  }; // End of Piezo sensors part

// Joysticks sensors part

for (int i=0; i<NbJoystick*2; i++){
  JoystickPin = analogRead(Joystick[i]);
  JoystickValue[i] = map(JoystickPin, 0, 1023, 5, 123); // the mapped value should be from 0 to 127 for true midi signal but the extreme often sound to agressive so I choose 5 to 123
  if(PreviousJoystickValue[i]!= JoystickValue[i]){// If the Joystick has been moved
      PreviousJoystickValue[i] = JoystickValue[i]; // Backup the value of the joystick
      MIDImessage(ControlChange, i, JoystickValue[i]); // Send the corresponding midi message to the serial port
    }
}; // End of Joysticks sensors part

} // End void loop()

Découpe Laser

Création d'une boite de 11x11x40 cm dans Inkscape à l'aide du module TabbedBoxMaker. Il manque un peu d'espace entre les créneaux pour que la boite soir plus facile à fermer (joint clearance).

:projet:controleur_midi:decoupe_controleur_midi.svg.zip

decoupelaser.jpg

Assemblage

workinprogress.jpg

arriereprototype.jpg

profilprototype1.jpg

profilprototype2.jpg

How To

Pour utiliser le code ci-dessus, il faut installer le logiciel Hairless midi serial

En « serial port », sélectionner l’arduino. En midi out, il faut sélectionner le bus disponible dans votre DAW (Digital Audio Workstation).

Dans Ableton live, il faut que les cases “Piste” et “Télec.” du Bus soit sur On dans les Préférences midi.

Pour les utilisateurs de Windows, il faudra en plus d’Hairless midiserial installer LoopMidi

Pour que ça fonctionne , il faut surtout respecter l’ordre suivant :

  1. Brancher l’arduino
  2. Lancer Hairless midi serial
  3. Lancer LoopMidi si besoin
  4. Lancer Ableton live ou votre DAW