なでしこさんでモールス符号練習機?
今週は、貴重な時間をヴァイスシュヴァルツポータブルに割り当てまくった。
そして、日曜日には物理ヴァイスシュヴァルツをしに出かけ……
今週もアレやソレを書くための作業ができず、またまた先延ばしすることに……
ああ、本当に頭が悪くて愚かでバカでクズでカスで無能でゴミで…………………
というわけで、頭を使うのを完全に回避できるわけではないが、今週もなるべく頭を使わずに雑プログラムで繋ぐのです……
今回やったこと
なでしこで、ボタンを押している間だけビープ音を鳴らすやつを作った。
プログラム
モールス符号練習機? (プログラム貯蔵庫)
ポイント
UIの用意
送信ボタンは「押」のボタン作成。
それの「文字サイズ」に「500%」をDOMスタイル設定。今回のUIは、ボタンを1個置くだけである。
本当は真四角にするなどもう少しスタイルをいい感じにした方が良さそうな気がするが……面倒だからいいや……
ビープ音の用意
定数のWAVデータは[
0x52, 0x49, 0x46, 0x46, 0xa4, 0x38, 0x01, 0x00, 0x57, 0x41, 0x56, 0x45,
0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00,
0x01, 0x00, 0x08, 0x00,
0x64, 0x61, 0x74, 0x61, 0x80, 0x38, 0x01, 0x00,
]
10000回、繰り返す
4回、WAVデータに0x00を配列追加。
4回、WAVデータに0xffを配列追加。
ここまでWAV形式の音声データを用意する。
詳細は面倒なので省略するが、サンプリング周波数 8000 Hz、モノラル、8 bitで、1000 Hz の矩形波のデータを用意した。
WAVデータに{関数}CHRを配列関数適用して配列只結合。
「btoa」を[それ]でJS関数実行。
オーディオURLは「data:audio/wav;base64,{それ}」。
オーディオオブジェクトはオーディオURLをオーディオ開く。用意したデータをなでしこで使える形にし、再生の準備をする。
具体的には、まず「CHR」関数を「配列関数適用」することで、各バイトの値が数値で格納された配列を文字で格納された配列に変換する。
そして、それを「配列只結合」で結合し、1個の文字列にする。
さらに、その文字列を btoa メソッドで Base64 エンコードする。
最後に、それを data URL として「オーディオ開」に渡すことで、再生の準備をする。
ボタン操作によるビープ音の再生
送信ボタンをマウス押した時には
オーディオオブジェクトをオーディオループ再生。
ここまで。
送信ボタンをマウス離した時には
オーディオオブジェクトをオーディオ停止。
ここまで。「マウス押時」「マウス離時」のイベントハンドラで、それぞれ「オーディオループ再生」「オーディオ停止」を実行することで、ボタンを押したり離したりする操作に応じてビープ音を鳴らしたり止めたりする。
おわりに
なでしこで、ボタンを押している間だけビープ音を鳴らすことができた。
世の中では、このような「ボタンを押している間だけビープ音を鳴らす装置」のことを「モールス符号練習機」と呼ぶことがあるようだ。
たとえばこれとか。
モールス符号練習機 - aitendo
しかし、「モールス符号練習機」を名乗るのであれば、モールス符号の練習に便利な機能、たとえば鳴らした音の長さや音と音の間の長さを計測し、比率が正しいかを調べる機能などを持つべきだと思う。
さて、今回のプログラムには、
スマホなど一部の環境では、ボタンを押しても音が上手く鳴らない
マウスのボタンを押したままカーソルをボタンから外すと、マウスのボタンを離しても音が鳴りっぱなしになる
などの不具合がある。
これらの修正や、デザインの改良、便利機能の追加などは、読者への宿題とする。面倒なので……


コメント