Stary syntezator, nowa przeglądarka: jak Web MIDI łączy epoki

Stary syntezator, nowa przeglądarka: jak Web MIDI łączy epoki

Cze 27, 2026 web-midi vintage-hardware javascript retrocomputing music-technology system-exclusive browser-apis hardware-hacking

Problem z komunikacją między przeglądarką a starym sprzętem MIDI

Wyobraź sobie taką sytuację: Twoja aplikacja JavaScript działa na procesorze, który wykonuje miliardy operacji na sekundę. Tymczasem stojący na biurku Yamaha DX7 ma mikroprocesor z 1983 roku, który ledwo osiąga dwa miliony. Kiedy próbujesz połączyć te dwa światy przez Web MIDI API, tak naprawdę prosisz bolid wyścigowy, żeby ciągnął wóz konny — a ten wóz nie wie, jak kazać samochodowi zwolnić.

To nie jest hipotetyczny scenariusz. Programiści tworzącyDAW-y w przeglądarce, biblioteki wirtualnych instrumentów czy panele sterowania sprzętem coraz częściej natykają się na twardą rzeczywistość: vintage'owy sprzęt MIDI nigdy nie był projektowany do odbierania danych z dzisiejszymi prędkościami.

Prawdziwy problem z przepełnieniem bufora

MIDI jako protokół powstało na początku lat 80. z ustaloną prędkością transmisji 31 250 bitów na sekundę. Ta wolniejsza niż dostęp dial-up prędkość oznaczała, że producenci sprzętu budowali malutkie bufory — często zaledwie kilkaset bajtów — do obsługi przychodzących danych. Yamaha DX7 operuje na przykład na buforze RAM o pojemności zaledwie 256 bajtów.

Kiedy przeglądarka wysyła dumpy SysEx przez interfejs USB-na-MIDI, nie throttluje (nie ogranicza) siebie do historycznej prędkości MIDI. Zamiast tego strzela pakietami z prędkością pasma USB, zalewając vintage'owy sprzęt, który nie ma mechanizmu proszenia o pauzę.

Rezultat? Ciche błędy, popsute patche, albo w najgorszym przypadku — syntezator się zawiesza i trzeba go wyłączyć i włączyć. Twój kosztujący tysiąc dolarów DX7 nagle stał się bardzo drogim papierem, bo Twoja aplikacja webowa była zbyt entuzjastyczna w wysyłaniu danych.

Dlaczego sprzętowa kontrola przepływu nie istnieje w MIDI

Protokoły komunikacji sz直直直直直直直直直直直直直直直直直直直直直直直直直直直直直直直直直直 serialnej zwykle zawierają linie handshakingu — piny RTS/CTS pozwalające urządzeniom sygnalizować "przestań wysyłać" albo "jestem gotowy". Kable MIDI mają dokładnie pięć pinów i żaden z nich nie pełni tej funkcji. Specyfikacja po prostu nigdy nie uwzględniła sposobu na komunikowanie zwrotnego ciśnienia przez urządzenie odbierające.

Tworzy to jednokierunkową ulicę, gdzie przeglądarka może wysyłać dane szybciej, niż syntezator jest w stanie je przetworzyć, a syntezator nie ma głosu, żeby powiedzieć "poczekaj". Całe obciążenie spada na oprogramowanie, żeby zaimplementować throttle, który powinien zapewniać sprzęt.

