Clarinette basse augmentée

boitier avec Teensy en midi-USB

// pour TEENSY
#include <Bounce.h>
#include <Statistic.h> // pour auto-calibration des joysticks par mise en mémoire des valeurs min et max de chaque axe
byte midiChannel = 1;
byte reception_midi_channel = 16;
byte CTRL_num = 1; // premier numéro de controleur midi (les 10 boutons)
byte CTRL_Joy = 22; // le premier controlleur pour joystick et capteur d'acceleration (5 en tout)
byte CTRL_Accl_OnOff = 100; // controleur pour on off reception données du capteur d'acceleration
//byte CTRL_calibrage = 101; // reception ordre de calibrage du joystick
byte CTRL_channel_select = 101; // le controleur pour choisir le canal d'envoi

/*
A0 : joystick 1
A1 : joystick 2
A2 : capteur d'acceleration Y

D4/BP4 : D0/BP0
D5/BP5 : D1/BP1
D6/BP6 : D2/BP2
D7/BP7 : D3/BP3

*/
//entrées analogiques
#define X1 0
#define Y1 1
#define Accl 2
//joystick
Statistic myStatsX1; 
Statistic myStatsY1;
int valX1 = 0;
int valY1 = 0;
int valX1_1 = 0;
int valY1_1 = 0;
int valX1_2 = 0;
int valY1_2 = 0;
int minX1 = 0;
int maxX1 = 1023;
int minY1 = 0;
int maxY1 = 1023;
int valX1_1_prev = 127;
int valY1_1_prev = 127;
int valX1_2_prev = 127;
int valY1_2_prev = 127;
int zero_X = 0;
int zero_Y = 0;
long timeX1_1 = 0;
long timeY1_1 = 0;
long timeX1_2 = 0;
long timeY1_2 = 0;
// capteur d'acceleration
Statistic myStatsAccl;
int valAccl = 0;
int minAccl = 0;
int maxAccl = 1023;
int valAccl_prev = 127;
long timeAccl = 0;
byte AcclOnOff = 0;
//

//entrées logiques
#define BP_Joy 0
#define BP0 1
#define BP1 2
#define BP2 3
#define BP3 4
#define BP4 5
#define BP5 6
#define BP6 7
#define BP7 8
#define PouceGauche 9
//#define res 10

// BP_JOY, BP0, BP1, BP2, BP3, BP4, BP5, BP6, BP7, BP_pouce_gauche
int valBP[] = {0,0,0,0,0,0,0,0,0,0}; 
int valBP_prev[] = {1,1,1,1,1,1,1,1,1,1};

Bounce bouncerBP_Joy = Bounce(BP_Joy,25);
Bounce bouncerBP0 = Bounce(BP0,25);
Bounce bouncerBP1 = Bounce(BP1,25);
Bounce bouncerBP2 = Bounce(BP2,25);
Bounce bouncerBP3 = Bounce(BP3,25);
Bounce bouncerBP4 = Bounce(BP4,25);
Bounce bouncerBP5 = Bounce(BP5,25);
Bounce bouncerBP6 = Bounce(BP6,25);
Bounce bouncerBP7 = Bounce(BP7,25);
Bounce bouncerPouceGauche = Bounce(PouceGauche,25);
//Bounce bouncerRes = Bounce(res,25);



void setup()
{
  //setup des entrées TOR
  for(byte i = 0; i < 10; i++)
  {
    pinMode(i, INPUT);
    digitalWrite(i, HIGH);
  }
  myStatsX1.clear(); //explicitly start clean  
  myStatsY1.clear(); //explicitly start clean  
  myStatsAccl.clear(); //explicitly start clean 
//calibrage sur le zéro : (position centrale)
  zero_X = analogRead(X1);
  zero_Y = analogRead(Y1);

}// fin setup

