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

Dependencies:   mbed

Committer:
gitakichi
Date:
Fri Jul 22 14:55:29 2016 +0000
Revision:
8:ce5b480a2646
Parent:
7:725b3bc34e7e
??????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gitakichi 0:1b56cf88e38c 1 #include "mbed.h"
gitakichi 0:1b56cf88e38c 2
gitakichi 1:1b9ca25019a6 3 Ticker flipper;
gitakichi 0:1b56cf88e38c 4 PwmOut mypwm(PC_8);
gitakichi 4:3f3d369ca0e3 5 DigitalIn sw(USER_BUTTON);
gitakichi 4:3f3d369ca0e3 6
gitakichi 7:725b3bc34e7e 7
gitakichi 8:ce5b480a2646 8 //duty must input 0.1-0.9
gitakichi 3:5cae780fe61e 9 bool flip_flag;
gitakichi 4:3f3d369ca0e3 10
gitakichi 3:5cae780fe61e 11 void flip()
gitakichi 3:5cae780fe61e 12 {
gitakichi 3:5cae780fe61e 13 flip_flag = 1;
gitakichi 3:5cae780fe61e 14 }
gitakichi 1:1b9ca25019a6 15
gitakichi 8:ce5b480a2646 16 double sin_osc(double late,double freq_out,double &ift)
gitakichi 8:ce5b480a2646 17 {
gitakichi 8:ce5b480a2646 18 double data;
gitakichi 8:ce5b480a2646 19
gitakichi 8:ce5b480a2646 20 data = sin(6.28 * ift);
gitakichi 8:ce5b480a2646 21
gitakichi 8:ce5b480a2646 22 ift += late * freq_out;
gitakichi 8:ce5b480a2646 23 if(ift > 1) ift--;
gitakichi 8:ce5b480a2646 24
gitakichi 8:ce5b480a2646 25 return data;
gitakichi 8:ce5b480a2646 26 }
gitakichi 8:ce5b480a2646 27 double square_osc(double late,double freq_out,double duty,double &ift)
gitakichi 8:ce5b480a2646 28 {
gitakichi 8:ce5b480a2646 29 double data;
gitakichi 8:ce5b480a2646 30
gitakichi 8:ce5b480a2646 31 if(duty > ift) data = 1;
gitakichi 8:ce5b480a2646 32 else data = -1;
gitakichi 8:ce5b480a2646 33
gitakichi 8:ce5b480a2646 34 ift += late * freq_out;
gitakichi 8:ce5b480a2646 35 if(ift > 1) ift--;
gitakichi 8:ce5b480a2646 36
gitakichi 8:ce5b480a2646 37 return data;
gitakichi 8:ce5b480a2646 38 }
gitakichi 8:ce5b480a2646 39 double triangle_osc(double late,double freq_out,double duty,double &ift)
gitakichi 8:ce5b480a2646 40 {
gitakichi 8:ce5b480a2646 41 double data;
gitakichi 8:ce5b480a2646 42
gitakichi 8:ce5b480a2646 43 if(ift < duty) data = 2 * (ift * (1 / ift) - 0.5);
gitakichi 8:ce5b480a2646 44 else data = 2 *( (1 / (1 - duty)) * (1 - ift) - 0.5);
gitakichi 8:ce5b480a2646 45
gitakichi 8:ce5b480a2646 46 ift += late * freq_out;
gitakichi 8:ce5b480a2646 47 if(ift > 1) ift--;
gitakichi 8:ce5b480a2646 48
gitakichi 8:ce5b480a2646 49 return data;
gitakichi 8:ce5b480a2646 50 }
gitakichi 0:1b56cf88e38c 51
gitakichi 3:5cae780fe61e 52 int main()
gitakichi 3:5cae780fe61e 53 {
gitakichi 8:ce5b480a2646 54 double data,late,ift_1,ift_2;
gitakichi 5:f798a173eefa 55 late = 20 * 0.001 * 0.001;
gitakichi 6:e3ed48abbd53 56
gitakichi 5:f798a173eefa 57 mypwm.period_us(20);
gitakichi 5:f798a173eefa 58 flipper.attach_us(&flip,20);
gitakichi 3:5cae780fe61e 59
gitakichi 0:1b56cf88e38c 60 while(1) {
gitakichi 6:e3ed48abbd53 61
gitakichi 3:5cae780fe61e 62 if(flip_flag == 1) {
gitakichi 6:e3ed48abbd53 63
gitakichi 8:ce5b480a2646 64 data = (sin_osc(late,1200,ift_1) * sin_osc(late,1210,ift_2)) + 1;
gitakichi 5:f798a173eefa 65 mypwm.write( data / 20 );
gitakichi 3:5cae780fe61e 66
gitakichi 3:5cae780fe61e 67 flip_flag = 0;
gitakichi 3:5cae780fe61e 68 }
gitakichi 0:1b56cf88e38c 69 }
gitakichi 0:1b56cf88e38c 70 }