Library for DMX and MIDI protocol

Dependents:   Arts_DMX512_carteV3_MIDI Arts_DMX512_carteV3_MIDI_nRF

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?

UserRevisionLine numberNew 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 }