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

Dependencies:   mbed

Committer:
gitakichi
Date:
Fri Jul 22 13:26:16 2016 +0000
Revision:
7:725b3bc34e7e
Parent:
6:e3ed48abbd53
Child:
8:ce5b480a2646
??????

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 #define sound_duty 0.1
gitakichi 7:725b3bc34e7e 8
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 0:1b56cf88e38c 16
gitakichi 3:5cae780fe61e 17 int main()
gitakichi 3:5cae780fe61e 18 {
gitakichi 6:e3ed48abbd53 19 double ft,data,late;
gitakichi 5:f798a173eefa 20 int freq_out = 5000;
gitakichi 5:f798a173eefa 21 late = 20 * 0.001 * 0.001;
gitakichi 6:e3ed48abbd53 22
gitakichi 5:f798a173eefa 23 mypwm.period_us(20);
gitakichi 5:f798a173eefa 24 flipper.attach_us(&flip,20);
gitakichi 3:5cae780fe61e 25
gitakichi 3:5cae780fe61e 26
gitakichi 0:1b56cf88e38c 27 while(1) {
gitakichi 6:e3ed48abbd53 28
gitakichi 3:5cae780fe61e 29 if(flip_flag == 1) {
gitakichi 6:e3ed48abbd53 30
gitakichi 7:725b3bc34e7e 31 //のこぎり波
gitakichi 6:e3ed48abbd53 32 if(sw == 0) data = ft;
gitakichi 7:725b3bc34e7e 33
gitakichi 7:725b3bc34e7e 34 //のこぎり波、下り
gitakichi 7:725b3bc34e7e 35 //else data = 1 - ft;
gitakichi 7:725b3bc34e7e 36
gitakichi 7:725b3bc34e7e 37 //正弦波
gitakichi 7:725b3bc34e7e 38 //else data = sin(6.28 * ft) + 1;
gitakichi 7:725b3bc34e7e 39 //三角波
gitakichi 7:725b3bc34e7e 40
gitakichi 7:725b3bc34e7e 41 else {
gitakichi 7:725b3bc34e7e 42 if(ft < sound_duty) data = ft * (1 / sound_duty);
gitakichi 7:725b3bc34e7e 43 else data = (1 / (1 - sound_duty)) * (1 - ft);
gitakichi 7:725b3bc34e7e 44 }
gitakichi 7:725b3bc34e7e 45
gitakichi 7:725b3bc34e7e 46 //矩形波
gitakichi 7:725b3bc34e7e 47 /*
gitakichi 7:725b3bc34e7e 48 else{
gitakichi 7:725b3bc34e7e 49 if(ft < sound_duty) data = 1;//thをいじればduty変わりそう
gitakichi 7:725b3bc34e7e 50 else data = 0;
gitakichi 7:725b3bc34e7e 51 }
gitakichi 7:725b3bc34e7e 52 */
gitakichi 5:f798a173eefa 53 mypwm.write( data / 20 );
gitakichi 3:5cae780fe61e 54
gitakichi 6:e3ed48abbd53 55 ft += late * freq_out;
gitakichi 6:e3ed48abbd53 56 if(ft > 1) ft--;
gitakichi 3:5cae780fe61e 57
gitakichi 3:5cae780fe61e 58 flip_flag = 0;
gitakichi 3:5cae780fe61e 59 }
gitakichi 0:1b56cf88e38c 60 }
gitakichi 0:1b56cf88e38c 61 }