A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.
Dependencies: mbed USBDevice PinDetect
main.cpp@8:deaedb59243e, 2016-04-13 (annotated)
- Committer:
- ndelfino
- Date:
- Wed Apr 13 17:44:36 2016 +0000
- Revision:
- 8:deaedb59243e
- Parent:
- 6:688698f814c0
- Child:
- 10:b9e14412cc23
Connected my code to Austin's. Made some fixes to the LEDController. Now lights will light up and turn off appropriately if they are in the same octave. Changed the values I was using for numerical identification of notes.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
asuszek | 2:e21bd39bdf46 | 1 | /* Karplus Strong MIDI synthesizer. |
asuszek | 2:e21bd39bdf46 | 2 | * |
asuszek | 2:e21bd39bdf46 | 3 | * @author Austin Suszek |
asuszek | 2:e21bd39bdf46 | 4 | * @author Nick Delfino |
asuszek | 2:e21bd39bdf46 | 5 | */ |
asuszek | 0:cad8dafb22be | 6 | |
asuszek | 6:688698f814c0 | 7 | #include "AudioEngine.h" |
asuszek | 2:e21bd39bdf46 | 8 | #include "Constants.h" |
asuszek | 0:cad8dafb22be | 9 | #include "mbed.h" |
asuszek | 6:688698f814c0 | 10 | #include "PinDetect.h" |
asuszek | 0:cad8dafb22be | 11 | #include "USBMIDI.h" |
ndelfino | 8:deaedb59243e | 12 | #include "LEDController.h" |
asuszek | 0:cad8dafb22be | 13 | |
asuszek | 0:cad8dafb22be | 14 | Serial pc(USBTX, USBRX); |
asuszek | 6:688698f814c0 | 15 | |
asuszek | 0:cad8dafb22be | 16 | USBMIDI midi; |
asuszek | 6:688698f814c0 | 17 | AudioEngine audioEngine; |
ndelfino | 8:deaedb59243e | 18 | LEDController ledController; |
ndelfino | 8:deaedb59243e | 19 | |
asuszek | 6:688698f814c0 | 20 | |
asuszek | 6:688698f814c0 | 21 | // Buttons for the toggling of synths. |
asuszek | 6:688698f814c0 | 22 | PinDetect nextSynth(p27); |
asuszek | 6:688698f814c0 | 23 | PinDetect prevSynth(p28); |
asuszek | 0:cad8dafb22be | 24 | |
asuszek | 2:e21bd39bdf46 | 25 | void midiMessageReceived(MIDIMessage message); |
asuszek | 2:e21bd39bdf46 | 26 | |
asuszek | 6:688698f814c0 | 27 | void nextSynthPressed(); |
asuszek | 6:688698f814c0 | 28 | void prevSynthPressed(); |
asuszek | 6:688698f814c0 | 29 | |
asuszek | 2:e21bd39bdf46 | 30 | int main() { |
asuszek | 2:e21bd39bdf46 | 31 | // Attach the function to handle all incoming MIDI events. |
asuszek | 2:e21bd39bdf46 | 32 | midi.attach(midiMessageReceived); |
asuszek | 6:688698f814c0 | 33 | |
asuszek | 6:688698f814c0 | 34 | // Attach the synth toggling buttons. |
asuszek | 6:688698f814c0 | 35 | nextSynth.attach_asserted(&nextSynthPressed); |
asuszek | 6:688698f814c0 | 36 | prevSynth.attach_asserted(&prevSynthPressed); |
asuszek | 6:688698f814c0 | 37 | nextSynth.setSampleFrequency(); |
asuszek | 6:688698f814c0 | 38 | prevSynth.setSampleFrequency(); |
asuszek | 2:e21bd39bdf46 | 39 | |
asuszek | 2:e21bd39bdf46 | 40 | while (1) {} |
asuszek | 2:e21bd39bdf46 | 41 | } |
asuszek | 2:e21bd39bdf46 | 42 | |
asuszek | 2:e21bd39bdf46 | 43 | /* |
asuszek | 2:e21bd39bdf46 | 44 | * The handler for all incoming MIDI messages. |
asuszek | 2:e21bd39bdf46 | 45 | */ |
asuszek | 0:cad8dafb22be | 46 | void midiMessageReceived(MIDIMessage message) { |
asuszek | 2:e21bd39bdf46 | 47 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 48 | pc.printf("Message Received\r\n"); |
asuszek | 2:e21bd39bdf46 | 49 | #endif |
asuszek | 0:cad8dafb22be | 50 | |
asuszek | 6:688698f814c0 | 51 | int key; |
asuszek | 6:688698f814c0 | 52 | int velocity; |
asuszek | 6:688698f814c0 | 53 | |
asuszek | 0:cad8dafb22be | 54 | switch (message.type()) { |
asuszek | 0:cad8dafb22be | 55 | case MIDIMessage::NoteOnType: |
asuszek | 6:688698f814c0 | 56 | key = message.key(); |
asuszek | 6:688698f814c0 | 57 | velocity = message.velocity(); |
asuszek | 6:688698f814c0 | 58 | |
asuszek | 6:688698f814c0 | 59 | audioEngine.midiNoteOn(key, velocity); |
ndelfino | 8:deaedb59243e | 60 | |
ndelfino | 8:deaedb59243e | 61 | ledController.identifyKeyForLed(key, 1); |
asuszek | 6:688698f814c0 | 62 | |
asuszek | 2:e21bd39bdf46 | 63 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 64 | pc.printf("\tType: Note On\r\n"); |
asuszek | 6:688698f814c0 | 65 | pc.printf("\tNote: %d\tVelocity: %d\r\n", key, velocity); |
asuszek | 2:e21bd39bdf46 | 66 | #endif |
asuszek | 0:cad8dafb22be | 67 | break; |
asuszek | 0:cad8dafb22be | 68 | case MIDIMessage::NoteOffType: |
asuszek | 6:688698f814c0 | 69 | key = message.key(); |
asuszek | 6:688698f814c0 | 70 | velocity = message.velocity(); |
asuszek | 6:688698f814c0 | 71 | |
asuszek | 6:688698f814c0 | 72 | audioEngine.midiNoteOff(key); |
ndelfino | 8:deaedb59243e | 73 | |
ndelfino | 8:deaedb59243e | 74 | ledController.identifyKeyForLed(key, -1); |
asuszek | 6:688698f814c0 | 75 | |
asuszek | 2:e21bd39bdf46 | 76 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 77 | pc.printf("\tType: Note Off\r\n"); |
asuszek | 6:688698f814c0 | 78 | pc.printf("\tNote: %d\r\n", key); |
asuszek | 2:e21bd39bdf46 | 79 | #endif |
asuszek | 0:cad8dafb22be | 80 | break; |
asuszek | 0:cad8dafb22be | 81 | default: |
asuszek | 2:e21bd39bdf46 | 82 | // no-op |
asuszek | 2:e21bd39bdf46 | 83 | break; |
asuszek | 0:cad8dafb22be | 84 | } |
asuszek | 0:cad8dafb22be | 85 | } |
asuszek | 0:cad8dafb22be | 86 | |
asuszek | 6:688698f814c0 | 87 | void nextSynthPressed() { |
asuszek | 6:688698f814c0 | 88 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 89 | pc.printf("Toggling to next synthesizer.r\n"); |
asuszek | 6:688698f814c0 | 90 | #endif |
asuszek | 6:688698f814c0 | 91 | |
asuszek | 6:688698f814c0 | 92 | audioEngine.nextSynth(1); |
asuszek | 6:688698f814c0 | 93 | } |
asuszek | 6:688698f814c0 | 94 | |
asuszek | 6:688698f814c0 | 95 | void prevSynthPressed() { |
asuszek | 6:688698f814c0 | 96 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 97 | pc.printf("Toggling to previous synthesizer.r\n"); |
asuszek | 6:688698f814c0 | 98 | #endif |
asuszek | 6:688698f814c0 | 99 | |
asuszek | 6:688698f814c0 | 100 | audioEngine.nextSynth(-1); |
asuszek | 6:688698f814c0 | 101 | } |
asuszek | 6:688698f814c0 | 102 |