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.
Dependencies: mbed
Fork of STM32FMSynth by
Diff: main.cpp
- Revision:
- 1:f3350a372732
- Parent:
- 0:b2f7400596ce
- Child:
- 2:5454dee210ed
--- a/main.cpp Thu Nov 09 21:24:50 2017 +0000
+++ b/main.cpp Thu Nov 09 22:40:50 2017 +0000
@@ -34,22 +34,117 @@
#define outMono DAC0
#define numKeys 88
-
+#define PI M_PI
//possible constants
int carrierIncrements[numKeys];
+const int attackLimit = (0x1 << 16) - 1;
+const int fixed2Pi = (int) ((2.0 * PI) * (0x1 << 16));
+
//non-constants
+//Most of these will be recalculated or reset on every input cycle of the main
+// loop, as appropriate
int FMmult;
int Volume;
+int modVol;
+int modAmpI;
+int carAmpS;
bool keysPressed[numKeys];
int carrierPhases[numKeys];
int modulatorPhases[numKeys];
short envelopeStatesC[numKeys];
short envelopeStatesM[numKeys];
int envelopeAmpsC[numKeys];
-int envleopeAmpsM[numKeys];
+int envelopeAmpsM[numKeys];
+
+int modA;
+int modD;
+int modS;
+int modR;
+int carA;
+int carD;
+int carS;
+int carR;
+
+int fastSin(const int phase){
+ return 0;
+}
+void synthesize(){
+ carAmpS = 0;
+ for(int i = 0; i < numKeys; ++i){
+ if(keysPressed[i]){
+ if(envelopeStatesC[i] < 2)
+ envelopeStatesC[i] = 4;
+ if(envelopeStatesM[i] < 2)
+ envelopeStatesM[i] = 4;
+
+ if(envelopeStatesC[i] == 4){
+ envelopeAmpsC[i] += carA;
+ if(envelopeAmpsC[i] >= attackLimit){
+ envelopeAmpsC[i] = attackLimit;
+ envelopeStatesC[i] = 3;
+ }
+ }
+
+ if(envelopeStatesM[i] == 4){
+ envelopeAmpsM[i] += modA;
+ if(envelopeAmpsM[i] >= attackLimit){
+ envelopeAmpsM[i] = attackLimit;
+ envelopeStatesM[i] = 3;
+ }
+ }
+
+ if(envelopeStatesC[i] == 3){
+ envelopeAmpsC[i] += carD;
+ if(envelopeAmpsC[i] <= carS){
+ envelopeAmpsC[i] = carS;
+ envelopeStatesC[i] = 2;
+ }
+ }
+
+ if(envelopeStatesM[i] == 3){
+ envelopeAmpsM[i] += modD;
+ if(envelopeAmpsM[i] <= modS){
+ envelopeAmpsM[i] = modS;
+ envelopeStatesM[i] = 2;
+ }
+ }
+ }else{
+ if(envelopeStatesC[i] > 1)
+ envelopeStatesC[i] = 1;
+ if(envelopeStatesM[i] > 1)
+ envelopeStatesM[i] = 1;
+
+ if(envelopeStatesC[i] == 1){
+ if(envelopeAmpsC[i] <= 0){
+ envelopeStatesC[i] = 0;
+ envelopeAmpsC[i] = 0;
+ }else{
+ envelopeAmpsC[i] -= carR;
+ }
+ }
+ if(envelopeStatesM[i] == 1){
+ if(envelopeAmpsM[i] <= 0){
+ envelopeStatesM[i] = 0;
+ envelopeAmpsM[i] = 0;
+ }else{
+ envelopeAmpsM[i] -= modR;
+ }
+ }
+ }
+
+ if(envelopeAmpsC[i] > 0){
+ modulatorPhases[i] += (Fmult * carrierIncrements[i]) >> 16;
+ modAmpI = fastSin((((modulatorPhases[i] * envelopeAmpsM[i]) >> 16)
+ * modVol) >> 16);
+ carrierPhases[i] += ((carrierIncrements[i] + modAmpI) * fixed2pi) >> 16;
+ carAmps += (fastSin(carrierPhases[i]) * envelopeAmpsC[i]) >> 16;
+ }
+ }
+ outMono.write_u16(((carAmps / numKeys) * Volume) >> 16);
+}
int main() {
