Abel Zatarain / Mbed 2 deprecated FMSynthCSUSM

Dependencies:   mbed

Committer:
davolfman
Date:
Thu Nov 09 22:40:50 2017 +0000
Revision:
1:f3350a372732
Parent:
0:b2f7400596ce
Child:
2:5454dee210ed
Synthesis algo input

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davolfman 0:b2f7400596ce 1 #include "mbed.h"
davolfman 0:b2f7400596ce 2
davolfman 0:b2f7400596ce 3 AnalogOut DAC0(PA_4);//Not labeled in the docs for the f401, but seems to be for all
davolfman 0:b2f7400596ce 4 AnalogOut DAC1(PA_5);
davolfman 0:b2f7400596ce 5
davolfman 0:b2f7400596ce 6 AnalogIn ADC0(PA_0);
davolfman 0:b2f7400596ce 7 AnalogIn ADC1(PA_1);
davolfman 0:b2f7400596ce 8 //AnalogIn ADC2(PA_2);//not labeled as such in MBED's docs for f401, yes 446
davolfman 0:b2f7400596ce 9 //AnalogIn ADC3(PA_3);//not labeled as such in MBED's docs for f401, yes 446
davolfman 0:b2f7400596ce 10 //AnalogIn ADC4(PA_4);//we're using these for output
davolfman 0:b2f7400596ce 11 //AnalogIn ADC5(PA_5);//we're using these for output
davolfman 0:b2f7400596ce 12 AnalogIn ADC6(PA_6);
davolfman 0:b2f7400596ce 13 AnalogIn ADC7(PA_7);
davolfman 0:b2f7400596ce 14 //AnalogIn ADC8(PB_0);//lets leave the 2 we aren't using in a single port
davolfman 0:b2f7400596ce 15 //AnalogIn ADC9(PB_1);//that way we know there's not ADCs on one of them
davolfman 0:b2f7400596ce 16 AnalogIn ADC10(PC_0);
davolfman 0:b2f7400596ce 17 AnalogIn ADC11(PC_1);
davolfman 0:b2f7400596ce 18 AnalogIn ADC12(PC_2);
davolfman 0:b2f7400596ce 19 AnalogIn ADC13(PC_3);
davolfman 0:b2f7400596ce 20 AnalogIn ADC14(PC_4);
davolfman 0:b2f7400596ce 21 AnalogIn ADC15(PC_5);
davolfman 0:b2f7400596ce 22
davolfman 0:b2f7400596ce 23 //Renaming ports
davolfman 0:b2f7400596ce 24 #define inVol ADC0
davolfman 0:b2f7400596ce 25 #define inModAmt ADC1
davolfman 0:b2f7400596ce 26 #define inCarA ADC6
davolfman 0:b2f7400596ce 27 #define inCarD ADC7
davolfman 0:b2f7400596ce 28 #define inCarS ADC10
davolfman 0:b2f7400596ce 29 #define inCarR ADC11
davolfman 0:b2f7400596ce 30 #define inModA ADC12
davolfman 0:b2f7400596ce 31 #define inModD ADC13
davolfman 0:b2f7400596ce 32 #define inModS ADC14
davolfman 0:b2f7400596ce 33 #define inModR ADC15
davolfman 0:b2f7400596ce 34 #define outMono DAC0
davolfman 0:b2f7400596ce 35
davolfman 0:b2f7400596ce 36 #define numKeys 88
davolfman 1:f3350a372732 37 #define PI M_PI
davolfman 0:b2f7400596ce 38
davolfman 0:b2f7400596ce 39 //possible constants
davolfman 0:b2f7400596ce 40 int carrierIncrements[numKeys];
davolfman 1:f3350a372732 41 const int attackLimit = (0x1 << 16) - 1;
davolfman 1:f3350a372732 42 const int fixed2Pi = (int) ((2.0 * PI) * (0x1 << 16));
davolfman 1:f3350a372732 43
davolfman 0:b2f7400596ce 44
davolfman 0:b2f7400596ce 45 //non-constants
davolfman 1:f3350a372732 46 //Most of these will be recalculated or reset on every input cycle of the main
davolfman 1:f3350a372732 47 // loop, as appropriate
davolfman 0:b2f7400596ce 48 int FMmult;
davolfman 0:b2f7400596ce 49 int Volume;
davolfman 1:f3350a372732 50 int modVol;
davolfman 1:f3350a372732 51 int modAmpI;
davolfman 1:f3350a372732 52 int carAmpS;
davolfman 0:b2f7400596ce 53 bool keysPressed[numKeys];
davolfman 0:b2f7400596ce 54 int carrierPhases[numKeys];
davolfman 0:b2f7400596ce 55 int modulatorPhases[numKeys];
davolfman 0:b2f7400596ce 56 short envelopeStatesC[numKeys];
davolfman 0:b2f7400596ce 57 short envelopeStatesM[numKeys];
davolfman 0:b2f7400596ce 58 int envelopeAmpsC[numKeys];
davolfman 1:f3350a372732 59 int envelopeAmpsM[numKeys];
davolfman 1:f3350a372732 60
davolfman 1:f3350a372732 61 int modA;
davolfman 1:f3350a372732 62 int modD;
davolfman 1:f3350a372732 63 int modS;
davolfman 1:f3350a372732 64 int modR;
davolfman 1:f3350a372732 65 int carA;
davolfman 1:f3350a372732 66 int carD;
davolfman 1:f3350a372732 67 int carS;
davolfman 1:f3350a372732 68 int carR;
davolfman 1:f3350a372732 69
davolfman 1:f3350a372732 70 int fastSin(const int phase){
davolfman 1:f3350a372732 71 return 0;
davolfman 1:f3350a372732 72 }
davolfman 0:b2f7400596ce 73
davolfman 1:f3350a372732 74 void synthesize(){
davolfman 1:f3350a372732 75 carAmpS = 0;
davolfman 1:f3350a372732 76 for(int i = 0; i < numKeys; ++i){
davolfman 1:f3350a372732 77 if(keysPressed[i]){
davolfman 1:f3350a372732 78 if(envelopeStatesC[i] < 2)
davolfman 1:f3350a372732 79 envelopeStatesC[i] = 4;
davolfman 1:f3350a372732 80 if(envelopeStatesM[i] < 2)
davolfman 1:f3350a372732 81 envelopeStatesM[i] = 4;
davolfman 1:f3350a372732 82
davolfman 1:f3350a372732 83 if(envelopeStatesC[i] == 4){
davolfman 1:f3350a372732 84 envelopeAmpsC[i] += carA;
davolfman 1:f3350a372732 85 if(envelopeAmpsC[i] >= attackLimit){
davolfman 1:f3350a372732 86 envelopeAmpsC[i] = attackLimit;
davolfman 1:f3350a372732 87 envelopeStatesC[i] = 3;
davolfman 1:f3350a372732 88 }
davolfman 1:f3350a372732 89 }
davolfman 1:f3350a372732 90
davolfman 1:f3350a372732 91 if(envelopeStatesM[i] == 4){
davolfman 1:f3350a372732 92 envelopeAmpsM[i] += modA;
davolfman 1:f3350a372732 93 if(envelopeAmpsM[i] >= attackLimit){
davolfman 1:f3350a372732 94 envelopeAmpsM[i] = attackLimit;
davolfman 1:f3350a372732 95 envelopeStatesM[i] = 3;
davolfman 1:f3350a372732 96 }
davolfman 1:f3350a372732 97 }
davolfman 1:f3350a372732 98
davolfman 1:f3350a372732 99 if(envelopeStatesC[i] == 3){
davolfman 1:f3350a372732 100 envelopeAmpsC[i] += carD;
davolfman 1:f3350a372732 101 if(envelopeAmpsC[i] <= carS){
davolfman 1:f3350a372732 102 envelopeAmpsC[i] = carS;
davolfman 1:f3350a372732 103 envelopeStatesC[i] = 2;
davolfman 1:f3350a372732 104 }
davolfman 1:f3350a372732 105 }
davolfman 1:f3350a372732 106
davolfman 1:f3350a372732 107 if(envelopeStatesM[i] == 3){
davolfman 1:f3350a372732 108 envelopeAmpsM[i] += modD;
davolfman 1:f3350a372732 109 if(envelopeAmpsM[i] <= modS){
davolfman 1:f3350a372732 110 envelopeAmpsM[i] = modS;
davolfman 1:f3350a372732 111 envelopeStatesM[i] = 2;
davolfman 1:f3350a372732 112 }
davolfman 1:f3350a372732 113 }
davolfman 1:f3350a372732 114 }else{
davolfman 1:f3350a372732 115 if(envelopeStatesC[i] > 1)
davolfman 1:f3350a372732 116 envelopeStatesC[i] = 1;
davolfman 1:f3350a372732 117 if(envelopeStatesM[i] > 1)
davolfman 1:f3350a372732 118 envelopeStatesM[i] = 1;
davolfman 1:f3350a372732 119
davolfman 1:f3350a372732 120 if(envelopeStatesC[i] == 1){
davolfman 1:f3350a372732 121 if(envelopeAmpsC[i] <= 0){
davolfman 1:f3350a372732 122 envelopeStatesC[i] = 0;
davolfman 1:f3350a372732 123 envelopeAmpsC[i] = 0;
davolfman 1:f3350a372732 124 }else{
davolfman 1:f3350a372732 125 envelopeAmpsC[i] -= carR;
davolfman 1:f3350a372732 126 }
davolfman 1:f3350a372732 127 }
davolfman 1:f3350a372732 128 if(envelopeStatesM[i] == 1){
davolfman 1:f3350a372732 129 if(envelopeAmpsM[i] <= 0){
davolfman 1:f3350a372732 130 envelopeStatesM[i] = 0;
davolfman 1:f3350a372732 131 envelopeAmpsM[i] = 0;
davolfman 1:f3350a372732 132 }else{
davolfman 1:f3350a372732 133 envelopeAmpsM[i] -= modR;
davolfman 1:f3350a372732 134 }
davolfman 1:f3350a372732 135 }
davolfman 1:f3350a372732 136 }
davolfman 1:f3350a372732 137
davolfman 1:f3350a372732 138 if(envelopeAmpsC[i] > 0){
davolfman 1:f3350a372732 139 modulatorPhases[i] += (Fmult * carrierIncrements[i]) >> 16;
davolfman 1:f3350a372732 140 modAmpI = fastSin((((modulatorPhases[i] * envelopeAmpsM[i]) >> 16)
davolfman 1:f3350a372732 141 * modVol) >> 16);
davolfman 1:f3350a372732 142 carrierPhases[i] += ((carrierIncrements[i] + modAmpI) * fixed2pi) >> 16;
davolfman 1:f3350a372732 143 carAmps += (fastSin(carrierPhases[i]) * envelopeAmpsC[i]) >> 16;
davolfman 1:f3350a372732 144 }
davolfman 1:f3350a372732 145 }
davolfman 1:f3350a372732 146 outMono.write_u16(((carAmps / numKeys) * Volume) >> 16);
davolfman 1:f3350a372732 147 }
davolfman 0:b2f7400596ce 148
davolfman 0:b2f7400596ce 149
davolfman 0:b2f7400596ce 150 int main() {
davolfman 0:b2f7400596ce 151 }