Play a recording on phone, and record it in a window
A phone function key names a wav file instead of words, which is what N1MM's
own SSB file holds: `F1 CQ,{WAVDIR}\Cq.wav`. `{WAVDIR}` is the folder named
after whoever is at the microphone, a name is taken relative to `Wav`, and
commas play several files in a row. An SSB `.mc` file written for N1MM plays
here.
Window ▸ Voice Keyer lists every recording the messages name, says which of
them are there for the operator picked at the top, plays one, and records over
one. The recording is written beside the wanted file and moved over it at the
end, so a recorder that will not start takes nothing away.
`CommandSoundCard` runs `aplay` and `arecord`, and both commands are settings:
the audio path belongs to whatever the station runs, and a library would pick
one of them for the operator. A recorder is stopped with an interrupt so it
closes its wav file, and killed only if it ignores that. PTT is cwdaemon's
`<ESC>a` for as long as the recording plays, off for a station on VOX.
Two things follow. The QTC window sends on SSB: N1MM's four recordings on the
Ready, Agn, Cfm and Close buttons, with the lines still read out by the
operator. And alternating CQ duels on phone, because the voice keyer says when
a recording has finished — which it had to, since the CQ message is picked by
the radio's mode and would otherwise have been keyed as Morse.
Nothing here has been played on a radio: this machine has no sound card, so
what is tested is the program being run, the file filled in, the exit code and
the interrupt, with shell commands standing in for the two.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0157i7PiZyqBkquxS9A6FTdQ
This commit is contained in:
@@ -48,14 +48,14 @@ scorer: red for a dupe, green for a new multiplier, blue for points.
|
||||
| Log | N1MM `.s3db`, Cabrillo 3.0 out, ADIF in and out |
|
||||
| While typing | dupe check, multiplier check, points, country and zone from the country file, exchange filled from a call history file |
|
||||
| While transmitting | a digital message is held in the transmit pane and fed to the engine a character at a time, so what has not gone out can still be rewritten; what has gone out is red, and the engine idles when it catches up with the cursor |
|
||||
| Windows | entry, log, check, bandmap, available mults and Qs, score summary, statistics, grey line, telnet, digital interface |
|
||||
| Windows | entry, log, check, bandmap, available mults and Qs, score summary, statistics, grey line, telnet, digital interface, voice keyer |
|
||||
| Statistics | the log counted under any two of its fields, as N1MM's table with its `Tot` and `Accum` columns or as a stacked column graph; either one copies to the clipboard, as spaced text or as a picture |
|
||||
| Editing | double-click a cell in the log, or open the whole contact with Ctrl+Y; Delete removes it. All of it goes out to the other stations |
|
||||
| Radio | one or two radios over hamlib `rigctld`, split, reconnecting on its own |
|
||||
| Cluster | DX cluster over telnet: a telnet window with the node's traffic, the published list of nodes, command buttons and spot filters, spots feeding the bandmap, Alt+P to spot a station |
|
||||
| Bandmap | drawn like N1MM's: a frequency scale with the receiver on it and callsigns beside it, joined by leader lines |
|
||||
| Network | contacts shared with the other stations of a multi-operator entry, in N1MM's own contact message |
|
||||
| Keying | CW through `cwdaemon` or a WinKeyer, with N1MM's message macros |
|
||||
| Keying | CW through `cwdaemon` or a WinKeyer, with N1MM's message macros; phone through the voice keyer, which plays each operator's own recordings |
|
||||
| Digital | N1MM's digital interface window, running MMTTY or 2Tone under Wine through the same `XMMT.ocx` N1MM drives them with |
|
||||
|
||||
### The digital window
|
||||
@@ -164,6 +164,7 @@ macros that are filled in:
|
||||
| `{FREQ}`, `{FREQROUND}` | this radio's frequency in kilohertz, with `R` for the decimal point on CW |
|
||||
| `{OTHERFREQ}`, `{OTHERFREQROUND}`, `{OTHERMHZ}`, `{OTHERBAND}`, `{LRMHZ}`, `{RRMHZ}` | the other radio, for passing a station |
|
||||
| `{TIMESTAMP}`, `{TIME2}` | the time now |
|
||||
| `{WAVDIR}` | the folder the voice keyer plays from, which is named after whoever is at the microphone |
|
||||
|
||||
The action macros run rather than standing for text: `{WIPE}`, `{LOG}`,
|
||||
`{RUN}`, `{S&P}`, `{SPACE}`, `{SPOTME}`, `{STOPTX}`, `{FREQUP}`, `{FREQDN}`,
|
||||
@@ -181,8 +182,54 @@ How far `{FREQUP}` and the rest move the radio is `FrequencyStepHertz` and
|
||||
for the same two numbers in its Configurer.
|
||||
|
||||
The rest of N1MM's action macros — the CAT families, audio, rotators, stereo,
|
||||
the digital TNC macros — are read and passed over, so a message that holds one
|
||||
still sends the right characters.
|
||||
the digital TNC macros, `{SETWAVDIR}` — are read and passed over, so a message
|
||||
that holds one still sends the right characters.
|
||||
|
||||
### The voice keyer
|
||||
|
||||
On phone a function key plays a recording, which is what N1MM does. The message
|
||||
is the name of a wav file rather than words:
|
||||
|
||||
F1 CQ,{WAVDIR}\Cq.wav
|
||||
|
||||
`{WAVDIR}` is the folder named after whoever is at the microphone, so each
|
||||
operator calls CQ in his own voice without anything being edited when the radio
|
||||
changes hands. A name is taken relative to `Wav`, so `WAEQRV.wav` is the one
|
||||
file the whole station shares and `OM3KFF\Cq.wav` is one operator's. Several
|
||||
files separated by commas play one after the other. All of this is N1MM's, so
|
||||
an SSB `.mc` file written for N1MM plays here.
|
||||
|
||||
**Window → Voice Keyer** lists every recording the messages name, says which
|
||||
ones are there, and records the ones that are not:
|
||||
|
||||
| Column | |
|
||||
|---|---|
|
||||
| Where | the keys that play it — `F1 run, F1 S&P` — or `QTC window` |
|
||||
| Says | what the key's label says, which is what the recording has to say |
|
||||
| File | the file name, in the folder named at the top |
|
||||
| Recorded | whether it is there, for the operator picked at the top |
|
||||
|
||||
**Play** auditions a recording. It does not key the transmitter, so what goes
|
||||
out on the air is only what a function key sends — unless the radio is on VOX,
|
||||
which hears the audio and keys itself either way. **Record** replaces the file,
|
||||
and the button becomes **Stop**; nothing is written over until the recorder has
|
||||
finished, so a recording that goes wrong leaves the old one playable.
|
||||
|
||||
Playing and recording are `aplay` and `arecord` out of the box, and the two
|
||||
commands are boxes at the bottom of the window: `{file}` in a command stands
|
||||
for the file. A station on JACK, or one on Windows, writes its own. Why it runs
|
||||
a program rather than driving the sound card itself is in
|
||||
[`docs/keying.md`](docs/keying.md).
|
||||
|
||||
The transmitter is keyed through the same `cwdaemon` that keys CW — its
|
||||
`<ESC>a` — for as long as the recording plays. The tick box turns that off for
|
||||
a station whose radio keys itself on VOX. A WinKeyer station has no PTT path
|
||||
from here and needs VOX.
|
||||
|
||||
What is not here is N1MM's advanced voicing: the recording per letter and per
|
||||
number in `LettersFiles` that N1MM strings together to say a callsign or a
|
||||
serial. So F5 (his call) is empty, as it is in N1MM's own default file, and a
|
||||
serial number is read out by the operator.
|
||||
|
||||
### ESM — Enter sends the message
|
||||
|
||||
@@ -455,16 +502,13 @@ pressing at a multi-operator station:
|
||||
|---|---|
|
||||
| Window positions | where every open window sits is stored against the operator leaving, and the operator taking over gets his own back. A window opened later is placed as it appears |
|
||||
| Colours | the theme he last had |
|
||||
| Recordings folder | the folder his wav files are in, since a voice keyer plays the recordings of whoever is at the microphone. It starts at `Wav/<his callsign>`, which is where N1MM looks, and the folder is made when he takes the radio |
|
||||
| Recordings folder | the folder his wav files are in: the voice keyer plays the recordings of whoever is at the microphone. It is `Wav/<his callsign>`, which is where N1MM looks, and the folder is made when he takes the radio |
|
||||
|
||||
An operator whose callsign is not in the list is made by typing it, and starts
|
||||
with the windows and colours on the screen. **Remove** drops one from the list;
|
||||
the contacts he logged keep his callsign, because those are in the log rather
|
||||
than in the settings.
|
||||
|
||||
Nothing plays the recordings yet — there is no voice keyer — so the folder is
|
||||
stored and passed on rather than used.
|
||||
|
||||
### The log window
|
||||
|
||||
The pane under the log lists what has already been worked with the call being
|
||||
@@ -661,7 +705,9 @@ cannot drive alternating CQ, and says so rather than keying the second radio
|
||||
while the first is still sending. **Config → Keyer and messages** sets the gap
|
||||
between the two, which is 100 ms by default because an SO2R box works relays.
|
||||
|
||||
CW only for now: it sends the F1 message, and there is no voice keyer.
|
||||
It sends the F1 message for the mode the radio is on, so it duels on phone as
|
||||
well as on CW: the voice keyer says when a recording has finished playing the
|
||||
same way `cwdaemon` says when a CW message has gone out.
|
||||
|
||||
Why the keying is `cwdaemon`'s job rather than the logger's, and what it would
|
||||
take to key the port directly as N1MM does, is in
|
||||
@@ -753,7 +799,8 @@ worked is.
|
||||
|
||||
Right-click the window for **Setup**: how many QTCs a series carries, whether
|
||||
the RX Ready and Cfm steps are stopped at, whether Hdr Agn and Agn clear what
|
||||
they ask for again, and the CW messages below. The defaults are N1MM's — both
|
||||
they ask for again, and the CW and RTTY messages. The SSB recordings are named
|
||||
by N1MM and are not settings. The defaults are N1MM's — both
|
||||
steps skipped, the header cleared, the line left alone.
|
||||
|
||||
On CW the window puts the traffic on the air itself, through the same keyer a
|
||||
@@ -787,11 +834,21 @@ out as it stands. All of it is edited in Setup, with N1MM's defaults. The serial
|
||||
number goes out as digits: N1MM can send cut numbers, and nothing here does, for
|
||||
any message.
|
||||
|
||||
Nothing is sent on SSB or RTTY. N1MM plays four recordings on SSB — QRV, Agn,
|
||||
Cfm and TU — and sends RTTY through its digital window; this program has no
|
||||
voice keyer and no digital window, so on those two modes the buttons move the
|
||||
cursor as they did before. N1MM's RTTY window also has a Send All button that
|
||||
keys the whole series at once; there is nothing to send it with here.
|
||||
On RTTY the traffic goes out through the digital window's engine, with N1MM's
|
||||
messages and N1MM's defaults on both sides: R U QRV and Save for the station
|
||||
reading a series out, RX Ready, All Agn, Agn n and Save for the station taking
|
||||
it down. Send All is there too — the heading, every line with the operator's
|
||||
spacing between them, then the ending, all as one message with `{TX}` and
|
||||
`{RX}` around it. Clicking a line in the digital window fills the next row,
|
||||
which is how a series is copied.
|
||||
|
||||
On SSB the buttons play N1MM's four recordings — `WAEQRV.wav`, `WAEAgain.wav`,
|
||||
`WAEConfirm.wav` and `WAETu.wav`, in the `Wav` folder rather than an operator's,
|
||||
which is where N1MM keeps them. RX Ready and R U QRV play the QRV one, Hdr Agn
|
||||
and every Agn play the again one, Cfm plays the confirm one, and Close plays the
|
||||
TU. The lines themselves are read out by the operator: a QTC line is a time, a
|
||||
callsign and a serial number, and no recording can say one. Record the four in
|
||||
Window ▸ Voice Keyer.
|
||||
|
||||
In a WAE contest the log window has N1MM's two columns, whose names do not read
|
||||
the way they sound: **Series** says whether the row is a contact or traffic —
|
||||
@@ -959,7 +1016,7 @@ windows redraw where they stand.
|
||||
| `Nonemm.Rig` | Radio control over `rigctld`, and the SO2R box |
|
||||
| `Nonemm.Spotting` | Spots, the bandmap, the DX cluster client |
|
||||
| `Nonemm.Network` | Contacts shared between the stations of a multi-operator entry |
|
||||
| `Nonemm.Keying` | CW through `cwdaemon` or a WinKeyer |
|
||||
| `Nonemm.Keying` | CW through `cwdaemon` or a WinKeyer, and the voice keyer's recordings |
|
||||
| `Nonemm.Digital` | MMTTY and 2Tone, over the Wine bridge in `bridge/` |
|
||||
| `Nonemm.Session` | The contest in progress, and one entry position per radio — no UI toolkit |
|
||||
| `Nonemm.App` | The Avalonia windows |
|
||||
@@ -970,11 +1027,11 @@ covered by plain unit tests.
|
||||
|
||||
## Where it stands
|
||||
|
||||
Working: logging a contest end to end, live dupe and multiplier checking, eight
|
||||
built-in contests plus user-defined ones, Cabrillo and ADIF export, ADIF import,
|
||||
the log, check, graphical bandmap, score and telnet windows, editing and deleting logged
|
||||
contacts, radio control, DX cluster spots, contacts shared between networked
|
||||
stations, and CW keying.
|
||||
Working: logging a contest end to end, live dupe and multiplier checking,
|
||||
twenty-six built-in contest families plus user-defined ones, Cabrillo and ADIF
|
||||
export, ADIF import, the log, check, graphical bandmap, score and telnet
|
||||
windows, editing and deleting logged contacts, radio control, DX cluster spots,
|
||||
contacts shared between networked stations, CW keying and the voice keyer.
|
||||
|
||||
Checked against N1MM 1.0.11031: a log this program wrote opens in N1MM, which
|
||||
reads the contest, its categories and the contacts. See
|
||||
|
||||
Reference in New Issue
Block a user