Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MIDI REnc button mbed
main.cpp@8:7d67a193582f, 2014-08-11 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |