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