Library for DMX and MIDI protocol
Dependents: Arts_DMX512_carteV3_MIDI Arts_DMX512_carteV3_MIDI_nRF
DMX_MIDI.cpp@0:9cf6898e6b66, 2021-12-12 (annotated)
- Committer:
- villemejane
- Date:
- Sun Dec 12 12:41:49 2021 +0000
- Revision:
- 0:9cf6898e6b66
Library for DMX and MIDI protocol
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
villemejane | 0:9cf6898e6b66 | 1 | /****************************************************************************/ |
villemejane | 0:9cf6898e6b66 | 2 | /* DMX_MIDI module library */ |
villemejane | 0:9cf6898e6b66 | 3 | /****************************************************************************/ |
villemejane | 0:9cf6898e6b66 | 4 | /* LEnsE / Julien VILLEMEJANE / Institut d'Optique Graduate School */ |
villemejane | 0:9cf6898e6b66 | 5 | /****************************************************************************/ |
villemejane | 0:9cf6898e6b66 | 6 | /* Library - DMX_MIDI.cpp file */ |
villemejane | 0:9cf6898e6b66 | 7 | /****************************************************************************/ |
villemejane | 0:9cf6898e6b66 | 8 | /* Tested on Nucleo-L476RG / 11th nov 2021 */ |
villemejane | 0:9cf6898e6b66 | 9 | /****************************************************************************/ |
villemejane | 0:9cf6898e6b66 | 10 | |
villemejane | 0:9cf6898e6b66 | 11 | #include "DMX_MIDI.h" |
villemejane | 0:9cf6898e6b66 | 12 | |
villemejane | 0:9cf6898e6b66 | 13 | /* Entrées - Sorties */ |
villemejane | 0:9cf6898e6b66 | 14 | // DMX |
villemejane | 0:9cf6898e6b66 | 15 | Serial dmx(PA_0, PA_1); |
villemejane | 0:9cf6898e6b66 | 16 | DigitalOut out_tx(D5); |
villemejane | 0:9cf6898e6b66 | 17 | DigitalOut start(D4); //envoie des données |
villemejane | 0:9cf6898e6b66 | 18 | DigitalOut enableDMX(D6); |
villemejane | 0:9cf6898e6b66 | 19 | // MIDI |
villemejane | 0:9cf6898e6b66 | 20 | Serial midi(D8, D2); |
villemejane | 0:9cf6898e6b66 | 21 | // Analogiques |
villemejane | 0:9cf6898e6b66 | 22 | AnalogIn CV_volume(PC_1); |
villemejane | 0:9cf6898e6b66 | 23 | AnalogIn CV_pitch(PB_0); |
villemejane | 0:9cf6898e6b66 | 24 | AnalogIn variationR(PC_0); |
villemejane | 0:9cf6898e6b66 | 25 | AnalogIn variationG(PC_2); |
villemejane | 0:9cf6898e6b66 | 26 | AnalogIn variationB(PC_3); |
villemejane | 0:9cf6898e6b66 | 27 | |
villemejane | 0:9cf6898e6b66 | 28 | /* Variables globales */ |
villemejane | 0:9cf6898e6b66 | 29 | char dmx_data[SAMPLES] = {0}; |
villemejane | 0:9cf6898e6b66 | 30 | int rgb; |
villemejane | 0:9cf6898e6b66 | 31 | // Midi |
villemejane | 0:9cf6898e6b66 | 32 | char cpt_midi; |
villemejane | 0:9cf6898e6b66 | 33 | char new_data_midi, new_note_midi; |
villemejane | 0:9cf6898e6b66 | 34 | char midi_data[3], note_data, velocity_data; |
villemejane | 0:9cf6898e6b66 | 35 | char control_ch, control_value; |
villemejane | 0:9cf6898e6b66 | 36 | |
villemejane | 0:9cf6898e6b66 | 37 | |
villemejane | 0:9cf6898e6b66 | 38 | /* Variation de lumière douce - Projet Arts et Sciences */ |
villemejane | 0:9cf6898e6b66 | 39 | const uint8_t vague[360]={ |
villemejane | 0:9cf6898e6b66 | 40 | 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, |
villemejane | 0:9cf6898e6b66 | 41 | 11, 12, 13, 15, 17, 18, 20, 22, 24, 26, 28, 30, 32, 35, 37, 39, |
villemejane | 0:9cf6898e6b66 | 42 | 42, 44, 47, 49, 52, 55, 58, 60, 63, 66, 69, 72, 75, 78, 81, 85, |
villemejane | 0:9cf6898e6b66 | 43 | 88, 91, 94, 97, 101, 104, 107, 111, 114, 117, 121, 124, 127, 131, 134, 137, |
villemejane | 0:9cf6898e6b66 | 44 | 141, 144, 147, 150, 154, 157, 160, 163, 167, 170, 173, 176, 179, 182, 185, 188, |
villemejane | 0:9cf6898e6b66 | 45 | 191, 194, 197, 200, 202, 205, 208, 210, 213, 215, 217, 220, 222, 224, 226, 229, |
villemejane | 0:9cf6898e6b66 | 46 | 231, 232, 234, 236, 238, 239, 241, 242, 244, 245, 246, 248, 249, 250, 251, 251, |
villemejane | 0:9cf6898e6b66 | 47 | 252, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255, 254, 254, 253, 253, |
villemejane | 0:9cf6898e6b66 | 48 | 252, 251, 251, 250, 249, 248, 246, 245, 244, 242, 241, 239, 238, 236, 234, 232, |
villemejane | 0:9cf6898e6b66 | 49 | 231, 229, 226, 224, 222, 220, 217, 215, 213, 210, 208, 205, 202, 200, 197, 194, |
villemejane | 0:9cf6898e6b66 | 50 | 191, 188, 185, 182, 179, 176, 173, 170, 167, 163, 160, 157, 154, 150, 147, 144, |
villemejane | 0:9cf6898e6b66 | 51 | 141, 137, 134, 131, 127, 124, 121, 117, 114, 111, 107, 104, 101, 97, 94, 91, |
villemejane | 0:9cf6898e6b66 | 52 | 88, 85, 81, 78, 75, 72, 69, 66, 63, 60, 58, 55, 52, 49, 47, 44, |
villemejane | 0:9cf6898e6b66 | 53 | 42, 39, 37, 35, 32, 30, 28, 26, 24, 22, 20, 18, 17, 15, 13, 12, |
villemejane | 0:9cf6898e6b66 | 54 | 11, 9, 8, 7, 6, 5, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 55 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 58 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 59 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 60 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 61 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
villemejane | 0:9cf6898e6b66 | 62 | 0, 0, 0, 0, 0, 0, 0, 0}; |
villemejane | 0:9cf6898e6b66 | 63 | |
villemejane | 0:9cf6898e6b66 | 64 | /* Fonction d'initialisation de la liaison DMX */ |
villemejane | 0:9cf6898e6b66 | 65 | void initDMX(void){ |
villemejane | 0:9cf6898e6b66 | 66 | dmx.baud(250000); |
villemejane | 0:9cf6898e6b66 | 67 | dmx.format (8, SerialBase::None, 2); |
villemejane | 0:9cf6898e6b66 | 68 | enableDMX = 0; |
villemejane | 0:9cf6898e6b66 | 69 | // Initialisation canaux DMX |
villemejane | 0:9cf6898e6b66 | 70 | for(int k = 0; k < SAMPLES; k++){ |
villemejane | 0:9cf6898e6b66 | 71 | dmx_data[k] = 0; |
villemejane | 0:9cf6898e6b66 | 72 | } |
villemejane | 0:9cf6898e6b66 | 73 | updateDMX(); |
villemejane | 0:9cf6898e6b66 | 74 | } |
villemejane | 0:9cf6898e6b66 | 75 | |
villemejane | 0:9cf6898e6b66 | 76 | /* Fonction de mise à jour de la sortie DMX */ |
villemejane | 0:9cf6898e6b66 | 77 | void updateDMX(){ |
villemejane | 0:9cf6898e6b66 | 78 | enableDMX = 1; |
villemejane | 0:9cf6898e6b66 | 79 | start = 1; // /start |
villemejane | 0:9cf6898e6b66 | 80 | out_tx = 0; // break |
villemejane | 0:9cf6898e6b66 | 81 | wait_us(88); |
villemejane | 0:9cf6898e6b66 | 82 | out_tx = 1; // mb |
villemejane | 0:9cf6898e6b66 | 83 | wait_us(8); |
villemejane | 0:9cf6898e6b66 | 84 | out_tx = 0; // break |
villemejane | 0:9cf6898e6b66 | 85 | start = 0; |
villemejane | 0:9cf6898e6b66 | 86 | dmx.putc(0); // Start |
villemejane | 0:9cf6898e6b66 | 87 | for(int i = 0; i < SAMPLES; i++){ |
villemejane | 0:9cf6898e6b66 | 88 | dmx.putc(dmx_data[i]); // data |
villemejane | 0:9cf6898e6b66 | 89 | } |
villemejane | 0:9cf6898e6b66 | 90 | wait_us(23000); // time between frame |
villemejane | 0:9cf6898e6b66 | 91 | } |
villemejane | 0:9cf6898e6b66 | 92 | |
villemejane | 0:9cf6898e6b66 | 93 | /* Fonction d'initialisation de la liaison MIDI */ |
villemejane | 0:9cf6898e6b66 | 94 | void initMIDI(void){ |
villemejane | 0:9cf6898e6b66 | 95 | midi.baud(31250); |
villemejane | 0:9cf6898e6b66 | 96 | midi.format(8, SerialBase::None, 1); |
villemejane | 0:9cf6898e6b66 | 97 | midi.attach(&ISR_midi_in, Serial::RxIrq); |
villemejane | 0:9cf6898e6b66 | 98 | } |
villemejane | 0:9cf6898e6b66 | 99 | /* Fonction d'initialisation de la liaison MIDI - version beta */ |
villemejane | 0:9cf6898e6b66 | 100 | void initMIDI2(void){ |
villemejane | 0:9cf6898e6b66 | 101 | debug_pc.baud(115200); |
villemejane | 0:9cf6898e6b66 | 102 | debug_pc.format(8, SerialBase::None, 1); |
villemejane | 0:9cf6898e6b66 | 103 | debug_pc.attach(&ISR_midi_in2, Serial::RxIrq); |
villemejane | 0:9cf6898e6b66 | 104 | } |
villemejane | 0:9cf6898e6b66 | 105 | /* Detection d'une note reçue en MIDI */ |
villemejane | 0:9cf6898e6b66 | 106 | bool isNoteMIDIdetected(void){ |
villemejane | 0:9cf6898e6b66 | 107 | if(new_note_midi == 1) |
villemejane | 0:9cf6898e6b66 | 108 | return true; |
villemejane | 0:9cf6898e6b66 | 109 | else |
villemejane | 0:9cf6898e6b66 | 110 | return false; |
villemejane | 0:9cf6898e6b66 | 111 | } |
villemejane | 0:9cf6898e6b66 | 112 | /* Note reçue en MIDI traitée */ |
villemejane | 0:9cf6898e6b66 | 113 | void resetNoteMIDI(void){ |
villemejane | 0:9cf6898e6b66 | 114 | new_note_midi = 0; |
villemejane | 0:9cf6898e6b66 | 115 | } |
villemejane | 0:9cf6898e6b66 | 116 | |
villemejane | 0:9cf6898e6b66 | 117 | /* Detection d'un controle reçu en MIDI */ |
villemejane | 0:9cf6898e6b66 | 118 | bool isCCMIDIdetected(void){ |
villemejane | 0:9cf6898e6b66 | 119 | if(new_data_midi == 1) |
villemejane | 0:9cf6898e6b66 | 120 | return true; |
villemejane | 0:9cf6898e6b66 | 121 | else |
villemejane | 0:9cf6898e6b66 | 122 | return false; |
villemejane | 0:9cf6898e6b66 | 123 | } |
villemejane | 0:9cf6898e6b66 | 124 | /* Controle reçu en MIDI traité */ |
villemejane | 0:9cf6898e6b66 | 125 | void resetCCMIDI(void){ |
villemejane | 0:9cf6898e6b66 | 126 | new_data_midi = 0; |
villemejane | 0:9cf6898e6b66 | 127 | } |
villemejane | 0:9cf6898e6b66 | 128 | |
villemejane | 0:9cf6898e6b66 | 129 | /* Renvoie la note reçue sur la liaison MIDI */ |
villemejane | 0:9cf6898e6b66 | 130 | void resendNoteMIDI(void){ |
villemejane | 0:9cf6898e6b66 | 131 | midi.putc(MIDI_NOTE_ON); |
villemejane | 0:9cf6898e6b66 | 132 | midi.putc(note_data); |
villemejane | 0:9cf6898e6b66 | 133 | midi.putc(127); |
villemejane | 0:9cf6898e6b66 | 134 | } |
villemejane | 0:9cf6898e6b66 | 135 | |
villemejane | 0:9cf6898e6b66 | 136 | /* Renvoie la note reçue sur la liaison MIDI - version beta */ |
villemejane | 0:9cf6898e6b66 | 137 | void resendNoteMIDI2(void){ |
villemejane | 0:9cf6898e6b66 | 138 | debug_pc.putc(MIDI_NOTE_ON); |
villemejane | 0:9cf6898e6b66 | 139 | debug_pc.putc(note_data); |
villemejane | 0:9cf6898e6b66 | 140 | debug_pc.putc(127); |
villemejane | 0:9cf6898e6b66 | 141 | } |
villemejane | 0:9cf6898e6b66 | 142 | /* Joue une note sur la liaison MIDI */ |
villemejane | 0:9cf6898e6b66 | 143 | void playNoteMIDI(char note, char velocity){ |
villemejane | 0:9cf6898e6b66 | 144 | midi.putc(MIDI_NOTE_ON); |
villemejane | 0:9cf6898e6b66 | 145 | midi.putc(note); |
villemejane | 0:9cf6898e6b66 | 146 | midi.putc(velocity); |
villemejane | 0:9cf6898e6b66 | 147 | } |
villemejane | 0:9cf6898e6b66 | 148 | /* Joue une note sur la liaison MIDI - version beta */ |
villemejane | 0:9cf6898e6b66 | 149 | void playNoteMIDI2(char note, char velocity){ |
villemejane | 0:9cf6898e6b66 | 150 | debug_pc.printf("%x %x \r\n", note, velocity); |
villemejane | 0:9cf6898e6b66 | 151 | } |
villemejane | 0:9cf6898e6b66 | 152 | |
villemejane | 0:9cf6898e6b66 | 153 | /* Stoppe une note sur la liaison MIDI */ |
villemejane | 0:9cf6898e6b66 | 154 | void stopNoteMIDI(char note, char velocity){ |
villemejane | 0:9cf6898e6b66 | 155 | midi.putc(MIDI_NOTE_OFF); |
villemejane | 0:9cf6898e6b66 | 156 | midi.putc(note); |
villemejane | 0:9cf6898e6b66 | 157 | midi.putc(velocity); |
villemejane | 0:9cf6898e6b66 | 158 | } |
villemejane | 0:9cf6898e6b66 | 159 | |
villemejane | 0:9cf6898e6b66 | 160 | /* Fonction d'appel à une variation de lumière en fonction d'un angle |
villemejane | 0:9cf6898e6b66 | 161 | @out : R G B au format 24 bits |
villemejane | 0:9cf6898e6b66 | 162 | */ |
villemejane | 0:9cf6898e6b66 | 163 | int sineLED(int angle) |
villemejane | 0:9cf6898e6b66 | 164 | { |
villemejane | 0:9cf6898e6b66 | 165 | return (vague[(angle+120)%360] << 16) + (vague[angle] << 8) + vague[(angle+240)%360]; |
villemejane | 0:9cf6898e6b66 | 166 | } |
villemejane | 0:9cf6898e6b66 | 167 | |
villemejane | 0:9cf6898e6b66 | 168 | |
villemejane | 0:9cf6898e6b66 | 169 | /* Fonction d'interruption sur MIDI */ |
villemejane | 0:9cf6898e6b66 | 170 | void ISR_midi_in(void){ |
villemejane | 0:9cf6898e6b66 | 171 | debug_out = !debug_out; |
villemejane | 0:9cf6898e6b66 | 172 | char data = midi.getc(); |
villemejane | 0:9cf6898e6b66 | 173 | if(data >= 128) |
villemejane | 0:9cf6898e6b66 | 174 | cpt_midi = 0; |
villemejane | 0:9cf6898e6b66 | 175 | else |
villemejane | 0:9cf6898e6b66 | 176 | cpt_midi++; |
villemejane | 0:9cf6898e6b66 | 177 | midi_data[cpt_midi] = data; |
villemejane | 0:9cf6898e6b66 | 178 | if(cpt_midi == 2){ |
villemejane | 0:9cf6898e6b66 | 179 | cpt_midi = 0; |
villemejane | 0:9cf6898e6b66 | 180 | if((midi_data[0] == MIDI_NOTE_ON) || (midi_data[0] == MIDI_NOTE_OFF)){ |
villemejane | 0:9cf6898e6b66 | 181 | new_note_midi = 1; |
villemejane | 0:9cf6898e6b66 | 182 | note_data = midi_data[1]; |
villemejane | 0:9cf6898e6b66 | 183 | velocity_data = midi_data[2]; |
villemejane | 0:9cf6898e6b66 | 184 | } |
villemejane | 0:9cf6898e6b66 | 185 | else{ |
villemejane | 0:9cf6898e6b66 | 186 | if(midi_data[0] == MIDI_CC){ |
villemejane | 0:9cf6898e6b66 | 187 | new_data_midi = 1; |
villemejane | 0:9cf6898e6b66 | 188 | control_ch = midi_data[1]; |
villemejane | 0:9cf6898e6b66 | 189 | control_value = midi_data[2]; |
villemejane | 0:9cf6898e6b66 | 190 | } |
villemejane | 0:9cf6898e6b66 | 191 | } |
villemejane | 0:9cf6898e6b66 | 192 | } |
villemejane | 0:9cf6898e6b66 | 193 | } |
villemejane | 0:9cf6898e6b66 | 194 | /* Fonction d'interruption sur MIDI - version beta */ |
villemejane | 0:9cf6898e6b66 | 195 | void ISR_midi_in2(void){ |
villemejane | 0:9cf6898e6b66 | 196 | debug_out = !debug_out; |
villemejane | 0:9cf6898e6b66 | 197 | char data = debug_pc.getc(); |
villemejane | 0:9cf6898e6b66 | 198 | if(data >= 128) |
villemejane | 0:9cf6898e6b66 | 199 | cpt_midi = 0; |
villemejane | 0:9cf6898e6b66 | 200 | else |
villemejane | 0:9cf6898e6b66 | 201 | cpt_midi++; |
villemejane | 0:9cf6898e6b66 | 202 | midi_data[cpt_midi] = data; |
villemejane | 0:9cf6898e6b66 | 203 | if(cpt_midi == 2){ |
villemejane | 0:9cf6898e6b66 | 204 | cpt_midi = 0; |
villemejane | 0:9cf6898e6b66 | 205 | if((midi_data[0] == MIDI_NOTE_ON)){ // || (midi_data[0] == MIDI_NOTE_OFF)){ |
villemejane | 0:9cf6898e6b66 | 206 | new_note_midi = 1; |
villemejane | 0:9cf6898e6b66 | 207 | note_data = midi_data[1]; |
villemejane | 0:9cf6898e6b66 | 208 | velocity_data = midi_data[2]; |
villemejane | 0:9cf6898e6b66 | 209 | } |
villemejane | 0:9cf6898e6b66 | 210 | else{ |
villemejane | 0:9cf6898e6b66 | 211 | if(midi_data[0] == MIDI_CC){ |
villemejane | 0:9cf6898e6b66 | 212 | new_data_midi = 1; |
villemejane | 0:9cf6898e6b66 | 213 | control_ch = midi_data[1]; |
villemejane | 0:9cf6898e6b66 | 214 | control_value = midi_data[2]; |
villemejane | 0:9cf6898e6b66 | 215 | } |
villemejane | 0:9cf6898e6b66 | 216 | } |
villemejane | 0:9cf6898e6b66 | 217 | } |
villemejane | 0:9cf6898e6b66 | 218 | } |