====== 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í.
{{ :lnxtracker:lnxtracker_export2.jpg?nolink |}}
===== 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:
{{ :lnxtracker:lnxtracker_export3.jpg?nolink |}}
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.
{{ :lnxtracker:lnxtracker_export4.jpg?nolink |}}
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.
----
{{:info.png?nolink&64 |}}//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! :-D
{{ :lnxtracker:lnxtracker_export5.jpg?nolink |}}
===== 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. |