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:
- 11:286386c0db40
- Parent:
- 10:59c829586a4f
- Child:
- 12:3a1e7fde5040
--- a/main.cpp Thu Dec 07 19:19:17 2017 +0000
+++ b/main.cpp Thu Dec 07 20:42:13 2017 +0000
@@ -42,6 +42,14 @@
#define U_PI 3.14159265358979
const int fixed2pi = (2.0 * U_PI) * (0x1 << 16l);
+enum envPhase {
+ attack = 4,
+ decay = 3,
+ sustain = 2,
+ release = 1,
+ off = 0
+};
+
//non-constants
//Most of these will be recalculated or reset on every input cycle of the main
// loop, as appropriate
@@ -53,8 +61,8 @@
int64_t keyboard;
int carrierPhases[numKeys];
int modulatorPhases[numKeys];
-short envelopeStatesC[numKeys];
-short envelopeStatesM[numKeys];
+envPhase envelopeStatesC[numKeys];
+envPhase envelopeStatesM[numKeys];
int envelopeAmpsC[numKeys];
int envelopeAmpsM[numKeys];
@@ -96,62 +104,74 @@
}
void synthesize(){
- carAmpS = 0;
- for(int i = 0; i < numKeys; ++i){
- if(keyboard & (0x1 << i)){
- if(envelopeStatesC[i] < 2)
- envelopeStatesC[i] = 4;
- if(envelopeStatesM[i] < 2)
- envelopeStatesM[i] = 4;
+ carAmpS = 0;//sum of all key waveforms
+
+ for(int i = 0; i < numKeys; ++i){//for all keys
+ carrierPhases[i] &= 0xFFFF;
+ modulatorPhases[i] &= 0xFFFF;
+
+ if(keyboard & (0x1ll << (long long)i)){//i key is pushed
+ if(envelopeStatesC[i] == off){
+ carrierPhases[i] = 0;
+ }
+ if(envelopeStatesM[i] == off){
+ modulatorPhases[i] = 0;
+ }
+
+
+ if(envelopeStatesC[i] < release)
+ envelopeStatesC[i] = attack;
+ if(envelopeStatesM[i] < release)
+ envelopeStatesM[i] = attack;
- if(envelopeStatesC[i] == 4){
+ if(envelopeStatesC[i] == attack){
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;
+ envelopeStatesC[i] = decay;
}
}
- if(envelopeStatesC[i] == 3){
- envelopeAmpsC[i] += carD;
+ if(envelopeStatesM[i] == attack){
+ envelopeAmpsM[i] += modA;
+ if(envelopeAmpsM[i] >= attackLimit){
+ envelopeAmpsM[i] = attackLimit;
+ envelopeStatesM[i] = decay;
+ }
+ }
+
+ if(envelopeStatesC[i] == decay){
+ envelopeAmpsC[i] -= carD;
if(envelopeAmpsC[i] <= carS){
envelopeAmpsC[i] = carS;
- envelopeStatesC[i] = 2;
+ envelopeStatesC[i] = sustain;
}
}
- if(envelopeStatesM[i] == 3){
- envelopeAmpsM[i] += modD;
+ if(envelopeStatesM[i] == decay){
+ envelopeAmpsM[i] -= modD;
if(envelopeAmpsM[i] <= modS){
envelopeAmpsM[i] = modS;
- envelopeStatesM[i] = 2;
+ envelopeStatesM[i] = sustain;
}
}
}else{
- if(envelopeStatesC[i] > 1)
- envelopeStatesC[i] = 1;
- if(envelopeStatesM[i] > 1)
- envelopeStatesM[i] = 1;
+ if(envelopeStatesC[i] > release)
+ envelopeStatesC[i] = release;
+ if(envelopeStatesM[i] > release)
+ envelopeStatesM[i] = release;
- if(envelopeStatesC[i] == 1){
+ if(envelopeStatesC[i] == release){
if(envelopeAmpsC[i] <= 0){
- envelopeStatesC[i] = 0;
+ envelopeStatesC[i] = off;
envelopeAmpsC[i] = 0;
}else{
envelopeAmpsC[i] -= carR;
}
}
- if(envelopeStatesM[i] == 1){
+ if(envelopeStatesM[i] == release){
if(envelopeAmpsM[i] <= 0){
- envelopeStatesM[i] = 0;
+ envelopeStatesM[i] = off;
envelopeAmpsM[i] = 0;
}else{
envelopeAmpsM[i] -= modR;
@@ -160,10 +180,19 @@
}
if(envelopeAmpsC[i] > 0){
- modulatorPhases[i] += (FMmult * carrierIncrements[i]) >> 16;
+ int tempMPI = (FMmult * carrierIncrements[i]) >> 16;
+ int tempCPI;
+
+ tempMPI = (tempMPI > 32767) ? 32767 : tempMPI;
+ tempMPI = (tempMPI < -32767) ? -32767 : tempMPI;
+ modulatorPhases[i] += tempMPI;
modAmpI = fastSin((((modulatorPhases[i] * envelopeAmpsM[i]) >> 16)
* modVol) >> 16);
- carrierPhases[i] += ((carrierIncrements[i] + modAmpI) * fixed2pi) >> 16;
+
+ tempCPI = (carrierIncrements[i] + modAmpI);
+ tempCPI = (tempCPI > 32767) ? 32767 : tempCPI;
+ tempCPI = (tempCPI < -32767) ? -32767 : tempCPI;
+ carrierPhases[i] += tempCPI;
carAmpS += (fastSin(carrierPhases[i]) * envelopeAmpsC[i]) >> 16;
}
}
@@ -186,8 +215,8 @@
for(int i = 0; i < numKeys; ++i){
carrierPhases[i] = 0;
modulatorPhases[i] = 0;
- envelopeStatesC[i] = 0;
- envelopeStatesM[i] = 0;
+ envelopeStatesC[i] = off;
+ envelopeStatesM[i] = off;
envelopeAmpsC[i] = 0;
envelopeAmpsM[i] = 0;
}
