Austin Suszek / Mbed 2 deprecated MIDISynthesizer

Dependencies:   mbed USBDevice PinDetect

Committer:
asuszek
Date:
Sun Apr 17 21:35:23 2016 +0000
Revision:
13:bb0ec927e458
Child:
15:aa5a4c350251
Implemented basic Karplus Strong. The sample rate had to be halved in order to process the algorithm for each sample without crashing.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
asuszek 13:bb0ec927e458 1
asuszek 13:bb0ec927e458 2 /**
asuszek 13:bb0ec927e458 3 * The processor used for teh implementation of Karplus strong.
asuszek 13:bb0ec927e458 4 *
asuszek 13:bb0ec927e458 5 * @author Austin Suszek
asuszek 13:bb0ec927e458 6 */
asuszek 13:bb0ec927e458 7
asuszek 13:bb0ec927e458 8 #ifndef AS_KARPLUS_STRONG_H
asuszek 13:bb0ec927e458 9 #define AS_KARPLUS_STRONG_H
asuszek 13:bb0ec927e458 10
asuszek 13:bb0ec927e458 11 #include <math.h>
asuszek 13:bb0ec927e458 12 #include <stdlib.h>
asuszek 13:bb0ec927e458 13 #include <time.h>
asuszek 13:bb0ec927e458 14
asuszek 13:bb0ec927e458 15 #include "../Constants.h"
asuszek 13:bb0ec927e458 16
asuszek 13:bb0ec927e458 17 class KarplusStrong {
asuszek 13:bb0ec927e458 18 public:
asuszek 13:bb0ec927e458 19
asuszek 13:bb0ec927e458 20 /**
asuszek 13:bb0ec927e458 21 * Constructor
asuszek 13:bb0ec927e458 22 */
asuszek 13:bb0ec927e458 23 KarplusStrong();
asuszek 13:bb0ec927e458 24
asuszek 13:bb0ec927e458 25 /**
asuszek 13:bb0ec927e458 26 * Signal the start of a new note.
asuszek 13:bb0ec927e458 27 *
asuszek 13:bb0ec927e458 28 * @param key The integer representation of the note
asuszek 13:bb0ec927e458 29 * @param velocity The float representation of the velocity (NOT int!)
asuszek 13:bb0ec927e458 30 */
asuszek 13:bb0ec927e458 31 void midiNoteOn(int key, float velocity);
asuszek 13:bb0ec927e458 32
asuszek 13:bb0ec927e458 33 /**
asuszek 13:bb0ec927e458 34 * Create the initial buffer sample for the specific index.
asuszek 13:bb0ec927e458 35 *
asuszek 13:bb0ec927e458 36 * @param bufferIndex The index to process
asuszek 13:bb0ec927e458 37 * @return The new sample to save in the buffer
asuszek 13:bb0ec927e458 38 */
asuszek 13:bb0ec927e458 39 float fillBuffer(const int bufferIndex);
asuszek 13:bb0ec927e458 40
asuszek 13:bb0ec927e458 41 /**
asuszek 13:bb0ec927e458 42 * Process the existing buffer for the specific index.
asuszek 13:bb0ec927e458 43 *
asuszek 13:bb0ec927e458 44 * @param inputSample The sample to process from the buffer
asuszek 13:bb0ec927e458 45 * @return The modified sample to save in the buffer
asuszek 13:bb0ec927e458 46 */
asuszek 13:bb0ec927e458 47 float processBuffer(const float inputSample);
asuszek 13:bb0ec927e458 48
asuszek 13:bb0ec927e458 49 private:
asuszek 13:bb0ec927e458 50
asuszek 13:bb0ec927e458 51 static void initializeNoiseSeed();
asuszek 13:bb0ec927e458 52 static float getRand() {
asuszek 13:bb0ec927e458 53 return float(rand()) / float(RAND_MAX);
asuszek 13:bb0ec927e458 54 };
asuszek 13:bb0ec927e458 55
asuszek 13:bb0ec927e458 56 float lastOutput;
asuszek 13:bb0ec927e458 57 float filterCoefficient;
asuszek 13:bb0ec927e458 58 float nextFilterCoefficient;
asuszek 13:bb0ec927e458 59 float velocity;
asuszek 13:bb0ec927e458 60
asuszek 13:bb0ec927e458 61 float lowpassFilter(const float output, const float input, const float smoothingFactor);
asuszek 13:bb0ec927e458 62
asuszek 13:bb0ec927e458 63 };
asuszek 13:bb0ec927e458 64
asuszek 13:bb0ec927e458 65 #endif