Catégories
Liens
Ceci est une ancienne révision du document !
Un shield pour utiliser des connecteur USB (comme la brutbox).
L'avantage d'utiliser teensy en midi = pas de drivers à installer = pratique dans les écoles !
Pour installer le firmware Midi, voir la page consacrée à Arduino et MIDI.
Code Arduino Uno : malinette_midi_uno.ino
/* * Malinette Midi for Arduino Uno * * Open/Close Analog Sensors * Outputs (Digital, PWM, Servo) except 0 and 1 (rx/tx) * * http://malinette.info * Reso-nance Numérique * 24/06/16 */ #include <Servo.h> #include <MIDI.h> MIDI_CREATE_DEFAULT_INSTANCE(); const int channel = 4; // midi channel const int anaNb = 4; // number of inputs const int outNb = 13; // number of outputs (note that we have 11 outputs, we don't use rx/tx) const int offsetAna = 20; // > ctlout 20 to control ana const int offsetOut = 30; // > ctlout 30 to control ana const long interval = 30; // sampling rate // SENSORS int anaState[anaNb]; // Analog on/off (O or 1); int anaValues[anaNb]; // current analog values int anaLastValues[anaNb]; // previous analog values //OUT int outState[outNb]; //modes (0,1,2,3) (none, digital, pwm, servo) Servo servos[6]; // SAMPLING RATE unsigned long currentMillis; unsigned long previousMillis = 0; // --------------- SETUP --------------- // void setup() { // Setup output pins (start from 2) for (int i = 2; i < (outNb - 2); i++) { pinMode(i, OUTPUT); } // Set Callback function MIDI.setHandleControlChange(handleControlChange); // Initiate MIDI communications, listen to all channels MIDI.begin(channel); } // --------------- LOOP --------------- // void loop() { MIDI.read(); // Sampling rate currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // Analog sensors loop for (int i = 0; i < anaNb; i++) { if (anaState[i] > 0) { // Test on/off anaValues[i] = (int) analogRead(i) / 8; // 10 bits > 7 bits if (anaValues[i] != anaLastValues[i]) { MIDI.sendControlChange(i, anaValues[i], channel); anaLastValues[i] = anaValues[i]; } } } } } // --------------- Receive Control Change --------------- // void handleControlChange(byte channel, byte number, byte value) { // outputs if(number < offsetAna) { setOutValue(number, value); } // ana states else if (number >= offsetAna && number < offsetOut) { anaState[number-offsetAna] = value; } // outputs states else if (number >= offsetOut) { setOutState(number-offsetOut, value); } } // --------------- SET OUTPUT --------------- // void setOutValue(int number, int value) { int state = outState[number]; if( state == 1) { // digital mode if(value == 0) {digitalWrite(number, LOW);} if(value >= 1) {digitalWrite(number, HIGH);} } else if( state == 2){ // pwm mode analogWrite(number, map(value,0,127,0,255)); } else if( state == 3){ // servo mode if (servos[number].attached()) {servos[number].write(map(value,0,127,0,180));} } } void setOutState(int number, int value) { // Check last state to turn off if ( outState[number] == 1) {digitalWrite(number, LOW);} else if ( outState[number] == 2) {analogWrite(number, 0);} if (value == 3) { if (!servos[number].attached()) {servos[number].attach(number);} } else { if (servos[number].attached()) {servos[number].detach();} } outState[number] = value; }
Code Arduino Leonardo : malinette_midi_leonardo.ino
/* * Malinette Midi with Teensy or Leonardo * * Open/Close Analog Sensors * Outputs (Digital, PWM, Servo) except 0 and 1 (rx/tx) * * http://malinette.info * Reso-nance Numérique * 24/06/16 */ #include <Servo.h> const int channel = 4; // midi channel const int anaNb = 4; // number of inputs const int outNb = 13; // number of outputs (note that we have 11 outputs, we don't use rx/tx) const int offsetAna = 20; // > ctlout 20 to control ana const int offsetOut = 30; // > ctlout 30 to control ana int rate = 30; // sampling rate // SENSORS int anaState[anaNb]; // Analog on/off (O or 1); int anaValues[anaNb]; // current analog values int anaLastValues[anaNb]; // previous analog values //OUT int outState[outNb]; //modes (0,1,2,3) (none, digital, pwm, servo) Servo servos[6]; // SAMPLING RATE elapsedMillis msec = 0; // --------------- SETUP --------------- // void setup() { // Setup output pins (start from 2) for (int i = 2; i < (outNb - 2); i++) { pinMode(i, OUTPUT); } // Set Callback function usbMIDI.setHandleControlChange(handleControlChange); // Initiate MIDI communications, listen to all channels //usbMIDI.begin(channel); } // --------------- LOOP --------------- // void loop() { // Sampling rate if (msec >= rate) { msec = 0; // Analog sensors loop for (int i = 0; i < anaNb; i++) { if (anaState[i] > 0) { // Test on/off anaValues[i] = (int) analogRead(i) / 8; // 10 bits > 7 bits if (anaValues[i] != anaLastValues[i]) { usbMIDI.sendControlChange(i, anaValues[i], channel); anaLastValues[i] = anaValues[i]; } } } } // MIDI Controllers should discard incoming MIDI messages. // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash while (usbMIDI.read()) { // ignore incoming messages } } // --------------- Receive Control Change --------------- // void handleControlChange(byte channel, byte number, byte value) { // outputs if(number < offsetAna) { setOutValue(number, value); } // ana states else if (number >= offsetAna && number < offsetOut) { anaState[number-offsetAna] = value; } // outputs states else if (number >= offsetOut) { setOutState(number-offsetOut, value); } } // --------------- SET OUTPUT --------------- // void setOutValue(int number, int value) { int state = outState[number]; if( state == 1) { // digital mode if(value == 0) {digitalWrite(number, LOW);} if(value >= 1) {digitalWrite(number, HIGH);} } else if( state == 2){ // pwm mode analogWrite(number, map(value,0,127,0,255)); } else if( state == 3){ // servo mode if (servos[number].attached()) {servos[number].write(map(value,0,127,0,180));} } } void setOutState(int number, int value) { // Check last state to turn off if ( outState[number] == 1) {digitalWrite(number, LOW);} else if ( outState[number] == 2) {analogWrite(number, 0);} if (value == 3) { if (!servos[number].attached()) {servos[number].attach(number);} } else { if (servos[number].attached()) {servos[number].detach();} } outState[number] = value; }
Code Arduino : teensy_malinette.ino
// TEENSY - MALINETTE // Control inputs and outputs with MIDI messages // 30/05/2015 - http://reso-nance.org #include <Servo.h> //servo library // Pins int anaPins[] = {16,17,18,19,20,21}; // analog pins int outPins[] = {9,10}; // output pins const int anaNb = 6; // number of inputs const int outNb = 2; // number of outputs // Midi Mapping int anaCtl[] = {5,4,3,2,1,0}; // controller in int outCtl[] = {50, 51}; // controller out int anaStateCtl[] = {20, 21} ; // sensor on (20), sensor off (21) int outStateCtl[] = {60, 61}; // controller out modes (0,1,2,3) (none, digital, pwm, servo) // Ana Sensors int anaState[anaNb]; // state : on/off const int channel = 1; int anaValues[anaNb]; // current analog values int anaLastValues[anaNb]; // previous analog values // Sampling rate const long interval = 30; unsigned long currentMillis; unsigned long previousMillis = 0; // Output Servo servo0,servo1; int outState[outNb]; // states : stop, digital, pwm, servo void setup() { for (int i = 0; i < outNb; i++) { pinMode(outPins[i], OUTPUT); } usbMIDI.setHandleControlChange(OnControlChange); } void loop() { currentMillis = millis(); if(currentMillis - previousMillis >= interval) { previousMillis = currentMillis; for (int i = 0; i < anaNb; i++) { if(anaState[i] == 1) { // check first if the sensor is on anaValues[i] = analogRead(anaPins[i]) / 8 ; if (anaValues[i] != anaLastValues[i]) { usbMIDI.sendControlChange(anaCtl[i], anaValues[i], channel); anaLastValues[i] = anaValues[i]; } } } } //Discard incoming MIDI messages. while (usbMIDI.read()) { } } // Receive Midi Control Change void OnControlChange(byte channel, byte control, byte value) { // Analog sensors on/off if (control == anaStateCtl[0] ) {anaState[-value+(anaNb-1)] = 0;} else if (control == anaStateCtl[1] ) {anaState[-value+(anaNb-1)] = 1;} // Set Outputs Values else if (control == outCtl[0] ) {setOutValue(0, value, servo0);} else if (control == outCtl[1] ) {setOutValue(1, value, servo1);} // Set Outputs States (none, digital, pwm, servo) else if (control == outStateCtl[0] ) {setOutState(0, value, servo0);} else if (control == outStateCtl[1] ) {setOutState(1, value, servo1);} } // Set outputs void setOutValue(int outId, int value, Servo servo) { int state = outState[outId]; if( state == 1) { // digital mode if(value == 0) {digitalWrite(outPins[outId], LOW);} if(value >= 1) {digitalWrite(outPins[outId], HIGH);} } else if( state == 2){ // pwm mode analogWrite(outPins[outId], map(value,0,127,0,255)); } else if( state == 3){ // servo mode if (servo.attached()) {servo.write(map(value,0,127,0,180));} } } void setOutState(int outId, int value, Servo servo) { // Check last state to turn off if ( outState[outId] == 1) {digitalWrite(outPins[outId], LOW);} else if ( outState[outId] == 2) {analogWrite(outPins[outId], 0);} if (value == 3) { if (!servo.attached()) {servo.attach(outPins[outId]);} } else { if (servo.attached()) {servo.detach();} } outState[outId] = value; }