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

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, 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