F401REにてアナログモデリングシンセもどきを作ってみました。 リングモジュレーターっぽいことやってみてます。正弦波、三角波、矩形波の関数が用意してあります。sin(2pift)のftをサンプリングレートごとに積分したものをiftとしてます。iftのポインタを関数に与えるだけで特に計算は入りません。

Dependencies:   mbed

main.cpp

Committer:
gitakichi
Date:
2016-07-22
Revision:
8:ce5b480a2646
Parent:
7:725b3bc34e7e

File content as of revision 8:ce5b480a2646:

#include "mbed.h"

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


//duty must input 0.1-0.9
bool flip_flag;

void flip()
{
    flip_flag = 1;
}

double sin_osc(double late,double freq_out,double &ift)
{
    double data;

    data = sin(6.28 * ift);

    ift += late * freq_out;
    if(ift > 1)    ift--;

    return data;
}
double square_osc(double late,double freq_out,double duty,double &ift)
{
    double data;

    if(duty > ift)  data = 1;
    else data = -1;

    ift += late * freq_out;
    if(ift > 1)    ift--;

    return data;
}
double triangle_osc(double late,double freq_out,double duty,double &ift)
{
    double data;
    
    if(ift < duty)    data = 2 * (ift * (1 / ift) - 0.5);
    else    data = 2 *( (1 / (1 - duty)) * (1 - ift) - 0.5);

    ift += late * freq_out;
    if(ift > 1)    ift--;

    return data;
}

int main()
{
    double data,late,ift_1,ift_2;
    late = 20 * 0.001 * 0.001;

    mypwm.period_us(20);
    flipper.attach_us(&flip,20);

    while(1) {

        if(flip_flag == 1) {

            data = (sin_osc(late,1200,ift_1) * sin_osc(late,1210,ift_2)) + 1;
            mypwm.write( data / 20 );

            flip_flag = 0;
        }
    }
}