Introduce CASIO CT-701,CT-601 Casio Barcode Scores Format.

カシオトーン・・・名前の響きがいいよね。

 ロストテクノロジー。カシオトーンのバーコードフォーマットです。これを読んで色々な刺激を受ける事を期待しています。
 
 
8. Check bitの所はCheckSUMの下位4bitと思われます。実際どの項目を足し算しているかは確かめないといけません。多分5. Dataだけと予想はしています。
Note Storage Capacity Max, 345steps
Chord Storage Capacity Max 201steps
 

バーコードリーダーの資料

MS-1(バーコードリーダー)の信号レベルは白が0.8V、黒が4.4Vです。
GND(フレームグラウンド),5V,OUT(1ピン)の3つの線で繋がっています。これは開ければわかりますし電圧測ってもわかるでしょう。
 
これだけわかればMS-1が無くとも信号レベルで等価であればArduinoであろうがラズパイであろうがシミュレート出来ます。
 
興味のある方はHackしてみてね。

独自のバーコード規格

例を観てみましょう。
 
0=thin,1=Bold,交互にリバース。しかし最後の2桁目が謎。

 なるほど。きっとEOLが白で終わると都合が悪いので黒の0を使いたいのが伝わってきます。
しかし最後の2桁目は0ではなくどう見ても白の1ですよねぇ・・・解読するうちに何か解るかもしれません。
 
そういえばバーコードバトラーが流行った時にバーコードを見て数字としてすらすら読んでた人がいたな。
一番データの少ない曲をチョイスしてみました。American Folk Song
これのPitchを観てみましょう。

 
 P1
00000010000000011011000000000000011100001010101010001010001100100001001000110010110010100000100010001010000000001010101001101010111100111
 P2
0000001010000001101000000000000110100101101000011010110010100000000010101010011010100001101000000000100010100101101001101010111100111
 P3
0000001001001000101011001010011100001000101011111010100
 
P1を分解してみましょう。
1=0000
2=0010
3=0000
4=0001
5=10110000 00000000 01110000 10101010 10001010 00110010 00010010 00110010 11001010 00001000 10001010 00000000 10101010 01101010
6=1111
8(?)=0011
9(?)=1
 さて、5の文字列をHexにしてみます。
5(Hex)=B0 00 70 AA 8A 32 12 32 CA 08 8A 00 AA 6A
32 12 32の分部はMML表記BGBだとすると<C>は8A、<D>はCA、<E>はAA、<F>は6A、セーニョ(Loop Point)は70、休符は00、B0は制御コード?08は何?
標準のOctの上6音はx2、1Oct上の下6音はxAは合ってると思う。私が設計するならキーマトリックスのコードに似せると変換表が無くて済むのでメモリ節約を考えるだろう。
 
Casiotone701 Key Matrix
 
ところでCheckSumがわからない。全部足すと53A。A?合わない。

誰かこの暗号を解く人は居ないかと探したところ・・・・いました!Robert!友よ!Hallelujah!


 
 この資料は素晴らしいではありませんか。音程音長との関連まで解析しまくってます。1111から後ろの7bitの答えが出ている。
テキストのMMLからバーコードへのコンバートプログラムがflashやhtml5で出来そうな気がします。
やっぱり印刷は必要ですけど😀
 
 こちらはVL-5(レアな機種ですが私は持っています)のMS-1ポートにSinclair Research ZX Spectrumのカセットポートを直結して3VのON/OFFで信号を転送する荒業です。これならラズパイに移植出来そうですね。

 
CheckSumの式はこれ。ノート数+3か。

420 INPUT C$: LET C=LEN C$
430 LET F=3: LET A$="00": FOR B =1 TO C+3: LET D=CODE C$(B)-55+7*(C$(B)<"A"): LET F=F+D
440 IF B=C THEN LET F=F-INT (F/16)*16: LET C$=C$+"F"+CHR$ (63+2*(8*(F>7)-F))+CHR$ (48+8+(F>7))
 

さらに分解すると

420 INPUT C$

421 LET C=LEN C$

430 LET F=3 

431 LET A$="00"

432 FOR B =1 TO C+3

433      LET D=CODE C$(B)-55+7*(C$(B)<"A")

434      LET F=F+D

440      IF B=C THEN LET F=F-INT (F/16)*16

441      LET C$=C$+"F"+CHR$ (63+2*(8*(F>7)-F))+CHR$ (48+8+(F>7))

 

3.Line Numberは15行以降は0000,1000,0100, 1100,0010,1010,0110,1110,0001,1001,0101,1101,0011,1011,0111,1111と32行は行けるようだ。ただし、バーコードの並び≠ビット左詰め方式であり、5.Dataを理解するにはバーコードの並び=ビット右詰め方式で表を作り理解する必要がある。(これかなり重要)表記を右詰めビット(R)バイト(H)バーコードビット(B)CheckSumHex4bit(C)と表示します。
まぁ一度テーブルを作れば気にせず並べればよい。 
 
