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

Dependencies:   mbed

main.cpp

Committer:
gitakichi
Date:
2016-07-24
Revision:
1:89977aca3b5b
Parent:
0:596ff247975f

File content as of revision 1:89977aca3b5b:

#include "mbed.h"

Ticker flipper;
PwmOut mypwm(LED1);
DigitalIn sw(USER_BUTTON);

bool flip_flag;

void flip()
{
    flip_flag = 1;
}

void eg_func(double &eg,int &eg_status,int note,double late,double attack,double decay,double sustain,double release)
{
    if(note == 0) {
        if(eg > 0)  eg -= late / release;
        else eg = 0;
        eg_status = 0;
    } else {
        if(eg_status == 0) {
            if(eg < 1)  eg += late / attack;
            else {
                eg = 1;
                eg_status = 1;
            }
        } else {
            if(eg > sustain)  eg -= (1 - sustain) * late / decay;
            else    eg = sustain;
        }
    }
}


int main()
{
    double eg,late,attack,decay,sustain,release;
    int eg_status,note;
    
    late = 0.00002;
    
    attack = 0.2;
    decay = 0.2;
    sustain = 0.2;
    release = 0.5;
    
    mypwm.period_us(20);
    flipper.attach_us(&flip,20);
    
    while(1) {
        //button status
        if(sw == 0) note = 1;
        else note = 0;
        
        if(flip_flag == 1) {

            eg_func(eg,eg_status,note,late,attack,decay,sustain,release); 
            mypwm.write(eg);

            flip_flag = 0;
        }
    }
}