Saya Matsuura
/
drum_zenkoku
drum
Diff: main.cpp
- Revision:
- 0:cd5fcde85881
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Nov 28 15:27:46 2020 +0000 @@ -0,0 +1,647 @@ +#include <mbed.h> +#include "astronomical_observation.h" +#include "mugamutyu.h" +#include "tapeled.h" +#include "scrp_slave.hpp" + +ScrpSlave slave(PC_12, PD_2, PH_1, SERIAL_TX, SERIAL_RX, 0x0807f801); + +bool on_off; +bool led; +bool led_flag[12]; + +Timeout stop_0; +Timeout stop_1; +Timeout stop_2; +Timeout stop_3; +Timeout stop_4; +Timeout stop_5; +Timeout stop_6; +Timeout stop_7; +Timeout stop_8; +Timeout stop_9;//drum_2_1 +Timeout stop_10;//drum_5_1 +Timeout stop_11;//cymbal_1_1 +Timeout stop_12;//haihat_close +Timeout stop_13;//haihat_middle + +Timeout drum_1_stop; + + +Timer timekeeper; +Timer timekeeper_1; + +Timer d1; + +void checkpoint(); +void checkpoint1(); +void checkpoint2(); +void checkpoint1_2(); + +DigitalOut led_pin[4] = { + DigitalOut(PA_10), + DigitalOut(PB_15), + DigitalOut(PB_2), + DigitalOut(PC_6) +}; + +DigitalOut solenoid[14] = { + DigitalOut(PA_14),//バスドラム + DigitalOut(PB_6),//スネアドラム_1 + DigitalOut(PB_7),//スネアドラム_2 + DigitalOut(PA_9),//ロータム + DigitalOut(PA_1),//ハイタム + DigitalOut(PC_3),//フロアタム_1 + DigitalOut(PC_2),//フロアタム_2 + DigitalOut(PB_4),//ハイハット_1 + DigitalOut(PB_5),//ハイハット_2 + DigitalOut(PA_0),//クラッシュシンバル_low + DigitalOut(PC_0),//クラッシュシンバル_hight + DigitalOut(PC_1),//ライドシンバル + DigitalOut(PA_13),//ハイハットclosse + DigitalOut(PC_4)//ハイハット//middle +}; + +PwmOut motor_pin[1][2]= { + {PwmOut(PA_11),PwmOut(PB_1)} +}; + +InterruptIn limit_switch(PB_0,PullUp); + +void (*func[12])(); + +int status; +int prev_status; + + +bool pause(int rx_data, int &tx_data){ + tx_data = rx_data; + if(tx_data == 0){ + status = 0; + } + return true; +} + +bool setup(int rx_data, int &tx_data){ + tx_data=rx_data; + status=99; + return true; +} + +bool command0(int rx_data, int &tx_data ){ + tx_data = rx_data; + switch(tx_data){ + case 1: + status =1; + break; + case 2: + status =2; + break; + case 3: + status =3; + break; + + //↓ 無我夢中 + case 11: + status =11; + break; + case 12: + status =12; + break; + } + return 1; +} + +void drum(int num, bool on_off){ + if(on_off == true){ + timekeeper_1.start(); + solenoid[num] = true; + led_pin[num%4] = 1; + }else if (on_off == false){ + solenoid[num] = false; + led_pin[num%4] = 0; + } +} + +void driveMotor(int num, double pwm){ + if (!pwm) { + motor_pin[num][0] = 0; + motor_pin[num][1] = 0; + led_pin[num%4] = 0; + } else if (0 < pwm) { + motor_pin[num][0] = pwm; + motor_pin[num][1] = 0; + led_pin[num%4] = 1; + } else { + motor_pin[num][0] = 0; + motor_pin[num][1] = -pwm; + led_pin[num%4] = 1; + } +} + + + +void stop0(){/* + if(timekeeper_1.read_ms()>100){ + stopt_0.attach_us(majistop1,100000); + } + if(d1.read_ms()>200) {*/ + driveMotor(0,0); + led_pin[0] = 0; + //} +} + +void stop1(){ + drum(1,false); + npx.off(); + led_pin[1] = 0; +} +void stop2(){ + drum(2,false); + npx.off(); + led_pin[2] = 0; +} +void stop3(){ + drum(3,false); + npx.off(); + led_pin[3] = 0; +} +void stop4(){ + drum(4,false); + npx.off(); +} +void stop5(){ + drum(5,false); + npx.off(); +} +void stop6(){ + drum(6,false); + npx.off(); +} +void stop7(){ + drum(7,false); + npx.off(); +} +void stop8(){ + drum(8,false); + npx.off(); +} +void stop9(){ + drum(9,false); + npx.off(); +} +void stop10(){ + drum(10,false); + npx.off(); +} +void stop11(){ + drum(11,false); + npx.off(); +} +void stop12(){ + drum(12,false); +} +void stop13(){ + drum(13,false); +} + +void light_2(){ + if(solenoid[1] == true){ + tape_led[0] = true; + light_drum_2(); + } +} + +void light_2_1(){ + if(solenoid[2] == true){ + tape_led[0] = true; + light_drum_2_1(); + } +} + +void light_3(){ + if(solenoid[3] == true){ + tape_led[1] = true; + light_drum_3(); + } +} + +void light_4(){ + if(solenoid[4] == true){ + tape_led[2] = true; + light_drum_4(); + } +} + +void light_5(){ + if(solenoid[5] == true){ + tape_led[3] = true; + light_drum_5(); + } +} + +void light_5_1(){ + if(solenoid[6] == true){ + tape_led[3] = true; + light_drum_5_1(); + } +} + +void light_c_1(){ + if(solenoid[7] == true){ + tape_led[4] = true; + light_cymbal_1(); + } +} + +void light_c_1_1(){ + if(solenoid[8] == true){ + tape_led[4] = true; + light_cymbal_1_1(); + } +} + +void light_c_2(){ + if(solenoid[9] == true){ + tape_led[5] = true; + light_cymbal_2(); + } +} + +void light_c_3(){ + if(solenoid[10] == true){ + tape_led[6] = true; + light_cymbal_3(); + } +} + +void light_c_4(){ + if(solenoid[11] == true){ + tape_led[7] = true; + light_cymbal_4(); + } +} + +void play(note_t note){ + if(note.hit < 11){ + led_flag[note.hit] = true; + } + switch (note.hit){ + case drum_1: + driveMotor(0,0.3); + break; + + case drum_2: + on_off = true; + drum(note.hit,true); + stop_1.attach_us(stop1,50000); + break; + + + case drum_2_1: + on_off = true; + drum(note.hit,true); + stop_2.attach_us(stop2,50000); + break; + + + case drum_3: + on_off = true; + drum(note.hit,true); + stop_3.attach_us(stop3,50000); + break; + + case drum_4: + on_off = true; + drum(note.hit,true); + stop_4.attach_us(stop4,50000); + break; + + case drum_5: + on_off = true; + drum(note.hit,true); + stop_5.attach_us(stop5,50000); + break; + + case drum_5_1: + on_off = true; + drum(note.hit,true); + stop_6.attach_us(stop6,50000); + break; + + case cymbal_1: + on_off = true; + drum(note.hit,true); + stop_7.attach_us(stop7,50000); + break; + + case cymbal_1_1: + on_off = true; + drum(note.hit,true); + stop_8.attach_us(stop8,50000); + break; + + case cymbal_2: + on_off = true; + drum(note.hit,true); + stop_9.attach_us(stop9,50000); + break; + + case cymbal_3: + on_off = true; + drum(note.hit,true); + stop_10.attach_us(stop10,50000); + break; + + case cymbal_4: + on_off = true; + drum(note.hit,true); + stop_11.attach_us(stop11,50000); + break; + + case hihat_off: + on_off = true; + drum(note.hit,true); + stop_12.attach_us(stop12,50000); + break; + + case hihat_middle: + on_off = true; + drum(note.hit,true); + stop_13.attach_us(stop13,50000); + break; + + case rest: + on_off = false; + + default: + break; + } +} + +void limitswitch_stop(){ + drum_1_stop.attach_us(stop0,140000); +} + + +Timer timer; +Timer measure; + +void druming(int numtime, const note_t* note, int num){ + static int i, j; + static bool already; + + for (i = 0; i < numtime && status == prev_status; i++) { + measure.reset(); + timer.reset(); + for (j = 0; j < num; j++) { + + while (note[j].time > timer.read_us()) { + if(note[j].time - timer.read_us() > 0.3 && !already){ + /*for(k = 1;k<12;k++){ + if(led_flag[k]){ + func[k](); + led_flag[k] = false; + } + }*/ + npx.show(); + already = true; + }else if(note[j].time - timer.read_us() < 0.05 && already){ + npx.off(); + already = false; + } + } + play(note[j]); + timer.reset(); + } + while(measure.read_us() < onemeasure); + } +} + +void druming2(int numtime, const note_t* note, int num){ + static int i, j; + static bool already; + + for (i = 0; i < numtime && status == prev_status; i++) { + measure.reset(); + timer.reset(); + for (j = 0; j < num; j++) { + while (note[j].time > timer.read_us()) { + if(note[j].time - timer.read_us() > 0.3 && !already){ + npx.show(); + already = true; + }else if(note[j].time - timer.read_us() < 0.05 && already){ + npx.off(); + already = false; + } + } + play(note[j]); + timer.reset(); + } + while(measure.read_us() < onemeasure_2); + } +} + +bool test(int rx_data,int &tx_data){ + drum(rx_data,true); + wait(1); + drum(rx_data,false); + return true; +} + +int main(){ + timekeeper_1.start(); + limit_switch.rise(limitswitch_stop); + + + slave.addCMD(255, pause); + slave.addCMD(2, command0); + slave.addCMD(3, setup); + slave.addCMD(4, test); + + npx.global_scale = 1.0f; + npx.normalize = false; + + motor_pin[0][0].period_us(20); + motor_pin[0][1].period_us(20); + + func[1] = light_2; + func[2] = light_2_1; + func[3] = light_3; + func[4] = light_4; + func[5] = light_5; + func[6] = light_5_1; + func[7] = light_c_1; + func[8] = light_c_1_1; + func[9] = light_c_2; + func[10] = light_c_3; + func[11] = light_c_4; + + timer.start(); + measure.start(); + while(1) { + + prev_status = status; + switch (status) { + case 0: + break; + case 1: + checkpoint1(); + if(status == prev_status) { + status=2; + } + break; + case 2: + checkpoint2(); + if(status == prev_status) { + status=100; + } + break; + //↓無我夢中 + case 11: + checkpoint1_2(); + if(status == prev_status) { + status=38; + } + break; + + case 38: + break; + + case 99: + checkpoint(); + status=38; + break; + } + } +} + +void checkpoint(){ + druming(1,astro::mearsure,12); +} + +void checkpoint1(){ + druming(3,astro::blank,4); + druming(1,astro::mearsure_1,7); + druming(1,astro::mearsure_2,17); + druming(3,astro::mearsure_3,20); + druming(1,astro::mearsure_4,11); + druming(1,astro::mearsure_5,11); + druming(1,astro::mearsure_6,17); + druming(6,astro::mearsure_7,20); + druming(1,astro::mearsure_8,20); + druming(1,astro::mearsure_6,17); + druming(1,astro::mearsure_9,17); + druming(1,astro::mearsure_10,18); + druming(1,astro::mearsure_9,17); + druming(1,astro::mearsure_10,18); + druming(1,astro::mearsure_9,17); + druming(1,astro::mearsure_10,18); + druming(1,astro::mearsure_11,14); + druming(1,astro::mearsure_6,17); + druming(2,astro::mearsure_7,20); + druming(1,astro::mearsure_12,14); + druming(2,astro::mearsure_13,12); + druming(1,astro::mearsure_14,8); + druming(1,astro::mearsure_15,13); + druming(1,astro::mearsure_6,17); + druming(1,astro::mearsure_16,21); + druming(1,astro::mearsure_7,20); + druming(1,astro::mearsure_16,21); + druming(1,astro::mearsure_7,20); + druming(1,astro::mearsure_16,21); + druming(1,astro::mearsure_17,17); + druming(1,astro::mearsure_18,21); + druming(1,astro::mearsure_19,10); + druming(1,astro::mearsure_20,11); + druming(1,astro::mearsure_19,10); + druming(3,astro::mearsure_20,11); + druming(1,astro::mearsure_21,12); + druming(1,astro::mearsure_22,12); + druming(1,astro::mearsure_23,13); + druming(1,astro::mearsure_24,7); +}//一番最後まで + +void checkpoint2(){ + druming(1,astro::mearsure_6,17); + druming(2,astro::mearsure_7,20); + druming(1,astro::mearsure_8,20); + druming(2,astro::mearsure_25,15); + druming(1,astro::mearsure_26,10); + druming(1,astro::mearsure_27,13); + druming(1,astro::mearsure_10,18); + druming(6,astro::mearsure_7,20); + druming(1,astro::mearsure_28,15); + druming(1,astro::mearsure_10,18); + druming(1,astro::mearsure_16,21); + druming(1,astro::mearsure_7,20); + druming(1,astro::mearsure_16,21); + druming(1,astro::mearsure_35,18); + druming(1,astro::mearsure_29,9); + druming(1,astro::mearsure_30,8); + druming(1,astro::mearsure_31,11); + druming(1,astro::mearsure_23,13); + druming(1,astro::mearsure_39,5); + druming(1,astro::mearsure_35,18); + druming(1,astro::mearsure_36,11); + druming(1,astro::mearsure_37,12); + druming(1,astro::mearsure_38,8); + druming(1,astro::mearsure_33,5); + druming(1,astro::mearsure_34,6); + druming(2,astro::blank,4); +}//天体観測終り + +void checkpoint1_2(){ + druming(17,muga::blank_2,4); + druming2(3,muga::mearsure_1_2,9); + druming2(1,muga::mearsure_2_2,8); + druming2(3,muga::mearsure_1_2,9); + druming2(1,muga::mearsure_3_2,22); + druming2(1,muga::mearsure_4_2,15); + druming2(1,muga::mearsure_5_2,20); + druming2(1,muga::mearsure_6_2,22); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_8_2,22); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_6_2,22); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_9_2,23); + druming2(1,muga::mearsure_5_2,20); + druming2(2,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_8_2,22); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_8_2,22); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_10_2,22); + druming2(1,muga::mearsure_5_2,20); + druming2(1,muga::mearsure_7_2,21); + druming2(1,muga::mearsure_8_2,22); + druming2(1,muga::mearsure_11_2,9); + druming2(1,muga::mearsure_12_2,21); + druming2(2,muga::mearsure_8_2,22); + druming2(1,muga::mearsure_13_2,20); + druming2(1,muga::mearsure_14_2,5); + druming2(3,muga::blank_2,4); + druming2(1,muga::mearsure_15_2,11); + druming2(1,muga::mearsure_16_2,1); + druming2(1,muga::mearsure_17_2,7); + druming2(1,muga::mearsure_18_2,16); + druming2(1,muga::mearsure_19_2,22); + druming2(6,muga::mearsure_20_2,23); + druming2(1,muga::mearsure_21_2,20); + druming2(1,muga::mearsure_19_2,22); + druming2(2,muga::mearsure_20_2,23); + druming2(1,muga::mearsure_22_2,22); +} + + +/*ハイハット中間の時→hihat_middle + ハイハットCLOSE→hihat_off + 左が半踏み真ん中が完全に閉まる + + 左上⇒ハイハット//1,2 + 左下⇒スネアドラム//3,4 + 真ん中上⇒クラッシュ_low//1 + 真ん中下⇒ハイタム//2・ロータム//3 + 右上⇒ライドシンバル//1・クラッシュ_hight//2 + 右下⇒フロアタム//3,4*/ \ No newline at end of file