SHIROのIchigoJam日記

IchigoJamの電子工作とプログラミングをメインに

TENORI-64

IchigoJam+IchigoDot-Matrix環境用に作った音楽プログラムです。
8×8のLEDマトリックスで、音階をセットして演奏します。
IchigoDotへの移植を狙って、操作はボタン1個です。
Ichigo 64」でLEDマトリックスを動かせるようになったので、YAMAHAの電子楽器「TENORI-ON」の動きを参考に作りました。

  • 起動すると、タイトル画面の後、画面左端の縦列のLEDが下→上へ点灯して移動します。下からそれぞれド・レ・ミ〜1オクターブ上のドの音になっています。出したい音の所でボタンを押すと、その音がセットされます。休符にしたい時は、1オクターブ上のドとドの間、LEDがついていない時にボタンを押してください。
  • 右隣の縦列の入力へ移ります。同様に音をセットしてください。
  • 8列目の縦列の入力が終わると、入力したメロディを2回くり返して演奏します。
  • メロディがクリアされて、最初へ戻ります。

※9/9修正

  • プログラムを自動起動してLEDマトリックスを同時ONすると、スタート時のMATLEDコマンドを受け付けないことがあるため、コマンド出力を修正。
  • 縦列スキャンの最初に休符を入力できるようにしました。前の列をボタン入力した直後に続けてボタンを押すと、休符を入力できます。

1 '*TENORI-64*
2 '@WAITA
3 IFBTN()GOTO2
4 WAIT60:CLV:UART1:CLS:?:GSB38:?"MATLED SHOW F1CFC1007F42F44F"
5 PLAY"L8CDECDE":WAIT180
6 '@START
7 CLV:GSB38
8 '@INLOOP
9 FORX=0TO7:Y=0
10 '@INLOOPLINE
11 W=0:GSB34
12 '@INLOOPBTN
13 IFBTN()BEEP30,5:GOTO17
14 WAIT1:W=W+1:IFW<50GOTO12
15 GSB36:Y=Y+1:IFY>8Y=0
16 GOTO10
17 '@INLOOPNEXT
18 IFBTN()GOTO17
19 NEXT
20 '@PLAY
21 FORZ=0TO1:FORX=0TO7:GSB32:GSBLINE()+[X+8]+2
22 WAIT20:GSB32:NEXT:NEXT:PLAY"R":WAIT60:GOTO6
23 PLAY"R":RTN
24 PLAY"C":RTN
25 PLAY"D":RTN
26 PLAY"E":RTN
27 PLAY"F":RTN
28 PLAY"G":RTN
29 PLAY"A":RTN
30 PLAY"B":RTN
31 PLAY"O5C":RTN
32 '@LINEXOR
33 [X]=[X]^#FF:GSB38:RTN
34 '@BITSET
35 [X]=(256>>Y)&255:[X+8]=Y:GSB38:RTN
36 '@BITRESET
37 [X]=0:[X+8]=0:GSB38:RTN
38 '@PRTMAT
39 ?"MATLED SHOW ";:FORB=0TO7:IF[B]<16?0;
40 ?HEX$([B]);:NEXT:?:RTN
実は以前にプチコンで作ったプログラムの応用です。

TENORI-15(9/13追加)

通常のIchigoJam用に移植しました。
IchigoDotを持っていない方も、マトリックスLEDで遊ぶ雰囲気を味わってみてください。

1 '*TENORI-15*
2 CLS:LET[0],#91,#FF,#81,0,#BF,#B2,#B4,#5F:GSB38
3 PLAY"L8CDECDE":WAIT180
4 '@START
5 CLV:GSB38
6 '@INLOOP
7 FORX=0TO7:Y=0
8 '@INLOOPLINE
9 W=0:GSB32
10 '@INLOOPBTN
11 IFBTN()BEEP30,5:GOTO15
12 WAIT1:W=W+1:IFW<50GOTO10
13 GSB35:Y=Y+1:IFY>8Y=0
14 GOTO8
15 '@INLOOPNEXT
16 IFBTN()GOTO15
17 NEXT
18 '@PLAY
19 FORZ=0TO1:FORX=0TO7:GSB30:GSBLINE()+[X+8]+2
20 WAIT20:GSB30:NEXT:NEXT:PLAY"R":WAIT60:GOTO4
21 PLAY"R":RTN
22 PLAY"C":RTN
23 PLAY"D":RTN
24 PLAY"E":RTN
25 PLAY"F":RTN
26 PLAY"G":RTN
27 PLAY"A":RTN
28 PLAY"B":RTN
29 PLAY"O5C":RTN
30 '@LINEXOR
31 A=#900+X:FORB=0TO7:POKEA+B*32,#E8+(SCR(X,B)=#E8):NEXT:RTN
32 '@BITSET
33 [X+8]=Y:IFY>0LCX,8-Y:?CHR$(#E9)
34 RTN
35 '@BITRESET
36 [X+8]=0:IFY>0LCX,8-Y:?CHR$(#E8)
37 RTN
38 '@PRTMAT
39 LC0,0:FORB=0TO7:FORC=0TO7:D=([C]&(1<0:?CHR$(#E8+D);:NEXT:?:NEXT:RTN