// Minimalne działające rozwiązanie paginacji
async function throttleSysEx(output, data) {
  const PACED_BYTES = 128;
  const DELAY_MS = 80;
  
  for (let offset = 0; offset < data.length; offset += PACED_BYTES) {
    output.send(data.slice(offset, offset + PACED_BYTES));
    await sleep(DELAY_MS);
  }
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Te liczby nie zadziałają dla każdego urządzenia. Niektóre syntezatory potrzebują więcej czasu między kawałkami, szczególnie podczas zapisu do EEPROM czy operacji na pamięci patchy. Eksperymentowanie jest nieuniknione — nie ma uniwersalnego standardu, bo producenci sprzętu nigdy nie wyobrażali sobie, że ktoś będzie wysyłać SysEx z przeglądarki w 2024 roku.

Problem z partycjami producentów

Kiedy rozwiążesz problem prędkości transmisji, napotkasz kolejną barierę: chaos formatów danych. Specyfikacja MIDI definiuje zdarzenia nutowe, zmiany kontrolera i zmiany programu, ale wiadomości System Exclusive — czyli masowe transfery danych zawierające parametry patchy — to wolna amerykanka producentów.

Yamaha, Roland, Korg i każda inna firma produkująca syntezatory wymyśliła własne struktury bajtów, algorytmy sum kontrolnych i formaty dumpów głosów. Twoja aplikacja webowa musi wiedzieć nie tylko z jakim urządzeniem rozmawia, ale dokładnie jaki układ bajtów to urządzenie oczekuje.

Yamaha DX7 oczekuje dokładnie 4104 bajtów na kompletny dump głosu. Wyślij 4103 i odrzuci dane. Wyślij 4105 i może zaakceptować pierwsze 4104 bajty, jednocześnie psując to, co przychodzi potem. Roland Juno-106 podchodzi do tego zupełnie inaczej — odmawia wysłania danych, chyba że człowiek fizycznie zainicjuje dump z panelu przedniego.

Spakowana architektura 7-bitowa Korga dodaje kolejną warstwę złożoności. Ponieważ bajty danych MIDI rezerwują najstarszy bit na sygnalizację statusu, Korg kompresuje dane parametrów do słów 7-bitowych. Wyciąganie rzeczywistych wartości wymaga operacji bitowych i rozpakowywania bajtów, nad którymi każdy doceni nowoczesne architektury 8-bitowe.

Bezpieczeństwo przeglądarek i rzeczywistość Web MIDI API

Web MIDI API jest potężne właśnie dlatego, że może wysyłać surowe dane do zewnętrznego sprzętu. Ta moc czyni je niebezpiecznym. Złośliwa strona mogłaby teoretycznie wgrać firmware do podłączonych urządzeń lub wysłać popsuty SysEx, który zablokuje syntezator.

W rezultacie przeglądarki traktują dostęp MIDI jako operację uprzywilejowaną. Chrome i Edge wymagają wyraźnej zgody użytkownika przed jakąkolwiek komunikacją MIDI. Firefox nigdy nie zaimplementował tego API, powołując się na obawy o fingerprinting i potencjalne ataki wykorzystujące sprzęt. Pozycja Safari zmieniała się przez lata, ale praktyczna rzeczywistość pozostaje: jeśli chcesz, żeby Web MIDI działało niezawodnie, musisz zakładać, że użytkownicy używają przeglądarek opartych na Chromium.

To ograniczenie ma znaczenie przy planowaniu produktu. Narzędzia webowe kierowane do muzyków i entuzjastów sprzętu muszą liczyć się z rzeczywistością, że znaczna część ich odbiorców domyślnie używa Safari lub Firefoxa. Progressive enhancement — gdzie funkcje MIDI działają dla użytkowników Chrome, a dla innych elegancko się wyłączają — staje się niezbędny, nie opcjonalny.

Dlaczego to ma znaczenie dla programistów

Przestrzeń vintage'owych syntezatorów nie jest niszowa. Klasyczny sprzęt osiąga premium ceny na rynku wtórnym właśnie dlatego, że muzycy preferują brzmienie, wrażenia i sposób pracy urządzeń z lat 80. Budowanie narzędzi webowych współpracujących z tym sprzętem to prawdziwa szansa developerska — ale tylko jeśli rozumiesz ograniczenia.

Każdy bajt, który Twoja aplikacja wysyła, przekracza most między epokami obliczeniowymi. Decyzje, które podejmujesz dotyczące paginacji, dzielenia na kawałki i obsługi formatów mogą oznaczać różnicę między narzędziem, które muzycy pokochają, a takim, które niszczy syntezatory warte 2000 dolarów. To odpowiedzialność warta zrozumienia.

Jeśli budujesz aplikacje webowe z obsługą MIDI, zacznij od najwolniejszej możliwej prędkości transmisji, testuj na prawdziwym sprzęcie wcześnie i często, i nigdy nie zakładaj, że "działało w moim emulatorze" oznacza cokolwiek dla prawdziwych urządzeń. Emulator nie ma bufora 256 bajtów, który może się przepełnić. Syntezatory Twoich użytkowników — mają.

Read in other languages:

RU BG EL CS UZ TR SV FI RO PT NB NL HU IT FR ES DE DA ZH-HANS EN