F401REにてアナログモデリングシンセもどきを作ってみました。 リングモジュレーターっぽいことやってみてます。正弦波、三角波、矩形波の関数が用意してあります。sin(2pift)のftをサンプリングレートごとに積分したものをiftとしてます。iftのポインタを関数に与えるだけで特に計算は入りません。
main.cpp@4:3f3d369ca0e3, 2016-07-20 (annotated)
- Committer:
- gitakichi
- Date:
- Wed Jul 20 15:09:13 2016 +0000
- Revision:
- 4:3f3d369ca0e3
- Parent:
- 3:5cae780fe61e
- Child:
- 5:f798a173eefa
???????
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 | 0:1b56cf88e38c | 7 | |
gitakichi | 0:1b56cf88e38c | 8 | DigitalOut myled(LED1); |
gitakichi | 3:5cae780fe61e | 9 | //int data; |
gitakichi | 2:47210a089f76 | 10 | float data_sin; |
gitakichi | 3:5cae780fe61e | 11 | bool flip_flag; |
gitakichi | 4:3f3d369ca0e3 | 12 | |
gitakichi | 3:5cae780fe61e | 13 | #define late 0.00001 |
gitakichi | 3:5cae780fe61e | 14 | //100khz-1 |
gitakichi | 1:1b9ca25019a6 | 15 | |
gitakichi | 3:5cae780fe61e | 16 | void flip() |
gitakichi | 3:5cae780fe61e | 17 | { |
gitakichi | 3:5cae780fe61e | 18 | //if(data > 100) data = 0; |
gitakichi | 3:5cae780fe61e | 19 | //else data++; |
gitakichi | 3:5cae780fe61e | 20 | //data_sin = sin((data/100)*6.28) + 1; |
gitakichi | 3:5cae780fe61e | 21 | flip_flag = 1; |
gitakichi | 3:5cae780fe61e | 22 | } |
gitakichi | 1:1b9ca25019a6 | 23 | |
gitakichi | 0:1b56cf88e38c | 24 | |
gitakichi | 3:5cae780fe61e | 25 | int main() |
gitakichi | 3:5cae780fe61e | 26 | { |
gitakichi | 3:5cae780fe61e | 27 | |
gitakichi | 1:1b9ca25019a6 | 28 | mypwm.period_us(10); |
gitakichi | 3:5cae780fe61e | 29 | flipper.attach_us(&flip, 10); |
gitakichi | 3:5cae780fe61e | 30 | |
gitakichi | 3:5cae780fe61e | 31 | float keika_t; |
gitakichi | 4:3f3d369ca0e3 | 32 | int freq_out = 500; |
gitakichi | 3:5cae780fe61e | 33 | |
gitakichi | 3:5cae780fe61e | 34 | |
gitakichi | 1:1b9ca25019a6 | 35 | //printf("pwm set to %.2f %%\n", mypwm.read() * 100); |
gitakichi | 3:5cae780fe61e | 36 | |
gitakichi | 0:1b56cf88e38c | 37 | while(1) { |
gitakichi | 4:3f3d369ca0e3 | 38 | |
gitakichi | 4:3f3d369ca0e3 | 39 | if(sw == 0) freq_out = 5000; |
gitakichi | 4:3f3d369ca0e3 | 40 | else freq_out = 1000; |
gitakichi | 4:3f3d369ca0e3 | 41 | |
gitakichi | 3:5cae780fe61e | 42 | if(flip_flag == 1) { |
gitakichi | 3:5cae780fe61e | 43 | |
gitakichi | 3:5cae780fe61e | 44 | data_sin = sin(6.28 * keika_t * freq_out) + 1; |
gitakichi | 3:5cae780fe61e | 45 | mypwm.write( data_sin / 10 ); |
gitakichi | 3:5cae780fe61e | 46 | |
gitakichi | 3:5cae780fe61e | 47 | if(keika_t + late > 1) keika_t = keika_t + late - 1; |
gitakichi | 3:5cae780fe61e | 48 | else keika_t += late; |
gitakichi | 3:5cae780fe61e | 49 | |
gitakichi | 3:5cae780fe61e | 50 | flip_flag = 0; |
gitakichi | 3:5cae780fe61e | 51 | } |
gitakichi | 0:1b56cf88e38c | 52 | } |
gitakichi | 0:1b56cf88e38c | 53 | } |