ZAJÍMAVOSTI O CMC

Zkratka "CMC" v titulu tohoto článku znamená "Chaos Music Composer", což je pěkný hudební editor od Janusze Pelce z polska, vydaný firmou L.K.Avalon. Tento editor dosáhl poměrně značného rozšíření, před několika lety v něm vznikaly téměř všechny hudební skladby v polských programech. Dnes je sice vytlačován ze scény programem Music ProTracker, který má o něco větší možnosti, v jednoduchosti ovládání je však CMC prakticky neporazitelný. To ho spolu se stále nadprůměrnými zvukovými možnostmi do budoucna předurčuje především pro "méně profesionální" uživatele, kteří ho asi sotva někdy zcela opustí.

CMC má bohužel i nevýhody. Návod dodávaný s programem obsahuje všechny nezbytné informace, v náročnějších případech začleňování hudby do vlastních programů se však může ukázat přece jen příliš stručný. Kromě toho obsahuje přehrávací rutina generovaná CMC některé chyby - mohou mít za následek nepříjemné "výkřiky" v pauzách původní skladby, jejichž výskyt zdánlivě postrádá logický vztah k čemukoliv.

Tento článek si klade za cíl podat alespoň několik málo užitečných informací o CMC.

FORMÁT SOUBORŮ

V některých situacích je užitečné znát formát souborů, do kterých CMC ukládá hudební skladby. Tyto soubory slouží současně jako vstupní data pro přehrávací rutinu při začleňování hudby do vlastních programů.

Jedná se o běžné binární segmentované soubory, které pochopitelně začínají standardní hlavičkou. Přesun hudby na jinou adresu však nelze realizovat pouhou změnou hlavičky - soubor obsahuje i další absolutní adresy, které umí správně upravit pouze CMC.

Obsah souboru je následující (pozice jsou v datovém bloku - např. v paměti - pozice v souboru získáme přičtením šesti):

0: Identifikace souboru (19 bytů). Jedná se o inverzní text " cmc data file " doplněný ještě o několik grafických znaků.

$13: Tempo.

$14: Adresy definic "patternů" - nižší byty.

$54: Adresy definic "patternů" - vyšší byty. Může jich být až 64, tato tabulka obsahuje absolutní adresy, na kterých příslušné definice začínají. (To je také důvodem, proč musí být soubor při přesunu na jinou adresu upraven CMC.) Prázdné "patterny" nemají definice, v tom případě obsahuje vyšší byte v této tabulce hodnotu $FF.

$94: Definice nástrojů - první tabulka.

$130: Definice nástrojů - druhá tabulka. Nástrojů je celkem 26, každému z nich patří 6 bytů v první tabulce a 8 bytů v druhé. První 4 byte z první tabulky odpovídají řídicím kódům, které v CMC vidíme na pravé straně okénka "instr". Bity D2 a D3 v prvním bytu (které nejsou v CMC běžně přístupné) jsou využity pro jakési interní účely, bity D3 a D4 ve druhém bytu (rovněž v CMC nedostupné) pak definují klouzavé zvuky nahoru resp. dolů, které v CMC označuje malá šipka. Zbývající 2 byty z první tabulky obsahují tzv. akcenty - zobrazované v CMC pod definicí hlasitosti. Každé pozici přísluší jeden bit, první je nejvyšší. Všech osm bytů z druhé tabulky pak obsahuje definici průběhu hlasitosti - dvě pozice v jednom bytu, první je spodní polovina.

$200: První stopa "songu".

$255: Druhá stopa "songu".

$2AA: Třetí stopa "songu". Tyto stopy odpovídají třem sloupcům v okně "song" v CMC, každá má 85 bytů. Obsahují čísla "patternů", nebo hodnotu $FF pro prázdné pozice. První stopa může navíc obsahovat následující zvláštní kódy:
$8F: Stop (SHIFT S)
$9F: Jump (SHIFT J)
$AF: Relativní skok nahoru (SHIFT+U)
$BF: Relativní skok dolů (SHIFT+D)
$CF: Nové tempo (SHIFT+T)
$DF: Opakování (SHIFT+R)
$EF: Break (SHIFT+B)
$FE: Prázdný řádek - bude přeskočen
Parametry jsou uloženy v dalších stopách, stejně jako v okně "song" v CMC.

