見出し画像

コピペするだけ!簡単「モールス信号」

月曜日のダメージが抜けきらない火曜日。

心の声は、日本語で伝えずひそかにモールス信号を送る。

これで心の安寧を保ちつつ、上司に目を付けられることも防ぐ。

完璧な作戦です!

(ぴーぴーうるさいと、別の意味では目を付けられてしまいますのでご注意ください)

おやすみがほしい

読ませて頂いた記事をマガジンに追加させて頂いております。

伺った際にはマガジンへの登録をさせて頂いていきますが、それはやめてほしいなどありましたら、DM / コメントで一言頂けましたら幸いです😊


ブックマークに置いとくだけ!

コピペするだけの簡単小道具!

Geminiで簡単!ツール作成!

一発作成プロンプトも紹介!


みなさんはモールス信号をご存知でしょうか。
私は名前だけしか知らず、中身はさっぱりです!

無線に詳しい方と話をしていると、モールス信号にするとこうだ!って伺うことが多いですが、ちゃんと勉強しないとさっぱりです。
わかるとカッコイイと思うのですが、覚えている時間がない!

そこで、Geminiさんにモールス信号への変換機を作ってもらいまいた。


変換したいテキストを入力すると!

ーと・で信号をあらわしたテキストを表示!

さらにモールス信号を音にして発信!


Geminiさんに聞く!モールス信号豆知識!

知識がないのでAIに聞いた内容をまるっとコピペです。
簡単に質問してみただけだったのですが、これがかなり面白かったので、そのままお届けします!


1. 「SOS」は略語ではない

最も有名な誤解です。

SOSは「Save Our Ship」や「Save Our Souls」の略ではありません。

単に

・・・
---
・・・

という、とても覚えやすく聞き取りやすい信号として国際的に採用されました。

後から覚えやすいように様々な言葉が当てられただけです。


2. 「・」と「-」の長さには厳密なルールがある

長さは適当ではありません。

  • ・(短点) = 1単位

  • -(長点) = 3単位

  • 同じ文字内の間 = 1単位

  • 文字と文字の間 = 3単位

  • 単語と単語の間 = 7単位

今回のブックマークレットも、この規則にほぼ沿っています。


3. 一番よく使う文字ほど短い

例えば英語では

文字モールスE・T-A・-I・・

逆に

Q
Y
Z

などは長めです。

これは文字の出現頻度を考慮した設計で、現在のデータ圧縮やハフマン符号と似た発想です。


4. 和文モールスは欧文とは別物

日本語はアルファベットではなく、

いろは順

で割り当てられています。

例えば

イ
ロ
ハ
ニ
ホ
ヘ
ト

の順です。

そのため、

A = ・-

ですが、

イ = ・-

でもあります。

同じ符号でもモード(欧文・和文)が違うだけです。


5. 和文モールスでは濁点も送る

例えば

を送り、

続けて

を送ります。

つまり

ガ = カ + ゛

です。

あなたのコード(注:本日のコピペするだけブックマークレットのことです)もこの方式を採用しています。


6. 昔は耳だけで高速に聞き分けていた

熟練した通信士は、

・--・・・

のように一つ一つ数えるのではなく、

リズムとして聞いていました。

これは音楽を聴く感覚に近いと言われます。


7. 最速では人間同士でもかなり速い

初心者

5~10 WPM(Words Per Minute)

上級者

20~30 WPM

コンテスト参加者やプロになると

40~50 WPM以上

で送受信できます。

50WPMになると、人によっては普通の会話より速く感じるほどです。


8. 光でも送れる

音だけではありません。

例えば

  • 懐中電灯

  • 車のライト

  • 鏡の反射

  • レーザー

でも送れます。

戦時中や遭難時にも使われました。


9. 「CQ」は今でも使われる

アマチュア無線では

CQ CQ CQ

という信号がよく聞かれます。

これは

「どなたでも応答してください」

という意味です。

ちなみに

CQ

は略語ではなく、昔の電信用語が由来です。


10. タイタニック号もモールス信号を送った

タイタニック号 の遭難(1912年)では、無線士がモールス信号で救難通信を送り続けました。

当時は新しい救難信号 SOS が導入されたばかりだったため、

CQD

(旧方式)

SOS

の両方が送信されたことで知られています。

自分の名前や好きな言葉をモールスで送ってみると、リズムの違いが感じられて面白いですよ。


🛠️ 使い方(スマホ版)

1. 適当なページをブックマークする

まずは、今見ているこのページなど、何でもいいので一度ブックマークに登録します。

2. 「編集」を開く

ブックマークバーにある今作ったブックマークを長押しして、「編集」を選択します。

3. 内容を書き換える

表示された設定画面で、以下の2箇所を変更して保存します。

  • 名前: (自分が分かりやすい名前)

  • URL: もともと入っているURLをすべて消して、コードを貼り付ける

ブックマークを押すだけ簡単!


📋これを貼ります!

javascript:void((function(){  var codeMap = {    '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': '-----',    'イ': '・-', 'ロ': '・-・-', 'ハ': '-・・・', 'ニ': '-・-・', 'ホ': '-・・',    'ヘ': '・', 'ト': '・・-・・', 'チ': '・・-・', 'リ': '--・', 'ヌ': '・・・・',    'ル': '-・-・-', 'ヲ': '・---', 'ワ': '-・-', 'カ': '・-・・', 'ヨ': '--',    'タ': '-・', 'レ': '---', 'ソ': '---・', 'ツ': '・--・', 'ネ': '--・-',    'ナ': '・-・', 'ラ': '・・・', 'ム': '-', 'ウ': '・・-', 'ヰ': '・-・・-',    'ノ': '・・--', 'オ': '・-・・・', 'ク': '・・・-', 'ヤ': '・--', 'マ': '-・・-',    'ケ': '-・--', 'フ': '--・・', 'コ': '----', 'エ': '-・---', 'テ': '・-・--',    'ア': '--・--', 'サ': '-・-・-', 'キ': '-・-・・', 'ユ': '-・・--', 'メ': '-・・・-',    'ミ': '・・-・-', 'シ': '--・-・', 'ヱ': '・--・・', 'ヒ': '--・・-', 'モ': '-・・-・',    'セ': '・--・-', 'ス': '---・-', 'ン': '・-・-・', 'ー': '・--・-',    '゛': '・・', '゜': '・・-・・'  };  var dMap = {    'ガ':'カ゛','ギ':'キ゛','グ':'ク゛','ゲ':'ケ゛','ゴ':'コ゛',    'ザ':'サ゛','ジ':'シ゛','ズ':'ス゛','ゼ':'セ゛','ゾ':'ソ゛',    'ダ':'タ゛','ヂ':'チ゛','ヅ':'ツ゛','デ':'テ゛','ド':'ト゛',    'バ':'ハ゛','ビ':'ヒ゛','ブ':'フ゛','ベ':'ヘ゛','ボ':'ホ゛',    'パ':'ハ゜','ピ':'ヒ゜','プ':'フ゜','ペ':'ヘ゜','ポ':'ホ゜',    'ヴ':'ウ゛'  };  var smallToLarge = {    'ァ':'ア','ィ':'イ','ゥ':'ウ','ェ':'エ','ォ':'オ',    'ッ':'ツ','ャ':'ヤ','ュ':'ユ','ョ':'ヨ','ヮ':'ワ',    'ぁ':'ア','ぃ':'イ','ぅ':'ウ','ぇ':'エ','ぉ':'オ',    'っ':'ツ','ゃ':'ヤ','ゅ':'ユ','ょ':'ヨ','ゎ':'ワ',    'ヵ':'カ','ヶ':'ケ'  };  function decomposeKatakana(str) {    var result = '';    for (var i = 0; i < str.length; i++) {      var c = str.charAt(i);      if (dMap[c]) {        result += dMap[c];      } else {        result += c;      }    }    return result;  }  var text = prompt("モールス信号に変換する文章を入力してください\n(例: SOS, サクラ, メール, キャット)", "SOS");  if (!text) return;  text = text.replace(/[\u3041-\u3096]/g, function(ch) {    return String.fromCharCode(ch.charCodeAt(0) + 0x60);  });  text = text.replace(/[ァィゥェォッャュョヮぁぃぅぇぉっゃゅょゎヵヶ]/g, function(ch) {    return smallToLarge[ch] || ch;  });  text = text.replace(/[A-Za-z0-9]/g, function(s) {    return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);  }).toUpperCase();  var normalizedText = decomposeKatakana(text);  var morseTokens = [];  var displayTokens = [];  for (var j = 0; j < normalizedText.length; j++) {    var char = normalizedText.charAt(j);    if (/\s/.test(char) || char === ' ') {      if (morseTokens.length > 0 && morseTokens[morseTokens.length - 1] !== ' ') {        morseTokens.push(' ');        displayTokens.push('/');      }      continue;    }    if (codeMap[char]) {      morseTokens.push(codeMap[char]);      displayTokens.push(codeMap[char]);    }  }  while (morseTokens.length > 0 && morseTokens[morseTokens.length - 1] === ' ') {    morseTokens.pop();    displayTokens.pop();  }  if (morseTokens.length === 0) return;  var displayText = displayTokens.join('   ');  var startPlay = confirm("【モールス信号変換結果】\n\n" + displayText + "\n\n【OK】を押すと、音声(ピ・ピー)でモールス信号を再生します!");  if (!startPlay) return;  var AudioCtx = window.AudioContext || window.webkitAudioContext;  if (!AudioCtx) return;  var ctx = new AudioCtx();  var dt = 0.06;  var dotDuration = dt;  var dashDuration = dt * 3;  var intraSymbolGap = dt;  var interCharGap = dt * 3;  var interWordGap = dt * 7;  var rampTime = 0.003;  var currentTime = ctx.currentTime + 0.1;  for (var m = 0; m < morseTokens.length; m++) {    var token = morseTokens[m];    if (token === ' ') {      currentTime += interWordGap - interCharGap;      continue;    }    for (var n = 0; n < token.length; n++) {      var symbol = token.charAt(n);      var duration = (symbol === '・') ? dotDuration : dashDuration;      var osc = ctx.createOscillator();      var gain = ctx.createGain();      osc.type = %27sine%27;      osc.frequency.setValueAtTime(800, currentTime);      gain.gain.setValueAtTime(0, currentTime);      gain.gain.linearRampToValueAtTime(1, currentTime + rampTime);      gain.gain.setValueAtTime(1, currentTime + duration - rampTime);      gain.gain.linearRampToValueAtTime(0, currentTime + duration);      osc.connect(gain);      gain.connect(ctx.destination);      osc.start(currentTime);      osc.stop(currentTime + duration);      currentTime += duration;      if (n < token.length - 1) {        currentTime += intraSymbolGap;      }    }    if (m < morseTokens.length - 1 && morseTokens[m + 1] !== %27 %27) {      currentTime += interCharGap;    }  }  var totalTimeMs = (currentTime - ctx.currentTime) * 1000;  setTimeout(function() {    alert("📡 モールス信号の送信が完了しました!");    if (ctx.state !== %27closed%27) {      ctx.close();    }  }, totalTimeMs);})());

一発作成プロンプト!

入力されたテキスト(日本語ひらがな・カタカナ・アルファベット英数字)を、正しく国際規格(欧文)・総務省無線規格(和文)のモールス信号(・と-)に変換し、Web Audio APIを用いて正しい音響テンポ(クリックノイズ対策済み)で再生する「本物モールス信号アドバイザー」ブックマークレットを作成してください。

一時保存や外部通信、DOM操作は禁止とし、完全なES5構文(var、functionのみ)で構成してください。

【動作仕様および入力フロー】
1. **テキスト入力**: prompt("モールス信号に変換する文章を入力してください\n(例: SOS, サクラ, メール, キャット)", "SOS") を実行。未入力・キャンセルの場合は即終了。

2. **前処理・正規化(小文字カナ・スペース・濁点分解)**:
   - 設定用オブジェクト(codeMap, dMap, smallToLarge)はトップレベルで一括定義し、毎回の生成を防止。
   - 全角スペース(' ')および半角スペース・改行等の空白(/\s/.test(char) || char === ' ')を単語区切り(7単位無音)として確実に判定。
   - 小文字カナ(ァィゥェォッャュョ等)は、自動的に大文字カナ(アイウエオツヤユヨ等)へ正規化。
   - ひらがなは全角カタカナへ自動変換。英小文字は英大文字へ自動変換。
   - 濁点付き文字(ガ, ギ等)は「カ+゛」、半濁点付き文字(パ, ピ等)は「ハ+゜」のように独立した文字と符号に自動分解。

