F401REにてアナログモデリングシンセもどきを作ってみました。 リングモジュレーターっぽいことやってみてます。正弦波、三角波、矩形波の関数が用意してあります。sin(2pift)のftをサンプリングレートごとに積分したものをiftとしてます。iftのポインタを関数に与えるだけで特に計算は入りません。
main.cpp@7:725b3bc34e7e, 2016-07-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |