morsecode
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| morsecode [2026/05/05 13:59] – created frchris | morsecode [2026/05/05 14:40] (current) – frchris | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Morse Coder ====== | ====== Morse Coder ====== | ||
| + | ==== ToneTester ==== | ||
| + | This demonstrates how to generate a morse code tone. The timing is all based on the length of the " | ||
| + | ToneTester demonstrates how to use the javax sound | ||
| + | | ||
| + | which is what a HAM radio operator will | ||
| + | call to seek out a conversation from | ||
| + | | ||
| + | |||
| + | <code java ToneTester.java> | ||
| + | import javax.sound.sampled.AudioFormat; | ||
| + | import javax.sound.sampled.AudioSystem; | ||
| + | import javax.sound.sampled.SourceDataLine; | ||
| + | |||
| + | public class ToneTester { | ||
| + | |||
| + | /** | ||
| + | * ToneTester demonstrates how to use the javax sound | ||
| + | * library to generate a morse code "CQ CQ" | ||
| + | * which is what a HAM radio operator will | ||
| + | * call to seek out a conversation from | ||
| + | * anyone who might be able to be listening | ||
| + | * | ||
| + | * @author Chris Thiel, ofmCap | ||
| + | * @version May 5, 2026 | ||
| + | */ | ||
| + | |||
| + | public static final float FRQ=650F; | ||
| + | public static final int GAP = 1; | ||
| + | public static final int LETTER_GAP = 3 * GAP; | ||
| + | public static final int WORD_GAP = 7 * GAP; | ||
| + | public static final int VOLUME = 100; | ||
| + | |||
| + | |||
| + | public static void main(String[] args) { | ||
| + | // | ||
| + | int dit= 90; | ||
| + | int di = dit; // milisecs | ||
| + | int dah=3*dit; | ||
| + | int gap=1; | ||
| + | int letterGap=3*gap; | ||
| + | int wordGap=7*gap; | ||
| + | |||
| + | int[] c = {dah, di, dah, dit}; | ||
| + | int[] q = {dah, dah, di, dah}; | ||
| + | int[][] cq = {c,q}; | ||
| + | for (int i = 0; i < 2; i++) { | ||
| + | playWord(cq); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | public static void play(int[] letter) { | ||
| + | for(int t:letter) { | ||
| + | generateTone(FRQ, | ||
| + | } | ||
| + | generateTone(0, | ||
| + | } | ||
| + | public static void playWord(int[][] word) { | ||
| + | for(int[] letter: | ||
| + | play(letter); | ||
| + | } | ||
| + | generateTone(0, | ||
| + | } | ||
| + | |||
| + | public static void generateTone(float hz1, int msecs, int volume) | ||
| + | |||
| + | { | ||
| + | float frequency = 44100.0F; | ||
| + | int samplesize = 8; | ||
| + | int channels; | ||
| + | boolean signed = true; | ||
| + | boolean bigendian = false; | ||
| + | byte[] buf; | ||
| + | double tau = (2.0 * Math.PI); | ||
| + | AudioFormat format; | ||
| + | buf = new byte[1]; | ||
| + | channels = 1; | ||
| + | format = new AudioFormat(frequency, | ||
| + | bigendian); | ||
| + | try { | ||
| + | SourceDataLine sdl = AudioSystem.getSourceDataLine(format); | ||
| + | |||
| + | sdl.open(format); | ||
| + | sdl.start(); | ||
| + | for (int i = 0; i < msecs * frequency / 1000; i++) | ||
| + | { | ||
| + | double angle = i / (frequency / hz1)* tau; | ||
| + | buf[0] = (byte) (Math.sin(angle) * volume); | ||
| + | sdl.write(buf, | ||
| + | } | ||
| + | sdl.drain(); | ||
| + | sdl.stop(); | ||
| + | sdl.close(); | ||
| + | } catch ( Exception e){ | ||
| + | e.printStackTrace(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
morsecode.1778003997.txt.gz · Last modified: by frchris
