2021/08/25

モールス信号の練習ツールを作成しました

javascript

概要

ドローンの開発を少しずつ進めているのですが、ドローンで使う通信に無線を多用するので、アマチュア無線の資格を取ることにしました。

資格にモールス信号の理解が必要なため、その学習も兼ねて練習ツールを作成することにしました。

Javascriptを使って、モールス信号を打つと、文字に変換して表示できるものを作ってみました。

できたものはこちらになります。

今回はその開発内容のメモになります。

Beep音の発生

const ctx = new (window.AudioContext || window.webkitAudioContext)()
const osc = ctx.createOscillator()
osc.type = 'square'
osc.connect(ctx.destination)
// 音の発生
osc.start()

// 音の停止
osc.stop()

注意点

  • モバイルではマナーモードになっていると音が出ませんでした。

モールス信号のデコード

  • 欧文と和文をサポートできるようにしました。

以下のような感じになりました。

const dictionaryEn = {
  A: '・-',
  B: '-・・・',
  C: '-・-・',
  D: '-・・',
  E: '・',
  F: '・・-・',
  G: '--・',
  H: '・・・・',
  I: '・・',
  J: '・---',
  K: '-・-',
  L: '・-・・',
  M: '--',
  N: '-・',
  O: '---',
  P: '・--・',
  Q: '--・-',
  R: '・-・',
  S: '・・・',
  T: '-',
  U: '・・-',
  V: '・・・-',
  W: '・--',
  X: '-・・-',
  Y: '-・--',
  Z: '--・・',
  1: '・----',
  2: '・・---',
  3: '・・・--',
  4: '・・・・-',
  5: '・・・・・',
  6: '-・・・・',
  7: '--・・・',
  8: '---・・',
  9: '----・',
  0: '-----',
  '.': '・-・-・-',
  ',': '--・・--',
  ':': '---・・・',
  '?': '・・--・・',
  _: '・・--・-',
  '+': '・-・-・',
  '-': '-・・・・-',
  '*': '-・・-',
  '^': '・・・・・・',
  '/': '-・・-・',
  '@': '・--・-・',
  '(': '-・--・',
  ')': '-・--・-',
  '"': '・-・・-・',
  "'": '・----・',
  '=': '-・・・-',
  delete: '・・・・・・・・',
}
const dictionaryJa = {
  イ: '・-',
  ロ: '・-・-',
  ハ: '-・・・',
  ニ: '-・-・',
  ホ: '-・・',
  ヘ: '・',
  ト: '・・-・・',
  チ: '・・-・',
  リ: '--・',
  ヌ: '・・・・',
  ル: '-・--・',
  ヲ: '・---',
  ワ: '-・-',
  カ: '・-・・',
  ヨ: '--',
  タ: '-・',
  レ: '---',
  ソ: '---・',
  ツ: '・--・',
  ネ: '--・-',
  ナ: '・-・',
  ラ: '・・・',
  ム: '-',
  ウ: '・・-',
  ヰ: '・-・・-',
  ノ: '・・--',
  オ: '・-・・・',
  ク: '・・・-',
  ヤ: '・--',
  マ: '-・・-',
  ケ: '-・--',
  フ: '--・・',
  コ: '----',
  エ: '-・---',
  テ: '・-・--',
  ア: '--・--',
  サ: '-・-・-',
  キ: '-・-・・',
  ユ: '-・・--',
  メ: '-・・・-',
  ミ: '・・-・-',
  シ: '--・-・',
  ヱ: '・--・・',
  ヒ: '--・・-',
  モ: '-・・-・',
  セ: '・---・',
  ス: '---・-',
  ン: '・-・-・',
  '゛': '・・',
  '゜': '・・--・',
  ー: '・--・-',
  '、': '・-・-・-',
  '」': '・-・-・・',
  '(': '-・--・-',
  ')': '・-・・-・',
  delete: '・・・-・',
}
const dictionary = {
  en: dictionaryEn,
  ja: dictionaryJa,
}
class Morse {
  constructor(lang) {
    this._lang = lang
  }

  get lang() {
    return this._lang
  }

  set lang(lang) {
    this._lang = lang
  }

  get dictionary() {
    return dictionary[this.lang]
  }

  decode(sequence) {
    const dict = this.dictionary
    for (const [key, value] of Object.entries(dict)) {
      if (value === sequence) {
        return key
      }
    }
    return undefined
  }
}
const morse = new Morse('en')
const sequence = '・-'
const char = morse.decode(sequence)
console.log(char)
// A

上記を組み合わせてツールを開発しました。

以上です。