A MIDI piano synthesizer that implements the Karplus Strong physical modeling algorithm.

Dependencies:   mbed USBDevice PinDetect

Committer:
asuszek
Date:
Wed Apr 13 19:46:28 2016 +0000
Revision:
9:1e012f67470c
Parent:
6:688698f814c0
Child:
10:b9e14412cc23
Moved Audio into it's own folder

Who changed what in which revision?

UserRevisionLine numberNew 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 9:1e012f67470c 7 #include "Audio/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