LoginSignup
17
18

More than 5 years have passed since last update.

Javascriptで文字列をモールス信号に変換してネットの海で助けを求める

Posted at

トントントンツーツーツートントントン・・・

届いているでしょうか?

「無人島にひとつだけ持っていくとしたら?」
と聞かれて
「ノートパソコン」
とうっかり答えてしまった時の為に、
Javascriptで文字列をモールス信号に変換するプログラムを作ってみました。

これです。

モールス信号変換
http://xiidec.appspot.com/morse.html

ss.png

上のテキストボックスに変換したい文字列(英数字)を入力すると、
0と1に変換してピーピー音がなります。

モールス信号はどうやってお話しするの?

短い「ピッ」と長い「ピー」の組み合わせで言葉を作るあれです。
「ピッ」「ピー」を「トン」「ツー」に言い換えるとなんか玄人っぽいですね。

モールス信号の代表例がこの

・・・ーーー・・・

「SOS」。
「S」が「・・・」で「O」が「ーーー」。
ピンクレディの『SOS』という曲のイントロにはモールス信号の
SOSが入っているのでラジオで放送できなかった…というエピソードは有名ですね。

具体的なルールはWikipediaを参考にしましょう。

国際モールス符号は短点(・)と長点(-)を組み合わせて、アルファベット・数字・記号を表現する。
長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。
また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。

なるほど。
非常にシンプルですね。

プログラム

Javascriptで実装してみるとこんな感じになります。
解説は後ろのほうで。

morse.html
<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秒毎に止めたり鳴らしたりしています。

そう、これだけ。

まとめ

応用すれば音響カプラ通信も実現できそうですね。
無人島で助けを呼ぶ際にはそちらも検討してみます。

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18