$300: Začátek definic "patternů", délka závisí na jejich počtu a obsahu. Použité kódy jsou následující:
$00-$19: Nastavení čísla nástroje pro další tóny
$40-$7E: Tóny ($40 je C-1, $41 je C#1 atd.)
$80-$BD: Počet prázdných řádků zvětšený o $7F
$FF: Konec.

PŘEHRÁVACÍ RUTINA

Jak víme z návodu, přehrávací rutina má na svém počátku tři instrukce JMP a tři proměnné určené ke spolupráci s nadřízeným programem (pozice jsou od počátku přehrávací rutiny):
0: JMP rutina pro BASIC
3: JMP komunikační rutina
6: JMP přehrávací rutina
9: Hlasitost (3 byte pro 3 hlasy)

První rutina se volá z BASICu pro zahájení hudby příkazem USR (adresa přehrávací rutiny, číslo skladby, adresa hudebního souboru v paměti), pro ukončení pak USR (adresa přehrávací rutiny). Pokud je v souboru více skladeb, musí být v okně "song" odděleny povelem SHIFT+S nebo SHIFT+B; v BASICu se číslují od jedné.

Druhá a třetí rutina slouží pro práci v assembleru. Druhou rutinu používáme k ovládání přehrávače, třetí musíme zařadit do obsluhy VBI, nebo ji jiným způsobem pravidelně vyvolávat. Nastavení registrů pro druhou rutinu je následující:
A=0, X=číslo skladby (zde od 0) - Zahájit přehrávání
A=$10, X=pozice - Zahájit přehrávání
A=$20+číslo kanálu, X=číslo tónu (zde od 0), Y=číslo nástroje - Vnucení cizího tónu do skladby (zvukový efekt)
A=$30, X=tempo - Změna rychlosti
A=$40 - Konec přehrávání (ticho)
A=$50 - Přerušení přehrávání (nástroje dozní)
A=$60 - Pokračování po přerušení
A=$70, Y/X=horní/dolní byte adresy hudebního souboru - Inicializace, MUSÍ být první operací!

To je vše, co se v návodu dočteme. Obvykle to stačí, pokud však chceme zvukové efekty synchronizovat s rytmem hudby, nebo dokonce podle potřeby přepínat různé části melodie, musíme komunikační rutinu vyvolat "v pravý čas". Ten rozpoznáme čtením následujících vnitřních poměnných přehrávače:
$0C: Příští pozice v "patternu". Nula zde znamená, že je třeba přečíst další řádek ze "songu" (to bývá ten zmíněný "pravý čas", je však třeba vzít v úvahu také čítač pro tempo).
$0D: Příští pozice v "songu"
$3E: Čísla "patternů" pro všechny tři kanály
$55: Čítač pro tempo. Počítá při každém vyvolání přehrávací rutiny, od hodnoty "tempo" k nule.

Výše uvedené adresy se týkají přehrávače, který generuje CMC verze 2.0. Nevím, zda existují ještě jiné verze, proto si raději před použitím uvedených informací číslo verze zkontrolujte!

Zajímavým příkladem použití výše uvedených adres je hudba ze hry HELIX, která je zkomponována ve 3/4 taktu. Jednoduchá rutina obsluhy VBI v této hře přinutí přehrávací rutinu k přeskakování poslední čtvrtiny každého "patternu":

    
    VBI      JSR  REPLAY+6
             LDA  REPLAY+$0C
             EOR  #$30
             BNE  VBIEXIT
             STA  REPLAY+$0C
    VBIEXIT  JMP  $E462

Na závěr ještě jedna rada: Pokud nepoužíváme BASIC, můžeme s klidným svědomím přemazat část přehrávací rutiny (z CMC verze 2.0) od pozice REPLAY+$75A do konce. Tato část obsahuje pouze podprogram pro volání z BASICu.

CHYBY PŘEHRÁVAČE

Přehrávací rutina z CMC bohužel obsahuje dvě chyby, které mohou způsobit neočekávané reakce hudby na změny v jinak nesouvisejících oblastech paměti. Nejčastěji se jedná o překvapivé "výkřiky" v pauzách, které se objeví zpravidla po odklopení OS-ROM.

První chyba: Přehrávač správně nerozpoznává prázdné pozice v "songu", které pak interpretuje jako podivný "pattern" z téměř libovolné adresy v paměti.

Náprava: Instrukci CMP #$40 na pozici REPLAY+$409 změnit na CPY #$40. (Autor se zjevně dopustil překlepu.)

Druhá chyba: Pokud je v "songu" specifikován "pattern", který je prázdný, může být přehrána nahodilá sekvence z nějaké adresy $FFxx. Přehrávač totiž vůbec nepočítá s prázdnými "patterny", jejichž označení hodnotou $FF místo horního bytu adresy interpretuje jako adresu $FFxx.

Náprava: Před spuštěním hudby provést úpravu hudebního souboru pomocí následující rutiny. Tím budou všechny prázdné "patterny" nahrazeny společnou definicí, která se skládá pouze ze zakončovací značky.

                LDX  #$3F
        LABEL1  LDY  MUSIC+$54,X
                INY
                BNE  LABEL2
                LDA  #ADRFF:L
                STA  MUSIC+$14,X
                LDA  #ADRFF:H
                STA  MUSIC+$54,X
        LABEL2  DEX
                BPL  LABEL1

"MUSIC" je adresa hudebního souboru v paměti, "ADRFF" je adresa jednoho bytu s hodnotou $FF - takový lze buď nalézt přímo v souboru (vždy tam je, obvykle vyhovuje poslední byte), nebo definovat v programu. Upravený soubor slouží pouze k přehrávání, jeho zpětné zavedení do CMC je nepřípustné!

ZÁVĚREM

Doufám, že informace uvedené v tomto článku čtenářům FLOPu alespoň trochu pomohou při práci s CMC. V každém případě doporučuji používat ve všech programech popsané nápravy chyb přehrávače, protože bez toho může hudba nevhodně reagovat na těžko definovatelné skutečnosti, jako je například verze OS-ROM apod.

Jiří Bernášek (BEWESOFT)

POUŽITÁ LITERATURA

  1. časopis TAJEMNICE ATARI 3/93 (Polsko), str. 4, Dariusz Zolna: Dokumentacja do CMC
  2. návod k CMC "PODRECZNIK UZYTKOWNIKA PAKIETU CHAOS MUSIC COMPOSER" (L.K.Avalon, 1992)