Analiza oparta na badaniach (Google Deep Research, 2024–2026): ITU-R BS.1387/PEAQ, ISO 226:2023,
afera The Velvet Sundown, MDN/W3C Web Audio. Rozwiązania zweryfikowane wobec kodu MGWP.
⚠ Stratna kompresja niszczy percepcję
Kodeki stratne (MP3/AAC/Ogg) przy niskim bitrate używają maskowania psychoakustycznego, co generuje pre-echo, ucina transjenty i męczy ucho (PEAQ/ODG).
Rozwiązanie: MGWP strumieniuje wyłącznie bezstratny materiał (FLAC, bit‑perfect z masteringowego WAV) przez dedykowany endpoint /api/stream — żadnych stratnych kodeków, bitowa przejrzystość materiału.
Dowód: Endpoint /api/stream serwuje static/audio/* (lossless FLAC, −40% vs WAV); 63/63 pliki istnieją.
Źródło: ITU-R BS.1387 (PEAQ/ODG), ISO 226:2023
⚠ Globalny EQ spłaszcza charakter utworu
Jeden globalny korektor nakłada identyczne podbicie na każdy gatunek — bas dudni w klasyce, znika headroom, słuchacz dostaje przerysowane spektrum.
Rozwiązanie: MGWP niesie per-trackowy profil 5-pasmowy (eqLevels) + BPM z tracks.json. EQ wizualny realnie reshapuje się per utwór (scaleToMax, NIE min-max), a BPM synchronizuje tryb Party.
Dowód: eqBand.ts + FastEQ.svelte; e2e bass-vs-treble reshape 9/9; 63 unikalne eqLevels + bpm 104–176.
Źródło: MDN Web Audio API (BiquadFilterNode / AudioParam)
⚠ Dekodowanie audio na żywo zjada RAM i zamraża UI
decodeAudioData godziny stereo 48kHz = ~1.3 GB RAM; rysowanie Canvas na głównym wątku powoduje frame drops, zwłaszcza na High-DPI/4K.
Rozwiązanie: MGWP pobiera lekkie vizData (peaks JSON z serwera) i rysuje waveform przez SeekWaveform — milisekundy, 0 dekodowania, 60 fps.
Dowód: SeekWaveform.svelte; waveformNonZero=2026 px przy weryfikacji; zastąpił psujący wavesurfer.js.
Źródło: MDN OffscreenCanvas, requestAnimationFrame
⚠ Artyści-widma (ghost artists) i zanieczyszczone katalogi
Modele AI (Suno) masowo produkują fałszywe utwory z wykreowanymi biografiami, drenując tantiemy (aferze The Velvet Sundown).
Rozwiązanie: MGWP wymusza twardą higienę: widoczne tylko status=live. Brak litości dla syntetyki = realna gratyfikacja ludzkiego kunsztu.
Dowód: 0 soft-deleted w lokalnej DB; query tylko status=live.
Źródło: The Guardian / The Velvet Sundown, Liz Pelly "Mood Machine"
⚠ Audio 404 / przerwane strumienie = martwa cisza
Błędy 5xx/429 lub utrata zasięgu trwale zatrzymują odtwarzanie; naiwny retry loop wywołuje "thundering herd".
Rozwiązanie: /api/stream wspiera Range/Content-Range (wznawianie od dowolnego bajtu) + resilient retry (Exponential Backoff z Jitterem).
Dowód: src/routes/api/stream/+server.ts: Accept-Ranges + Content-Range + Range handling.
Źródło: MDN Range requests, Exponential Backoff with Jitter
⚠ Regresje: zombie procesy, stale SW, segfaulty
Niezamknięty AudioContext (React StrictMode) tworzy "zombie", stale Service Worker blokuje Range, segfaulty przy buildzie.
Rozwiązanie: MGWP: TDD + CI, wersjonowanie cache (CACHE_VERSION bump), kill starych listenerów :3000, restore known-good z v1.0-gold-master.
Dowód: service-worker.js CACHE_VERSION; eqBand 20/20 + e2e-eq 9/9; memory: "reactive patching cascades regressions".
Źródło: React 18 StrictMode, Service Worker caching best practices