Morse Recorder - モールスレコーダー


■概要

エレキー、電鍵等のON/OFF信号をRS232Cで拾い、それをPCで音を鳴らすと同時に、ON/OFF情報を保存するソフトウェア。
さらに、その保存した情報を元に再生する。

といったものはありふれているのできっとどこかにあるだろう、と探してみたけどなかなか見つけられなかったので作ることに。

そもそもこのソフトを作った動機は、手持ちのエレキー(カツミ EK-160)ではスピーカーのみでヘッドフォン端子が無い。
試験会場で本番前の練習をしたくてもエレキー単体のみでは周りの迷惑になる(かも?)、ならば一緒に持って行くPCに再生させれば問題ない♪
と思ったのがきっかけ。

CWTW-Proというソフトがすでにあり、これも同様のことができますが、音質にやや不満があるのと、自分で打鍵したものをreplayできないという機能的な不満がありました。
作者に頼めば作ってくれそうですが、自分でも簡単に作れそうだったのでやってみました。
実際、一部を除けば簡単でした。その一部というのは肝心のモールス音の再生です。
リアルタイムでモールス音を満足できる品質で再生するのは難しい。。。

■ダウンロード

プログラム - MorseRec-20080118.zip
ソースコード - MorseRec-src-20081818.zip (要C++Builder Ver.5)

■設定

1. 適当なところに解凍し、起動。
2 .RS232CのDTRとDSRを電鍵端子と接続(CWTW-Proと同じ) こちらなどを参考にしてください。
3. COMポート番号を確認し、MorseRecorderのCOMポート番号を選択

■使い方

F5キー RS232Cポートを開き、打鍵記録の開始。"Realtime Monitor"にチェックが入っていれば、打鍵に応じて音も鳴ります。
F6キー 記録した打鍵内容を再生
F4キー 記録の停止、RS232Cポートを閉じる

記録した内容をごらんになってわかるとおり、ミリ秒単位の時刻とON(1)/OFF(0)がタブ区切りになっており、その繰り返しです。
このテキストをクリップボードへコピーして、Excelなど他のソフトで利用することができます。

ほか使用されると思われるキーとしては、

Ctrl+A 記録テキストを全て選択
Ctrl+C 選択した部分をクリップボードへコピー
Ctrl+E 記録を消去

■プログラム詳細

当初Windows APIのMCIコマンドを使い、モールス音の入った.wavファイルを再生・停止するように作りました。それはとても簡単。
当然のことながら、音の鳴り始め、終わりに「プツっ」という雑音が入り、非常に気になる。

そこで、waveOutWrite APIを使ってfade-in/fade-outすれば聞きやすくなるだろうと言うことで軽い気持ちで作りましたが。。

モールス音をリアルタイムで鳴らすには以下の要件が必要。
・再生中は途切れてはいけない - 当然だが、モールス音は正弦波等の単調な音であるため、少しでも途切れるとノイズとなって聞きづらくなる。
・latencyは極力抑えなければならない - モールス音をOFFにするときはただちにゼロレベルにする必要があるが、前述の通り一気にゼロレベルにすると雑音が発生し、聞きづらくなる。(追記:ゼロクロス点でOFFにすればいいだけだけど、なぜそうしなかったんだっけ?)

waveOutWrite()関数を使う場合、上記の要件を満たすためには、
・WAVEHDRで指定するデータ長をなるべく短くする(25mSecに設定してみた)
必要がある。

しかし、waveOutWrite()を呼び出してから実際に音が出るまで非常に時間がかかることが判明。環境に依存するが、自分のところでは50mSec程度かかっているのではないかと推測。(waveOutWrite()を逐次呼び出したとき、出力音の間隔から判断)

そこで複数のWAVEHDRを予め送ることで途切れないようにすることはできるが、モールスOFF時のlatencyが長くなってしまう。

突き詰めていくと、waveOutWrite()を呼び出して、実際に音が鳴るまでのlatencyが保証されていないところに今回のプログラムの難しさがある。

恐らくこのプログラムはPC環境によって音の鳴り方が異なるはずです。
期待する品質にするにはパラメータの調整が必要。
1つのWAVEHDRのデータ長、WAVEHDRの数、fade_speed。サンプリング周波数を変更しただけでも変わるはずです。

また、Loopを使った方法も考えられますが、これも同様の理由でうまくいきません。

ソースコードにはやや苦戦の跡 - WaveOutTh.cpp

■結論

モースル信号は少なくとも10ミリ秒単位の精度を要求する、音の世界では比較的シビアな分野かもしれない。
120字/分の欧文の場合、1文字あたり500mSecで送信。"S"の場合は短点を500mSecで3つ送ることになり、短点一つあたりは約160mSec。50mSecもlatencyがあったりしたら違和感を感じるのは当然。やはり高級なOSでリアルタイム処理をやるのは無茶だということを実感。

DirectSoundを使えばできるかもしれないが、そこまでやるmotivationが無いため断念。

PCで再生するなんて言う高度なことをやろうとせず、エレキーのKEY端子に発信器を繋いでヘッドフォンで聞く、っていうスタイルがもっとも楽。
このソフトに関してはMorse Recorder という名前の通りの機能は果たすので、一応公開状態のままにしておきます。(回り道だったな。。)

また、記録したモールス信号の再生に関しては、latencyは関係なくなるので綺麗に再生されると思いましたが、リアルタイム再生用にタイミングをシビアに作ったせいなのか、根本的に問題があるのか、単なるバグなのか・・・よくわかりませんが、打鍵したままに再生されず、ときどきタイミングがずれます。(特に初っぱなの開始はガタガタ)
修正したいところですが、記録した自分のモールスで受信テストをするのが目的ですので、難易度が上がって自分的には好都合です。従って、試験のためだけにプログラミングに時間を費やすのはもったいないのでここで打ち止めにしておきます。もし気がついた方がいらっしゃいましたら、下記の連絡先までご連絡を。

■連絡先

解決策、ほかに良いソフトがありましたら下記のメールまでお願いします。


無線のページへ