
Gemphet8 ; 8-polyphonic synthesizer control application
Dependencies: MIDI REnc button mbed
Revision 9:a86ad099f24d, committed 2014-08-11
- Comitter:
- ChuckTimber
- Date:
- Mon Aug 11 23:16:06 2014 +0000
- Parent:
- 5:7d7be4c72d21
- Child:
- 10:c3b797b62ddb
- Commit message:
- Function divided version - compile OK
Changed in this revision
--- a/MIDI_Proc/midi_proc.c Mon Aug 11 07:46:03 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -#include "midi_proc.h" - -using namespace mbed; - -MN_t NoteEnd = { 255, 255, 15, 0 }; -MN_t NoteStart = { 0, 0, 0, &NoteEnd }; -MN_t MidiNotes[POLYPHONICE_NOTES]; -static uint16_t MidiNotesTag; -volatile static uint8_t NumOfNotes = POLYPHONICE_NOTES; - -MIDI midi(dp16, dp15); - -void midi_init(void) -{ - midi.setHandleNoteOff(&midi_noteoff); - midi.setHandleNoteOn(&midi_noteon); - midi.setHandleControlChange(&midi_cc); - midi.setHandleProgramChange(&midi_pc); - midi.setHandlePitchBend(&midi_pbend); - midi.setHandleSystemReset(&midi_sysreset); -} - -/// @brief Reset all MIDI controller -static void midi_allnoteoff(void) -{ - int i; - uint16_t msk; - - for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { - if (MidiNotesTag & msk) { - midi.sendNoteOff(MidiNotes[i].Note, MidiNotes[i].Velocity, MidiNotes[i].Channel); - MidiNotesTag &= ~msk; - } - } - - MidiNotesTag = 0x0000; - NoteEnd.next = NULL; - NoteStart.next = &NoteEnd; -} - -/// @brief Reset MIDI controller -static void midi_resetcontrol(void) -{ -} - -/// @brief Reset all MIDI controller -void midi_sysreset(void) -{ - midi_allnoteoff(); - midi_resetcontrol(); -} - -/// @brief MIDI note structure allocate function -static MN_p allocN(void) { - int i; - uint16_t msk; - - for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { - if (!(MidiNotesTag & msk)) { - MidiNotesTag |= msk; - MidiNotes[i].Channel = i; - return (&MidiNotes[i]); - } - } - return NULL; -} - -/// @brief MIDI note structure free function -static void freeN(MN_p addr) -{ - int i; - uint16_t msk; - - for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { - if (addr == &MidiNotes[i]) - MidiNotesTag &= ~msk; - } -} - -/// @brief MIDI Control Change callback funcion -void midi_cc(byte channel, byte number, byte value) -{ - if (number == MIDI_ALL_NOTE_OFF) { - midi_allnoteoff(); - } - if (number == MIDI_RESET_ALL_CONTROLLERS) { - midi_resetcontrol(); - } - midi.sendControlChange(number, value, channel); -} - -/// @brief MIDI Program Change callback funcion -void midi_pc(byte channel, byte number) -{ - midi.sendProgramChange(number, channel); -} - -/// @brief MIDI Pitch Bend callback funcion -void midi_pbend(byte channel, int bend) -{ - midi.sendPitchBend(bend, channel); -} - -/// @brief MIDI Note On callback funcion -void midi_noteon(byte channel, byte note, byte velocity) -{ - MN_p ptr, newnote; - - if ((newnote = allocN()) == NULL) { // if table full, release oldest note - ptr = NoteStart.next; - midi.sendNoteOff(ptr->Note, ptr->Velocity, ptr->Channel); - NoteStart.next = ptr->next; - freeN(ptr); - newnote = allocN(); - } - newnote->Note = note; - newnote->Velocity = velocity; - // newnote->Channel // do not set channel - midi.sendNoteOn(note, velocity, newnote->Channel); - for (ptr = &NoteStart; ptr->next; ptr = ptr->next) { // put newnote on the tail - if (ptr->next == &NoteEnd) { - newnote->next = ptr->next; - ptr->next = newnote; - break; - } - } -} - -/// @brief MIDI Note Off callback funcion -void midi_noteoff(byte channel, byte note, byte velocity) -{ - MN_p ptr, lastptr; - - for (ptr = &NoteStart; ptr->next; ptr = ptr->next) { - if (note == ptr->next->Note) { - lastptr = ptr->next; - midi.sendNoteOff(lastptr->Note, lastptr->Velocity, lastptr->Channel); - ptr->next = lastptr->next; - freeN(lastptr); - break; - } - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MIDI_Proc/midi_proc.cpp Mon Aug 11 23:16:06 2014 +0000 @@ -0,0 +1,143 @@ +#include "midi_proc.h" + +using namespace mbed; + +MN_t NoteEnd = { 255, 255, 15, 0 }; +MN_t NoteStart = { 0, 0, 0, &NoteEnd }; +MN_t MidiNotes[POLYPHONICE_NOTES]; +static uint16_t MidiNotesTag; +uint8_t NumOfNotes = POLYPHONICE_NOTES; + +MIDI midi(dp16, dp15); + +void midi_init(void) +{ + midi.setHandleNoteOff(&midi_noteoff); + midi.setHandleNoteOn(&midi_noteon); + midi.setHandleControlChange(&midi_cc); + midi.setHandleProgramChange(&midi_pc); + midi.setHandlePitchBend(&midi_pbend); + midi.setHandleSystemReset(&midi_sysreset); +} + +/// @brief Reset all MIDI controller +static void midi_allnoteoff(void) +{ + int i; + uint16_t msk; + + for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { + if (MidiNotesTag & msk) { + midi.sendNoteOff(MidiNotes[i].Note, MidiNotes[i].Velocity, MidiNotes[i].Channel); + MidiNotesTag &= ~msk; + } + } + + MidiNotesTag = 0x0000; + NoteEnd.next = NULL; + NoteStart.next = &NoteEnd; +} + +/// @brief Reset MIDI controller +static void midi_resetcontrol(void) +{ +} + +/// @brief Reset all MIDI controller +void midi_sysreset(void) +{ + midi_allnoteoff(); + midi_resetcontrol(); +} + +/// @brief MIDI note structure allocate function +static MN_p allocN(void) { + int i; + uint16_t msk; + + for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { + if (!(MidiNotesTag & msk)) { + MidiNotesTag |= msk; + MidiNotes[i].Channel = i; + return (&MidiNotes[i]); + } + } + return NULL; +} + +/// @brief MIDI note structure free function +static void freeN(MN_p addr) +{ + int i; + uint16_t msk; + + for (i = 0, msk = 0x01; i < NumOfNotes; i++, msk<<=1) { + if (addr == &MidiNotes[i]) + MidiNotesTag &= ~msk; + } +} + +/// @brief MIDI Control Change callback funcion +void midi_cc(byte channel, byte number, byte value) +{ + if (number == MIDI_ALL_NOTE_OFF) { + midi_allnoteoff(); + } + if (number == MIDI_RESET_ALL_CONTROLLERS) { + midi_resetcontrol(); + } + midi.sendControlChange(number, value, channel); +} + +/// @brief MIDI Program Change callback funcion +void midi_pc(byte channel, byte number) +{ + midi.sendProgramChange(number, channel); +} + +/// @brief MIDI Pitch Bend callback funcion +void midi_pbend(byte channel, int bend) +{ + midi.sendPitchBend(bend, channel); +} + +/// @brief MIDI Note On callback funcion +void midi_noteon(byte channel, byte note, byte velocity) +{ + MN_p ptr, newnote; + + if ((newnote = allocN()) == NULL) { // if table full, release oldest note + ptr = NoteStart.next; + midi.sendNoteOff(ptr->Note, ptr->Velocity, ptr->Channel); + NoteStart.next = ptr->next; + freeN(ptr); + newnote = allocN(); + } + newnote->Note = note; + newnote->Velocity = velocity; + // newnote->Channel // do not set channel + midi.sendNoteOn(note, velocity, newnote->Channel); + for (ptr = &NoteStart; ptr->next; ptr = ptr->next) { // put newnote on the tail + if (ptr->next == &NoteEnd) { + newnote->next = ptr->next; + ptr->next = newnote; + break; + } + } +} + +/// @brief MIDI Note Off callback funcion +void midi_noteoff(byte channel, byte note, byte velocity) +{ + MN_p ptr, lastptr; + + for (ptr = &NoteStart; ptr->next; ptr = ptr->next) { + if (note == ptr->next->Note) { + lastptr = ptr->next; + midi.sendNoteOff(lastptr->Note, lastptr->Velocity, lastptr->Channel); + ptr->next = lastptr->next; + freeN(lastptr); + break; + } + } +}
--- a/MIDI_Proc/midi_proc.h Mon Aug 11 07:46:03 2014 +0000 +++ b/MIDI_Proc/midi_proc.h Mon Aug 11 23:16:06 2014 +0000 @@ -5,7 +5,7 @@ #include "MIDI.h" #ifdef __cplusplus -extern "C" { +//extern "C" { #endif /* __cplusplus */ /** MIDI System message */ @@ -31,7 +31,7 @@ uint8_t Channel; /// pointer to the next _MidiNote object struct _MidiNote *next; - } MN_t, MN_p; + } MN_t, *MN_p; extern MN_t NoteEnd; extern MN_t NoteStart; @@ -55,6 +55,6 @@ extern void midi_pbend(byte channel, int bend); #ifdef __cplusplus -} +//} #endif /* __cplusplus */ #endif /* __C_MIDI_PROC_H__ */ \ No newline at end of file