void loop()
{
  // midi in et out  
if (usbMIDI.read()) 
{

  if(usbMIDI.getChannel() == reception_midi_channel)
  {
    if (usbMIDI.getType() == 3) //0 = Note Off, 1 = Note On, 2 = Velocity Change, 3 = Control Change, 4 = Program Change, 5 = After Touch, 6 = Pitch Bend, 7 = System Exclusive 
    {
       byte data1 = usbMIDI.getData1();
       byte data2 = usbMIDI.getData2();

       if(data1 == CTRL_Accl_OnOff)
       {
         if(data2 == 0)
         {
           AcclOnOff = 0;
         }
         else if(data2 == 127)
         {
           AcclOnOff = 1;
         }
         else{}
       }
       else if(data1 == CTRL_channel_select)
       {
         midiChannel = data2;
         if(midiChannel ==0)
         {
           midiChannel = 1;
         }
         else if(midiChannel > 16)
         {
           midiChannel = 16;
         }
         else{}
       }
       else{}
    }
    else{}
  }
 else{}  
}
else{}
//end read usb midi

  // Update the debouncer
  bouncerBP0.update ( );
  bouncerBP1.update ( );
  bouncerBP2.update ( );
  bouncerBP3.update ( );
  bouncerBP4.update ( );
  bouncerBP5.update ( );
  bouncerBP6.update ( );
  bouncerBP7.update ( );
  bouncerBP_Joy.update ( );
  bouncerPouceGauche.update ( );  
  // Get the update value
   valBP[0] = bouncerBP_Joy.read(); 
   valBP[1] = bouncerBP0.read();
   valBP[2] = bouncerBP1.read();
   valBP[3] = bouncerBP2.read();
   valBP[4] = bouncerBP3.read();
   valBP[5] = bouncerBP4.read();
   valBP[6] = bouncerBP5.read(); 
   valBP[7] = bouncerBP6.read();
   valBP[8] = bouncerBP7.read();
   valBP[9] = bouncerPouceGauche.read();  

    // send MIDI according to Buttons state
    // version momentary switch
    /*
 for(byte i = 0; i<10; i++)
  { 
   if (valBP[i] != valBP_prev[i])
   {
    if(valBP[i] == 1)
     {
      usbMIDI.sendControlChange(CTRL_num +i, 127, midiChannel);  
     }
    else
     {
      usbMIDI.sendControlChange(CTRL_num +i, 0, midiChannel); 
     }  
   valBP_prev[i] =  valBP[i];    
  }
 }
 */
 // version togle switch
 for(byte i = 0; i<10; i++)
  { 
   if (valBP[i] < valBP_prev[i])
   {
      usbMIDI.sendControlChange(CTRL_num +i, 127, midiChannel);
      valBP_prev[i] =  valBP[i];  
   }
   else if (valBP[i] > valBP_prev[i])
     {
      usbMIDI.sendControlChange(CTRL_num +i, 0, midiChannel); 
      valBP_prev[i] =  valBP[i]; 
     }  

  } 
  //
  //analog joysticks
  valX1 = analogRead(X1);
  valY1 = analogRead(Y1);
  myStatsX1.add(valX1);
  myStatsY1.add(valY1);
  valX1_1 = map(valX1,(long)myStatsX1.minimum(), zero_X, 127, 0);
  valX1_2 = map(valX1,zero_X,(long)myStatsX1.maximum(), 0, 127);  
  valY1_1 = map(valY1,(long)myStatsY1.minimum(), zero_Y, 127, 0);
  valY1_2 = map(valY1,zero_Y,(long)myStatsY1.maximum(), 0, 127);
  if(valX1_1 < 5)
  {
    valX1_1 = 0;
  }
    if(valX1_2 < 5)
  {
    valX1_2 = 0;
  }
  if(valY1_1 < 5)
  {
    valY1_1 = 0;
  }
    if(valY1_2 < 5)
  {
    valY1_2 = 0;
  }  
  valX1_1 = constrain(valX1_1, 0 , 127);
  valX1_2 = constrain(valX1_2, 0 , 127);  
  valY1_1 = constrain(valY1_1, 0 , 127);
  valY1_2 = constrain(valY1_2, 0 , 127);

long time = millis();  

  if(valX1_1 != valX1_1_prev && time - timeX1_1 > 15){
    usbMIDI.sendControlChange(CTRL_Joy, valX1_1, midiChannel); 
    valX1_1_prev = valX1_1;
    timeX1_1 = millis();
  } 
  else{}
  if(valX1_2 != valX1_2_prev && time - timeX1_2 > 15){
    usbMIDI.sendControlChange(CTRL_Joy+1, valX1_2, midiChannel); 
    valX1_2_prev = valX1_2;
    timeX1_2 = millis();
  } 
  else{}  
  if(valY1_1 != valY1_1_prev && time - timeY1_1 > 15){
    usbMIDI.sendControlChange(CTRL_Joy+2, valY1_1, midiChannel); 
    valY1_1_prev = valY1_1;
    timeY1_1 = millis();
  } 
  else{}
  if(valY1_2 != valY1_2_prev && time - timeY1_2 > 15){
    usbMIDI.sendControlChange(CTRL_Joy+3, valY1_2, midiChannel); 
    valY1_2_prev = valY1_2;
    timeY1_2 = millis();
  } 
  else{} 

 //accelerometre
 valAccl = analogRead(Accl);
 //usbMIDI.sendPitchBend(valAccl,midiChannel); 
 //myStatsAccl.add(valAccl);
 //valAccl = map(valAccl,(long)myStatsAccl.minimum(), (long)myStatsAccl.maximum(), 0, 127);
   valAccl = map(valAccl,0, 1023, 0, 127);
   valAccl = constrain(valAccl, 0, 127);
if(AcclOnOff == 1)
{
   if(valAccl != valAccl_prev && time - timeAccl > 15){
    usbMIDI.sendControlChange(CTRL_Joy+4, valAccl, midiChannel); 
    valAccl_prev = valAccl;
    timeAccl = millis();
  } 
  else{}
}
else{}
}
  • acceleromètre ADXL335
  • teensy 2 (5 Volts)
  • joystick de manette de jeu
  • poussoirs à membrane