<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Morse Zone</title>
    <description>The latest articles on DEV Community by Morse Zone (@morsezone).</description>
    <link>https://dev.to/morsezone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4185974%2F03f5d557-1924-47a0-b704-dc133417218b.png</url>
      <title>DEV Community: Morse Zone</title>
      <link>https://dev.to/morsezone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/morsezone"/>
    <language>en</language>
    <item>
      <title>Decode Morse Code Audio in Python: From Waveform to Text</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Mon, 02 Nov 2026 06:31:36 +0000</pubDate>
      <link>https://dev.to/morsezone/decode-morse-code-audio-in-python-from-waveform-to-text-fod</link>
      <guid>https://dev.to/morsezone/decode-morse-code-audio-in-python-from-waveform-to-text-fod</guid>
      <description>&lt;h1&gt;
  
  
  Decode Morse Code Audio in Python: From Waveform to Text
&lt;/h1&gt;

&lt;p&gt;Morse code is, at its heart, a timing problem. A dot is one unit of tone, a dash is three, and the silences between them carry just as much meaning as the sounds. That makes it a perfect starter project for digital signal processing: you can go from a raw WAV file to readable text in under a hundred lines of Python, and every step teaches a concept that shows up again in real-world audio work.&lt;/p&gt;

&lt;p&gt;In this tutorial we will build a complete Morse audio decoder: generate a test signal, extract its envelope, slice it into marks and spaces, classify each slice by duration, and decode the result into text. The only dependency is NumPy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Morse timing actually works
&lt;/h2&gt;

&lt;p&gt;Everything in Morse is measured in multiples of one base unit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dot (dit):&lt;/strong&gt; 1 unit of tone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dash (dah):&lt;/strong&gt; 3 units of tone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap inside a letter:&lt;/strong&gt; 1 unit of silence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap between letters:&lt;/strong&gt; 3 units of silence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gap between words:&lt;/strong&gt; 7 units of silence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So decoding audio is really a classification task: measure how long each burst of tone lasts, measure how long each silence lasts, and map those durations back to symbols. If you can measure time accurately, you can decode Morse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Build a test signal
&lt;/h2&gt;

&lt;p&gt;Before decoding real audio, generate a known-good test signal. That way you can verify the decoder against ground truth. First, the code table and a text-to-signal function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;MORSE_CODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-.-.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-..&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;E&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;..-.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;F&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;G&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;....&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;H&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;..&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.---&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;J&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-.-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;K&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.-..&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;L&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;M&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;N&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.--.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;P&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--.-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.-.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;R&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;S&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;T&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;..-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;U&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;...-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;V&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.--&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;W&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-..-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;X&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-.--&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--..&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Z&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-----&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.----&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;..---&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;...--&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;....-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.....&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-....&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;7&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;---..&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;----.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;TEXT_TO_MORSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;MORSE_CODE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;text_to_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;700.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;44100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Render TEXT as a Morse tone signal (NumPy array).&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;silence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;dur&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;wi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TEXT_TO_MORSE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;si&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;silence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# intra-letter gap
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;li&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;silence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;       &lt;span class="c1"&gt;# letter gap
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;wi&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;silence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;           &lt;span class="c1"&gt;# word gap
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;text_to_signal("SOS")&lt;/code&gt; gives you a clean 700 Hz tone spelling &lt;code&gt;... --- ...&lt;/code&gt; — your ground truth for testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Envelope detection
&lt;/h2&gt;

&lt;p&gt;Real (and generated) Morse audio is an oscillating tone. We do not care about the oscillation — we care about &lt;em&gt;when the tone is on&lt;/em&gt;. The standard trick is envelope detection: rectify the signal (take the absolute value) and smooth it with a moving average. The result is high where tone is present and near zero during silences.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;envelope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;smooth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rectified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;smooth&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 10 ms smoothing window
&lt;/span&gt;    &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rectified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;same&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 10 ms window is a good default: much shorter than a dot (80 ms at our test speed) so it does not smear symbols together, but long enough to flatten the 700 Hz ripple.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Thresholding and run-length encoding
&lt;/h2&gt;

&lt;p&gt;Pick a threshold — say 25% of the envelope's peak — and turn the envelope into a boolean mask: tone on, or tone off. Then compress the mask into runs of consecutive on/off samples. This is run-length encoding, and it converts ~100,000 samples into a few dozen (start, end) pairs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_runs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Yield (start, end) index pairs for each True run in a boolean mask.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatnonzero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;slice_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;envelope&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;
    &lt;span class="n"&gt;marks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;find_runs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="c1"&gt;# Spaces are the gaps *between* marks: invert the mask and
&lt;/span&gt;    &lt;span class="c1"&gt;# drop the leading/trailing silence.
&lt;/span&gt;    &lt;span class="n"&gt;off_runs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find_runs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;interior&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;off_runs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;off_runs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;interior&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Classify by duration and decode
&lt;/h2&gt;

&lt;p&gt;Now the timing table does the work. Estimate the base unit from the shortest mark (almost every real message contains at least one dot), then round each duration to the nearest multiple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;slice_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# shortest mark = one dot
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nearest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;nearest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nearest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;MORSE_CODE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;MORSE_CODE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
                &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;MORSE_CODE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Putting it together
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;44100&lt;/span&gt;
    &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;text_to_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SOS MORSE&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sample_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Add a little noise to prove the point:
