Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:f3350a372732, 2017-11-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |