A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.
Dependencies: mbed USBDevice PinDetect
main.cpp@6:688698f814c0, 2016-04-12 (annotated)
- Committer:
- asuszek
- Date:
- Tue Apr 12 20:37:08 2016 +0000
- Revision:
- 6:688698f814c0
- Parent:
- 2:e21bd39bdf46
- Child:
- 8:deaedb59243e
- Child:
- 9:1e012f67470c
Created Audio Engine and Synthesizer class. It is now a fully working MIDI synth with the following simple waveforms: sine, triangle, square, and saw.
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" |
asuszek | 0:cad8dafb22be | 12 | |
asuszek | 0:cad8dafb22be | 13 | Serial pc(USBTX, USBRX); |
asuszek | 6:688698f814c0 | 14 | |
asuszek | 0:cad8dafb22be | 15 | USBMIDI midi; |
asuszek | 6:688698f814c0 | 16 | AudioEngine audioEngine; |
asuszek | 6:688698f814c0 | 17 | |
asuszek | 6:688698f814c0 | 18 | // Buttons for the toggling of synths. |
asuszek | 6:688698f814c0 | 19 | PinDetect nextSynth(p27); |
asuszek | 6:688698f814c0 | 20 | PinDetect prevSynth(p28); |
asuszek | 0:cad8dafb22be | 21 | |
asuszek | 2:e21bd39bdf46 | 22 | void midiMessageReceived(MIDIMessage message); |
asuszek | 2:e21bd39bdf46 | 23 | |
asuszek | 6:688698f814c0 | 24 | void nextSynthPressed(); |
asuszek | 6:688698f814c0 | 25 | void prevSynthPressed(); |
asuszek | 6:688698f814c0 | 26 | |
asuszek | 2:e21bd39bdf46 | 27 | int main() { |
asuszek | 2:e21bd39bdf46 | 28 | // Attach the function to handle all incoming MIDI events. |
asuszek | 2:e21bd39bdf46 | 29 | midi.attach(midiMessageReceived); |
asuszek | 6:688698f814c0 | 30 | |
asuszek | 6:688698f814c0 | 31 | // Attach the synth toggling buttons. |
asuszek | 6:688698f814c0 | 32 | nextSynth.attach_asserted(&nextSynthPressed); |
asuszek | 6:688698f814c0 | 33 | prevSynth.attach_asserted(&prevSynthPressed); |
asuszek | 6:688698f814c0 | 34 | nextSynth.setSampleFrequency(); |
asuszek | 6:688698f814c0 | 35 | prevSynth.setSampleFrequency(); |
asuszek | 2:e21bd39bdf46 | 36 | |
asuszek | 2:e21bd39bdf46 | 37 | while (1) {} |
asuszek | 2:e21bd39bdf46 | 38 | } |
asuszek | 2:e21bd39bdf46 | 39 | |
asuszek | 2:e21bd39bdf46 | 40 | /* |
asuszek | 2:e21bd39bdf46 | 41 | * The handler for all incoming MIDI messages. |
asuszek | 2:e21bd39bdf46 | 42 | */ |
asuszek | 0:cad8dafb22be | 43 | void midiMessageReceived(MIDIMessage message) { |
asuszek | 2:e21bd39bdf46 | 44 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 45 | pc.printf("Message Received\r\n"); |
asuszek | 2:e21bd39bdf46 | 46 | #endif |
asuszek | 0:cad8dafb22be | 47 | |
asuszek | 6:688698f814c0 | 48 | int key; |
asuszek | 6:688698f814c0 | 49 | int velocity; |
asuszek | 6:688698f814c0 | 50 | |
asuszek | 0:cad8dafb22be | 51 | switch (message.type()) { |
asuszek | 0:cad8dafb22be | 52 | case MIDIMessage::NoteOnType: |
asuszek | 6:688698f814c0 | 53 | key = message.key(); |
asuszek | 6:688698f814c0 | 54 | velocity = message.velocity(); |
asuszek | 6:688698f814c0 | 55 | |
asuszek | 6:688698f814c0 | 56 | audioEngine.midiNoteOn(key, velocity); |
asuszek | 6:688698f814c0 | 57 | |
asuszek | 2:e21bd39bdf46 | 58 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 59 | pc.printf("\tType: Note On\r\n"); |
asuszek | 6:688698f814c0 | 60 | pc.printf("\tNote: %d\tVelocity: %d\r\n", key, velocity); |
asuszek | 2:e21bd39bdf46 | 61 | #endif |
asuszek | 0:cad8dafb22be | 62 | break; |
asuszek | 0:cad8dafb22be | 63 | case MIDIMessage::NoteOffType: |
asuszek | 6:688698f814c0 | 64 | key = message.key(); |
asuszek | 6:688698f814c0 | 65 | velocity = message.velocity(); |
asuszek | 6:688698f814c0 | 66 | |
asuszek | 6:688698f814c0 | 67 | audioEngine.midiNoteOff(key); |
asuszek | 6:688698f814c0 | 68 | |
asuszek | 2:e21bd39bdf46 | 69 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 70 | pc.printf("\tType: Note Off\r\n"); |
asuszek | 6:688698f814c0 | 71 | pc.printf("\tNote: %d\r\n", key); |
asuszek | 2:e21bd39bdf46 | 72 | #endif |
asuszek | 0:cad8dafb22be | 73 | break; |
asuszek | 0:cad8dafb22be | 74 | default: |
asuszek | 2:e21bd39bdf46 | 75 | // no-op |
asuszek | 2:e21bd39bdf46 | 76 | break; |
asuszek | 0:cad8dafb22be | 77 | } |
asuszek | 0:cad8dafb22be | 78 | } |
asuszek | 0:cad8dafb22be | 79 | |
asuszek | 6:688698f814c0 | 80 | void nextSynthPressed() { |
asuszek | 6:688698f814c0 | 81 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 82 | pc.printf("Toggling to next synthesizer.r\n"); |
asuszek | 6:688698f814c0 | 83 | #endif |
asuszek | 6:688698f814c0 | 84 | |
asuszek | 6:688698f814c0 | 85 | audioEngine.nextSynth(1); |
asuszek | 6:688698f814c0 | 86 | } |
asuszek | 6:688698f814c0 | 87 | |
asuszek | 6:688698f814c0 | 88 | void prevSynthPressed() { |
asuszek | 6:688698f814c0 | 89 | #ifdef DEBUG |
asuszek | 6:688698f814c0 | 90 | pc.printf("Toggling to previous synthesizer.r\n"); |
asuszek | 6:688698f814c0 | 91 | #endif |
asuszek | 6:688698f814c0 | 92 | |
asuszek | 6:688698f814c0 | 93 | audioEngine.nextSynth(-1); |
asuszek | 6:688698f814c0 | 94 | } |
asuszek | 6:688698f814c0 | 95 |