&lt;/span&gt;    &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;decode_signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# -&amp;gt; SOS MORSE
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it and you get &lt;code&gt;SOS MORSE&lt;/code&gt; back — the full round trip from text, to waveform, to text again. Try changing the unit to simulate different sending speeds, or raise the noise floor to find where the fixed 25% threshold starts to break. (Spoiler: adaptive thresholds and median-based unit estimation are the natural next steps.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Making it robust for real audio
&lt;/h2&gt;

&lt;p&gt;The toy version above assumes clean audio and a known-ish speed. Real recordings need a few upgrades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unknown speed:&lt;/strong&gt; estimate the unit from a histogram of mark durations instead of a single minimum — the two clear clusters (dots vs dashes) reveal it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise:&lt;/strong&gt; a fixed fraction-of-peak threshold fails when background hum is loud. Use a noise-floor estimate from the quietest 10% of the envelope instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fading signals:&lt;/strong&gt; ham radio signals fade in and out. Normalise the envelope in sliding windows rather than globally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human sending:&lt;/strong&gt; hand-sent Morse has wobbly timing. Widen the classification tolerance and prefer the &lt;em&gt;ratio&lt;/em&gt; between consecutive marks over absolute durations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is a small, satisfying change — and each one mirrors a technique used in production audio pipelines, from voice activity detection to music onset detection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on real Morse audio
&lt;/h2&gt;

&lt;p&gt;Once your decoder works on generated signals, feed it the real thing: record the audio playback from an &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;online Morse code translator&lt;/a&gt; spelling your name, load the WAV with &lt;code&gt;scipy.io.wavfile&lt;/code&gt; or the &lt;code&gt;soundfile&lt;/code&gt; package, and decode it. Hearing your own name come back out of a waveform you sliced up yourself is the moment the DSP concepts click.&lt;/p&gt;

&lt;p&gt;Morse code survived 180 years because it is beautifully efficient — the most common letters got the shortest codes, a Huffman-style optimisation decades before Huffman. Decoding it in Python takes an afternoon and teaches envelope detection, thresholding, and run-length encoding along the way. Not bad for a 19th-century protocol.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Morse Zone (&lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;morsezone.com&lt;/a&gt;) is a free online Morse code translator with audio playback, timing visualisations, and learning tools — handy for generating test signals for projects like this one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>morsecode</category>
      <category>tutorial</category>
      <category>dsp</category>
    </item>
    <item>
      <title>Morse Code for Hikers: 5 Trail Signals That Could Save Your Life</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Mon, 02 Nov 2026 04:34:41 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-for-hikers-5-trail-signals-that-could-save-your-life-7mb</link>
      <guid>https://dev.to/morsezone/morse-code-for-hikers-5-trail-signals-that-could-save-your-life-7mb</guid>
      <description>&lt;p&gt;There is a particular silence that falls when your phone drops to zero bars halfway up a ridge. The map app spins, the signal bars vanish, and you are left with the oldest navigation tools of all: your eyes, your ears, and whatever you are carrying. That is exactly where Morse code earns its place in a hiker's kit. It needs no battery, no mast, no subscription — just a torch, a whistle, or even two stones, and a handful of signals anyone can learn in an afternoon.&lt;/p&gt;

&lt;p&gt;You do not need to master the whole alphabet to make Morse useful on the trail. Start with these five signals. They are simple, internationally recognised, and each one has a practical job to do if things go wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. SOS — &lt;code&gt;... --- ...&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The universal distress call is three dots, three dashes, three dots, sent as one continuous group. It has meant "I need help" since 1908, and rescue teams worldwide still recognise it instantly — flashed with a headtorch, blasted on a whistle, tapped on a rock, or even trampled as lines in snow.&lt;/p&gt;

&lt;p&gt;The key detail beginners get wrong is rhythm. Dots should be short and dashes about three times longer, with a clear pause between each group of three. Rushed, uneven flashing just looks like a faulty torch. Slow, deliberate, repeated SOS is unmistakable. Practise it at home with a torch against a wall until the pattern feels automatic — in a real emergency your hands will be shaking, and muscle memory does the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The rule of three
&lt;/h2&gt;

&lt;p&gt;If SOS feels like too much to remember under stress, remember this instead: &lt;strong&gt;three of anything means distress&lt;/strong&gt;. Three whistle blasts, three torch flashes, three fires in a triangle, three bright objects laid out in a row — in the wilderness, repetitions of three are the universal sign that someone needs help.&lt;/p&gt;

&lt;p&gt;The convention is three signals per minute, then a minute of silence, then repeat. That pause matters: it gives rescuers a chance to spot you and respond, and it conserves your energy and your whistle. A single flash could be anything. Three, evenly spaced, is a message.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "R" — &lt;code&gt;.-.&lt;/code&gt; — "Received"
&lt;/h2&gt;

&lt;p&gt;Distress signalling is only half the job; the other half is knowing you have been heard. The Morse letter R (dot-dash-dot) is the traditional acknowledgement: it means "received" or "understood".&lt;/p&gt;

&lt;p&gt;Imagine a helicopter sweeping the valley below you. You flash SOS; the aircraft banks toward you and flashes its landing light back. If you answer with R, you have just told the crew "message received — I see you", which stops them wasting time re-sweeping your area and starts the rescue moving. One tiny letter, enormous practical value.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. "K" — &lt;code&gt;-.-&lt;/code&gt; — "Go ahead"
&lt;/h2&gt;

&lt;p&gt;K means "go ahead" or "over to you" — an invitation for the other party to send their message. You will rarely need it with professional rescuers, but it is surprisingly useful between hiking partners.&lt;/p&gt;

&lt;p&gt;Picture this: your group has split across a wide gully, shouting distance but barely. One headtorch flashes a question; the other answers K — "go ahead, I'm listening". Now you have a two-person signalling link: one side sends, the other acknowledges with R. Clumsy at first, but with a little rehearsal it beats shouting yourself hoarse into the wind.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. "AR" — &lt;code&gt;.-.-.&lt;/code&gt; — End of message
&lt;/h2&gt;

&lt;p&gt;AR (di-dah-di-dah-dit) is the full stop of radio procedure: "end of message". Use it after your SOS or after any sequence you have flashed, so whoever is watching knows the message is complete and they should respond rather than keep waiting for more.&lt;/p&gt;

&lt;p&gt;It also stops the most common beginner mistake: trailing off. People flash SOS once, stop, and assume help is coming. Signal, then AR, then wait a full minute watching for a reply, then repeat the whole cycle. A complete, repeated message is far easier for a tired rescuer to pick out than a single half-remembered burst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making your signals readable
&lt;/h2&gt;

&lt;p&gt;Five signals are useless if nobody can read them, so timing is everything. The standard recipe is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;dash&lt;/strong&gt; lasts about three times as long as a &lt;strong&gt;dot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The gap between dots and dashes inside one letter is one dot-length&lt;/li&gt;
&lt;li&gt;The gap between letters is about three dot-lengths&lt;/li&gt;
&lt;li&gt;The gap between words or groups is about seven dot-lengths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds fussy, but in practice it just means: keep it slow and even. Beginners almost always signal too fast. If it feels painfully slow, you are probably doing it right.&lt;/p&gt;

&lt;p&gt;At night, a torch works best aimed at the rescuers or at low cloud, which reflects the beam. By day, a signal mirror can be seen for kilometres — flash the mirror's glint in the same dot-dash rhythm. And a whistle carries far further than a shout while using a fraction of the energy; six blasts a minute is the classic mountain distress pattern in the UK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practise before you need it
&lt;/h2&gt;

&lt;p&gt;Nobody learns Morse for the first time during an emergency. The good news is that ten minutes a day for a week is enough to lock in these five signals. Type any phrase into a &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;free Morse code translator&lt;/a&gt; and listen to the audio playback — hearing the rhythm is what cements it, far more than staring at dots on a screen. Then check yourself against a &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; and try sending the patterns with a torch, a whistle, or even tapping on the table.&lt;/p&gt;

&lt;p&gt;Make it a game on your next group walk: one person "transmits" a signal from behind a rise, the others decode it. You will be amazed how quickly SOS, R, K and AR become second nature — and how much fun the learning is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to pack
&lt;/h2&gt;

&lt;p&gt;None of this requires specialist gear. A &lt;strong&gt;whistle&lt;/strong&gt; (pea-less, so it cannot freeze), a &lt;strong&gt;headtorch&lt;/strong&gt; with a strobe or flash mode, and a small &lt;strong&gt;signal mirror&lt;/strong&gt; weigh almost nothing and live happily in a hip-belt pocket. Add the five signals in your head, and you are carrying a communication system that works when every modern one has failed.&lt;/p&gt;

&lt;p&gt;Morse code is nearly two centuries old, yet on a dark mountainside it is still one of the most reliable technologies you own. Learn five signals, practise them until they are boring, and hope you never need them — but know that if you do, three dots, three dashes and three dots might be the most important thing you ever flash.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Signal and Noise: Why Morse Code Still Works When Voice Radio Fails</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sun, 01 Nov 2026 04:31:44 +0000</pubDate>
      <link>https://dev.to/morsezone/signal-and-noise-why-morse-code-still-works-when-voice-radio-fails-3ge3</link>
      <guid>https://dev.to/morsezone/signal-and-noise-why-morse-code-still-works-when-voice-radio-fails-3ge3</guid>
      <description>&lt;p&gt;When storms knock out infrastructure or a hiker is lost beyond mobile coverage, radio amateurs and emergency teams still reach for a code invented in the 1840s. Morse code, sent as simple on-off keying of a radio carrier (known as continuous wave, or CW), keeps working in conditions where voice transmissions dissolve into static. The reason is not nostalgia — it is physics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narrow bandwidth, strong signal
&lt;/h2&gt;

&lt;p&gt;A single-sideband voice signal occupies roughly 2,400 Hz of spectrum. A CW Morse signal occupies only 100–150 Hz. All of the transmitter's power is concentrated into that narrow slice, so the power density is far higher. For the same transmitter power, a Morse signal can be 10–20 dB stronger at the receiver than a voice signal — the difference between a readable message and nothing at all.&lt;/p&gt;

&lt;p&gt;This is where signal-to-noise ratio (SNR) decides everything. Voice needs a positive SNR to be intelligible; the ear must distinguish formants and consonants. Morse only needs the operator to detect the presence or absence of a tone. Skilled operators copy CW at negative SNR, pulling signals out of noise that would render speech completely unintelligible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the brain beats the codec
&lt;/h2&gt;

&lt;p&gt;Digital voice modes rely on codecs that fail abruptly: below a threshold, the audio drops out entirely. Morse degrades gracefully. A missed dot here or there still leaves a recognisable word, because the operator's brain does error correction in real time, using context, standard abbreviations and procedural words. Redundancy is built into the rhythm of the exchange itself — callsigns repeated, key information sent twice.&lt;/p&gt;

&lt;p&gt;That graceful degradation is why CW remains part of emergency communications training for amateur radio groups such as ARES and RAYNET, and why it still appears in military and maritime contexts. When every watt counts — a handheld radio on a dying battery, a low-power field station — narrowband Morse delivers the message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple equipment, fewer failure points
&lt;/h2&gt;

&lt;p&gt;A CW transmitter can be astonishingly simple: an oscillator, a key and an antenna. There is no microphone to fail, no speech processor to misbehave, no codec to desynchronise. Receivers can be equally minimal — a direct-conversion receiver built from a handful of components can copy Morse across continents. Simplicity is reliability when it matters most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning the rhythm
&lt;/h2&gt;

&lt;p&gt;Reading Morse by ear is a skill, but the alphabet itself is quick to learn. Practising a few minutes a day builds recognition of the most common letters first — E, T, A, O and N — which carry a surprising share of ordinary text. If you want to see how your own name or a test message looks in dots and dashes, try a &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;free Morse code translator&lt;/a&gt; and play the audio back at different speeds. Training your ear at slow speeds, then gradually increasing the pace, is exactly how radio operators have learned for generations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Voice radio is convenient, but convenience is fragile. Morse code survives interference, weak signals and failing batteries because it asks so little of the channel: a tone, switched on and off, carrying meaning in its rhythm. For anyone interested in radio, emergency preparedness or the history of communication, it is worth learning — &lt;a href="https://morsezone.com/morse-code-practice/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; has free practice drills that make the first steps easy.&lt;/p&gt;

</description>
      <category>science</category>
      <category>morsecode</category>
    </item>
    <item>
      <title>How to Read Morse Code Without Memorizing the Whole Chart</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:40:13 +0000</pubDate>
      <link>https://dev.to/morsezone/how-to-read-morse-code-without-memorizing-the-whole-chart-1dd1</link>
      <guid>https://dev.to/morsezone/how-to-read-morse-code-without-memorizing-the-whole-chart-1dd1</guid>
      <description>&lt;p&gt;Staring at a wall of dots and dashes is how most people begin learning Morse code — and how most people quit. All 36 letters and numbers look equally important on the chart, so beginners try to memorise everything at once and retain almost nothing.&lt;/p&gt;

&lt;p&gt;There is a better way. Morse code was designed around patterns, and if you learn the patterns first, you can start reading real messages after learning just a handful of characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with rhythm, not letters
&lt;/h2&gt;

&lt;p&gt;Before you learn a single letter, get the rhythm into your ears. A dot (dit) lasts one unit. A dash (dah) lasts three. The gap between symbols in one letter is one unit; between letters it is three. That 1-3-3 ratio is the entire skeleton of Morse.&lt;/p&gt;

&lt;p&gt;Tap it out on your desk: &lt;em&gt;dit-dah&lt;/em&gt;. Hear the short-long shape. Almost every beginner mistake comes from mushing dots and dashes together, not from forgetting which letter is which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn the six letters that do half the work
&lt;/h2&gt;

&lt;p&gt;Six characters — E, T, A, O, N, M — account for roughly half of all letters in ordinary English text. Learn them first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;E&lt;/strong&gt; is one dot: &lt;code&gt;.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;T&lt;/strong&gt; is one dash: &lt;code&gt;-&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; is dot-dash: &lt;code&gt;.-&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N&lt;/strong&gt; is dash-dot: &lt;code&gt;-.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;M&lt;/strong&gt; is two dashes: &lt;code&gt;--&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt; is three dashes: &lt;code&gt;---&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With just these six, you can decode words like &lt;em&gt;me, to, on, no, at, am, one, name, moment&lt;/em&gt; and dozens more. That early win matters more than any mnemonic — it proves the code is readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn opposites as pairs
&lt;/h2&gt;

&lt;p&gt;Morse is full of mirror pairs: flip every dot to a dash and you get the sibling letter. Learn them as couples and you halve the memorisation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A&lt;/strong&gt; (&lt;code&gt;.-&lt;/code&gt;) ↔ &lt;strong&gt;N&lt;/strong&gt; (&lt;code&gt;-.&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;U&lt;/strong&gt; (&lt;code&gt;..-&lt;/code&gt;) ↔ &lt;strong&gt;D&lt;/strong&gt; (&lt;code&gt;-..&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;V&lt;/strong&gt; (&lt;code&gt;...-&lt;/code&gt;) ↔ &lt;strong&gt;B&lt;/strong&gt; (&lt;code&gt;-...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;K&lt;/strong&gt; (&lt;code&gt;-.-&lt;/code&gt;) ↔ &lt;strong&gt;R&lt;/strong&gt; (&lt;code&gt;.-.&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;W&lt;/strong&gt; (&lt;code&gt;.--&lt;/code&gt;) ↔ &lt;strong&gt;G&lt;/strong&gt; (&lt;code&gt;--.&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you know one half of the pair, the other is free. This is the pattern-recognition trick that chart memorisers never discover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Say it, don't just see it
&lt;/h2&gt;

&lt;p&gt;Morse is a sound code. When you practise, vocalise every letter: "di-dah" for A, "dah-di-di-dit" for D. Readers who vocalise consistently recognise letters by their rhythm shape long before they can recite the chart. Try decoding your own name by ear before you look anything up — the letters you already know will jump out at you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decode common words as whole shapes
&lt;/h2&gt;

&lt;p&gt;Experienced operators do not spell out S-O-S letter by letter; they hear one continuous rhythm: &lt;code&gt;... --- ...&lt;/code&gt;. Treat the classics as single units:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SOS&lt;/strong&gt;: &lt;code&gt;... --- ...&lt;/code&gt; (three short, three long, three short)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CQ&lt;/strong&gt;: &lt;code&gt;-.-. --.-&lt;/code&gt; (calling all stations — hear it in any radio drama)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;73&lt;/strong&gt;: &lt;code&gt;--... ...--&lt;/code&gt; (best regards, from telegraph shorthand)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chunking turns 36 memorisation tasks into a few familiar sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practise with audio, not paper
&lt;/h2&gt;

&lt;p&gt;A chart teaches recognition; audio teaches &lt;em&gt;reading&lt;/em&gt;. A good &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; practice session runs like this: type a word you know, listen to it at slow speed, then shadow it — repeat the dits and dahs out loud a beat behind the audio. Speed the playback up only when you are comfortable. Keep a &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; open nearby as a safety net, but resist checking it until you have guessed first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first week's drill
&lt;/h2&gt;

&lt;p&gt;Spend ten minutes a day on this loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review the six high-frequency letters (E, T, A, O, N, M) by ear.&lt;/li&gt;
&lt;li&gt;Add one mirror pair per day.&lt;/li&gt;
&lt;li&gt;Decode three short words aloud without looking.&lt;/li&gt;
&lt;li&gt;Listen to one full sentence and write down every letter you catch — blanks are fine.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By day seven you will be catching real words from real audio. The chart never leaves your desk, but you will stop needing it — which was the point all along.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Morse Code in Modern Tech: The Beeps Hiding in Your Gadgets</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:36:04 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-in-modern-tech-the-beeps-hiding-in-your-gadgets-1md8</link>
      <guid>https://dev.to/morsezone/morse-code-in-modern-tech-the-beeps-hiding-in-your-gadgets-1md8</guid>
      <description>&lt;p&gt;You would think Morse code died with the telegraph. Listen closely and you will hear it everywhere — in cockpits, under the sea, even in your phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aviation still speaks Morse
&lt;/h2&gt;

&lt;p&gt;Every VOR and NDB navigation beacon broadcasts its station identifier in Morse code, cycling endlessly over the radio. Pilots learn to recognise these rhythmic identifiers by ear, and aviation exams still expect you to copy them. When you fly into a major airport, a stream of dots and dashes is quietly telling the instruments where they are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the sea and at sea
&lt;/h2&gt;

&lt;p&gt;Submarines on silent running and ships within visual range still use Morse via signal lamps. The international COLREGs recognise light signals as a legal means of communication. No internet, no satellite — just a shutter and a pattern anyone trained can read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most efficient mode on the airwaves
&lt;/h2&gt;

&lt;p&gt;Amateur radio operators prize CW (continuous wave) Morse because it cuts through noise when voice cannot. A whisper of a signal that no voice mode could carry becomes readable in Morse. That is why "Morse code is dead" gets a laugh on every ham band.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hiding in your pocket
&lt;/h2&gt;

&lt;p&gt;Here is a fun one: the classic Nokia text-message alert tone is the Morse pattern for "SMS" (... -- ...). Millions of people carried a Morse message in their pocket for years without knowing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility and design
&lt;/h2&gt;

&lt;p&gt;Vibration patterns on phones and wearables are dot-dash rhythms at heart. Switch-access users and some assistive tools encode choices as short and long signals — Morse logic, repackaged for the touchscreen era.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The best way to feel this history is to send and receive it. &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; is a free translator that converts text to Morse and back with audio playback, no signup needed. Keep the &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; open beside it and you will be copying your first callsign within minutes.&lt;/p&gt;

&lt;p&gt;Morse code did not disappear. It just stopped shouting and started whispering — in cockpits, oceans, phones and space.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>history</category>
      <category>electronics</category>
    </item>
    <item>
      <title>Building a Morse Code Practice Timer in JavaScript: Timing Dits, Dahs and Gaps</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Thu, 29 Oct 2026 04:29:52 +0000</pubDate>
      <link>https://dev.to/morsezone/building-a-morse-code-practice-timer-in-javascript-timing-dits-dahs-and-gaps-39ol</link>
      <guid>https://dev.to/morsezone/building-a-morse-code-practice-timer-in-javascript-timing-dits-dahs-and-gaps-39ol</guid>
      <description>&lt;p&gt;Learning Morse code is not only about memorising dots and dashes. It is about rhythm. If your timing is uneven, even a perfectly remembered letter can sound like something else. That is why a small practice timer is such a useful first project: it turns an abstract rule into something you can hear, see and feel.&lt;/p&gt;

&lt;p&gt;The standard timing is beautifully simple. Think of one short unit as your base. A dit lasts one unit, a dah lasts three units, the gap between elements inside a letter is one unit, the gap between letters is three units, and the gap between words is seven units. Once you fix the length of one unit, everything else follows. At a slow practice speed, one unit might be 200 milliseconds. At a faster speed, it might be only 80 milliseconds, but the ratios stay the same.&lt;/p&gt;

&lt;p&gt;A setInterval-based timer makes this easy to build in JavaScript. Start with a variable for the unit length and a queue of signals. Each signal is either a dit, a dah or a gap, with a duration measured in units. Use setInterval to step through the queue, or use setTimeout for each step, and show the current letter on screen while a short beep or a visual flash plays. Add controls for speed, a start and stop button, and a display that highlights each element as it plays. Keep the code small at first: a function to convert a word into signals, a function to play one signal, and a function to move to the next.&lt;/p&gt;

&lt;p&gt;Try this short drill. Set one unit to 200 milliseconds and practise the word SOS, then the word HI, then the word CQ. Listen first without looking, then check the letters, then repeat the same words slightly faster. Notice where you rush: most beginners shorten the gap between letters, which makes separate letters run together. Slowing down that gap often improves readability more than speeding up the dits and dahs.&lt;/p&gt;

&lt;p&gt;For reference while you practise, keep a &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; nearby and explore the tools at &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt;. A timer will not teach you every letter on its own, but it will teach you the timing habit that makes every letter clearer.&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Decoding Morse Code by Ear: A Beginner's Listening Drill</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Wed, 28 Oct 2026 04:26:28 +0000</pubDate>
      <link>https://dev.to/morsezone/decoding-morse-code-by-ear-a-beginners-listening-drill-39mb</link>
      <guid>https://dev.to/morsezone/decoding-morse-code-by-ear-a-beginners-listening-drill-39mb</guid>
      <description>&lt;p&gt;Learning to read Morse code on paper is one thing. Hearing it, recognising it and understanding it in real time is quite another. The good news is that listening is a skill you can train in short, enjoyable sessions. This beginner's drill will help you move from counting dots and dashes to hearing whole letters, words and rhythms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with sound, not symbols
&lt;/h2&gt;

&lt;p&gt;Many beginners try to memorise a chart and then translate every beep in their head. That quickly becomes slow and tiring. Instead, learn each letter as a sound pattern. A is di-dah, B is dah-di-di-dit, and so on. Say the patterns aloud, tap them on a table, and listen to them repeatedly until they feel familiar rather than abstract.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;free morse code translator&lt;/a&gt; is ideal for this stage. Type a short word, listen to the audio, and then try to write down what you heard before checking your answer. Because &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; plays the code instantly, you can repeat the same word as many times as you need without waiting for a recording or a partner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five-minute listening drill
&lt;/h2&gt;

&lt;p&gt;Set a timer for five minutes and follow this simple routine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose three letters you already know, for example E, T and M.&lt;/li&gt;
&lt;li&gt;Listen to each one five times and say it aloud.&lt;/li&gt;
&lt;li&gt;Mix the three letters and listen without looking.&lt;/li&gt;
&lt;li&gt;Write down each letter you hear, then check your score.&lt;/li&gt;
&lt;li&gt;Add one new letter only when you can recognise the first three without hesitating.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Short sessions work better than long ones because listening fatigue is real. Five focused minutes every day will beat an hour of frustrated practice once a week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn the rhythm of words
&lt;/h2&gt;

&lt;p&gt;Once single letters feel comfortable, practise short, common words such as CAT, DOG, RUN and SOS. Hearing a word as one flowing pattern, rather than three separate letters, is the key step towards fluency. Try listening at a slightly slower speed first, then gradually increase the pace as your confidence grows.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;Morse code alphabet&lt;/a&gt; is a useful reference while you practise. Use it to check a letter you missed, but resist the urge to keep it open during a drill. The goal is to trust your ears, not your eyes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common listening mistakes
&lt;/h2&gt;

&lt;p&gt;Beginners often confuse similar patterns, such as S (three dots) and H (four dots), or mix up the spacing between letters and words. If a pattern sounds unclear, slow it down and listen for the gaps. A short gap separates letters, while a longer gap separates words. That spacing is just as important as the dots and dashes themselves.&lt;/p&gt;

&lt;p&gt;Another common mistake is counting. If you find yourself thinking "dot, dot, dash" for every letter, you are still translating rather than listening. Go back to a smaller set of letters and practise until the sound itself triggers the letter in your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a daily habit
&lt;/h2&gt;

&lt;p&gt;End each session with something enjoyable: decode a friend's name, a favourite word, or a short message. Keep a simple log of the letters you practised and your score. Watching that list grow is motivating, and it shows exactly which letters still need work.&lt;/p&gt;

&lt;p&gt;With steady, short drills, a free tool and a little patience, decoding Morse code by ear soon stops feeling like a puzzle and starts feeling like listening to a language. Visit &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;https://morsezone.com/&lt;/a&gt; to begin today's drill, and see how quickly your ears catch up with your eyes.&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Morse Code in Amateur Radio: Why Hams Still Learn CW</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Tue, 27 Oct 2026 04:26:38 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-in-amateur-radio-why-hams-still-learn-cw-33il</link>
      <guid>https://dev.to/morsezone/morse-code-in-amateur-radio-why-hams-still-learn-cw-33il</guid>
      <description>&lt;p&gt;Walk into any amateur radio shack, field day tent or quiet evening net, and sooner or later you will hear it: the steady rhythm of dots and dashes cutting through static that voice signals cannot always cross. CW, or continuous wave Morse code, has been part of amateur radio since its earliest days. Although modern radios offer voice, digital modes and satellite links, many operators still choose to learn CW — not out of nostalgia alone, but because it remains practical, efficient and deeply satisfying.&lt;/p&gt;

&lt;p&gt;The first reason is simple physics. A Morse signal needs very little bandwidth. That narrow footprint lets it travel further on low power than a voice transmission, and it can often be copied when a spoken signal would be lost in noise. For portable operators, QRP enthusiasts and anyone working with a modest antenna, that efficiency matters. A five-watt station and a wire in a tree can reach another continent on a good day, especially when the operator can send and receive clean, well-spaced code.&lt;/p&gt;

&lt;p&gt;CW also builds a different kind of listening skill. Unlike a digital decoder, a human operator learns to recognise rhythm, spacing and tone almost instinctively. At first, every letter feels like a puzzle. With practice, common words and callsign patterns begin to sound like whole phrases rather than individual characters. That progression is one of the pleasures of the hobby: progress is audible, session by session, and even a modest increase in comfortable speed feels like a real achievement.&lt;/p&gt;

&lt;p&gt;If you are starting out, keep your practice short, regular and enjoyable. Learn the letters by sound rather than by counting dots and dashes on paper, and use a &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; only as a reference while your ear catches up. Practise sending with a straight key or paddle at a relaxed pace, listen to slow-speed nets, and do not rush to increase speed before your spacing is consistent. Accuracy will always serve you better than speed in a real contact.&lt;/p&gt;

&lt;p&gt;A small timing helper can make that practice clearer. In standard Morse timing, one dit lasts 1200 divided by your speed in words per minute, a dah lasts three dits, and the gaps between elements, letters and words follow the same simple ratios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;cwTiming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wpm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;wpm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;dit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dah&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;elementGap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;letterGap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;wordGap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cwTiming&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At 15 words per minute, for example, a dit is 80 milliseconds. Seeing those numbers helps beginners understand why rushed, uneven spacing is harder to copy than slower, well-formed code. Try the helper at different speeds, then practise at the speed where you can copy comfortably without guessing.&lt;/p&gt;

&lt;p&gt;Finally, CW connects you to a worldwide community. Contests, slow-speed nets, portable activations and casual ragchews all welcome newcomers, and experienced operators are usually happy to slow down for a beginner. You do not need expensive equipment to begin, and you do not need to be fast to be welcome.&lt;/p&gt;

&lt;p&gt;To explore the sounds, practise at your own pace and check characters as you learn, visit &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt;. Then switch on your radio, find a slow-speed contact, and enjoy one of amateur radio's oldest — and still most rewarding — skills.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>morsecode</category>
    </item>
    <item>
      <title>Morse Code Practice Routines: From Your First Dit to 20 WPM</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:27:04 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-practice-routines-from-your-first-dit-to-20-wpm-24</link>
      <guid>https://dev.to/morsezone/morse-code-practice-routines-from-your-first-dit-to-20-wpm-24</guid>
      <description>&lt;p&gt;Learning Morse code is less about talent than about routine. Most beginners do not fail because the alphabet is hard; they fail because they practise in long, irregular bursts, then forget what they learnt. A short daily routine, built around listening rather than memorising dots on a page, will take you much further than an occasional weekend marathon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with sound, not symbols
&lt;/h2&gt;

&lt;p&gt;Your first goal is to recognise letters by ear. Start with just four letters, for example E, T, M and O, and listen to them at a comfortable speed until each one feels distinct. Add two or three new letters only when the first set feels automatic. Keeping the set small prevents the common trap of confusing similar patterns, such as S and H, before either is secure.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; to check a letter whenever you are unsure, and keep the &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; nearby during your first week. The chart is a safety net, not a crutch: glance at it, then close it and listen again. You want the sound, not the picture, to trigger the letter.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 20-minute daily routine
&lt;/h2&gt;

&lt;p&gt;A routine that works for many learners looks like this. Spend five minutes listening to single letters and saying each one aloud as soon as you hear it. Then spend five minutes on short words made only from letters you already know, such as CAT, DOG and MEET. Next, spend five minutes copying: listen to a short phrase and write down what you hear, checking afterwards rather than stopping mid-stream. Finish with five minutes of sending, tapping the same letters on a key, a phone screen or even a tabletop.&lt;/p&gt;

&lt;p&gt;Short and regular beats long and rare. Twenty minutes a day, five days a week, builds a habit your brain can consolidate overnight. If you miss a day, do not try to catch up with an hour the next day; simply return to the routine.&lt;/p&gt;

&lt;h2&gt;
  
  
  From 5 WPM to 20 WPM
&lt;/h2&gt;

&lt;p&gt;Speed comes in stages. At 5 words per minute, focus on accuracy and relaxed listening. Do not rush to increase the speed if you are still guessing. When you can copy simple words at around 90 percent accuracy, raise the speed by just 2 WPM. That small step keeps the task challenging without turning it into noise.&lt;/p&gt;

&lt;p&gt;Around 12 WPM, many learners hit a plateau. This is normal. It usually means you are still counting dits and dahs instead of hearing whole letters. The remedy is to practise at a slightly faster speed for short bursts, then drop back to your comfortable speed. Your ear learns to recognise the shape of a letter rather than assembling it piece by piece.&lt;/p&gt;

&lt;p&gt;By 20 WPM, you should be hearing common words as units. Short, familiar words such as THE, AND and YOU will arrive as single sounds. That is the real breakthrough, and it comes from repeated exposure, not from studying harder.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small practice snippet
&lt;/h2&gt;

&lt;p&gt;If you enjoy coding, this tiny JavaScript snippet turns text into Morse and is a handy way to test your own listening drills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MORSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-.-.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;O&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;MORSE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// ... --- ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extend the table letter by letter as you learn them, and use it to generate short practice strings. Generating your own drills keeps practice fresh and gives you a reason to revisit letters that still feel shaky.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it enjoyable
&lt;/h2&gt;

&lt;p&gt;End each session with something easy. Copy a favourite word, send your name, or listen to a slow, familiar call sign. Finishing on a success makes you more likely to return tomorrow. Morse code rewards patience: a dit today, a word next week, and a comfortable conversation at 20 WPM before long.&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Morse Code for Hikers: Signalling When Your Phone Dies</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:27:14 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-for-hikers-signalling-when-your-phone-dies-1cf6</link>
      <guid>https://dev.to/morsezone/morse-code-for-hikers-signalling-when-your-phone-dies-1cf6</guid>
      <description>&lt;p&gt;A dead phone battery does not have to mean silence on the trail. Long before mobile coverage, walkers, sailors and rescuers relied on simple light, sound and movement to send messages over distance. Morse code is still one of the most practical of those systems, because it needs no power, no network and very little equipment — just a torch, a whistle, a mirror or even your hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Morse still works outdoors
&lt;/h2&gt;

&lt;p&gt;Morse code turns every letter into a pattern of short and long signals: dots and dashes. That simplicity is its strength. A torch flashing three short bursts, three long bursts and three short bursts spells SOS, the internationally recognised distress signal. Even if you cannot remember the full alphabet, knowing SOS alone could help rescuers spot you.&lt;/p&gt;

&lt;p&gt;Sound carries well in valleys and across still water, while light works best at night or in low visibility. A whistle is especially useful because it is loud, light to carry and does not tire your voice. Tapping on a rock, a water bottle or a tree trunk can also work if someone is listening nearby.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signals every hiker should learn
&lt;/h2&gt;

&lt;p&gt;Start with a handful of useful words rather than trying to memorise everything at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOS: ... --- ...&lt;/li&gt;
&lt;li&gt;HELP: .... . .-.. .--.&lt;/li&gt;
&lt;li&gt;OK: --- -.-&lt;/li&gt;
&lt;li&gt;YES: -.-- . ...&lt;/li&gt;
&lt;li&gt;NO: -. ---&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practise them slowly first, keeping a clear gap between letters and a longer gap between words. Speed matters far less than clarity. A slow, steady signal is much easier to read than a fast, muddled one.&lt;/p&gt;

&lt;p&gt;Before your next walk, spend ten minutes with a &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; and pick out the letters in your name, your route and the word HELP. Learning in small, personal chunks makes the patterns stick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Torch, whistle and mirror: three practical methods
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Torch:&lt;/strong&gt; At night, flash the torch towards a path, a valley or a rescue team. Short flashes are quick on-off blips; long flashes last about three times as long. Keep the torch steady and aim it deliberately rather than waving it about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whistle:&lt;/strong&gt; Blow short, sharp blasts for dots and longer blasts for dashes. Repeat SOS in groups, then pause and listen. Rescue teams often respond with a signal of their own, so leave silence between repetitions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mirror:&lt;/strong&gt; In daylight, a small signalling mirror or any shiny surface can flash sunlight over a surprising distance. Angle it carefully and flash in the same dot-dash rhythm. This method takes practice, so try it at home first.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tiny snippet to practise at home
&lt;/h2&gt;

&lt;p&gt;You do not need special software to explore the patterns. This short JavaScript example converts a few letters to Morse and prints the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;morse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;O&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;H&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;....&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;L&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.—..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.--.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;morse&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// ... --- ...&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;toMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HELP&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// .... . .-.. .--.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try extending the table with your own name and the letters for OK and NO. Writing the code yourself is a surprisingly good way to remember the patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stay safe, and keep it simple
&lt;/h2&gt;

&lt;p&gt;Morse code is a useful backup, not a replacement for proper planning. Always tell someone your route and expected return time, carry a map, water, warm layers and a charged power bank where possible, and check the weather before you set out. If you are in real danger, use every method available to you: shout, whistle, flash a light and make yourself visible.&lt;/p&gt;

&lt;p&gt;For a gentle, free way to learn and practise before you head out, try &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt;. It lets you convert text to Morse and back again, listen to the sounds and build confidence step by step — no signup required. A few minutes of practice at home could make a real difference when your phone cannot help you.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>morsecode</category>
    </item>
    <item>
      <title>Morse Code Timing: The Hidden Rules Behind Dits and Dahs</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Sat, 24 Oct 2026 04:31:04 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-timing-the-hidden-rules-behind-dits-and-dahs-57ai</link>
      <guid>https://dev.to/morsezone/morse-code-timing-the-hidden-rules-behind-dits-and-dahs-57ai</guid>
      <description>&lt;p&gt;Most beginners memorise the Morse alphabet in an afternoon — A is &lt;code&gt;.-&lt;/code&gt;, B is &lt;code&gt;-...&lt;/code&gt;, and so on. Then they try to send or decode a real message and it falls apart. The reason is rarely the dots and dashes. It's the &lt;em&gt;timing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Morse code is not just two symbols. It is a timed rhythm, and every pause matters as much as every signal. The international standard defines five simple rules, all measured in "units". One unit is the base duration — the length of a single dit. Everything else is a multiple of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five timing rules
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;dit&lt;/strong&gt; (&lt;code&gt;.&lt;/code&gt;) lasts &lt;strong&gt;1 unit&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;dah&lt;/strong&gt; (&lt;code&gt;-&lt;/code&gt;) lasts &lt;strong&gt;3 units&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The gap &lt;strong&gt;between signals within one letter&lt;/strong&gt; is &lt;strong&gt;1 unit&lt;/strong&gt;. Without this rule, the three dits of S (&lt;code&gt;...&lt;/code&gt;) would merge into one long blur.&lt;/li&gt;
&lt;li&gt;The gap &lt;strong&gt;between letters&lt;/strong&gt; is &lt;strong&gt;3 units&lt;/strong&gt;. This is what tells the listener that &lt;code&gt;.-&lt;/code&gt; (A) is followed by &lt;code&gt;-.&lt;/code&gt; (N), rather than reading the whole string as a single letter.&lt;/li&gt;
&lt;li&gt;The gap &lt;strong&gt;between words&lt;/strong&gt; is &lt;strong&gt;7 units&lt;/strong&gt;. This is the longest silence, and it is what makes SOS (&lt;code&gt;... --- ...&lt;/code&gt;) readable as three distinct letters.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Put another way: within a letter, signals are separated by 1 unit; letters are separated by 3 units; words are separated by 7 units. Miss any one of these and decoding becomes guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a unit?
&lt;/h2&gt;

&lt;p&gt;A unit is not fixed — it depends on your speed. Speed is measured in words per minute (wpm), and at the standard of 20 wpm one unit is roughly 60 milliseconds. So a dah lasts 180 ms, the gap between letters is 180 ms, and the gap between words is 420 ms. Slower sending simply means a longer unit; the ratios never change. That is the hidden elegance of the system: it scales to any speed as long as the ratios hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it into code
&lt;/h2&gt;

&lt;p&gt;If you have ever built a Morse player in JavaScript, you have had to model these timings. Here is a small function that converts text into a timed signal list — each entry holds the character, the signal, and its duration in milliseconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MORSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-.-.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;D&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;F&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..-.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;G&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;H&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;....&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;I&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;J&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.---&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;K&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-.-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;L&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.-..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;M&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;N&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;O&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.--.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--.-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.-.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;U&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;V&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.--&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;X&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-..-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-.--&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;--..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;textToTimedMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// 7-unit gap between words&lt;/span&gt;
      &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;MORSE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// dit = 1 unit, dah = 3 units&lt;/span&gt;
      &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sig&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// 1-unit gap inside a letter&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unitMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// complete the 3-unit letter gap&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;textToTimedMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SOS&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each element of the array is a single instruction for a player: sound the tone for &lt;code&gt;ms&lt;/code&gt; milliseconds, then stay silent for the gap. The function returns exactly the &lt;code&gt;[{ch, sig, ms}]&lt;/code&gt; shape that an audio scheduler or LED blinker can consume directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hearing the rhythm
&lt;/h2&gt;

&lt;p&gt;Reading about timing is one thing; hearing it is another. Try &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt; — a free online Morse code translator that converts text to Morse code and decodes it back instantly, with audio playback so you can hear correct timing in action. If you want the letter patterns at a glance while you practise, keep the &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; open beside it.&lt;/p&gt;

&lt;p&gt;Learn the alphabet in an afternoon, then spend a week on the timing. That is where the signal becomes a language.&lt;/p&gt;

</description>
      <category>morsecode</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Morse Code for Teachers: 5 Classroom Activities That Actually Work</title>
      <dc:creator>Morse Zone</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:04:55 +0000</pubDate>
      <link>https://dev.to/morsezone/morse-code-for-teachers-5-classroom-activities-that-actually-work-3o4d</link>
      <guid>https://dev.to/morsezone/morse-code-for-teachers-5-classroom-activities-that-actually-work-3o4d</guid>
      <description>&lt;p&gt;Teaching Morse code sounds old-fashioned until you see what it does to a classroom. Dots and dashes give pupils a hands-on reason to practise spelling, rhythm, sequencing and teamwork — no batteries required. Here are five activities that genuinely work, ordered from easiest to most ambitious.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Flashlight sentences
&lt;/h2&gt;

&lt;p&gt;Darken the classroom and let pupils send each other short words with a torch: long flashes for dashes, short flashes for dots. Start with names. Keep a free &lt;a href="https://morsezone.com/morse-code-alphabet/" rel="noopener noreferrer"&gt;morse code alphabet chart&lt;/a&gt; open on the projector so the letter patterns stay visible while they work.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Clap-back decoding
&lt;/h2&gt;

&lt;p&gt;You clap (or tap the desk) a letter; the class writes it down. Speed up gradually. This trains pure listening and doubles as a great five-minute warm-up before English or music lessons.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The message relay
&lt;/h2&gt;

&lt;p&gt;Split the class into teams of four. Pupil one reads a word, pupil two encodes it into dots and dashes, pupil three “transmits” it by tapping, and pupil four decodes it back. The first team with the correct word wins. It is noisy, competitive and memorable — and it secretly teaches encoding and decoding.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Build a pocket translator
&lt;/h2&gt;

&lt;p&gt;For older pupils, nothing beats writing a tiny translator in JavaScript. It is barely a dozen lines and it demystifies how text becomes code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MORSE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-.-.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-..&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;..-.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;....&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;j&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.---&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-.-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.-..&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;---&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.--.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--.-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.-.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;..-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;...-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.--&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-..-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-.--&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--..&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;textToMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MORSE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;textToMorse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello class&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="c1"&gt;// .... . .-.. .-.. --- / -.-. .-.. .- ... ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pupils can paste it into the browser console and check their answers against &lt;a href="https://morsezone.com/" rel="noopener noreferrer"&gt;Morse Zone&lt;/a&gt;, a free morse code translator that also plays the audio — perfect for verifying tricky letters like L and Q.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Secret-message homework
&lt;/h2&gt;

&lt;p&gt;Set homework where pupils write each other coded messages. Parents get involved, grandparents recognise it, and the playground becomes a decoding hub for a week. Collect the best messages and decode them together on Friday.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it simple, keep it fun
&lt;/h2&gt;

&lt;p&gt;Morse code works in classrooms because it is physical, social and instantly rewarding. Print one alphabet chart, keep sessions short, and let the pupils do the transmitting. The dots and dashes take care of the rest.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>morsecode</category>
      <category>education</category>
    </item>
  </channel>
</rss>
