Finn Quicke / Mbed 2 deprecated Basic_recursive_osc_synth

Dependencies:   mbed

Committer:
quickeman
Date:
Wed Jan 08 19:17:43 2020 +0000
Revision:
0:d0c08e2c4315
Basic recursive oscillator to be used with an Mbed and custom-designed control board.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
quickeman 0:d0c08e2c4315 1 #include "mbed.h"
quickeman 0:d0c08e2c4315 2 #include "math.h"
quickeman 0:d0c08e2c4315 3
quickeman 0:d0c08e2c4315 4 #ifndef M_PI
quickeman 0:d0c08e2c4315 5 #define M_PI 3.14159265358979323846
quickeman 0:d0c08e2c4315 6 #endif
quickeman 0:d0c08e2c4315 7
quickeman 0:d0c08e2c4315 8 AnalogIn pitchIn(p20);
quickeman 0:d0c08e2c4315 9 AnalogIn levelIn(p19);
quickeman 0:d0c08e2c4315 10 AnalogOut output(p18);
quickeman 0:d0c08e2c4315 11 DigitalIn switchIn(p21);
quickeman 0:d0c08e2c4315 12 DigitalOut led(LED1);
quickeman 0:d0c08e2c4315 13
quickeman 0:d0c08e2c4315 14 Ticker takePitch;
quickeman 0:d0c08e2c4315 15 Ticker takeLevel;
quickeman 0:d0c08e2c4315 16 Ticker outputSig;
quickeman 0:d0c08e2c4315 17
quickeman 0:d0c08e2c4315 18 float pitch;
quickeman 0:d0c08e2c4315 19 float level;
quickeman 0:d0c08e2c4315 20 float freqNorm;
quickeman 0:d0c08e2c4315 21
quickeman 0:d0c08e2c4315 22 // Recursive oscillator variables
quickeman 0:d0c08e2c4315 23 float y;
quickeman 0:d0c08e2c4315 24 float y_n1;
quickeman 0:d0c08e2c4315 25 float y_n2;
quickeman 0:d0c08e2c4315 26 float outSig;
quickeman 0:d0c08e2c4315 27
quickeman 0:d0c08e2c4315 28 void initOsc() {
quickeman 0:d0c08e2c4315 29 // Initialise values of recursive oscillator variables
quickeman 0:d0c08e2c4315 30 y = 0;
quickeman 0:d0c08e2c4315 31 y_n1 = sin(2 * M_PI * (1 - freqNorm));
quickeman 0:d0c08e2c4315 32 y_n2 = sin(2 * M_PI * (1 - (2 * freqNorm)));
quickeman 0:d0c08e2c4315 33 }
quickeman 0:d0c08e2c4315 34
quickeman 0:d0c08e2c4315 35 // Flag variables
quickeman 0:d0c08e2c4315 36 bool flag1 = 0;
quickeman 0:d0c08e2c4315 37 bool flag2 = 0;
quickeman 0:d0c08e2c4315 38
quickeman 0:d0c08e2c4315 39 void getPitch() {
quickeman 0:d0c08e2c4315 40 // Read in relative pitch value
quickeman 0:d0c08e2c4315 41 pitch = pitchIn.read();
quickeman 0:d0c08e2c4315 42 flag2 = 1;
quickeman 0:d0c08e2c4315 43 }
quickeman 0:d0c08e2c4315 44
quickeman 0:d0c08e2c4315 45 float getNormFreq(float freq, float max, float sampRate) {
quickeman 0:d0c08e2c4315 46 // Returns the normalised frequency for given input
quickeman 0:d0c08e2c4315 47 // freq: input frequency/pitch 0-1
quickeman 0:d0c08e2c4315 48 // max: maximum pitch defined in Hz
quickeman 0:d0c08e2c4315 49 // sampRate: sample rate in Hz
quickeman 0:d0c08e2c4315 50 float normFreq = freq * (max / sampRate);
quickeman 0:d0c08e2c4315 51 return normFreq;
quickeman 0:d0c08e2c4315 52 }
quickeman 0:d0c08e2c4315 53
quickeman 0:d0c08e2c4315 54 void getLevel() {
quickeman 0:d0c08e2c4315 55 // Read in desired output level
quickeman 0:d0c08e2c4315 56 level = levelIn.read();
quickeman 0:d0c08e2c4315 57 }
quickeman 0:d0c08e2c4315 58
quickeman 0:d0c08e2c4315 59 void genNext() {
quickeman 0:d0c08e2c4315 60 // Recursive oscillator
quickeman 0:d0c08e2c4315 61 y = (2 * cos(2 * M_PI * freqNorm) * y_n1) - y_n2;
quickeman 0:d0c08e2c4315 62 y_n2 = y_n1;
quickeman 0:d0c08e2c4315 63 y_n1 = y;
quickeman 0:d0c08e2c4315 64 }
quickeman 0:d0c08e2c4315 65
quickeman 0:d0c08e2c4315 66 void outputSignal() {
quickeman 0:d0c08e2c4315 67 // Output signal
quickeman 0:d0c08e2c4315 68 output.write(outSig);
quickeman 0:d0c08e2c4315 69 flag1 = 1;
quickeman 0:d0c08e2c4315 70 }
quickeman 0:d0c08e2c4315 71
quickeman 0:d0c08e2c4315 72 int main() {
quickeman 0:d0c08e2c4315 73 float sampFreq = 48000.0; // Hz
quickeman 0:d0c08e2c4315 74 float sampTime = 1.0 / sampFreq; // s
quickeman 0:d0c08e2c4315 75 float pitchMax = 9600.0; // Hz
quickeman 0:d0c08e2c4315 76
quickeman 0:d0c08e2c4315 77 getPitch();
quickeman 0:d0c08e2c4315 78 freqNorm = getNormFreq(pitch, pitchMax, sampFreq);
quickeman 0:d0c08e2c4315 79 flag2 = 0;
quickeman 0:d0c08e2c4315 80 getLevel();
quickeman 0:d0c08e2c4315 81
quickeman 0:d0c08e2c4315 82 initOsc();
quickeman 0:d0c08e2c4315 83
quickeman 0:d0c08e2c4315 84 takePitch.attach(&getPitch, 0.1);
quickeman 0:d0c08e2c4315 85 takeLevel.attach(&getLevel, 0.1);
quickeman 0:d0c08e2c4315 86 outputSig.attach(&outputSignal, sampTime);
quickeman 0:d0c08e2c4315 87
quickeman 0:d0c08e2c4315 88 while(1) {
quickeman 0:d0c08e2c4315 89 if(flag1) {
quickeman 0:d0c08e2c4315 90 genNext();
quickeman 0:d0c08e2c4315 91 if (switchIn.read()) {
quickeman 0:d0c08e2c4315 92 outSig = (level * y) / 33.0;
quickeman 0:d0c08e2c4315 93 } else {
quickeman 0:d0c08e2c4315 94 outSig = level * y;
quickeman 0:d0c08e2c4315 95 }
quickeman 0:d0c08e2c4315 96 flag1 = 0;
quickeman 0:d0c08e2c4315 97 }
quickeman 0:d0c08e2c4315 98 if(flag2){
quickeman 0:d0c08e2c4315 99 freqNorm = getNormFreq(pitch, pitchMax, sampFreq);
quickeman 0:d0c08e2c4315 100 flag2 = 0;
quickeman 0:d0c08e2c4315 101 }
quickeman 0:d0c08e2c4315 102 led = switchIn;
quickeman 0:d0c08e2c4315 103 }
quickeman 0:d0c08e2c4315 104 }