Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

morse

A command-line English/digit to Morse translator (and Morse to English/digit translator) that also renders the message as OGG Vorbis audio.

Workspace layout

This repository is a Cargo workspace with two packages:

  • morse: the reusable Morse library and the main morse CLI.
  • morse-keyboard-debugger: the standalone morse-keyboard-debug terminal diagnostics CLI.

Run the whole workspace with cargo build --workspace or cargo test --workspace. To run a particular package from the workspace root:

cargo run -p morse -- "SOS"
cargo run -p morse-keyboard-debugger --bin morse-keyboard-debug

Requirements

  • Rust 1.85 or newer
  • ffmpeg with the libvorbis encoder

Build and use

cargo build --workspace --release
./target/release/morse "Hello 2026"
./target/release/morse ".... . .-.. .-.. --- ..--- ----- ..--- -...."
./target/release/morse -- "-..."# use -- when Morse begins with a dash
./target/release/morse -f 900 -u 120 -w square -o signal.ogg "SOS"echo"MORSE 5"| ./target/release/morse --frequency=750 --timbre=piano
./target/release/morse --exam encode "SOS 2"
./target/release/morse -e d "... --- ... ..---"
./target/release/morse --realtime
./target/release/morse-keyboard-debug

The input charset selects the direction automatically. Input containing only Morse symbols and whitespace is decoded as Morse; both . and · are accepted as dots, and both - and _ as dashes. ASCII English letters and digits are encoded as Morse. Encoded Morse uses one space between letters and two spaces between words. When decoding, one space separates letters, two spaces separate words, and three or more spaces create a paragraph break. Any whitespace run containing a tab or newline also creates a paragraph break (\n\n). / remains accepted as a word separator for compatibility. With no text argument, input is read from stdin and an interactive terminal displays a prompt.

Examination mode

Use -e or --exam with e/encode to practise encoding English and digits, or d/decode to practise decoding Morse. The supplied text is the question; the program then waits for an answer. It checks only the letters and digits, so letter case and formatting do not affect a correct result. A correct answer prints Correct, consumed 0.000 s, rate: 0.00 sigs/min, 0.00 chars/min (with the measured values substituted). An incorrect answer prints Incorrect, expected: followed by the expected answer on the next line.

Defaults are a 700 Hz sine wave and an 80 ms unit. Audio is written to a timestamped path such as audio/morse-1753334400000.ogg; the audio directory is created automatically. Dots last one unit and dashes three; gaps within a letter, between letters, and between words last one, three, and seven units respectively.

Real-time keying mode

Run -r, --rt, or --realtime in an interactive terminal to decode Morse as you key it. First select either single-key mode or double-key mode, then select the key or keys. -u selects the Morse time unit for all real-time timing. In single-key mode, a hold at or below sqrt(3) * unit is a dot and a longer hold is a dash; this is the geometric-mean boundary between a one-unit dot and a three-unit dash. The original press timestamp is retained while a key is held, so keyboard auto-repeat cannot shorten a long hold. In double-key mode, the selected dot and dash keys enter their symbols directly. Pauses use the same geometric-mean principle: sqrt(3) * unit separates intra-letter from letter gaps, and sqrt(21) * unit separates letter from word gaps. The live line shows the Morse sequence being entered and the decoded text. Press Escape or Ctrl-C to end the session. Key events are read from the focused terminal, not globally from the operating system. Single-key mode needs a terminal that supports the kitty keyboard protocol (such as kitty, foot, WezTerm, or recent Alacritty) because it depends on key-release events; double-key mode works in normal terminals.

The eight-dit error/correction prosign (........) is supported as a realtime backspace: it is shown as while being keyed and removes the last decoded character when the character gap is reached.

Keyboard debugger

Build the package and run morse-keyboard-debug in the terminal where real-time mode has trouble:

cargo build --workspace --release
./target/release/morse-keyboard-debug --unit 80

The debugger prints every parsed keyboard event with its event kind, key code, modifiers, keyboard state, time since the previous event, and measured hold duration. On release it applies the same sqrt(3) * unit threshold as single-key real-time mode and prints dit (.) or dah (-). It also warns about duplicate presses, repeats without a press, releases without a press, and keys whose release was never observed. Press Ctrl-C to exit.

Keyboard enhancement defaults to auto. Use --enhancement force to request the kitty keyboard protocol when terminal support detection is wrong, or --enhancement off to inspect the terminal's unenhanced event stream.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages