Biblioteka AMIDI (mała zapowiedź)

Dawno nic nie pisałem, więc postaram się to naprawić. W końcu żeby nie było, że tylko się obijam ;). Ostatnie kilka miesięcy było trochę pracowitych życie(tm), przeprowadzka do nowego HQ. Na całe szczęście udało mi się rozstawić sprzęt i ruszyć prace nad projektem, nad którym pracuję z większymi lub mniejszymi przerwami, od początku września tego roku.
I właśnie na temat tego projektu chciałbym trochę poopowiadać.

Słowem wstępu…

Jeżeli czytają to osoby, które śledzą projekty typu opensource typu ScummVM/Exult/DOSbox na pewno wiedzą z jakimi problemami wiąże się odtwarzanie plików MIDI (w różnej postaci).
Emulacja starych modułów nie jest w 100% idealna, zestawy instrumentów różnią się pomiędzy urządzeniami MIDI (weźmy sobie na ten przykład starego Rolanda MT-32 i nowsze urządzenia w standardzie GM/GS) co wpływa na sposób odtwarzania danych z pliku z danymi MIDI.
Jako, że od jakiegoś czasu ostrzę sobie zęby na przeportowanie projektu Exult (interpreter gry RPG Ultima VII (Origin)) na Atari Falcon 030 zauważyłem pewne luki. Otóż mimo tego, że na Atari ST/TT/Falcon są naprawdę dobre sekwencery typu Cubase, Sweet16 etc.. to

  1. nie ma prostego, dobrego programu/biblioteki do odtwarzania plików MID(0,1,2), XMI, SMF z playlisty (oczywiście w pełni wykorzytującego dostępny RAM (ST-RAM i FastRam)).
  2. Nie ma wsparcia dla portów MIDI Atari w bibliotece SDL_mixer.
  3. Nie ma bibliotek, które umożliwiałyby odtwarzanie ww. formatów plików w aplikacjach dla TOSa i MiNTa i mogłyby być ponownie użyte w projektach opensource pod kątem wydajności i łatwości obsługi.
    Obecnie są porty Doom’a, Hexen’a, Heretica, niestety bez obsługi MIDI. Emulacja software’owa syntezy dźwięku starych modułów jak Roland MT-32 (MUNT) czy też nowszych w standardzie GM dla 16/32 bitowych Atari nie wchodzi w grę (nawet najmocniejsze komputery PC sobie z tym nie radzą).

Ale co w takim razie jest możliwe?

  • Wszystkie Atari 16/32 bit są wyposażone w porty MIDI(IN/OUT) od około 85 roku (miażdżące! innymi słowy są po prostu jak darmowe piwo). Pomijam tutaj fakt, że możliwe jest wysyłaanie/odbieranie danych MIDI przez port RS232, ale do naszych celów nie jest to potrzebne, bo w naszym założeniu, będziemy obsługiwali jedno zewnętrzne urządzenie określonego typu (kompatybilne z Rolandem MT-32 lub kompatybilne z GM/GS).
  • Stare moduły typu Roland MT-32/CM-32L/CM-64/CM-500/SC-55 są nadal dostępne. Ich koszt nie jest duży (,ale z tym to już różnie bywa). Generalnie są dostępne na Allegro i eBay’u.
  • Falcon030 ma superskomplikowaną macierz dźwiękową, która umożliwia miksowanie (w większości wypadkach nieużywaną) dźwięku ze źródła zewnętrznego (np. z naszego modułu MIDI). W związku z tym możemy używać naszej maszyny jako miksera (ewentualnie możemy użyć miksera zewnętrznego).

I tutaj dochodzimy do tematu oprogramowania – jako takiego nie ma… Trzeba zrobić ;)).. I właśnie tutaj wkracza biblioteka AMIDI (czyli taki skrót od Atari MIDI, tak wiem mało oryginalnie).
Całość jeszcze nie jest skończona (można powiedzieć, projekt obecnie znajduje się na półmetku, między innymi z tego powodu jest ten post), ale przy pierwszym oficjalnym releasie udostępnię pełen kod źródłowy (na licencji GPL v.3). Aktualnie całość jest pisana w Pure C, ale planuję później migrację kodu na gcc 4.3.2 oraz dodanie jakiegoś wrappera w c++.

Co zostało do tej pory zrobione:

  • dekodowanie MIDI (0,1,2), zaimplementowana pełna lista rzeczy, które można spotkać w plikach MIDI
  • wysyłanie komend MIDI (pełen zestaw) przez wbudowany port Atari MIDI OUT
  • podstawowe funkcje do obsługi, zmiany ustawień modułów Rolanda (LA,GS)
  • konfigurowalna wielkość domyślnego bufora MIDI (nie będzie już strasznego “MIDI buffer overflow”)

Do zrobienia:

  • wrzucenie zdekodowanych danych do struktury optymalnej dla 16/32 bitowych Atari w zalezności też od podłączonego modułu dźwiękowego (zmiana np. mapowania instrumentów (MT32->GS),(GS->MT32) )
  • opracowanie procedur odtwarzających listę zdarzeń MIDI z przygotowanej wcześniej struktury (żadnych dodatkowych obliczeń, tylko przejście po liście i wysłanie co określony interwał zawartości bufora MIDI)
  • zaimplementowanie proste zarządzanie stanem podłączonego modułu
  • funkcje do obsługi macierzy dźwięku w Falcon 030
  • dekodowanie i obsługa specjalnych kontrolerów w plikach XMIDI
  • dekodowanie SMF (to już prawie jest)
  • dekodowanie RMID (czyli MID zapisany w standardzie EA IFF)
  • dodanie funkcjonalności ładowania danych SySex załączonych w oddzielnych plikach (bez konieczności używania zewnętrznych programów)
  • testy, testy, więcej testów

Po zaimplementowaniu tej bazy funkcjonalności przyjdzie kolej na napisanie klienta, który będzie korzystał z tej biblioteki (jeszcze nie zdecydowałem czy interfejs będzie w GEM czy też będzie aplikacja z własnym interfejsem graficznym). Możliwe będzie także stworzenie drivera MIDI dla SDL_mixera.
Więcej informacji wkrótce….


O wpisie