Obsah
Použití naší hudby v ASM projektu
LnxTracker neexportuje samotnou přehrávací rutinu, která by se nahrála do ZX Spectra a jen spustila. Exportují se pouze hudební data, která se připojí k přehrávací rutině v Assembler editoru obsaženou v LnxSpectrum emulátoru. LnxTracker zatím neobsahuje kompiler takového kódu.
Export z LnxTrackeru
V našem prvním příkladu si ukážeme základní použití naší hudby v našem ASM projektu. Testovací skladba se bude přehrávat na čipu AY a SAA současně (celkem 9 kanálů, režim SAAY).
Jako první si vyexportujem soubor s naší skladbou z LnxTrackeru. Použijeme typ Music
, což je jeden soubor, kompletní balíček který obsahuje vše potřebné pro přehrávání. Získáme tím soubor BIN, který můžeme použít v našem ASM projektu. Nepoužité samply a patterny se do BIN souboru neukládají.
LnxSpectrum assembler
Nyní se přesuneme do Assembler editoru v ZX Spectrum emulátoru LnxSpectrum. V ASM editoru založíme nový prázdný projekt. Poté připojíme do ASM projektu námi vyexportovaný soubor BIN z LnxTrackeru:
Následně připojíme naše data do ASM projektu a také přilinkujeme hudební rutinu pomocí include
. Přehrávací rutina je součástí vnitřní knihovny kompileru. Napíšeme tento kód:
org 50000 include "LnxTrackerEngine.slb" ;hudební rutina LnxTrackeru include "TestMusic.bin" ;naše exportovaná data z LnxTrackeru
Stiskněte dole tlačítko Build. Přepneme vlevo dole Tab z Regions na Labels (seznam návěstí), a do okna Filter zapíšeme „mus.“. Tím si zobrazíme jen návěstí z hudební rutiny.
Pro náš základní příklad potřebujeme 4. Jsou to:
- mus.LoadPlay (Inicializuje skladbu a následně spustí)
- mus.int_Patterns (Přerušení pro přehrávání skladby)
- mus.int_AY (Přerušení pro ovládání AY čipu)
- mus.int_SAA (Přerušení pro ovládání SAA čipu)
Pro správný chod hudební rutiny je potřeba některé části volat 50x za sekundu, ideálně při každém přerušení. Tyto rutiny by se měly volat neustále, i když žádná skladba aktuálně není přehrávána. Je to mus.int_Patterns
, který se stará o přehrávání skladby, a dále mus.int_AY
a mus.int_SAA
, které se starají o přehrávání zvuků na čipech.
Pokud naše skladba má hrát pouze na čipu AY, použijeme pouze mus.int_AY
. Pokud má hrát pouze čip SAA, použijeme pouze mus.int_SAA
. Pokud je skladba jak pro čip AY, tak pro čip SAA, musíme volat oba. Pokud některé nepoužijeme, výsledný program se nám o něco zkrátí, protože se do projektu nebudou tyto rutiny připojovat.
Za ORG 50000 doplníme tento kód:
ld de,hudba ;Adresa našich hudebních dat call mus.LoadPlay ;a inicializujeme skladbu a spustíme přehrávání ei ;Povolíme přerušení loop call mus.int_Patterns;Zpracujeme skladbu call mus.int_AY ;Zpracujeme AY čip call mus.int_SAA ;Zpracujeme SAA čip halt ;a počkáme na další přerušení. jr loop ;vše opakujeme
Nyní stiskneme dole tlačítko Start a náš program se spustí.
Jako první po spuštění se do registru DE uloží adresa našich dat exportovaných z LnxTrackeru. Zavolá se mus.LoadPlay
rutina, ta inicializuje naší skladbu a spustí její přehrávání. O ostatní se již postará přerušení, které jsem v našem případě nasimuloval smyčkou s instrukcí halt
. Ta bude stále dokola volat 50x za sekundu potřebné rutiny… a už to hraje!
Popis návěstí hudební rutiny
Návěstí | Typ | Popis |
---|---|---|
mus.LoadPlay | Call | Inicializuje a spustí přehrávání hudby. V registru DE musí být adresa dat exportovaných z LnxTrackeru. |
mus.Load | Call | Inicializuje hudbu k přehrávání. V registru DE musí být adresa dat exportovaných z LnxTrackeru. |
mus.Play | Call | Spustí přehrávání hudby, inicializovanou pomocí mus.Load . |
mus.Stop | Call | Zastaví přehrávání hudby. |
mus.module_smp | Word | Zde se nachází adresa sady samplů pro hudbu. |
mus.PlaySmp | Call | Spustí sampl z registru L, v IX musí být adresa na SampleInfoBlok , viz. mus.GetChan . |
mus.module_effect | Word | Zde se nachází adresa sady samplů pro efekty. |
mus.PlayEffect | Call | Spustí efekt z registru L, v IX musí být adresa na SampleInfoBlok , viz. mus.GetChan . |
mus.SampleStop | Call | Zastaví přehrávání samplů (jednorázově). Typické použití: Po zastavení přehrávání hudby samply dozní, ale některé můžou mít smyčku a zní stále dokola. Tímto tomu zamezíme. |
mus.GetChan | Call | V HL i IX vrací adresu na SampleInfoBlok konkrétního kanálu z registru A (0-11). 0-2 je AY1, 3-5 je AY2 (TS), 6-11 je SAA. Tato hodnota se již dále nemění, není potřeba jí zjišťovat znovu a znovu. |
mus.int_Patterns | Call 50x | Rutina starajicí se o přehrávání hudby. Volá se 50x za sekundu. |
mus.int_TS | Call 50x | Rutina starajicí se o TurboSound (2xAY), volá se 50x za sekundu. |
mus.int_AY | Call 50x | Rutina starajicí se o AY, volá se 50x za sekundu. |
mus.int_SAA | Call 50x | Rutina starajicí se o SAA, volá se 50x za sekundu. |
mus.int_All | Call 50x | Rutina starajicí se o všechny čipy, 2xAY a SAA, volá se 50x za sekundu. |