Skip to main content

Sourced from docs/sfx-map.md in the firmware repo.

Nimbus SFX - action → audio map

Generated by tools/sounds/gen_sfx_map.py from palette.py (curation) and lib/core/src/sfx_map.cpp (per-mode level thresholds). Do not edit by hand - re-run the generator.

Every device action maps to a short, wordless sound cue - synthesized tones sharing one musical palette, so the device sounds like one instrument. What you actually hear depends on three axes:

  • Mode - Notifier (status display; deliberately sparse - the broker floods job events during a coding session) vs Orchestrator (the agent).
  • Level (verbosity) - none (0, silent) · light (1) · medium (2) · heavy (3); shown in the UI as Off / Low / Medium / High. An action fires when the mode's level ≥ its threshold below. Defaults: Notifier none (silent out of the box), Orchestrator medium.
  • Storage tier - with no SD card the device plays the small embedded set (the attention-critical events below); with an SD card it resolves custom → theme → general → embedded → silence, adding variants and the full 24-event coverage. Missing files fall through silently by design.

Your own sounds: drop 22.05 kHz mono 16-bit WAVs named <slug>-<n>.wav (n from 0) into /sfx/custom/ on the SD card - they win over every built-in pool and are never touched by the background sync.

Event map

eventOrchestrator ≥Notifier ≥embeddedSD variants (general + theme)
bootlightmediumgeneral×2 + pulse×2
wifi_upmediumheavygeneral×2 + pulse×2
wifi_downmediumheavygeneral×2 + pulse×2
ble_upmediumheavygeneral×2 + pulse×2
ble_downmediumheavygeneral×2 + pulse×2
ble_bondmediummediumgeneral×2 + pulse×2
agent_spawnmedium-general×3 + pulse×3
agent_donemediumheavygeneral×3 + pulse×3
errorlightlightgeneral×2 + pulse×2
needs_youlightlightgeneral×3 + pulse×3
low_batterylightlightgeneral×2 + pulse×2
battery_okmediumheavy-general×2 + pulse×2
mode_switchmediummediumgeneral×2 + pulse×2
sd_mountedmedium--general×2 + pulse×2
sd_lostmedium--general×2 + pulse×2
turn_startheavy--general×3 + pulse×3
reply_sentheavy--general×3 + pulse×3
voice_listenheavy--general×2 + pulse×2
voice_stopheavy--general×2 + pulse×2
mem_savedheavy--general×2 + pulse×2
net_degradedheavy--general×2 + pulse×2
net_okheavy--general×2 + pulse×2
ask_clearedheavy--general×2 + pulse×2
sync_doneheavy--general×2 + pulse×2

Themes

One theme ships today - Pulse (alternate-seed renders of the same tone recipes, audibly distinct takes). The device resolves any /sfx/<theme>/ directory by name, so new themes are a content drop, not a firmware change.

Events absent from the embedded tier are silent without an SD card - a deliberate degradation, never an error.