Skip to content

fix(app): put the transmit pop under the receptions it sat over - #738

Merged
efiten merged 2 commits into
efiten:masterfrom
khagele:fix/602-tx-cue-level
Sep 30, 2026
Merged

efiten merged 2 commits into
efiten:masterfrom
khagele:fix/602-tx-cue-level

Conversation

@khagele

@khagele khagele commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

Closes #602

With sound on, auto-discover was the loudest thing in the mix. A sweep of N targets is N + 2 pops every ten seconds, each at gain 0.16 with a 160 ms tail through the whole reverb. A direct network dit at -110 dBm peaks at 0.078, so the cue for "a frame went out" was 2.1 times over the cue for "something was heard".

In this PR

TX_POP in sound.js holds the levels Kasper chose by ear on 30 September, in a lab page running the real engine with the pop adjustable:

was is
peak gain 0.16 0.05
tail 160 ms 70 ms
share through the master and its reverb send 100% 15%, the rest dry at the same level
  • The dry share goes through a second lowpass into the same output gain, so it gets the master's rounding without its reverb send.
  • cuePeak is the level cue() plays a direct dit at, pulled out so the pop can be held against it.
  • Every transmission still sounds: two pops for the Discover broadcast, one per trace-ping. Sounding only the Discover pops (direction 2) and a silent auto-discover (direction 3) were both in the lab and not chosen.
  • The rule of App: Discover FAB pulses only for the broadcast, not for trace-ping transmissions #254 is untouched: the cue follows the frame.
  • docs/2026-07-16-sound-modes.md carries the new levels as an amendment, and there is a changelog entry.

Acceptance

A direct network dit at -110 dBm (0.078) is 1.6 times over the pop (0.05). Measured in the lab at the master, behind the 0.9 output gain: pop 0.042 to 0.045, network dits 0.064 to 0.079, trace replies 0.143 to 0.155 (taken with the reverb share at 0; the dry level is the same at 15%).

Verification

  • soundengine.test.js, 3 new tests: every family's dit at -110 dBm peaks over the pop; cue() plays a dit at cuePeak; a pop reaches the reverb at TX_POP.reverb of a dit's share and the output at the same dry level.
  • Each was run with its change reverted: 5 mutations, 5 red.
  • app: 1626 tests green, eslint clean, build clean. web: 762 green (the changelog copies).
  • The levels were heard in the lab page, not in the app build on a phone.

🤖 Generated with Claude Code

khagele and others added 2 commits September 30, 2026 10:37
With sound on, auto-discover was the loudest thing in the mix: a sweep
of N targets is N + 2 pops every ten seconds, each at gain 0.16 with a
160 ms tail through the whole reverb. A direct network dit at -110 dBm
peaks at 0.078, so the cue that carries no measurement was 2.1 times
over the one that does (efiten#602).

TX_POP holds the levels Kasper chose by ear in a lab on the real engine:
peak 0.05, tail 70 ms, and 15% of the pop through the master and its
reverb send, the rest dry at the same level. The dit is now 1.6 times
over the pop. Every transmission still sounds.

cuePeak is the level cue() plays a direct dit at, exported so the test
can hold the pop against it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@efiten
efiten merged commit 2bfc5fa into efiten:master Sep 30, 2026
6 checks passed
@github-actions github-actions Bot mentioned this pull request Sep 30, 2026
efiten pushed a commit that referenced this pull request Sep 30, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>app: 1.30.0</summary>

##
[1.30.0](app-v1.29.1...app-v1.30.0)
(2026-09-30)


### Features

* **app,web:** ease what the map shows by zoom, on one hex system
([#734](#734))
([4c2a57b](4c2a57b))
* **app,web:** name a relay on the map the way the app does
([#733](#733))
([a9aa01a](a9aa01a))
* **app:** send one broker to several collectors under one switch
([#722](#722))
([8c6da30](8c6da30))
* **web:** export the repeaters heard in view as a 1200×1200 PNG
([#725](#725))
([d6186bc](d6186bc))


### Bug Fixes

* **app,web:** hang a Discover-heard repeater's star from its own
position ([#724](#724))
([15a6ada](15a6ada))
* **app,web:** put the caret in the target picker's search when it opens
([#721](#721))
([6bd899c](6bd899c))
* **app:** drop the float window's previous and next buttons
([#717](#717))
([c957ff3](c957ff3))
* **app:** give the sound the playback buffer instead of the smallest
([#712](#712))
([dee5484](dee5484))
* **app:** hide Chrome's pause on the fullscreen readout
([#715](#715))
([836d91e](836d91e))
* **app:** keep a space under the HUD on Android
([#710](#710))
([2754716](2754716))
* **app:** let the fullscreen readout turn with the phone
([#718](#718))
([fae3749](fae3749))
* **app:** put the transmit pop under the receptions it sat over
([#738](#738))
([2bfc5fa](2bfc5fa))
* **server:** keep the node registry in memory on a loop of its own
([#736](#736))
([4f3e988](4f3e988))
* **web:** keep the map bar on one row between 641 and 767 px
([#732](#732))
([c44dc1d](c44dc1d))
</details>

<details><summary>server: 1.10.1</summary>

##
[1.10.1](server-v1.10.0...server-v1.10.1)
(2026-09-30)


### Bug Fixes

* **server:** keep the node registry in memory on a loop of its own
([#736](#736))
([4f3e988](4f3e988))
* **server:** read a refused frame again when the message-id decoder
changes ([#737](#737))
([8586c71](8586c71))
</details>

<details><summary>web: 1.26.0</summary>

##
[1.26.0](web-v1.25.1...web-v1.26.0)
(2026-09-30)


### Features

* **app,web:** ease what the map shows by zoom, on one hex system
([#734](#734))
([4c2a57b](4c2a57b))
* **app,web:** name a relay on the map the way the app does
([#733](#733))
([a9aa01a](a9aa01a))
* **app:** send one broker to several collectors under one switch
([#722](#722))
([8c6da30](8c6da30))
* **web:** export the repeaters heard in view as a 1200×1200 PNG
([#725](#725))
([d6186bc](d6186bc))


### Bug Fixes

* **app,web:** hang a Discover-heard repeater's star from its own
position ([#724](#724))
([15a6ada](15a6ada))
* **app,web:** put the caret in the target picker's search when it opens
([#721](#721))
([6bd899c](6bd899c))
* **app:** drop the float window's previous and next buttons
([#717](#717))
([c957ff3](c957ff3))
* **app:** give the sound the playback buffer instead of the smallest
([#712](#712))
([dee5484](dee5484))
* **app:** hide Chrome's pause on the fullscreen readout
([#715](#715))
([836d91e](836d91e))
* **app:** keep a space under the HUD on Android
([#710](#710))
([2754716](2754716))
* **app:** let the fullscreen readout turn with the phone
([#718](#718))
([fae3749](fae3749))
* **app:** put the transmit pop under the receptions it sat over
([#738](#738))
([2bfc5fa](2bfc5fa))
* **server:** keep the node registry in memory on a loop of its own
([#736](#736))
([4f3e988](4f3e988))
* **web:** keep the map bar on one row between 641 and 767 px
([#732](#732))
([c44dc1d](c44dc1d))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

app: the auto-discover transmit cues are louder and more frequent than the receptions they sit over

2 participants