2019年04月28日

アマチュア無線(ScratchでCW打鍵練習ゲーム)

和文モールス聞き取りゲームは自分なりにそこそこ上手にできたと思う。その流れで今度は本家CWインベーダー同様の打鍵練習ゲームをScratchで組めないかチャレンジしてみた。



聞き取りゲームはロジックとしては単純な四択クイズの応用で,音源の準備(パドルを叩きながら録音した)が地道な作業で時間がかかったのが大変ではあったけれど,本質的に困難な部分はなかった。もちろん慣れないうちは思った通り動かなかったりして苦労したけれど,Scratchの仕様の範囲で十分に書けることがわかっていたという意味で。

その点打鍵練習には「これはScratchで可能かな?」と思うハードルが3つあって,

(1)キーを押している間連続音(サイドトーン)を流し,離したら止める,という実装
(2)打鍵に対する処理速度(レスポンス)の問題
(3)モールス符号のデコードアルゴリズムの移植

(1)については,短点と長点を固定長としてしまえばそれほど難しくない。Scratchで公開されている多くのモールス信号系のプロジェクトもだいたいこの方式。でも縦振れキーの練習としては,やっぱり打鍵の長さを自由に変えられる機能は必須だろう。

いろいろ試して,なんとかそれっぽい実装を考えた。具体的なやり方は,
・長め(5秒とか)のサイドトーンを録音して登録する。
・「キーが押された」までループで待機。
・上記ループを抜けたら長いサイドトーンを再生。
・「「キーが押された」ではない」まで空ループ。
・空ループを抜けたら「すべての音を止める」。

cw_scratch_01_w560.jpg

これで,キーを押している間はサイドトーンを再生して,キーを離すと止める,という動きが実現できる。

ただ問題も残っていて,Scratchに音を登録するときに,自動的にフェードイン・フェードアウトが付加されてしまうこと。時間0で音量100%になるような音を登録しても,音量0からフェードインする音に勝手に編集されてしまう。このせいでキーを押した瞬間は無音で,一瞬遅れてサイドトーンが鳴るようなタイムラグが発生する。連続して打鍵したときの音の歯切れも悪くなる。これは後のレスポンスの問題とも密接に関わってきて,今のところ解決できていない。

cw_scratch_02_w560.jpg

(2)はゲーム性に関わる問題。ストレートキーでそれなりに打てる人ならわかると思うけれど,慣れてくると短点の打鍵などはかなり高速になる。電鍵の代わりにキーボードを打つという違和感は我慢してもらうとしても,慣れているスピードで打とうとすると,処理速度のためだと考えられる入力の取りこぼしが発生する。何度かやっているうちに「うまく反応してくれるタイミング」みたいなものがわかるようになってくるんだけど,初めての人は「なんだこりゃ」と思うかも。

(3)はこのゲームを作る上での「キモ」とも呼べる部分。モールス符号のデコードアルゴリズムをネットで検索すると、「枯れたアルゴリズムがある」とされている一方で、具体的なコードの例はなかなか見つからない。あっても実際の交信の音を入力してFFTをかけて、みたいなものだったり。

可変長のキーダウン信号を短点、長点、符号間の空白、文字間の空白、単語間の空白の5つに分類するわけだけど、それぞれ長さが人間の打ち方によって変化するというのが難しい。人間がいかにこの辺の判定をうまくやっているかがわかる。

で、数少ない情報の中で比較的わかりやすく書かれているのが、JH7UBCさんのサイト。わかりやすいフローチャートとIchigojamとPythonによる実装が紹介されており、大変親切。もっと高度なアルゴリズムもあるのかもしれないけれど、まずはこれをベースとさせていただく。

Scratch用に改造したのは、キーアップ(High)時とキーダウン時(Low)のループのsleep(0.001秒)をなくして,カウンタのインクリメントではなくタイマーを使った経過時間計測に変えた点。Scratchは遅いのでループ回数がsleep無しでも少なく,精度が悪くなってしまったため。

これでそこそこは認識するようになったと思っているけれど,本家CWインベーダーと比べるとまだまだ。パラメータ調整でどうにかなるレベルなのか,アルゴリズムが違うのか,Scratchの処理速度の問題なのか,まだ切り分けられない状況。今後の課題としたい。

プログラムはいじらずに,拡張ブロックを使ってMicro:bitをBluetooth接続でつなぎ、入力端子に電鍵をつないでみた。

これでキーボードで打鍵する違和感をなくせればラッキー、と思ったけれど甘かった。Bluetoothで接続している関係か、打鍵してからScratchが反応するまでの遅延があって、余計に違和感が大きくなってしまった。お手軽な構成で電鍵が繋げると思ったのに残念。



タグ:CW Scratch
posted by ソウヘイ at 18:15| Comment(0) | アマチュア無線
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: