# v2.6.0 β€” Audio Sonification, Regional Hop Filtering, Audio Lab ## πŸ”Š Mesh Audio Sonification Packets now have sound. Each packet's raw bytes become music through a modular voice engine. - **Payload type β†’ instrument + scale**: ADVERTs play triangle waves on C major pentatonic, GRP_TXT uses sine on A minor pentatonic, TXT_MSG on E natural minor, TRACE on D whole tone - **Payload bytes β†’ melody**: √(payload_length) bytes sampled evenly, quantized to scale - **Byte value β†’ note duration**: low bytes = staccato, high = sustained - **Byte delta β†’ note spacing**: small deltas = rapid fire, large = pauses - **Observation count β†’ volume + chord voicing**: more observers = louder + richer (up to 8 detuned voices via logβ‚‚ scaling) - **Hop count β†’ filter cutoff**: more hops = more muffled (lowpass 800-8000Hz) - **Node longitude β†’ stereo pan** - **BPM tempo slider** for ambient ↔ techno feel - **Per-packet limiter** prevents amplitude spikes from overlapping notes - **Exponential envelopes** eliminate click/pop artifacts - **"Tap to enable audio" overlay** handles browser autoplay policy - **Modular voice architecture**: engine (`audio.js`) + swappable voice modules. New voices = new file + script tag. ## 🎡 Audio Lab (Packet Jukebox) New `#/audio-lab` page for understanding and debugging the audio: - **Packet buckets by type** β€” representative packets spanning size/observation ranges - **Play/Loop/Speed controls** β€” trigger individual packets, 0.25x to 4x speed - **Sound Mapping panel** β€” shows WHY each parameter has its value (formulas + computed results) - **Note Sequence table** β€” every sampled byte β†’ MIDI note β†’ frequency β†’ duration β†’ gap, with derivation formulas - **Real-time playback highlighting** β€” hex dump, note rows, and byte visualizer highlight in sync as each note plays - **Click individual notes** β€” play any single note from the sequence - **Byte Visualizer** β€” bar chart of payload bytes, sampled bytes colored by type ## πŸ—ΊοΈ Regional Hop Filtering (#117) 1-byte repeater IDs (0-255) collide globally. Previously, resolve-hops picked candidates from anywhere, causing false cross-regional paths (e.g., Eugene packet showing Vancouver repeaters). - **Layered filtering**: GPS distance to IATA center (bridge-proof) β†’ observer-based fallback β†’ global fallback - **60+ IATA airport coordinates** built in for geographic distance calculations - **Regional candidates sorted by distance** β€” closest to region center wins when no sender GPS available - **Sender GPS as origin anchor** β€” ADVERTs use their own coordinates; channel messages look up sender node GPS from previous ADVERTs in the database - **Per-observer resolution** β€” packet list batch-resolves ambiguous hops per observer via server API - **Conflict popover** β€” clickable ⚠ badges show all regional candidates with distances, each linking to node detail - **Shared HopDisplay module** β€” consistent conflict display across packets, nodes, and detail views ## 🏷️ Region Dropdown Improvements (#116) - **150+ built-in IATA-to-city mappings** β€” dropdown shows `SEA - Seattle, WA` automatically, no config needed - **Layout fixes** β€” dropdown auto-sizes for longer labels, checkbox alignment, ellipsis overflow ## πŸ“ Location & Navigation - **Packet detail shows location** for ADVERTs (direct GPS), channel texts (sender node lookup), and all resolvable senders - **πŸ“ Map link** navigates to `#/map?node=PUBKEY` β€” centers on the actual node and opens its popup - **Observer IATA regions** shown in packet detail, node detail, and live map node panels ## πŸ”§ Fixes - **Realistic mode fixed** β€” secondary WS broadcast paths (ADVERT, GRP_TXT, TXT_MSG, TRACE) were missing `hash` field, bypassing the 5-second grouping buffer entirely - **Observation count passed to sonification** β€” realistic mode now provides actual observer count for volume/chord voicing - **Packet list dedup** β€” O(1) hash index via Map prevents duplicate rows - **Observer names in packet detail** β€” direct navigation to `#/packets/HASH` now loads observers first - **Observer detail packet links** β€” fixed to use hash (not ID) and correct route - **Time window bypassed for direct links** β€” `#/packets/HASH` always shows the packet regardless of time filter - **CI: `docker rm -f`** β€” prevents stale container conflicts during deploy - **CI: `paths-ignore`** β€” skips deploy on markdown/docs/license changes