Files
meshcore-analyzer/RELEASE-v2.6.0.md
T

65 lines
4.4 KiB
Markdown

# 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