Chuck Timber / Mbed 2 deprecated Gemphet8

Dependencies:   MIDI REnc button mbed

Committer:
ChuckTimber
Date:
Mon Aug 11 09:38:22 2014 +0000
Revision:
8:7d67a193582f
Parent:
7:2398a1835eae
wroking copy - main trunk - compile OK

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChuckTimber 0:3dc89ac1495f 1 /**
ChuckTimber 0:3dc89ac1495f 2 * @file main.cpp
ChuckTimber 0:3dc89ac1495f 3 * Project Gem8 - handles 8-gembox synth project application
ChuckTimber 0:3dc89ac1495f 4 * @brief Gem8 project application
ChuckTimber 0:3dc89ac1495f 5 * @version 1.0
ChuckTimber 0:3dc89ac1495f 6 * @author Chuck Timber
ChuckTimber 0:3dc89ac1495f 7 * @date 08/08/2014
ChuckTimber 0:3dc89ac1495f 8 */
ChuckTimber 6:16aa8fc30ef8 9
ChuckTimber 0:3dc89ac1495f 10 #include "mbed.h"
ChuckTimber 7:2398a1835eae 11 #include "button.h"
ChuckTimber 8:7d67a193582f 12 //#include "REnc.h"
ChuckTimber 0:3dc89ac1495f 13 #include "MIDI.h"
ChuckTimber 7:2398a1835eae 14 #include "I2CEEprom.h"
ChuckTimber 0:3dc89ac1495f 15
ChuckTimber 1:2760654d0b44 16
ChuckTimber 1:2760654d0b44 17 // LED (active HIGH)
ChuckTimber 1:2760654d0b44 18 #define dbg_led_on() { }
ChuckTimber 1:2760654d0b44 19 #define dbg_led_off() { }
ChuckTimber 1:2760654d0b44 20
ChuckTimber 1:2760654d0b44 21
ChuckTimber 1:2760654d0b44 22 /** MIDI System message */
ChuckTimber 1:2760654d0b44 23 #define MIDI_ALL_NOTE_OFF 0x7B
ChuckTimber 1:2760654d0b44 24 #define MIDI_RESET_ALL_CONTROLLERS 0x79
ChuckTimber 1:2760654d0b44 25
ChuckTimber 0:3dc89ac1495f 26 #define POLYPHONICE_NOTES 8
ChuckTimber 1:2760654d0b44 27
ChuckTimber 1:2760654d0b44 28 /** @structure MIDI Note management structure
ChuckTimber 1:2760654d0b44 29 *
ChuckTimber 1:2760654d0b44 30 */
ChuckTimber 6:16aa8fc30ef8 31 typedef struct _MidiNote {
ChuckTimber 1:2760654d0b44 32 /// MIDI Note number
ChuckTimber 1:2760654d0b44 33 uint8_t Note;
ChuckTimber 1:2760654d0b44 34 /// MIDI Note velocity
ChuckTimber 1:2760654d0b44 35 uint8_t Velocity;
ChuckTimber 1:2760654d0b44 36 /// MIDI Note channel
ChuckTimber 1:2760654d0b44 37 uint8_t Channel;
ChuckTimber 1:2760654d0b44 38 /// pointer to the next _MidiNote object
ChuckTimber 1:2760654d0b44 39 struct _MidiNote *next;
ChuckTimber 6:16aa8fc30ef8 40 } MN_t, *MN_p;
ChuckTimber 1:2760654d0b44 41
ChuckTimber 6:16aa8fc30ef8 42 MN_t NoteEnd = { 255, 255, 15, 0 };
ChuckTimber 6:16aa8fc30ef8 43 MN_t NoteStart = { 0, 0, 0, &NoteEnd };
ChuckTimber 6:16aa8fc30ef8 44 MN_t MidiNotes[POLYPHONICE_NOTES];
ChuckTimber 1:2760654d0b44 45 static uint16_t MidiNotesTag;
ChuckTimber 1:2760654d0b44 46
ChuckTimber 1:2760654d0b44 47 volatile static uint8_t NumOfNotes = POLYPHONICE_NOTES;
ChuckTimber 1:2760654d0b44 48
ChuckTimber 1:2760654d0b44 49 /** @brief Prototypes related to MIDI
ChuckTimber 1:2760654d0b44 50 *
ChuckTimber 1:2760654d0b44 51 */
ChuckTimber 6:16aa8fc30ef8 52 void midi_init(void);
ChuckTimber 1:2760654d0b44 53 struct _MidiNote *allocN(void);
ChuckTimber 1:2760654d0b44 54 void freeN(struct _MidiNote *addr);
ChuckTimber 1:2760654d0b44 55 void midi_allnoteoff(void);
ChuckTimber 1:2760654d0b44 56 void midi_resetcontrol(void);
ChuckTimber 1:2760654d0b44 57 void midi_sysreset(void);
ChuckTimber 1:2760654d0b44 58 void midi_noteoff(byte channel, byte note, byte velocity);
ChuckTimber 1:2760654d0b44 59 void midi_noteon(byte channel, byte note, byte velocity);
ChuckTimber 1:2760654d0b44 60 void midi_cc(byte channel, byte number, byte value);
ChuckTimber 1:2760654d0b44 61 void midi_pc(byte channel, byte number);
ChuckTimber 1:2760654d0b44 62 void midi_pbend(byte channel, int bend);
ChuckTimber 0:3dc89ac1495f 63
ChuckTimber 7:2398a1835eae 64 /// midi parameter (82-byte)
ChuckTimber 6:16aa8fc30ef8 65 uint8_t midi_params[]= {
ChuckTimber 0:3dc89ac1495f 66 0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
ChuckTimber 0:3dc89ac1495f 67 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,
ChuckTimber 0:3dc89ac1495f 68 0,0,0,0,0,0,0,64,0,0,127,0,32,127,0,0,64,32,
ChuckTimber 0:3dc89ac1495f 69 };
ChuckTimber 0:3dc89ac1495f 70
ChuckTimber 0:3dc89ac1495f 71 DigitalOut myled(LED1);
ChuckTimber 0:3dc89ac1495f 72 MIDI midi(dp16, dp15);
ChuckTimber 7:2398a1835eae 73 //I2CEEprom i2crom(sda, scl, addr);
ChuckTimber 7:2398a1835eae 74 I2CEEprom i2crom(dp5, dp27, 0xa0);
ChuckTimber 0:3dc89ac1495f 75
ChuckTimber 0:3dc89ac1495f 76
ChuckTimber 6:16aa8fc30ef8 77 int main()
ChuckTimber 6:16aa8fc30ef8 78 {
ChuckTimber 6:16aa8fc30ef8 79 midi_init();
ChuckTimber 6:16aa8fc30ef8 80
ChuckTimber 6:16aa8fc30ef8 81 while(1) {
ChuckTimber 8:7d67a193582f 82 midi.read();
ChuckTimber 8:7d67a193582f 83
ChuckTimber 6:16aa8fc30ef8 84 myled = 1;
ChuckTimber 6:16aa8fc30ef8 85 wait(0.2);
ChuckTimber 6:16aa8fc30ef8 86 myled = 0;
ChuckTimber 6:16aa8fc30ef8 87 wait(0.2);
ChuckTimber 6:16aa8fc30ef8 88 }
ChuckTimber 6:16aa8fc30ef8 89 }
ChuckTimber 6:16aa8fc30ef8 90
ChuckTimber 6:16aa8fc30ef8 91
ChuckTimber 6:16aa8fc30ef8 92 void midi_init(void)
ChuckTimber 6:16aa8fc30ef8 93 {
ChuckTimber 0:3dc89ac1495f 94 midi.setHandleNoteOff(&midi_noteoff);
ChuckTimber 0:3dc89ac1495f 95 midi.setHandleNoteOn(&midi_noteon);
ChuckTimber 0:3dc89ac1495f 96 midi.setHandleControlChange(&midi_cc);
ChuckTimber 0:3dc89ac1495f 97 midi.setHandleProgramChange(&midi_pc);
ChuckTimber 0:3dc89ac1495f 98 midi.setHandlePitchBend(&midi_pbend);
ChuckTimber 0:3dc89ac1495f 99 midi.setHandleSystemReset(&midi_sysreset);
ChuckTimber 8:7d67a193582f 100
ChuckTimber 8:7d67a193582f 101 midi.begin();
ChuckTimber 0:3dc89ac1495f 102 }
ChuckTimber 0:3dc89ac1495f 103
ChuckTimber 1:2760654d0b44 104 /// @brief Reset all MIDI controller
ChuckTimber 1:2760654d0b44 105 static void midi_allnoteoff(void)
ChuckTimber 1:2760654d0b44 106 {
ChuckTimber 1:2760654d0b44 107 int i;
ChuckTimber 1:2760654d0b44 108 uint16_t msk;
ChuckTimber 1:2760654d0b44 109
ChuckTimber 1:2760654d0b44 110 for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) {
ChuckTimber 1:2760654d0b44 111 if (MidiNotesTag & msk) {
ChuckTimber 1:2760654d0b44 112 midi.sendNoteOff(MidiNotes[i].Note, MidiNotes[i].Velocity, MidiNotes[i].Channel);
ChuckTimber 6:16aa8fc30ef8 113 MidiNotesTag &= ~msk;
ChuckTimber 1:2760654d0b44 114 }
ChuckTimber 1:2760654d0b44 115 }
ChuckTimber 1:2760654d0b44 116
ChuckTimber 1:2760654d0b44 117 MidiNotesTag = 0x0000;
ChuckTimber 1:2760654d0b44 118 NoteEnd.next = NULL;
ChuckTimber 1:2760654d0b44 119 NoteStart.next = &NoteEnd;
ChuckTimber 1:2760654d0b44 120 }
ChuckTimber 1:2760654d0b44 121
ChuckTimber 1:2760654d0b44 122 /// @brief Reset MIDI controller
ChuckTimber 1:2760654d0b44 123 static void midi_resetcontrol(void)
ChuckTimber 1:2760654d0b44 124 {
ChuckTimber 1:2760654d0b44 125 }
ChuckTimber 1:2760654d0b44 126
ChuckTimber 1:2760654d0b44 127 /// @brief Reset all MIDI controller
ChuckTimber 1:2760654d0b44 128 void midi_sysreset(void)
ChuckTimber 1:2760654d0b44 129 {
ChuckTimber 1:2760654d0b44 130 midi_allnoteoff();
ChuckTimber 1:2760654d0b44 131 midi_resetcontrol();
ChuckTimber 1:2760654d0b44 132 }
ChuckTimber 1:2760654d0b44 133
ChuckTimber 1:2760654d0b44 134 /// @brief MIDI note structure allocate function
ChuckTimber 8:7d67a193582f 135 static MN_p allocN(void)
ChuckTimber 8:7d67a193582f 136 {
ChuckTimber 1:2760654d0b44 137 int i;
ChuckTimber 1:2760654d0b44 138 uint16_t msk;
ChuckTimber 1:2760654d0b44 139
ChuckTimber 1:2760654d0b44 140 for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) {
ChuckTimber 1:2760654d0b44 141 if (!(MidiNotesTag & msk)) {
ChuckTimber 1:2760654d0b44 142 MidiNotesTag |= msk;
ChuckTimber 1:2760654d0b44 143 MidiNotes[i].Channel = i;
ChuckTimber 1:2760654d0b44 144 return (&MidiNotes[i]);
ChuckTimber 1:2760654d0b44 145 }
ChuckTimber 1:2760654d0b44 146 }
ChuckTimber 1:2760654d0b44 147 return NULL;
ChuckTimber 1:2760654d0b44 148 }
ChuckTimber 1:2760654d0b44 149
ChuckTimber 1:2760654d0b44 150 /// @brief MIDI note structure free function
ChuckTimber 6:16aa8fc30ef8 151 static void freeN(MN_p addr)
ChuckTimber 1:2760654d0b44 152 {
ChuckTimber 1:2760654d0b44 153 int i;
ChuckTimber 1:2760654d0b44 154 uint16_t msk;
ChuckTimber 1:2760654d0b44 155
ChuckTimber 1:2760654d0b44 156 for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) {
ChuckTimber 6:16aa8fc30ef8 157 if (addr == &MidiNotes[i])
ChuckTimber 1:2760654d0b44 158 MidiNotesTag &= ~msk;
ChuckTimber 1:2760654d0b44 159 }
ChuckTimber 1:2760654d0b44 160 }
ChuckTimber 1:2760654d0b44 161
ChuckTimber 1:2760654d0b44 162 /// @brief MIDI Control Change callback funcion
ChuckTimber 1:2760654d0b44 163 void midi_cc(byte channel, byte number, byte value)
ChuckTimber 1:2760654d0b44 164 {
ChuckTimber 1:2760654d0b44 165 if (number == MIDI_ALL_NOTE_OFF) {
ChuckTimber 1:2760654d0b44 166 midi_allnoteoff();
ChuckTimber 1:2760654d0b44 167 }
ChuckTimber 1:2760654d0b44 168 if (number == MIDI_RESET_ALL_CONTROLLERS) {
ChuckTimber 1:2760654d0b44 169 midi_resetcontrol();
ChuckTimber 1:2760654d0b44 170 }
ChuckTimber 1:2760654d0b44 171 midi.sendControlChange(number, value, channel);
ChuckTimber 1:2760654d0b44 172 }
ChuckTimber 1:2760654d0b44 173
ChuckTimber 1:2760654d0b44 174 /// @brief MIDI Program Change callback funcion
ChuckTimber 1:2760654d0b44 175 void midi_pc(byte channel, byte number)
ChuckTimber 1:2760654d0b44 176 {
ChuckTimber 1:2760654d0b44 177 midi.sendProgramChange(number, channel);
ChuckTimber 1:2760654d0b44 178 }
ChuckTimber 1:2760654d0b44 179
ChuckTimber 1:2760654d0b44 180 /// @brief MIDI Pitch Bend callback funcion
ChuckTimber 1:2760654d0b44 181 void midi_pbend(byte channel, int bend)
ChuckTimber 1:2760654d0b44 182 {
ChuckTimber 1:2760654d0b44 183 midi.sendPitchBend(bend, channel);
ChuckTimber 1:2760654d0b44 184 }
ChuckTimber 1:2760654d0b44 185
ChuckTimber 1:2760654d0b44 186 /// @brief MIDI Note On callback funcion
ChuckTimber 1:2760654d0b44 187 void midi_noteon(byte channel, byte note, byte velocity)
ChuckTimber 1:2760654d0b44 188 {
ChuckTimber 6:16aa8fc30ef8 189 MN_p ptr, newnote;
ChuckTimber 1:2760654d0b44 190
ChuckTimber 1:2760654d0b44 191 if ((newnote = allocN()) == NULL) { // if table full, release oldest note
ChuckTimber 1:2760654d0b44 192 ptr = NoteStart.next;
ChuckTimber 1:2760654d0b44 193 midi.sendNoteOff(ptr->Note, ptr->Velocity, ptr->Channel);
ChuckTimber 1:2760654d0b44 194 NoteStart.next = ptr->next;
ChuckTimber 1:2760654d0b44 195 freeN(ptr);
ChuckTimber 1:2760654d0b44 196 newnote = allocN();
ChuckTimber 1:2760654d0b44 197 }
ChuckTimber 1:2760654d0b44 198 newnote->Note = note;
ChuckTimber 1:2760654d0b44 199 newnote->Velocity = velocity;
ChuckTimber 1:2760654d0b44 200 // newnote->Channel // do not set channel
ChuckTimber 1:2760654d0b44 201 midi.sendNoteOn(note, velocity, newnote->Channel);
ChuckTimber 1:2760654d0b44 202 for (ptr = &NoteStart; ptr->next; ptr = ptr->next) { // put newnote on the tail
ChuckTimber 1:2760654d0b44 203 if (ptr->next == &NoteEnd) {
ChuckTimber 1:2760654d0b44 204 newnote->next = ptr->next;
ChuckTimber 1:2760654d0b44 205 ptr->next = newnote;
ChuckTimber 1:2760654d0b44 206 break;
ChuckTimber 1:2760654d0b44 207 }
ChuckTimber 1:2760654d0b44 208 }
ChuckTimber 1:2760654d0b44 209 }
ChuckTimber 1:2760654d0b44 210
ChuckTimber 1:2760654d0b44 211 /// @brief MIDI Note Off callback funcion
ChuckTimber 1:2760654d0b44 212 void midi_noteoff(byte channel, byte note, byte velocity)
ChuckTimber 1:2760654d0b44 213 {
ChuckTimber 6:16aa8fc30ef8 214 MN_p ptr, lastptr;
ChuckTimber 1:2760654d0b44 215
ChuckTimber 1:2760654d0b44 216 for (ptr = &NoteStart; ptr->next; ptr = ptr->next) {
ChuckTimber 1:2760654d0b44 217 if (note == ptr->next->Note) {
ChuckTimber 1:2760654d0b44 218 lastptr = ptr->next;
ChuckTimber 1:2760654d0b44 219 midi.sendNoteOff(lastptr->Note, lastptr->Velocity, lastptr->Channel);
ChuckTimber 1:2760654d0b44 220 ptr->next = lastptr->next;
ChuckTimber 1:2760654d0b44 221 freeN(lastptr);
ChuckTimber 1:2760654d0b44 222 break;
ChuckTimber 1:2760654d0b44 223 }
ChuckTimber 1:2760654d0b44 224 }
ChuckTimber 1:2760654d0b44 225 }