Technologia rozwiązań

Technologia, która słyszy muzykę

MGWP Music nie jest kolejnym playerem. Każdy utwór niesie własny profil EQ, strumień jest bezstratny, a wizualizacje są dowodem dźwięku — nie dekoracją. Poniżej: realne problemy branży i jak je rozwiązujemy.

Najczęstsze problemy — i jak je rozwiązujemy

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

Źródła analizy

  • ITU-R BS.1387 / PEAQ — Percepcyjna ocena jakości audio (skala ODG).
  • ISO 226:2023 — Krzywe jednakowej głośności — ucho czułe na skrajne pasma.
  • The Velvet Sundown (Suno) — Afera AI-music ghost artists, The Guardian.
  • Liz Pelly "Mood Machine" — Krytyka algorytmicznych playlist / PFC.
  • MDN / W3C Web Audio API — AudioWorklet, OffscreenCanvas, BiquadFilterNode, AudioParam.
  • Exponential Backoff with Jitter — Obrona przed retry storm / thundering herd.

Per-track EQ (żywa wizualizacja)

Fiolet = bass-heavy, róż = treble-heavy. Ten sam silnik reshapuje się per utwór (eqLevels + BPM).

Waveform timeline (vizData peaks)

Rysowane z lekkiego JSON peaków — 0 dekodowania, 60 fps (jak SeekWaveform).

Tryb Party: radialny EQ z BPM

Jeden silnik EQ, zwinięty w koło. Rotacja i "pompowanie" zależą od BPM utworu — wizualizacja idealnie zsynchronizowana z pulsem, bez zawieszeń UI (OffscreenCanvas / rAF).

MGWP nie dubluje radial/horizontal w osobnych komponentach — to ten sam blok EQ, inne zastosowanie.