Gitakichi Tokyo
/
envelope_generator
アナログモデリングシンセに実装する目的で、エンベロープジェネレーターを作ってみました。attack,decay,sustain,releaseの値を変更すればシンセに使えるかと思います。
main.cpp@1:89977aca3b5b, 2016-07-24 (annotated)
- Committer:
- gitakichi
- Date:
- Sun Jul 24 04:59:33 2016 +0000
- Revision:
- 1:89977aca3b5b
- Parent:
- 0:596ff247975f
decay??????????????????????
Who changed what in which revision?
User | Revision | Line number | New 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 | } |