Abel Zatarain / Mbed 2 deprecated FMSynthCSUSM

Dependencies:   mbed

Committer:
davolfman
Date:
Mon Dec 11 20:30:36 2017 +0000
Revision:
18:4992aa537387
Parent:
17:65437c94ab1b
Child:
19:72886f894dc5
Fixed a few obvious mistakes, also tried tweaking Key Read timing for stronger pullups.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davolfman 0:b2f7400596ce 1 #include "mbed.h"
davolfman 3:83ac767f3a63 2 #include "sintable.h"
davolfman 0:b2f7400596ce 3
davolfman 9:86c0035f5321 4 AnalogOut outMono(PA_4);//Not labeled in the docs for the f401, but seems to be for all
davolfman 7:b0cd74923bc6 5 //AnalogOut DAC1(PA_5);
davolfman 0:b2f7400596ce 6
davolfman 9:86c0035f5321 7 AnalogIn inVol(PA_0);
davolfman 7:b0cd74923bc6 8 AnalogIn inModAmt(PA_1);
davolfman 6:9f8c8c3c111d 9 //AnalogIn ADC2(PA_2);//these are the uart pins!!
davolfman 6:9f8c8c3c111d 10 //AnalogIn ADC3(PA_3);//these are the uart pins!!
davolfman 0:b2f7400596ce 11 //AnalogIn ADC4(PA_4);//we're using these for output
davolfman 0:b2f7400596ce 12 //AnalogIn ADC5(PA_5);//we're using these for output
davolfman 9:86c0035f5321 13 AnalogIn inCarA(PA_6);
davolfman 9:86c0035f5321 14 AnalogIn inCarD(PA_7);
davolfman 0:b2f7400596ce 15 //AnalogIn ADC8(PB_0);//lets leave the 2 we aren't using in a single port
davolfman 0:b2f7400596ce 16 //AnalogIn ADC9(PB_1);//that way we know there's not ADCs on one of them
davolfman 9:86c0035f5321 17 AnalogIn inCarS(PC_0);
davolfman 9:86c0035f5321 18 AnalogIn inCarR(PC_1);
davolfman 9:86c0035f5321 19 AnalogIn inModA(PC_2);
davolfman 9:86c0035f5321 20 AnalogIn inModD(PC_3);
davolfman 9:86c0035f5321 21 AnalogIn inModS(PC_4);
davolfman 9:86c0035f5321 22 AnalogIn inModR(PC_5);
davolfman 0:b2f7400596ce 23
lenzi002 8:13b0594510de 24 //BusIn keyBank(PC_10, PC_11, PC_12, PC_13, PD_2, PH_1); old
lenzi002 8:13b0594510de 25 BusIn keyBank(PH_1, PD_2, PC_13, PC_12, PC_11, PC_10);
davolfman 7:b0cd74923bc6 26 BusOut bankSelect(PB_0, PB_1, PB_2, PB_3, PB_4, PB_5, PB_6, PB_7, PB_8);
davolfman 2:5454dee210ed 27 BusIn numerator(PA_8, PA_9, PA_10, PA_11);
davolfman 2:5454dee210ed 28 BusIn denominator(PA_12, PA_13, PA_14, PA_15);
davolfman 2:5454dee210ed 29
davolfman 16:c2f912cdd919 30 //Serial pc(USBTX, USBRX);
lenzi002 8:13b0594510de 31
davolfman 9:86c0035f5321 32 Ticker synthesisClock;
davolfman 0:b2f7400596ce 33
davolfman 2:5454dee210ed 34 #define numKeys 49
davolfman 0:b2f7400596ce 35
davolfman 4:1d2a699c95c7 36 //constants
davolfman 16:c2f912cdd919 37 const int carrierIncrements[] = {214, 227, 240, 254, 270, 286, 303, 321, 340,
davolfman 16:c2f912cdd919 38 360, 381, 404, 428, 454, 481, 509, 540, 572, 606, 642, 680, 720, 763, 809,
davolfman 16:c2f912cdd919 39 857, 908, 962, 1019, 1080, 1144, 1212, 1284, 1360, 1441, 1527, 1618, 1714,
davolfman 16:c2f912cdd919 40 1816, 1924, 2039, 2160, 2288, 2424, 2568, 2721, 2883, 3055, 3236, 3429};
davolfman 15:34ba7c2ef718 41 #define attackLimit 0xFFFF
davolfman 10:59c829586a4f 42 #define U_PI 3.14159265358979
davolfman 0:b2f7400596ce 43 //non-constants
davolfman 1:f3350a372732 44 //Most of these will be recalculated or reset on every input cycle of the main
davolfman 1:f3350a372732 45 // loop, as appropriate
davolfman 18:4992aa537387 46 int FMmult = 1;
davolfman 18:4992aa537387 47 int Volume = 0xffff;
davolfman 18:4992aa537387 48 int modVol = 0x2000;
davolfman 18:4992aa537387 49 int64_t keyboard = 0;
davolfman 18:4992aa537387 50 int64_t modattack = 0x1ffffffffffff;
davolfman 18:4992aa537387 51 int64_t carattack = 0x1ffffffffffff;
davolfman 0:b2f7400596ce 52 int carrierPhases[numKeys];
davolfman 0:b2f7400596ce 53 int modulatorPhases[numKeys];
davolfman 0:b2f7400596ce 54 int envelopeAmpsC[numKeys];
davolfman 1:f3350a372732 55 int envelopeAmpsM[numKeys];
davolfman 1:f3350a372732 56
davolfman 17:65437c94ab1b 57 //int testTone = 0;
davolfman 12:3a1e7fde5040 58
davolfman 18:4992aa537387 59 int modA = 0xffff;
davolfman 18:4992aa537387 60 int modD = 0xffff;
davolfman 18:4992aa537387 61 int modS = 0;
davolfman 18:4992aa537387 62 int modR = 0xffff;
davolfman 18:4992aa537387 63 int carA = 0xffff;
davolfman 18:4992aa537387 64 int carD = 0xffff;
davolfman 18:4992aa537387 65 int carS = 0;
davolfman 18:4992aa537387 66 int carR = 0xffff;
davolfman 1:f3350a372732 67
davolfman 1:f3350a372732 68 int fastSin(const int phase){
davolfman 5:ac5c4bd3ef4b 69 int index = (phase & 0x3ffc) >> 2;
davolfman 5:ac5c4bd3ef4b 70 int subindex = phase & 0x3;
davolfman 5:ac5c4bd3ef4b 71 int quadrant = (phase & 0xc000) >> 14;
davolfman 3:83ac767f3a63 72 int sum = 0;
davolfman 5:ac5c4bd3ef4b 73 switch (quadrant) {
davolfman 5:ac5c4bd3ef4b 74 case 0:
davolfman 7:b0cd74923bc6 75 sum += (4 - subindex) * sinTable[index];
davolfman 7:b0cd74923bc6 76 sum += subindex * sinTable[index+1];
davolfman 5:ac5c4bd3ef4b 77 break;
davolfman 5:ac5c4bd3ef4b 78 case 1:
davolfman 7:b0cd74923bc6 79 sum += (4 - subindex) * sinTable[1+4095-index];
davolfman 7:b0cd74923bc6 80 sum += subindex * sinTable[4095-index];
davolfman 5:ac5c4bd3ef4b 81 break;
davolfman 5:ac5c4bd3ef4b 82 case 2:
davolfman 7:b0cd74923bc6 83 sum -= (4 - subindex) * sinTable[index];
davolfman 7:b0cd74923bc6 84 sum -= subindex * sinTable[index+1];
davolfman 5:ac5c4bd3ef4b 85 break;
davolfman 5:ac5c4bd3ef4b 86 case 3:
davolfman 7:b0cd74923bc6 87 sum -= (4 - subindex) * sinTable[1+4095-index];
davolfman 7:b0cd74923bc6 88 sum -= subindex * sinTable[4095-index];
davolfman 5:ac5c4bd3ef4b 89 break;
davolfman 5:ac5c4bd3ef4b 90 }
davolfman 3:83ac767f3a63 91 sum = sum >> 2;
davolfman 3:83ac767f3a63 92
davolfman 3:83ac767f3a63 93 return sum;
davolfman 1:f3350a372732 94 }
davolfman 0:b2f7400596ce 95
davolfman 1:f3350a372732 96 void synthesize(){
davolfman 15:34ba7c2ef718 97 int wave = 0;
davolfman 15:34ba7c2ef718 98 int subsignal;
davolfman 15:34ba7c2ef718 99 int64_t keymask;
davolfman 11:286386c0db40 100
davolfman 17:65437c94ab1b 101 //testTone = testTone + carrierIncrements[25] & 0xffff;
davolfman 12:3a1e7fde5040 102
davolfman 15:34ba7c2ef718 103 for(int64_t i = 0; i < numKeys; ++i){
davolfman 15:34ba7c2ef718 104 keymask = 1ll << i;
davolfman 15:34ba7c2ef718 105
davolfman 15:34ba7c2ef718 106 if(!(keymask & keyboard)){
davolfman 15:34ba7c2ef718 107 carattack |= keymask;
davolfman 12:3a1e7fde5040 108 modattack |= keymask;
davolfman 15:34ba7c2ef718 109
davolfman 15:34ba7c2ef718 110 if(envelopeAmpsC[i] > 0){
davolfman 15:34ba7c2ef718 111 envelopeAmpsC[i] -= carR;
davolfman 15:34ba7c2ef718 112 }
davolfman 15:34ba7c2ef718 113 if(envelopeAmpsM[i] > 0){
davolfman 18:4992aa537387 114 envelopeAmpsM[i] -= modR;
davolfman 15:34ba7c2ef718 115 }
davolfman 12:3a1e7fde5040 116 }else{
davolfman 15:34ba7c2ef718 117 if(envelopeAmpsC[i] <= 0){
davolfman 15:34ba7c2ef718 118 carrierPhases[i] = 0;
davolfman 15:34ba7c2ef718 119 modulatorPhases[i] = 0;
davolfman 18:4992aa537387 120 envelopeAmpsM[i] = 0;
davolfman 11:286386c0db40 121 }
davolfman 11:286386c0db40 122
davolfman 15:34ba7c2ef718 123 if(keymask & carattack){
davolfman 15:34ba7c2ef718 124 if(envelopeAmpsC[i] < attackLimit ){
davolfman 15:34ba7c2ef718 125 envelopeAmpsC[i] += carA;
davolfman 15:34ba7c2ef718 126 }else{
davolfman 15:34ba7c2ef718 127 envelopeAmpsC[i] = attackLimit;
davolfman 15:34ba7c2ef718 128 carattack &= ~keymask;
davolfman 15:34ba7c2ef718 129 }
davolfman 12:3a1e7fde5040 130 }else{
davolfman 15:34ba7c2ef718 131 if(envelopeAmpsC[i] > carS){
davolfman 15:34ba7c2ef718 132 envelopeAmpsC[i] -= carD;
davolfman 15:34ba7c2ef718 133 }
davolfman 15:34ba7c2ef718 134 }
davolfman 15:34ba7c2ef718 135
davolfman 15:34ba7c2ef718 136 if(keymask & modattack){
davolfman 15:34ba7c2ef718 137 if(envelopeAmpsM[i] < attackLimit){
davolfman 15:34ba7c2ef718 138 envelopeAmpsM[i] += modA;
davolfman 15:34ba7c2ef718 139 }else{
davolfman 15:34ba7c2ef718 140 envelopeAmpsM[i] = attackLimit;
davolfman 18:4992aa537387 141 modattack &= ~keymask;
davolfman 15:34ba7c2ef718 142 }
davolfman 15:34ba7c2ef718 143 }else{
davolfman 15:34ba7c2ef718 144 if(envelopeAmpsM[i] > modS){
davolfman 15:34ba7c2ef718 145 envelopeAmpsM[i] -= modD;
davolfman 15:34ba7c2ef718 146 }
davolfman 15:34ba7c2ef718 147 }
davolfman 15:34ba7c2ef718 148
davolfman 15:34ba7c2ef718 149 if(envelopeAmpsC[i] > 0){
davolfman 15:34ba7c2ef718 150 modulatorPhases[i] += (carrierIncrements[i] * FMmult)>> 16;
davolfman 15:34ba7c2ef718 151 int modulation = (fastSin(modulatorPhases[i]) * envelopeAmpsM[i])>>16;
davolfman 15:34ba7c2ef718 152 modulation = (modulation * modVol) >> 16;
davolfman 15:34ba7c2ef718 153 carrierPhases[i] += carrierIncrements[i] + modulation;
davolfman 15:34ba7c2ef718 154 subsignal = (fastSin(carrierPhases[i]) * envelopeAmpsC[i])>>16;
davolfman 18:4992aa537387 155 wave += subsignal >> 3;
davolfman 1:f3350a372732 156 }
davolfman 12:3a1e7fde5040 157 }
davolfman 15:34ba7c2ef718 158
davolfman 15:34ba7c2ef718 159 }
davolfman 15:34ba7c2ef718 160 //if(keyboard)
davolfman 15:34ba7c2ef718 161 // wave += fastSin(testTone);
davolfman 15:34ba7c2ef718 162
davolfman 15:34ba7c2ef718 163 wave = wave * Volume >> 16;
davolfman 16:c2f912cdd919 164 //wave = wave << 3;
davolfman 12:3a1e7fde5040 165
davolfman 15:34ba7c2ef718 166 wave = (wave > 32767) ? 32767 : wave;
davolfman 15:34ba7c2ef718 167 wave = (wave < -32768) ? - 32768 : wave;
davolfman 15:34ba7c2ef718 168 wave += 32768;
davolfman 15:34ba7c2ef718 169 outMono.write_u16(wave);
davolfman 1:f3350a372732 170 }
davolfman 0:b2f7400596ce 171
davolfman 0:b2f7400596ce 172
davolfman 0:b2f7400596ce 173 int main() {
davolfman 2:5454dee210ed 174 int ratNumer;
davolfman 18:4992aa537387 175 int ratDenom;
davolfman 18:4992aa537387 176 int64_t keytemp;
davolfman 18:4992aa537387 177 int tempCarA, tempCarD, tempCarR, tempModA, tempModD, tempModR;
davolfman 9:86c0035f5321 178
davolfman 9:86c0035f5321 179 for(int i = 0; i < numKeys; ++i){
davolfman 9:86c0035f5321 180 carrierPhases[i] = 0;
davolfman 9:86c0035f5321 181 modulatorPhases[i] = 0;
davolfman 9:86c0035f5321 182 envelopeAmpsC[i] = 0;
davolfman 9:86c0035f5321 183 envelopeAmpsM[i] = 0;
davolfman 9:86c0035f5321 184 }
davolfman 9:86c0035f5321 185
lenzi002 8:13b0594510de 186 keyBank.mode(PullNone);
davolfman 16:c2f912cdd919 187 synthesisClock.attach(synthesize, 0.00005);//debug
lenzi002 8:13b0594510de 188
davolfman 16:c2f912cdd919 189 //pc.printf("done.\r\n");
davolfman 2:5454dee210ed 190 while(true){
davolfman 2:5454dee210ed 191 ratNumer = 0xf & ~ numerator;
davolfman 7:b0cd74923bc6 192 ratDenom = 0xf & ~ denominator;
davolfman 7:b0cd74923bc6 193 FMmult = (ratNumer << 16) / ratDenom;
davolfman 2:5454dee210ed 194
davolfman 13:29705e6bf718 195 Volume = (int)inVol.read_u16();
davolfman 12:3a1e7fde5040 196
davolfman 2:5454dee210ed 197 modVol = (int)inModAmt.read_u16();
davolfman 2:5454dee210ed 198
davolfman 18:4992aa537387 199 tempCarA = inCarA.read_u16();
davolfman 18:4992aa537387 200 if(! tempCarA)
davolfman 9:86c0035f5321 201 carA = 0xffff;
davolfman 9:86c0035f5321 202 else
davolfman 18:4992aa537387 203 carA = 0xffff / tempCarA;
davolfman 9:86c0035f5321 204
davolfman 18:4992aa537387 205 tempCarD = inCarD.read_u16();
davolfman 18:4992aa537387 206 if(! tempCarD)
davolfman 9:86c0035f5321 207 carD = 0xffff;
davolfman 9:86c0035f5321 208 else
davolfman 18:4992aa537387 209 carD = 0xffff / tempCarD;
davolfman 9:86c0035f5321 210
davolfman 2:5454dee210ed 211 carS = (int)inCarS.read_u16();
davolfman 9:86c0035f5321 212
davolfman 18:4992aa537387 213 tempCarR = inCarR.read_u16();
davolfman 18:4992aa537387 214 if(! tempCarR)
davolfman 9:86c0035f5321 215 carR = 0xffff;
davolfman 9:86c0035f5321 216 else
davolfman 18:4992aa537387 217 carR = 0xffff / tempCarR;
davolfman 2:5454dee210ed 218
davolfman 18:4992aa537387 219 tempModA = inModA.read_u16();
davolfman 18:4992aa537387 220 if(! tempModA)
davolfman 9:86c0035f5321 221 modA = 0xffff;
davolfman 9:86c0035f5321 222 else
davolfman 18:4992aa537387 223 modA = 0xffff / tempModA;
davolfman 9:86c0035f5321 224
davolfman 18:4992aa537387 225 tempModD = inModD.read_u16();
davolfman 18:4992aa537387 226 if(! tempModD)
davolfman 9:86c0035f5321 227 modD = 0xffff;
davolfman 9:86c0035f5321 228 else
davolfman 18:4992aa537387 229 modD = 0xffff / tempModD;
davolfman 9:86c0035f5321 230
davolfman 2:5454dee210ed 231 modS = (int)inModS.read_u16();
davolfman 9:86c0035f5321 232
davolfman 18:4992aa537387 233 tempModR = inModR.read_u16();
davolfman 18:4992aa537387 234 if(! tempModR)
davolfman 9:86c0035f5321 235 modR = 0xffff;
davolfman 9:86c0035f5321 236 else
davolfman 18:4992aa537387 237 modR = 0xffff / tempModR;
davolfman 13:29705e6bf718 238
davolfman 9:86c0035f5321 239 keytemp = 0; //zero the keys before we start ORing on top of everything
davolfman 9:86c0035f5321 240 for(int i = 0; i < 9; ++i) {
davolfman 13:29705e6bf718 241 bankSelect = (~(1 << i)) & bankSelect.mask();
davolfman 18:4992aa537387 242 wait_us(40);
lenzi002 8:13b0594510de 243 int shiftOffset = 6LL * i;
davolfman 13:29705e6bf718 244
davolfman 9:86c0035f5321 245 keytemp |= ((~(unsigned long long)keyBank) & (unsigned long long)keyBank.mask()) << (unsigned long long)shiftOffset;
davolfman 7:b0cd74923bc6 246 }
davolfman 9:86c0035f5321 247 keytemp >>= 5;
davolfman 9:86c0035f5321 248
davolfman 13:29705e6bf718 249 keyboard = keytemp;
davolfman 13:29705e6bf718 250
davolfman 18:4992aa537387 251 wait_ms(10);
davolfman 2:5454dee210ed 252 }
davolfman 0:b2f7400596ce 253 }