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

Dependencies:   mbed USBDevice PinDetect

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?

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 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