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

Dependencies:   mbed

Committer:
gitakichi
Date:
Thu Jul 21 12:20:51 2016 +0000
Revision:
5:f798a173eefa
Parent:
4:3f3d369ca0e3
Child:
6:e3ed48abbd53
??????DA??????????

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 3:5cae780fe61e 7 bool flip_flag;
gitakichi 4:3f3d369ca0e3 8
gitakichi 3:5cae780fe61e 9 void flip()
gitakichi 3:5cae780fe61e 10 {
gitakichi 3:5cae780fe61e 11 flip_flag = 1;
gitakichi 3:5cae780fe61e 12 }
gitakichi 1:1b9ca25019a6 13
gitakichi 0:1b56cf88e38c 14
gitakichi 3:5cae780fe61e 15 int main()
gitakichi 3:5cae780fe61e 16 {
gitakichi 5:f798a173eefa 17 double keika_t,data,late;
gitakichi 5:f798a173eefa 18 int freq_out = 5000;
gitakichi 5:f798a173eefa 19 late = 20 * 0.001 * 0.001;
gitakichi 5:f798a173eefa 20
gitakichi 5:f798a173eefa 21 mypwm.period_us(20);
gitakichi 5:f798a173eefa 22 flipper.attach_us(&flip,20);
gitakichi 3:5cae780fe61e 23
gitakichi 3:5cae780fe61e 24
gitakichi 0:1b56cf88e38c 25 while(1) {
gitakichi 4:3f3d369ca0e3 26
gitakichi 3:5cae780fe61e 27 if(flip_flag == 1) {
gitakichi 5:f798a173eefa 28
gitakichi 5:f798a173eefa 29 if(sw == 0) data = keika_t;
gitakichi 5:f798a173eefa 30 else data = sin(6.28 * keika_t * freq_out) + 1;
gitakichi 5:f798a173eefa 31
gitakichi 5:f798a173eefa 32 mypwm.write( data / 20 );
gitakichi 3:5cae780fe61e 33
gitakichi 3:5cae780fe61e 34 if(keika_t + late > 1) keika_t = keika_t + late - 1;
gitakichi 3:5cae780fe61e 35 else keika_t += late;
gitakichi 3:5cae780fe61e 36
gitakichi 3:5cae780fe61e 37 flip_flag = 0;
gitakichi 3:5cae780fe61e 38 }
gitakichi 0:1b56cf88e38c 39 }
gitakichi 0:1b56cf88e38c 40 }