• docs/superpowers/specs/2026-07-16-syncretro-lobby-enter-sound-design.m

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Fri Jul 17 02:57:08 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/e3024f0fc318a49f4e2f0967
    Added Files:
    docs/superpowers/specs/2026-07-16-syncretro-lobby-enter-sound-design.md Log Message:
    docs: design for a SyncRetro lobby enter_sound

    SyncDuke and SyncDOOM play a one-shot, sysop-supplied sound when a player enters the lobby. The SyncRetro consoles (SyncNES, SyncIvision) don't. The mechanism is already shared -- game_lobby.js's enter_sound(), which syncretro_lobby.js already loads -- so this is a call, an ini key and docs.

    Records the two decisions that took the most getting to:

    - No built-in sound. A synthesized blip would need no asset and would reach
    terminals that have the audio APC but no libsndfile, but A;Synth has no
    envelope, and a console effect is mostly its decay. And a Synth sequence
    tuned until it reproduces a specific game's sound is a derivative of that
    sound -- arriving as code rather than a WAV changes nothing. Only a
    generic blip is clean, and that isn't what the feature is for.

    - The key is [lobby] enter_sound, not [audio]. [lobby] is game_lobby.js's
    contract and matches the siblings; SyncRetro's [audio] documents the
    in-game Opus stream from the core, which a one-shot lobby SFX shares
    nothing with.

    Also records a concern that was raised and disproved, so it isn't chased
    again: enter_sound's fixed "lobby_enter" name does NOT defeat a wildcard's per-entry randomness, because enter_sound loads cterm_lib.js into a fresh
    scope each call, so its upload-once cache starts empty every entry. Verified under jsexec.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net