人間、複数の感覚から刺激されたことはよく覚えるようにできている。
なので、読んで、聞いて、手を動かして、作ってみて、考えてみるのがいい。
音声読み上げチップ AquesTalk pico x IchigoJam を使って、いままで覚えてこなかった和文モールス信号に挑戦。
100文字/分速度のモールス信号に続いて、かなをイロハ順に読み上げてくれるモノを作ってみました。
プログラムはこちら。配列に和文モールス信号が50コ、AquesTalk読み用のかなが50コ入れる。
10 LET[0],13,1313,3111,3131,311,1,11311,1131,331,1111,31331,1333,313,1311,33,31,333,3331,1331,3313,131,111,3,113,13113 20 LET[25],1133,13111,1113,133,3113,3133,3311,3333,31333,13133,33133,31313,31311,31133,31113,11313,33131,13311,33113,31131,13331,33313,13131,11,11331 30 LET[50],"i","ro","ha","ni","ho","he","to","ti","ri","nu","ru","wo","wa","ka","yo","ta","re","so","tu","ne","na","ra","mu","u","i" 40 LET[75],"no","o","ku","ya","ma","ke","fu","ko","e","te","a","sa","ki","yu","me","mi","si","e","hi","mo","se","su","n","da","pa" 100 FOR I=0 TO 49 110 ?[I],STR$([50+I]) 120 N=[I]:GSB@MORSE:WAIT 30 130 S=[50+I]:GSB@TALK:WAIT 30 140 NEXT 150 END 200 @MORSE:S=100 210 P=10:W=360/S:IF W<10 W=-36*261/S*10 220 B=10000:FOR J=0 TO 4:M=N/B%10:IF M<0 M=M+6:N=N+35536 230 IF M LED1:BEEP P,600:WAIT W*M:BEEP0:LED0:WAIT W 240 B=B/10:NEXT 250 WAIT W*3 260 RTN 300 @TALK:U=I2CW(#2E,S,LEN(S)):U=I2CW(#2E,13):RTN
ハマったポイントは、3と1とで表していたモールス信号、5文字の33000以上だと16bit正数の上限を越えて、値がマイナスになってしまう。
マイナスになった時は、適度な数を足して補正。(置換が使える環境であれば、3の替わりに2にしたほうが簡単)
工夫したポイントは、WAITのマイナス値指定を使うことで、1/(261*60)秒単位で待ち時間を調整し、より正確なモールス速度を実現している。200行のSを変更してみよう!
(IchigoJam BASICリファレンス WAITの項目参照、IchigoJam web は未対応)
Nに符号化したモールス信号をセットして、呼び出す。下記は、有名なSOSの発信。
N=111:GSB@MORSE:N=333:GSB@MORSE:N=111:GSB@MORSE
links
- IchigoJam モールス信号エンコーダー アルファベット編
- モールス符号 - Wikipedia