0000(R) = 0(H) = 0(C) = Line NO.0
0001(R) = 1(H) = 1(C) = Line NO.1
0010(R) = 2(H) = 2(C) = Line NO.2
0011(R) = 3(H) = 3(C) = Line NO.3
0100(R) = 4(H) = 4(C) = Line NO.4
0101(R) = 5(H) = 5(C) = Line NO.5
0110(R) = 6(H) = 6(C) = Line NO.6
0111(R) = 7(H) = 7(C) = Line NO.7
1000(R) = 8(H) = 8(C) = Line NO.8
1001(R) = 9(H) = 9(C) = Line NO.9
1010(R) = A(H) = A(C) = Line NO.10
1011(R) = B(H) = B(C) = Line NO.11
1100(R) = C(H) = C(C) = Line NO.12
1101(R) = D(H) = D(C) = Line NO.13
1110(R) = E(H) = E(C) = Line NO.14
1111(R) = F(H) = F(C) = Line NO.15
0000(R) = 0(H) = 0(C) = Line NO.16
1000(R) = 8(H) = 8(C) = Line NO.17
0100(R) = 4(H) = 4(C) = Line NO.18
1100(R) = C(H) = C(C) = Line NO.19
0010(R) = 2(H) = 2(C) = Line NO.20
1010(R) = A(H) = A(C) = Line NO.21
0110(R) = 6(H) = 6(C) = Line NO.22
1110(R) = E(H) = E(C) = Line NO.23
0001(R) = 1(H) = 1(C) = Line NO.24
1001(R) = 9(H) = 9(C) = Line NO.25
0101(R) = 5(H) = 5(C) = Line NO.26
1101(R) = D(H) = D(C) = Line NO.27
0011(R) = 3(H) = 3(C) = Line NO.28
1011(R) = B(H) = B(C) = Line NO.29
0111(R) = 7(H) = 7(C) = Line NO.30
1111(R) = F(H) = F(C) = Line NO.31

4.は
1000(R) = 8(H) = 8(C) = Pitch
0100(R) = 4(H) = 4(C) = Length
0010(R) = 2(H) = 2(C) = Chord

5.Dataについては
特殊なコードは4種類。
 
00000000(R) = 00(H) = 0(C) = Rest.(休符)
00001101(R) = B0(H) = D(C) = Accompaniment Start.
00001110(R) = 70(H) = E(C) = Return 1. (Repeat Start/End)
00010000(R) = 08(H) = 1(C) = Return 2. (1st ending)

音程はO4CからO7Bまでの48種類。

01000001(R) = 82(H) = 5(C) = O4C
01000010(R) = 42(H) = 6(C) = O4C#
01000011(R) = C2(H) = 7(C) = O4D
01000100(R) = 22(H) = 8(C) = O4D#
01000101(R) = A2(H) = 9(C) = O4E
01000110(R) = 62(H) = A(C) = O4F
01000111(R) = E2(H) = B(C) = O4F#
01001000(R) = 12(H) = C(C) = O4G
01001001(R) = 92(H) = D(C) = O4G#
01001010(R) = 52(H) = E(C) = O4A
01001011(R) = D2(H) = F(C) = O4A#
01001100(R) = 32(H) = 0(C) = O4B
                   
01010001(R) = 8A(H) = 6(C) = O5C
01010010(R) = 4A(H) = 7(C) = O5C#
01010011(R) = CA(H) = 8(C) = O5D
01010100(R) = 2A(H) = 9(C) = O5D#
01010101(R) = AA(H) = A(C) = O5E
01010110(R) = 6A(H) = B(C) = O5F
01010111(R) = EA(H) = C(C) = O5F#
01011000(R) = 1A(H) = D(C) = O5G
01011001(R) = 9A(H) = E(C) = O5G#
01011010(R) = 5A(H) = F(C) = O5A
01011011(R) = DA(H) = 0(C) = O5A#
01011100(R) = 3A(H) = 1(C) = O5B
                   
01100001(R) = 86(H) = 7(C) = O6C
01100010(R) = 46(H) = 8(C) = O6C#
01100011(R) = C6(H) = 9(C) = O6D
01100100(R) = 26(H) = A(C) = O6D#
01100101(R) = A6(H) = B(C) = O6E
01100110(R) = 66(H) = C(C) = O6F
01100111(R) = E6(H) = D(C) = O6F#
01101000(R) = 16(H) = E(C) = O6G
01101001(R) = 96(H) = F(C) = O6G#
01101010(R) = 56(H) = 0(C) = O6A
01101011(R) = D6(H) = 1(C) = O6A#
01101100(R) = 36(H) = 2(C) = O6B
                   
01110001(R) = 8E(H) = 8(C) = O7C
01110010(R) = 4E(H) = 9(C) = O7C#
01110011(R) = CE(H) = A(C) = O7D
01110100(R) = 2E(H) = B(C) = O7D#
01110101(R) = AE(H) = C(C) = O7E
01110110(R) = 6E(H) = D(C) = O7F
01110111(R) = EE(H) = E(C) = O7F#
01111000(R) = 1E(H) = F(C) = O7G
01111001(R) = 9E(H) = 0(C) = O7G#
01111010(R) = 5E(H) = 1(C) = O7A
01111011(R) = DE(H) = 2(C) = O7A#
01111100(R) = 3E(H) = 3(C) = O7B

この後に6.7.が来て、問題のCheckSumです。3.4.5.6.7.の範囲を計算するようです。
6.7.の計算は6.で15。7.で0か1。

01111(R) = 0F(H) = F(C) = EOL, not Last Line
11111(R) = 1F(H) = 0(C) = EOL, Last Line
CheckSum
00(B) = Padding
 
間違えたかな?

コメント