MCP3008 Version

Dependencies:   mbed-rtos mbed mcp3008

Fork of KIK01_Proto01 by Ryo Od

Revision:
0:2dcec10e9199
Child:
1:f9b967ae26e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 04 05:27:59 2017 +0000
@@ -0,0 +1,140 @@
+#include "mbed.h"
+#include "rtos.h"
+
+#define TITLE_STR1      ("KIK01 Kick Machine")
+#define TITLE_STR2      ("20170604")
+
+#define PI_F            (3.1415926f)
+#define SAMPLING_RATE   (16000)
+#define SAMPLING_PERIOD (1.0f/SAMPLING_RATE)
+
+#define ENVELOPE_PERIOD     (500)
+#define FREQUENCY_ATTACK    (5)
+#define FREQUENCY_RELEASE   (300)
+#define AMPLITUDE_ATTACK    (50)
+#define AMPLITUDE_RELEASE   (200)
+
+AnalogOut Dac1(PA_4);
+
+class EnvelopeAR {
+public:
+    EnvelopeAR(int _attack, int _release, float _v0, float _v1, float _v2, float _attackTauRatio=0.36f, float _releaseTauRatio=0.36f) :
+        amplitude(_v0),
+        v0(_v0),
+        v1(_v1),
+        v2(_v2),
+        vLast(_v0),
+        attackTauRatio(_attackTauRatio),
+        releaseTauRatio(_releaseTauRatio)
+    {
+        setAttack(_attack);
+        setRelease(_release);
+    }
+
+    ~EnvelopeAR() {}
+
+    void setAttack(int _attack) {
+        attack = _attack;
+        tau0 = attack * attackTauRatio;
+    }
+    int getAttack() { return attack; }
+
+    void setRelease(int _release) {
+        release = _release;
+        tau1 = release * releaseTauRatio;
+    }
+    int getRelease() { return release; }
+
+    void setAttackTauRatio(float _attackTauRatio) { attackTauRatio = _attackTauRatio; }
+    float getAttackTauRatio() { return attackTauRatio;  }
+
+    void setReleaseTauRatio(float _releaseTauRatio) { releaseTauRatio = _releaseTauRatio; }
+    float getReleaseTauRatio() { return releaseTauRatio; }
+
+    void setV0(float _v0) { v0 = _v0; }
+    float getV0() { return v0; }
+    void setV1(float _v1) { v1 = _v1; }
+    float getV1() { return v1; }
+    void setV2(float _v2) { v2 = _v2; }
+    float getV2() { return v2; }
+
+    float getAmplitude() { return amplitude; }
+    float getAmplitude(int tick) {
+        if (tick < attack) {
+            // attackの処理
+            amplitude = v0 + (v1 - v0) * (1 - expf(-(float)tick / tau0));
+            vLast = amplitude;
+        }
+        else {
+            // releaseの処理
+            amplitude = (vLast - v2) * (expf(-(float)(tick - attack) / tau1)) + v2;
+        }
+        return amplitude;
+    }
+
+private:
+    int attack;
+    int release;
+    float amplitude;
+    float v0;
+    float v1;
+    float v2;
+    float vLast;
+    float tau0;
+    float tau1;
+    float attackTauRatio;
+    float releaseTauRatio;
+};
+
+EnvelopeAR envelopeFrequency(
+    FREQUENCY_ATTACK, FREQUENCY_RELEASE, 880.0f, 120.0f, 40.0f, 0.36f, 0.1f);
+EnvelopeAR envelopeAmplitude(AMPLITUDE_ATTACK, AMPLITUDE_RELEASE, 0.9f, 1.0f, 0.0f);
+
+int ticks = 0;
+int envelopeTicks = 0;
+float frequency;
+float phi;
+float phiDelta;
+float amplitude;
+
+void generateWave()
+{
+    phi += phiDelta;
+    if (phi >= 1.0f) {
+        phi -= 2.0f;
+    }
+    float level = sinf(PI_F * phi) * amplitude;
+    //printf("%d\t%f\t%f\t%f\r\n", ticks, frequency, amplitude, level);
+    //printf("%f\r\n", level);
+    //Dac1.write_u16((uint16_t)((level + 1.0f) * 0X3FFF));
+    Dac1.write((level + 1.0f) / 2.0f);
+}
+
+void generateEnvelope()
+{
+    // Frequency Envelope
+    frequency = envelopeFrequency.getAmplitude(envelopeTicks);
+    phiDelta = 2.0f * frequency / SAMPLING_RATE;
+
+    // Amplitude Envelope
+    amplitude = envelopeAmplitude.getAmplitude(envelopeTicks);
+
+    envelopeTicks++;
+    if (envelopeTicks == ENVELOPE_PERIOD) {
+        envelopeTicks = 0;
+    }
+}
+
+int main()
+{
+    printf("%s %s\r\n", TITLE_STR1, TITLE_STR2);
+    
+    frequency = 1000.0f;
+    phiDelta = 2.0f * frequency / SAMPLING_RATE;
+    amplitude = 1.0f;
+    
+    for (;;) {
+        generateWave();
+        wait(SAMPLING_PERIOD);
+    }
+}