Library for DMX and MIDI protocol
Dependents: Arts_DMX512_carteV3_MIDI Arts_DMX512_carteV3_MIDI_nRF
DMX_MIDI.cpp
- Committer:
- villemejane
- Date:
- 2021-12-12
- Revision:
- 0:9cf6898e6b66
File content as of revision 0:9cf6898e6b66:
/****************************************************************************/ /* DMX_MIDI module library */ /****************************************************************************/ /* LEnsE / Julien VILLEMEJANE / Institut d'Optique Graduate School */ /****************************************************************************/ /* Library - DMX_MIDI.cpp file */ /****************************************************************************/ /* Tested on Nucleo-L476RG / 11th nov 2021 */ /****************************************************************************/ #include "DMX_MIDI.h" /* Entrées - Sorties */ // DMX Serial dmx(PA_0, PA_1); DigitalOut out_tx(D5); DigitalOut start(D4); //envoie des données DigitalOut enableDMX(D6); // MIDI Serial midi(D8, D2); // Analogiques AnalogIn CV_volume(PC_1); AnalogIn CV_pitch(PB_0); AnalogIn variationR(PC_0); AnalogIn variationG(PC_2); AnalogIn variationB(PC_3); /* Variables globales */ char dmx_data[SAMPLES] = {0}; int rgb; // Midi char cpt_midi; char new_data_midi, new_note_midi; char midi_data[3], note_data, velocity_data; char control_ch, control_value; /* Variation de lumière douce - Projet Arts et Sciences */ const uint8_t vague[360]={ 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 17, 18, 20, 22, 24, 26, 28, 30, 32, 35, 37, 39, 42, 44, 47, 49, 52, 55, 58, 60, 63, 66, 69, 72, 75, 78, 81, 85, 88, 91, 94, 97, 101, 104, 107, 111, 114, 117, 121, 124, 127, 131, 134, 137, 141, 144, 147, 150, 154, 157, 160, 163, 167, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 202, 205, 208, 210, 213, 215, 217, 220, 222, 224, 226, 229, 231, 232, 234, 236, 238, 239, 241, 242, 244, 245, 246, 248, 249, 250, 251, 251, 252, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 254, 253, 253, 252, 251, 251, 250, 249, 248, 246, 245, 244, 242, 241, 239, 238, 236, 234, 232, 231, 229, 226, 224, 222, 220, 217, 215, 213, 210, 208, 205, 202, 200, 197, 194, 191, 188, 185, 182, 179, 176, 173, 170, 167, 163, 160, 157, 154, 150, 147, 144, 141, 137, 134, 131, 127, 124, 121, 117, 114, 111, 107, 104, 101, 97, 94, 91, 88, 85, 81, 78, 75, 72, 69, 66, 63, 60, 58, 55, 52, 49, 47, 44, 42, 39, 37, 35, 32, 30, 28, 26, 24, 22, 20, 18, 17, 15, 13, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 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, 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}; /* Fonction d'initialisation de la liaison DMX */ void initDMX(void){ 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 sortie 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); } /* Fonction d'initialisation de la liaison MIDI - version beta */ void initMIDI2(void){ debug_pc.baud(115200); debug_pc.format(8, SerialBase::None, 1); debug_pc.attach(&ISR_midi_in2, Serial::RxIrq); } /* Detection d'une note reçue en MIDI */ bool isNoteMIDIdetected(void){ if(new_note_midi == 1) return true; else return false; } /* Note reçue en MIDI traitée */ void resetNoteMIDI(void){ new_note_midi = 0; } /* Detection d'un controle reçu en MIDI */ bool isCCMIDIdetected(void){ if(new_data_midi == 1) return true; else return false; } /* Controle reçu en MIDI traité */ void resetCCMIDI(void){ new_data_midi = 0; } /* Renvoie la note reçue sur la liaison MIDI */ void resendNoteMIDI(void){ midi.putc(MIDI_NOTE_ON); midi.putc(note_data); midi.putc(127); } /* Renvoie la note reçue sur la liaison MIDI - version beta */ void resendNoteMIDI2(void){ debug_pc.putc(MIDI_NOTE_ON); debug_pc.putc(note_data); debug_pc.putc(127); } /* Joue une note sur la liaison MIDI */ void playNoteMIDI(char note, char velocity){ midi.putc(MIDI_NOTE_ON); midi.putc(note); midi.putc(velocity); } /* Joue une note sur la liaison MIDI - version beta */ void playNoteMIDI2(char note, char velocity){ debug_pc.printf("%x %x \r\n", note, velocity); } /* Stoppe une note sur la liaison MIDI */ void stopNoteMIDI(char note, char velocity){ midi.putc(MIDI_NOTE_OFF); midi.putc(note); midi.putc(velocity); } /* Fonction d'appel à une variation de lumière en fonction d'un angle @out : R G B au format 24 bits */ int sineLED(int angle) { return (vague[(angle+120)%360] << 16) + (vague[angle] << 8) + vague[(angle+240)%360]; } /* Fonction d'interruption sur MIDI */ void ISR_midi_in(void){ debug_out = !debug_out; 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] == MIDI_NOTE_ON) || (midi_data[0] == MIDI_NOTE_OFF)){ new_note_midi = 1; 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]; } } } } /* Fonction d'interruption sur MIDI - version beta */ void ISR_midi_in2(void){ debug_out = !debug_out; char data = debug_pc.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] == MIDI_NOTE_ON)){ // || (midi_data[0] == MIDI_NOTE_OFF)){ new_note_midi = 1; 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]; } } } }