Sync In
Dependencies: AverageMCP3008 VoltageMonitor mbed-rtos mbed mcp3008
Fork of KIK01_Proto06 by
Diff: main.cpp
- 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); + } +}