Abel Zatarain / Mbed 2 deprecated FMSynthCSUSM

Dependencies:   mbed

Committer:
davolfman
Date:
Mon Nov 27 22:05:48 2017 +0000
Revision:
2:5454dee210ed
Parent:
1:f3350a372732
Child:
3:83ac767f3a63
Pins defined partial main loop implementation

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 2:5454dee210ed 23 BusIn keyBank(PC_10, PC_11, PC_12, PC_13, PC_14, PC_15);
davolfman 2:5454dee210ed 24 BusOut keySelect(PB_0, PB_1, PB_2, PB_3, PB_4, PB_5, PB_6, PB_7, PB_8);
davolfman 2:5454dee210ed 25 BusIn numerator(PA_8, PA_9, PA_10, PA_11);
davolfman 2:5454dee210ed 26 BusIn denominator(PA_12, PA_13, PA_14, PA_15);
davolfman 2:5454dee210ed 27
davolfman 0:b2f7400596ce 28 //Renaming ports
davolfman 0:b2f7400596ce 29 #define inVol ADC0
davolfman 0:b2f7400596ce 30 #define inModAmt ADC1
davolfman 0:b2f7400596ce 31 #define inCarA ADC6
davolfman 0:b2f7400596ce 32 #define inCarD ADC7
davolfman 0:b2f7400596ce 33 #define inCarS ADC10
davolfman 0:b2f7400596ce 34 #define inCarR ADC11
davolfman 0:b2f7400596ce 35 #define inModA ADC12
davolfman 0:b2f7400596ce 36 #define inModD ADC13
davolfman 0:b2f7400596ce 37 #define inModS ADC14
davolfman 0:b2f7400596ce 38 #define inModR ADC15
davolfman 0:b2f7400596ce 39 #define outMono DAC0
davolfman 0:b2f7400596ce 40
davolfman 2:5454dee210ed 41 #define numKeys 49
davolfman 1:f3350a372732 42 #define PI M_PI
davolfman 0:b2f7400596ce 43
davolfman 0:b2f7400596ce 44 //possible constants
davolfman 0:b2f7400596ce 45 int carrierIncrements[numKeys];
davolfman 2:5454dee210ed 46 /*
davolfman 2:5454dee210ed 47 going to build table here later.
davolfman 2:5454dee210ed 48 */
davolfman 1:f3350a372732 49 const int attackLimit = (0x1 << 16) - 1;
davolfman 1:f3350a372732 50 const int fixed2Pi = (int) ((2.0 * PI) * (0x1 << 16));
davolfman 1:f3350a372732 51
davolfman 0:b2f7400596ce 52
davolfman 0:b2f7400596ce 53 //non-constants
davolfman 1:f3350a372732 54 //Most of these will be recalculated or reset on every input cycle of the main
davolfman 1:f3350a372732 55 // loop, as appropriate
davolfman 0:b2f7400596ce 56 int FMmult;
davolfman 0:b2f7400596ce 57 int Volume;
davolfman 1:f3350a372732 58 int modVol;
davolfman 1:f3350a372732 59 int modAmpI;
davolfman 1:f3350a372732 60 int carAmpS;
davolfman 2:5454dee210ed 61 //bool keysPressed[numKeys];
davolfman 2:5454dee210ed 62 int64_t keyboard;
davolfman 0:b2f7400596ce 63 int carrierPhases[numKeys];
davolfman 0:b2f7400596ce 64 int modulatorPhases[numKeys];
davolfman 0:b2f7400596ce 65 short envelopeStatesC[numKeys];
davolfman 0:b2f7400596ce 66 short envelopeStatesM[numKeys];
davolfman 0:b2f7400596ce 67 int envelopeAmpsC[numKeys];
davolfman 1:f3350a372732 68 int envelopeAmpsM[numKeys];
davolfman 1:f3350a372732 69
davolfman 1:f3350a372732 70 int modA;
davolfman 1:f3350a372732 71 int modD;
davolfman 1:f3350a372732 72 int modS;
davolfman 1:f3350a372732 73 int modR;
davolfman 1:f3350a372732 74 int carA;
davolfman 1:f3350a372732 75 int carD;
davolfman 1:f3350a372732 76 int carS;
davolfman 1:f3350a372732 77 int carR;
davolfman 1:f3350a372732 78
davolfman 1:f3350a372732 79 int fastSin(const int phase){
davolfman 1:f3350a372732 80 return 0;
davolfman 1:f3350a372732 81 }
davolfman 0:b2f7400596ce 82
davolfman 1:f3350a372732 83 void synthesize(){
davolfman 1:f3350a372732 84 carAmpS = 0;
davolfman 1:f3350a372732 85 for(int i = 0; i < numKeys; ++i){
davolfman 2:5454dee210ed 86 if(keyboard & (0x1 << i)){
davolfman 1:f3350a372732 87 if(envelopeStatesC[i] < 2)
davolfman 1:f3350a372732 88 envelopeStatesC[i] = 4;
davolfman 1:f3350a372732 89 if(envelopeStatesM[i] < 2)
davolfman 1:f3350a372732 90 envelopeStatesM[i] = 4;
davolfman 1:f3350a372732 91
davolfman 1:f3350a372732 92 if(envelopeStatesC[i] == 4){
davolfman 1:f3350a372732 93 envelopeAmpsC[i] += carA;
davolfman 1:f3350a372732 94 if(envelopeAmpsC[i] >= attackLimit){
davolfman 1:f3350a372732 95 envelopeAmpsC[i] = attackLimit;
davolfman 1:f3350a372732 96 envelopeStatesC[i] = 3;
davolfman 1:f3350a372732 97 }
davolfman 1:f3350a372732 98 }
davolfman 1:f3350a372732 99
davolfman 1:f3350a372732 100 if(envelopeStatesM[i] == 4){
davolfman 1:f3350a372732 101 envelopeAmpsM[i] += modA;
davolfman 1:f3350a372732 102 if(envelopeAmpsM[i] >= attackLimit){
davolfman 1:f3350a372732 103 envelopeAmpsM[i] = attackLimit;
davolfman 1:f3350a372732 104 envelopeStatesM[i] = 3;
davolfman 1:f3350a372732 105 }
davolfman 1:f3350a372732 106 }
davolfman 1:f3350a372732 107
davolfman 1:f3350a372732 108 if(envelopeStatesC[i] == 3){
davolfman 1:f3350a372732 109 envelopeAmpsC[i] += carD;
davolfman 1:f3350a372732 110 if(envelopeAmpsC[i] <= carS){
davolfman 1:f3350a372732 111 envelopeAmpsC[i] = carS;
davolfman 1:f3350a372732 112 envelopeStatesC[i] = 2;
davolfman 1:f3350a372732 113 }
davolfman 1:f3350a372732 114 }
davolfman 1:f3350a372732 115
davolfman 1:f3350a372732 116 if(envelopeStatesM[i] == 3){
davolfman 1:f3350a372732 117 envelopeAmpsM[i] += modD;
davolfman 1:f3350a372732 118 if(envelopeAmpsM[i] <= modS){
davolfman 1:f3350a372732 119 envelopeAmpsM[i] = modS;
davolfman 1:f3350a372732 120 envelopeStatesM[i] = 2;
davolfman 1:f3350a372732 121 }
davolfman 1:f3350a372732 122 }
davolfman 1:f3350a372732 123 }else{
davolfman 1:f3350a372732 124 if(envelopeStatesC[i] > 1)
davolfman 1:f3350a372732 125 envelopeStatesC[i] = 1;
davolfman 1:f3350a372732 126 if(envelopeStatesM[i] > 1)
davolfman 1:f3350a372732 127 envelopeStatesM[i] = 1;
davolfman 1:f3350a372732 128
davolfman 1:f3350a372732 129 if(envelopeStatesC[i] == 1){
davolfman 1:f3350a372732 130 if(envelopeAmpsC[i] <= 0){
davolfman 1:f3350a372732 131 envelopeStatesC[i] = 0;
davolfman 1:f3350a372732 132 envelopeAmpsC[i] = 0;
davolfman 1:f3350a372732 133 }else{
davolfman 1:f3350a372732 134 envelopeAmpsC[i] -= carR;
davolfman 1:f3350a372732 135 }
davolfman 1:f3350a372732 136 }
davolfman 1:f3350a372732 137 if(envelopeStatesM[i] == 1){
davolfman 1:f3350a372732 138 if(envelopeAmpsM[i] <= 0){
davolfman 1:f3350a372732 139 envelopeStatesM[i] = 0;
davolfman 1:f3350a372732 140 envelopeAmpsM[i] = 0;
davolfman 1:f3350a372732 141 }else{
davolfman 1:f3350a372732 142 envelopeAmpsM[i] -= modR;
davolfman 1:f3350a372732 143 }
davolfman 1:f3350a372732 144 }
davolfman 1:f3350a372732 145 }
davolfman 1:f3350a372732 146
davolfman 1:f3350a372732 147 if(envelopeAmpsC[i] > 0){
davolfman 1:f3350a372732 148 modulatorPhases[i] += (Fmult * carrierIncrements[i]) >> 16;
davolfman 1:f3350a372732 149 modAmpI = fastSin((((modulatorPhases[i] * envelopeAmpsM[i]) >> 16)
davolfman 1:f3350a372732 150 * modVol) >> 16);
davolfman 1:f3350a372732 151 carrierPhases[i] += ((carrierIncrements[i] + modAmpI) * fixed2pi) >> 16;
davolfman 1:f3350a372732 152 carAmps += (fastSin(carrierPhases[i]) * envelopeAmpsC[i]) >> 16;
davolfman 1:f3350a372732 153 }
davolfman 1:f3350a372732 154 }
davolfman 1:f3350a372732 155 outMono.write_u16(((carAmps / numKeys) * Volume) >> 16);
davolfman 1:f3350a372732 156 }
davolfman 0:b2f7400596ce 157
davolfman 0:b2f7400596ce 158
davolfman 0:b2f7400596ce 159 int main() {
davolfman 2:5454dee210ed 160 int ratNumer;
davolfman 2:5454dee210ed 161 int ratDenom;
davolfman 2:5454dee210ed 162
davolfman 2:5454dee210ed 163 while(true){
davolfman 2:5454dee210ed 164 ratNumer = 0xf & ~ numerator;
davolfman 2:5454dee210ed 165 ratDenom = 0xf & ~ denom;
davolfman 2:5454dee210ed 166 FMult = (ratNumer << 16) / ratDenom;
davolfman 2:5454dee210ed 167
davolfman 2:5454dee210ed 168 Volume = (int)inVol.read_u16();
davolfman 2:5454dee210ed 169 modVol = (int)inModAmt.read_u16();
davolfman 2:5454dee210ed 170
davolfman 2:5454dee210ed 171 carA = 0xffff / ((int)inCarA.read_u16());
davolfman 2:5454dee210ed 172 carD = 0xffff / ((int)inCarD.read_u16());
davolfman 2:5454dee210ed 173 carS = (int)inCarS.read_u16();
davolfman 2:5454dee210ed 174 carR = 0xffff / ((int)inCarR.read_u16());
davolfman 2:5454dee210ed 175
davolfman 2:5454dee210ed 176 modA = 0xffff / ((int)inModA.read_u16());
davolfman 2:5454dee210ed 177 modD = 0xffff / ((int)inModD.read_u16());
davolfman 2:5454dee210ed 178 modS = (int)inModS.read_u16();
davolfman 2:5454dee210ed 179 modR = 0xffff / ((int)inModR.read_u16());
davolfman 2:5454dee210ed 180
davolfman 2:5454dee210ed 181
davolfman 2:5454dee210ed 182 }
davolfman 0:b2f7400596ce 183 }