mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-03-29 08:29:55 +00:00
4.4 KiB
4.4 KiB
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, WAautomatically, 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
hashfield, 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/HASHnow loads observers first - Observer detail packet links — fixed to use hash (not ID) and correct route
- Time window bypassed for direct links —
#/packets/HASHalways 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