3. **モールス信号マッピング(公的無線規格・総務省令に完全準拠&全角記号統一)**:
   - 記号はすべて全角中黒「・」と全角ダッシュ「-」に完全統一(ASCIIハイフン `-` の混在を厳禁)。
   - 長音記号「ー」に対応: 'ー': '・--・-'
   - 正式な和文モールス規格(無線設備規則別表第1号準拠)を絶対厳守(重複・誤りの完全排除):
     ・ 'ン': '・-・-・' (※トン・ツー・トン・ツー・トン)
     ・ 'セ': '・--・-' (※トン・ツー・ツー・トン・ツー)
     ・ 'ソ': '---・' (※ツー・ツー・ツー・トン)
     ・ 'ス': '---・-'
     ・ 濁点「゛」(・・) / 半濁点「゜」(・・-・・)

4. **結果表示・末尾整形と音響再生確認**:
   - 変換後の記号配列末尾に残った余分な空白・区切り(/ または 空白)は `.pop()` 等で綺麗に削除トリム。
   - confirm("【モールス信号変換結果】\n\n" + 変換文字列 + "\n\n【OK】を押すと、音声(ピ・ピー)でモールス信号を再生します!") を表示。

5. **Web Audio APIによる正確な音響再生(ITU規格&ノイズ対策)**:
   - 音響テンポ基準(基準単位 dt = 0.06秒):
     ・ 短点(・): 1単位 (0.06秒)
     ・ 長点(-): 3単位 (0.18秒)
     ・ 符号内の無音: 1単位 (0.06秒)
     ・ 文字間の無音: 3単位 (0.18秒)
     ・ 単語間の無音: 7単位 (0.42秒)
   - **クリックノイズ対策(エンベロープ処理)**:
     音の開始・終了時に GainNode の Gain 値を 0.003秒かけてフェードイン/フェードアウト(linearRampToValueAtTime)させ、スピーカーの「パチッ」というクリックノイズを完全に防止。
   - 再生完了後には `ctx.close()` でリソースを正しく解放。

6. **完了通知**:
   - 全音の再生が終わるタイミングに合わせて alert("📡 モールス信号の送信が完了しました!") を出力。

【出力形式(絶対厳守)】
- 解説テキストや前置き文は一切出力しないでください。
- 構文エラー(\u00A0等の特殊空白混入)を防ぐため、インデントやスペースにノーブレークスペースを含めず、標準の半角スペース(\u0020)のみを使用してください。
- 全体を `javascript:void((function(){ ... })());` のラッパー構造で記述し、可読性を保った改行ありの単一コードブロックのみを出力してください。

この記事について!

今更ながら、Gemini 3分クッキング記事について注意点など|へろん


PR記事を書かせて頂いています!


何でもどうぞ!答えられるものは全て答えます!

設置はお済みですか?図らずも人の庭でnote質問箱を試す!|へろん


メンバーシップ始めました!

まだ手探りですが、ご要望/無茶振り/質問、可能な限りお受けします!


参加させて頂いています!是非チェックしてみてください😆


有料ツールに挑戦中!

OBS Studio用リモコン | OBS画面を前面に出さずに操作できます!


小道具すべて、こちらに置きました!


☕ お時間あればこちらも是非!


気に入ったらスキ、フォローよろしくお願いします!
note外から見にきてくださったかたも、もしよければハートマーク押して頂けたら励みになります😊


いいなと思ったら応援しよう!

へろん いつも応援ありがとうございます! 快適な制作を進めるためのおやつ活動費に使わせて頂きます!