/****************************************************************************/ /* PROJET SOLEC : APPLICATION POUR PILOTAGE DMX/MIDI */ /****************************************************************************/ /* CORON AUDREY, CHIRIER AGATHE, HASSANALY SAPNA, KOUBA SIMON */ /****************************************************************************/ /* Institut d'Optique Graduate School */ /****************************************************************************/ // Ce code permet de commander 4 projecteurs (sortie DMX) à l'aide d'un clavier // de type piano (sortie MIDI), les deux etant relies par une carte nucleo. // Nous avons programme 3 modes : // - 1er mode (potentiometre <0.33V): les projecteurs affichent tous la même couleur pour une note; // - 2ème mode (0.33V0.65V): les projecteurs affichent une succession de 16 motifs, et la //note defini la vitesse avec laquelle les motifs s'enchaînent ("do" est le plus // rapide, "si" le plus lent). // Pour changer de mode on utilise un potentiomètre. #include "mbed.h" #include "platform/mbed_thread.h" //tableaux mode 1 (scriabin) const uint8_t scriabin_r[12] = {255, 255, 255, 128, 0, 0, 0, 0, 0, 127, 255, 255}; // composantes rouges des LED pour les 12 notes possibles const uint8_t scriabin_g[12] = {0, 128, 255, 255, 255, 255, 255, 128, 0, 0, 0, 0}; // composantes vertes des LED pour les 12 notes possibles const uint8_t scriabin_b[12] = {0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 255, 127}; // composantes bleues des LED pour les 12 notes possibles //tableaux mode 2 (controleur) //projecteur 1 //projecteur 2 //projecteur 3 //projecteur 4 //motifs: 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 const uint8_t controleur_bright[48] = {255,255,255,255,255,255,255,255,255,255,255,255 , 255,255,255,255,255,255,255, 10,255,255,255,255 , 255,255,255,255,255,255,255,255,255,255,255,255 , 255,255,255,255,255,255,255, 10,255,255,255,255 }; // intensite const uint8_t controleur_r[48] = {209, 0, 0,255,255, 80,249, 0,178, 0,255, 0 , 24,255, 0,232, 0, 0,249, 0,245,245,255, 0 , 209,253, 0,135, 0, 0,249, 0,178, 0,255,255 , 24,255, 0, 0,255, 80,249, 0,245,245, 0,255 }; // composantes rouges const uint8_t controleur_g[48] = { 27,255, 0, 0, 0, 61, 80, 0, 12,255, 0,142 , 151,255, 0, 0,255,255, 80, 0,117, 0,255,142 , 27,121, 0, 0, 0,255, 80, 0, 12,255,255,255 , 151, 20, 0, 0,255, 61, 80, 0,117, 0, 0,255 }; // composantes vertes const uint8_t controleur_b[48] = { 27, 0,255,104, 0,255,188,255,255, 0, 0,255 , 211, 0, 0,255, 0, 10,188,255, 0,255,255,255 , 27, 4,255,255,255, 10,188,255,255, 0,255, 0 , 211, 0, 0,255,255,255,188,255, 0,255,255, 0 }; // composantes bleues const uint8_t controleur_w[48] = { 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0 , 0, 0,255, 0, 0,128, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0 , 0, 0,255, 0, 0,128, 0, 0, 0, 0, 0, 0 }; // leds blanches const uint8_t controleur_strobe[48] = { 0, 0, 0, 0, 0, 0,200, 0,100, 0, 0, 0 , 0, 0,200, 0, 0, 0,200, 0,200, 0, 0, 0 , 0, 0, 0, 0, 0, 0,200, 0,100, 0, 0, 0 , 0, 0,200, 0, 0, 0,200, 0,200, 0, 0, 0 }; // effet stroboscopique //tableaux mode 3 (sequenceur) //projecteur 1 //projecteur 2 //projecteur 3 //projecteur 4 //motifs: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 const uint8_t sequenceur_bright[64] = {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100 , 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100 , 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100 , 100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}; // intensite const uint8_t sequenceur_r[64] = {255,255,255,255,255,255, 20, 20, 33, 33, 0, 0,196,196,255,255 , 255,255,255,255,255, 20, 20, 33, 33, 0, 0,196,196,255,255,255 , 255,255,255,255,255,255, 20, 20, 33, 33, 0, 0,196,196,255,255 , 255,255,255,255,255, 20, 20, 33, 33, 0, 0,196,196,255,255,255}; // composantes rouges const uint8_t sequenceur_g[64] = { 0, 0, 70, 70,142,142,255,255,218,218, 0, 0, 41, 41, 12, 12 , 0, 70, 70,142,142,255,255,218,218, 0, 0, 41, 41, 12, 12, 0 , 0, 0, 70, 70,142,142,255,255,218,218, 0, 0, 41, 41, 12, 12 , 0, 70, 70,142,142,255,255,218,218, 0, 0, 41, 41, 12, 12, 0}; // composantes vertes const uint8_t sequenceur_b[64] = { 0, 0, 16, 16, 0, 0, 44, 44,255,255,255,255,255,255,214,214 , 0, 16, 16, 0, 0, 44, 44,255,255,255,255,255,255,214,214, 0 , 0, 0, 16, 16, 0, 0, 44, 44,255,255,255,255,255,255,214,214 , 0, 16, 16, 0, 0, 44, 44,255,255,255,255,255,255,214,214, 0}; // composantes bleues const uint8_t sequenceur_w[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // leds blanches const uint8_t sequenceur_strobe[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // effet stroboscopique const double vitessemode[12]={0.001, 0.01, 0.05, 0.1, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8, 2.1,2.4 }; // reglage de la vitesse du mode sequenceur ( de 1 millieme de seconde à 2.4 secondes) //definition de l'entree MIDI #define MIDI_NOTE_ON 0x90 #define MIDI_NOTE_OFF 0x80 #define MIDI_CC 0xB0 #define SAMPLES 512 int i; // numero du projecteur int j; // numero du motif pour le mode 3 int note_mode3; // note enrengistree quand on reappui sur une note alors que le motif n'est pas fini pour le mode 3 Serial debug_pc(USBTX, USBRX); //debugage: permet de visualiser des informations via TeraTerm InterruptIn my_bp(USER_BUTTON); // definition des entrees et sortie de la Nucleo Serial dmx(A0, A1); Serial midi(D8, D2); DigitalOut out_tx(D5); DigitalOut start(D4); DigitalOut enableDMX(D6); AnalogIn CV_volume(PC_1); AnalogIn CV_pitch(PB_0); AnalogIn variation(A3); //potentiometre // DMX char dmx_data[SAMPLES] = {0}; char nb = 0; void initDMX(); void updateDMX(); // MIDI char cpt_midi; char new_data_midi, new_note_midi; char midi_data[3], channel_data, note_data, velocity_data; char control_ch, control_value; char note; void initMIDI(void); void ISR_midi_in(void); bool isNoteMIDIdetected(void); //Potentiometre double potentio; // recupère la valeur du potentiomètre afin de changer de mode // Boucle principale int main() { double time; //Debuggage debug_pc.baud(115200); debug_pc.printf("Essai DMX512\r\n"); initDMX(); //initialisation de la sortie DMX initMIDI(); //initialisation de l'entree MIDI while(1) { if(isNoteMIDIdetected()){ debug_pc.printf("C=%d,N=%d,V=%d\r\n", channel_data, note_data, velocity_data); //visualisation des donnees MIDI if (velocity_data) { //boucle pour que relacher une touche ne soit pas considere comme une nouvelle note note= note_data%12; // le reste de la division euclidienne par 12 donne la hauteur de la note jouee } debug_pc.printf("N=%d\r\n", note); // visualisation de la note potentio=variation.read(); debug_pc.printf("pressoir %lf \r\n",potentio ); if (potentio<0.33){ //Mode 1 for(int i=0; i<4; i++){ //pour chaque projecteur dmx_data[0+i*8] = 100; // intensite dmx_data[1+i*8] = scriabin_r[note]; //rouge dmx_data[2+i*8] = scriabin_g[note]; //vert dmx_data[3+i*8] = scriabin_b[note]; //bleu dmx_data[4+i*8] = 0 ; // LEDs blanches du milieu dmx_data[5+i*8] = 0; //effet stroboscopique dmx_data[6+i*8] = 0; // absence de fonction pre-enregistree } } if (0.330.65){ //Mode 3 (motif en boucle infinie) for(int j=0; j<16; j++){ // pour chaque motif for(int i=0; i<4; i++){ //pour chaque projecteur dmx_data[0+i*8] = sequenceur_bright[j+i*16]; //intensite dmx_data[1+i*8] = sequenceur_r[j+i*16]; //rouge dmx_data[2+i*8] = sequenceur_g[j+i*16]; //vert dmx_data[3+i*8] = sequenceur_b[j+i*16]; //bleu dmx_data[4+i*8] = sequenceur_w[j+i*16]; //LEDs blanches du milieu dmx_data[5+i*8] = sequenceur_strobe[j+i*16]; //effet stroboscopique dmx_data[6+i*8] = 0; //absence de fonction pre-enregistree } if (isNoteMIDIdetected()){//permet de sortir de la boucle for si on reactionne une note alors que le motif n'est pas fini new_note_midi = 0; updateDMX(); note_mode3=note; debug_pc.printf("C=%d,N=%d,V=%d\r\n", channel_data, note_data, velocity_data); note=note_data%12; if (note!=note_mode3){//sort de la boucle si la nouvelle note appuyee est differente de l'ancienne break; } } new_note_midi = 0; updateDMX(); potentio=variation.read(); wait_us(vitessemode[note]*1E6); //reglage de la vitesse de transition } } new_note_midi = 0; // reinitialisation updateDMX(); // envoi des mises à jour dans les projecteurs wait_us(10000); // temps minimal d'attente entre deux notes } } } // Fonction d'initialisation de la liaison DMX void initDMX(){ // Initialisation DMX dmx.baud(250000); dmx.format (8, SerialBase::None, 2); enableDMX = 0; // Initialisation canaux DMX for(int k = 0; k < SAMPLES; k++){ dmx_data[k] = 0; } updateDMX(); } // Fonction de mise à jour de la liaison DMX void updateDMX(){ enableDMX = 1; start = 1; // /start out_tx = 0; // break wait_us(88); out_tx = 1; // mb wait_us(8); out_tx = 0; // break start = 0; dmx.putc(0); // Start for(int i = 0; i < SAMPLES; i++){ dmx.putc(dmx_data[i]); // data } wait_us(23000); // time between frame } //Fonction d'initialisation de la liaison MIDI void initMIDI(void){ midi.baud(31250); midi.format(8, SerialBase::None, 1); midi.attach(&ISR_midi_in, Serial::RxIrq); } //Detection d'une note reçue en MIDI bool isNoteMIDIdetected(void){ if(new_note_midi == 1) return true; else return false; } //Fonction d'interruption sur MIDI void ISR_midi_in(void){ char data = midi.getc(); if(data >= 128) cpt_midi = 0; else cpt_midi++; midi_data[cpt_midi] = data; if(cpt_midi == 2){ cpt_midi = 0; if(((midi_data[0] & 0xF0) == MIDI_NOTE_ON) || ((midi_data[0] & 0xF0) == MIDI_NOTE_OFF)){ new_note_midi = 1; channel_data = midi_data[0] & 0x0F; note_data = midi_data[1]; velocity_data = midi_data[2]; } else{ if(midi_data[0] == MIDI_CC){ new_data_midi = 1; control_ch = midi_data[1]; control_value = midi_data[2]; } } } }