取りあえず今年の締めとして、解答例を示しましょう。
課題を再掲します。
Sensor_1, Sensor_2にタッチセンサーがついています。
何も押されていないときは、ドミソの分散和音を鳴らしてください。
たとえば、ドを0.5秒、ミを0.5秒、ソを0.5秒、そしてまたド...と繰り返します。
Sensor_1だけが押されたら、直ちにドファラに変えます。必ずドからなりはじめます。
Sensor_2だけが押されたら、直ちにシレソに変えます。同様にシからです。
そしてSensor_1,Sensor_2が同時に押されたら、ラドミに変えます。
[解答例]
1 // Multi Task Corder
2 // Coded by 
3
4 #define TLEN 48
5 #define WLEN 50
6 #define A5 440
7 #define B5 494
8 #define C5 523
9 #define D5 587
10 #define E5 659
11 #define F5 698
12 #define G5 784
13 #define A6 880
14
15 int stat, old_stat;
16
17 task cord_c()
18 {
19 while(true) {
20 PlayTone(C5, TLEN); Wait(WLEN);
21 PlayTone(E5, TLEN); Wait(WLEN);
22 PlayTone(G5, TLEN); Wait(WLEN);
23 }
24 }
25
26 task cord_f()
27 {
28 while(true) {
29 PlayTone(C5, TLEN); Wait(WLEN);
30 PlayTone(F5, TLEN); Wait(WLEN);
31 PlayTone(A6, TLEN); Wait(WLEN);
32 }
33 }
34
35
36 task cord_g()
37 {
38 while(true) {
39 PlayTone(B5, TLEN); Wait(WLEN);
40 PlayTone(D5, TLEN); Wait(WLEN);
41 PlayTone(G5, TLEN); Wait(WLEN);
42 }
43 }
44
45
46 task cord_am()
47 {
48 while(true) {
49 PlayTone(A5, TLEN); Wait(WLEN);
50 PlayTone(C5, TLEN); Wait(WLEN);
51 PlayTone(E5, TLEN); Wait(WLEN);
52 }
53 }
54
55 task main()
56 {
57
58 SetSensor(SENSOR_1,SENSOR_TOUCH);
59 SetSensor(SENSOR_2,SENSOR_TOUCH);
60
61 start cord_c;
62 old_stat = 0;
63
64 while (true) {
65 if (SENSOR_2 == 1) {
66 stat = 2;
67 }
68 else {
69 stat = 0;
70 }
71 if (SENSOR_1 == 1) {
72 stat++;
73 }
74
75 if (stat != old_stat) {
76 if (old_stat < 2) {
77 if (old_stat == 0) {
78 stop cord_c;
79 }
80 else {
81 stop cord_f;
82 }
83 }
84 else {
85 if (old_stat == 2) {
86 stop cord_g;
87 }
88 else {
89 stop cord_am;
90 }
91 }
92 old_stat = stat;
93
94 if (stat < 2) {
95 if (stat == 0) {
96 start cord_c;
97 }
98 else {
99 start cord_f;
100 }
101 }
102 else {
103 if (stat == 2) {
104 start cord_g;
105 }
106 else {
107 start cord_am;
108 }
109 }
110 }
111 }
112 }
まず、各和音を演奏する部分はtaskにします。
そして、main taskでは、センサーの状態に応じて条件に合うtaskを選択して起動停止を制御すれば良いわけです。
状態の変化を検知する方法、スイッチの仕方はコードを見てください。
起動していないものを停止しても、エラーにならないので、
L75-L91は単に、
stop cord_c;
stop cord_f;
stop cord_g;
stop cord_am;
としてしまっても動きますが、タスクの起動停止は、意外と負荷が重く、限界性能を期待する時には、丁寧に処理した方が良いです。
また、4つのパターンの振り分けについてですが、タイミングを重視する場合のif文は、対称性を良くした方が、betterです。
次の課題です。
今回は、センサーの状態が変わったら直ちに和音を変えました。
これを変更しします。ワルツのリズムを保って1拍目以外では変更しないで下さい。
Sensor_1, Sensor_2にタッチセンサーがついています。
和音の1拍目直前に何も押されていないときは、ドミソの分散和音を鳴らしてください。
たとえば、ドを0.5秒、ミを0.5秒、ソを0.5秒、そしてまたド...と繰り返します。
和音の1拍目直前にSensor_1だけが押されていたら、ドファラをならします。
Sensor_2だけが押されていたら、シレソを鳴らします。
そしてSensor_1,Sensor_2が同時に押されていたら、ラドミをならします。
どなたでも解答をお寄せ下さい。お待ちしております。
それでは皆さん良いお年を。http://www.line.to/mac/MindStorms/