プログラム
IchigoJam親機と子機に、下記のメインプログラムをスロット0、曲データをスロット1~3に配置しています。
親機と子機をボタンを押しながら電源ONしてメインプログラムを自動起動し、親機の有機EL画面で曲1~3をボタンを押して選択します。
メインプログラム(親機)
1 '*Tekkin P
2 CLV:LED1:WAIT60:UART0:GSB26
3 LET[90],200,110,205,120,210,120,220,125
4 FORP=2TO5:PWMP,[86+P*2]:NEXT
5 OUT0:CLS:S=0
6 IFTICK()>59GSB23
7 IF!BTN()GOTO6
8 CLK:UART1:?S:UART0:G=9:LRUNS
9 IFBTN()CONT
10 LC0,2:?"Push BTN":GSB34
11 IF!BTN()CONT
12 LED1:CLK:UART1:?"*":UART0
13 FORI=0TOL
14 X=[I]&15:Y=[I]&240/16:Z=[I]&768/256
15 B=1:A=X:IFA%2GSB25
16 A=Y:IFA%2GSB25
17 WAIT14
18 B=0:A=X:IFA%2GSB25
19 A=Y:IFA%2GSB25
20 WAIT1:IFZ=1WAIT15
21 NEXT
22 GOTO4
23 CLT:S=S+1:IFS=4S=1:CLS
24 ?CHR$(233);:GSB34:RTN
25 P=A/2+2:PWMP,[86+P*2+B]:RTN
26 poke#780,#00,#40,#21,#00,#7F,#22,#00,#07,#AE,#D5,#80,#8D,#14,#20,#00,#DA,#12,#81,#CF,#D9,#F1,#DB,#40,#A4,#A6,#AF
27 forP=#788to#799:i=i2cw(60,#780,1,P,1)
28 next
29 poke #79a,#70,#b5,#40,#18,#07,#23,#1b,#02
30 poke #7a2,#c9,#18,#10,#24,#03,#78,#db,#00
31 poke #7aa,#d3,#18,#1d,#68,#0d,#60,#5d,#68
32 poke #7b2,#4d,#60,#20,#30,#08,#31,#01,#3c
33 poke #7ba,#f4,#d1,#70,#bd
34 fork=0to7:j=usr(#79A,#907-k):j=i2cw(60,#781,1,#700,128):next:rtn
メインプログラム(子機)
1 '*Tekkin C
2 CLV:CLK:LED 1:WAIT 60:UART 1,1
3 LET[90],60,155,75,170,62,160,70,167
4 FOR P=2 TO 5:PWM P,[86+P*2]:NEXT
5 OUT 0:CLK
6 S=INKEY()-48:IF S<1 OR S>3 CONT
7 CLK:G=8:LRUNS
8 IF INKEY()!=42 CONT
9 CLK:LED 1
10 FOR I=0 TO L
11 X=[I]&15:Y=[I]&240/16:Z=[I]&768/256
12 B=1:A=X:IFA&&A%2=0GSB20
13 A=Y:IFA&&A%2=0GSB20
14 WAIT14
15 B=0:A=X:IFA&&A%2=0GSB20
16 A=Y:IFA&&A%2=0GSB20
17 WAIT1:IFZ=1WAIT15
18 NEXT
19 GOTO 4
20 P=A/2+1:PWMP,[86+P*2+B]:RTN
※3行目のデータは、4個のサーボモーターの真上/下ろした時の値です。これはマレットの作り方や各サーボモーターの個体差によって変わるので、実際に動かして調整する必要があります。
なお、マレットを真上で止めているのは、斜めで止めるとハンチング(振動)を起こしてしまうからです。実はハンチング抑制のために、マレットの長さの短縮、サーボモーターのアームの取り付け角やプログラムのパラメータ調整など、かなり試行錯誤しています。もっとトルクが大きいサーボモーターを使えば解決しますが、とても高価なので(^_^;)
10 '*Tekkin - Chime
20 LET [ 0],#105,#107,#106,#102,#100,#100
30 LET [ 6],#105,#106,#107,#105,#100,#100
40 LET [12],#107,#105,#106,#102,#100,#100
50 LET [18],#102,#106,#107,#105,#100,#100
60 L=23
70 LRUN 0,G
曲データ「かえるのうた 輪唱」
10 '*Tekkin - Kaeru Rinsho
20 LET [ 0],#101,#102,#103,#104,#103,#102,#101,#100
30 LET [ 8],#113,#124,#135,#146,#135,#124,#113,#100
40 LET [16],#131,#140,#151,#160,#151,#140,#131,#100
50 LET [24],#201,#201,#202,#202,#213,#203,#204,#204
60 LET [32],#113,#102,#101,#100
70 LET [36],#201,#201,#202,#202,#203,#203,#204,#204
80 LET [44],#103,#102,#101,#100
90 L=47
100 LRUN 0,G
曲データ「もろびとこぞりて」(Joy to the World)
10 '*Tekkin - Morobito Kozorite
20 LET [ 0],#108,#100,#107,#200,#206,#105,#100,#100
30 LET [ 8],#104,#103,#100,#102,#100,#101,#100,#100
40 LET [16],#105,#106,#100,#100,#106,#107,#100,#100
50 LET [24],#107,#108,#100,#100,#100,#100,#100,#100
60 LET [32],#108,#108,#107,#106,#105,#105,#200,#204,#103
70 LET [41],#108,#108,#107,#106,#105,#105,#200,#204,#103
80 LET [50],#103,#103,#103,#103,#203,#204,#105,#100,#100
90 LET [59],#204,#203,#102,#102,#102,#202,#203,#104,#100,#100
100 LET [69],#203,#202,#101,#108,#100,#106,#105,#200,#204,#103
110 LET [79],#104,#103,#100,#102,#100,#101,#100,#100
120 L=86
130 LRUN 0,G
曲データの各音は16進数3桁です。
- 1桁目=音の長さ(1=四分音符、2=八分音符)
- 2桁目=音階2(1=ド、2=レ、…8=上のド、0=休符)
- 3桁目=音階1(1=ド、2=レ、…8=上のド、0=休符)
- 音階1と2を同時に指定すると、重音で叩きます。
- 二分音符など長い音を出したい時は、四分音符+四分休符にすれば、叩いた音がそのまま響きます。