アナログモデリングシンセに実装する目的で、エンベロープジェネレーターを作ってみました。attack,decay,sustain,releaseの値を変更すればシンセに使えるかと思います。

Dependencies:   mbed

Committer:
gitakichi
Date:
Sun Jul 24 04:59:33 2016 +0000
Revision:
1:89977aca3b5b
Parent:
0:596ff247975f
decay??????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gitakichi 0:596ff247975f 1 #include "mbed.h"
gitakichi 0:596ff247975f 2
gitakichi 0:596ff247975f 3 Ticker flipper;
gitakichi 0:596ff247975f 4 PwmOut mypwm(LED1);
gitakichi 0:596ff247975f 5 DigitalIn sw(USER_BUTTON);
gitakichi 0:596ff247975f 6
gitakichi 0:596ff247975f 7 bool flip_flag;
gitakichi 0:596ff247975f 8
gitakichi 0:596ff247975f 9 void flip()
gitakichi 0:596ff247975f 10 {
gitakichi 0:596ff247975f 11 flip_flag = 1;
gitakichi 0:596ff247975f 12 }
gitakichi 0:596ff247975f 13
gitakichi 0:596ff247975f 14 void eg_func(double &eg,int &eg_status,int note,double late,double attack,double decay,double sustain,double release)
gitakichi 0:596ff247975f 15 {
gitakichi 0:596ff247975f 16 if(note == 0) {
gitakichi 0:596ff247975f 17 if(eg > 0) eg -= late / release;
gitakichi 0:596ff247975f 18 else eg = 0;
gitakichi 0:596ff247975f 19 eg_status = 0;
gitakichi 0:596ff247975f 20 } else {
gitakichi 0:596ff247975f 21 if(eg_status == 0) {
gitakichi 0:596ff247975f 22 if(eg < 1) eg += late / attack;
gitakichi 0:596ff247975f 23 else {
gitakichi 0:596ff247975f 24 eg = 1;
gitakichi 0:596ff247975f 25 eg_status = 1;
gitakichi 0:596ff247975f 26 }
gitakichi 0:596ff247975f 27 } else {
gitakichi 1:89977aca3b5b 28 if(eg > sustain) eg -= (1 - sustain) * late / decay;
gitakichi 0:596ff247975f 29 else eg = sustain;
gitakichi 0:596ff247975f 30 }
gitakichi 0:596ff247975f 31 }
gitakichi 0:596ff247975f 32 }
gitakichi 0:596ff247975f 33
gitakichi 0:596ff247975f 34
gitakichi 0:596ff247975f 35 int main()
gitakichi 0:596ff247975f 36 {
gitakichi 0:596ff247975f 37 double eg,late,attack,decay,sustain,release;
gitakichi 0:596ff247975f 38 int eg_status,note;
gitakichi 0:596ff247975f 39
gitakichi 0:596ff247975f 40 late = 0.00002;
gitakichi 0:596ff247975f 41
gitakichi 1:89977aca3b5b 42 attack = 0.2;
gitakichi 1:89977aca3b5b 43 decay = 0.2;
gitakichi 1:89977aca3b5b 44 sustain = 0.2;
gitakichi 1:89977aca3b5b 45 release = 0.5;
gitakichi 0:596ff247975f 46
gitakichi 0:596ff247975f 47 mypwm.period_us(20);
gitakichi 0:596ff247975f 48 flipper.attach_us(&flip,20);
gitakichi 0:596ff247975f 49
gitakichi 0:596ff247975f 50 while(1) {
gitakichi 0:596ff247975f 51 //button status
gitakichi 0:596ff247975f 52 if(sw == 0) note = 1;
gitakichi 0:596ff247975f 53 else note = 0;
gitakichi 0:596ff247975f 54
gitakichi 0:596ff247975f 55 if(flip_flag == 1) {
gitakichi 0:596ff247975f 56
gitakichi 0:596ff247975f 57 eg_func(eg,eg_status,note,late,attack,decay,sustain,release);
gitakichi 0:596ff247975f 58 mypwm.write(eg);
gitakichi 0:596ff247975f 59
gitakichi 0:596ff247975f 60 flip_flag = 0;
gitakichi 0:596ff247975f 61 }
gitakichi 0:596ff247975f 62 }
gitakichi 0:596ff247975f 63 }