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