トントントンツーツーツートントントン・・・
届いているでしょうか?
「無人島にひとつだけ持っていくとしたら?」
と聞かれて
「ノートパソコン」
とうっかり答えてしまった時の為に、
Javascriptで文字列をモールス信号に変換するプログラムを作ってみました。
これです。
モールス信号変換
http://xiidec.appspot.com/morse.html
上のテキストボックスに変換したい文字列(英数字)を入力すると、
0と1に変換してピーピー音がなります。
モールス信号はどうやってお話しするの?
短い「ピッ」と長い「ピー」の組み合わせで言葉を作るあれです。
「ピッ」「ピー」を「トン」「ツー」に言い換えるとなんか玄人っぽいですね。
モールス信号の代表例がこの
・・・ーーー・・・
「SOS」。
「S」が「・・・」で「O」が「ーーー」。
ピンクレディの『SOS』という曲のイントロにはモールス信号の
SOSが入っているのでラジオで放送できなかった…というエピソードは有名ですね。
具体的なルールはWikipediaを参考にしましょう。
国際モールス符号は短点(・)と長点(-)を組み合わせて、アルファベット・数字・記号を表現する。
長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。
また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。
なるほど。
非常にシンプルですね。
プログラム
Javascriptで実装してみるとこんな感じになります。
解説は後ろのほうで。
<HTML>
<HEAD>
<style type="text/css">
</style>
<Script>
var audio = new Audio();
audio.src = "etc/pi.wav";
var dict = {
"a":"10111",
"b":"111010101",
"c":"11101011101",
"d":"1110101",
"e":"1",
"f":"101011101",
"g":"111011101",
"h":"1010101",
"i":"101",
"j":"1011101110111",
"k":"111010111",
"l":"101110101",
"m":"1110111",
"n":"11101",
"o":"11101110111",
"p":"10111011101",
"q":"1110111010111",
"r":"1011101",
"s":"10101",
"t":"111",
"u":"1010111",
"v":"101010111",
"w":"101110111",
"x":"11101010111",
"y":"1110101110111",
"z":"11101110101",
"1":"10111011101110111",
"2":"101011101110111",
"3":"1010101110111",
"4":"10101010111",
"5":"101010101",
"6":"11101010101",
"7":"1110111010101",
"8":"111011101110101",
"9":"11101110111011101",
"0":"1110111011101110111",
".":"10111010111010111",
",":"1110111010101110111",
"?":"101011101110101",
"!":"1110101110101110111",
"-":"111010101010111",
"/":"1110101011101",
"@":"10111011101011101",
"(":"111010111011101",
")":"1110101110111010111",
" ":"0"
}
function morse(){
var morse_str=conv(document.getElementById("inp").value)
play_sound(morse_str)
}
function conv(word_str){
var strs = word_str.toLowerCase().split('');
var rtn ="";
for(var i =0;i<=strs.length-1;i++){
if(dict[strs[i]]===undefined){
}else{
rtn+=dict[strs[i]]+"000";
}
}
return rtn;
}
function play_sound(morse){
var mstrs=morse.split('');
var mesEle=document.getElementById("mes");
mesEle.value="";
var timer=setInterval(function(){
audio.currentTime = 0;
if(mstrs.length<=0){
audio.pause();
clearInterval(timer);
return;
}
var onoff=mstrs.shift();
if(onoff=="0"){
audio.pause();
}else{
audio.play();
}
mesEle.value=mesEle.value+onoff;
},100)
}
</Script>
</HEAD>
<BODY onLoad="">
<h1>モールス信号変換</h1>
入力値:<input type="text" id="inp" value="SOS" size="35"><input type="button" value="変換" onclick="morse()"><br>
↓</br>
<textarea id="mes" rows="4" cols="40" wrap="soft"></textarea><br>
</BODY>
</HTML>
解説
100行中の49行くらいが変換テーブルです。
仕組みは非常に簡単。
まずconv()
で文字列を1文字ずつ1と0に変換しています。
1は音を鳴らす、0は鳴らさない、文字と文字の間には0が3つ。
そしてplay_sound()
で実際に音を鳴らします。
あらかじめ用意したwavファイルを再生して、0か1かに応じて0.1秒毎に止めたり鳴らしたりしています。
そう、これだけ。
まとめ
応用すれば音響カプラ通信も実現できそうですね。
無人島で助けを呼ぶ際にはそちらも検討してみます。