MOD-player 3

[eng]

   Po pár letech od zveřejnění původní konstrukce se na internetu začaly objevovat konstrukce tohoto přehrávadla. V jednom případě si dokonce autor dal tu práci prokousat se nepřehledným a mizerně komentovaným kódem a přepracovat SW tak, aby byl schopen přehrávat přímo z interní FLASH. Podobnou úpravu jsem kdysi zkoušel rovněž, ale tehdy byl ATmega32 maximum v DIL, co se běžně dalo sehnat a oněch 27kB zbylé FLASH je na poslouchatelný MOD dost málo, takže jsem to nechal u ledu.
   Zájem o konstrukci v poslední době mě však přiměl vrátit se k přehrávadlu a zkusit ho trochu poladit. Po pár minutách procházení zdrojáku mě nálada vrtat se v té hrůze přešla a rozhodl jsem se to napsat rovnou znovu a pořádně. K tomu účelu jsem si pořídil podstatně lepší MCU ATmega644 (64kB FLASH, 4kB RAM, 20MHz), který by měl mít víc než dostatečný výkon pro 4 kanály při 33kHz vzorkování (o možnosti taktování ani nemluvě). Programování mi překvapivě zabralo jen zlomek času, co minule, zato funkčnost je díky kvalitní dokumentaci ProTracker formátu a fízlování zdrojáků vynikajícího Modplug Trackeru podstatně vyšší (MP tracker jsem při programování bral skoro jako etalon toho, jak to má znít ;-).

Takhle nějak vypadá MOD-player 3. Dole MCU, uprostřed SRAM a USB-COM, nahoře zdroj a audio výstup a nad tím vším kabely LCD a IDE rozhraní. Takhle nějak vypadá MOD-player 3. Dole MCU, uprostřed SRAM a USB-COM, nahoře zdroj a audio výstup a nad tím vším kabely LCD a IDE rozhraní. MOD-player 3 s fešným LCD.

1. Základní vlastnosti

Mixing: 16-bit mono/stereo
Vzorkování: 4 - 48kHz (teoreticky i víc)
Resampling: žádný nebo lineární interpolace
Max. kanálů: 4 při 36kHz vzorkování
8 při 21kHz vzorkování
10 při 17kHz vzorkování
Zdroj dat: HDD nebo CF karta s FAT16 (základní podpora adresářů)
nebo sériový port
Formáty: Nekomprimovaný ProTracker (*.MOD)

   Všechny hodnoty platí pro AVR taktované na 20MHz, nicméně použitý ATmega644 lze značně přetaktovat.


2. Popis zapojení

   Zapojení je téměř identické s původní konstrukcí. Aby taky ne - ve stolním sedimentu jsem našel původní kontaktní pole. Sice tam bylo dost prachu a "někdo" sebral pár dost důležitých drátů, ale nakonec jsem to s původním SW rozchodil. Přesto jsem pár změn provést musel.
   Podstatnou změnou je adresace SRAM - minimum je teď 64kB a maximum podle volných pinů IC3 až 2MB, což je i na největší MOD až příliš. V mojí konstrukci (na fotkách) jsou dvě 512kB SRAM na sobě, přepínací logika pro CS je přímo pod paticí horní SRAM.


   K vlastnímu zapojení jen stručně: Jádrem zapojení je celkem výkonný MCU AVR ATmega644-20PU na 20MHz. Disponuje slušným množstvím FLASH (64KB) i RAM (4kB). Externí SRAM IC4 je kvůli kapacitě adresovaná SW, pomocí dvou rozšiřujících 8-bit bufferů IC2 a IC3. Zabírá to pouze dva porty (porta: adresy, portc: data) a pár řídících signálů. Paměť by měla být svižná (v mém případě to chodí na 55ns verzi). Na těchto portech je nadrátováno také IDE rozhraní v 16-bit módu. Jeho adresace je řešena přes zbytek bufferu IC3. Zde bych upozornil, že LED D8 je občas nezbytná - některé HDD bez ní odmítají komunikovat (CF možná taky). Na stejných portech je navíc ještě HD44780 LCD a tlačítka. Audio výstup je kvůli kvalitě zvuku 16-bit a to sériový přes SPI rozhraní. MCU na SPI rozhraní emuluje I2S sběrnici (nebo obdobu pro TDA1545 převodník). Šířka sterea je omezena analogově součtovými rezistory za operáky (digitálně by to bralo nějaký ten výkon MCU navíc). Více k tomuto audio výstupu zde.
   K audio výstupu bych doplnil ještě tolik, že jsem strávil pěkných pár hodin hledáním příčiny "pochrchlávání" zvuku. To byl horor - nejdřív to vypadalo na komunikaci se SRAM, které mohl vadit dlouhý IDE kabel (odrazy), ale zakončovací rezistory neměly vliv. Pak to zase chvíli vypadalo na pochybné rušení I2S dat (při vhodně zmuchlaných drátech to chrchlat přestalo). Tak jsem je všechny zkroutil a omotal jedním napojeným na jedné straně na GND - trochu to pomohlo, ale stále ne dokonale. Pak se omylem GND drát dotkl i na druhé straně a najednou bylo po problému. Do téhle chvíle jsem skutečně nevěřil, že by zemní rušení na 15cm vedení mohlo dosáhnout úrovně potřebné k rušení TTL kompatibilní logiky (zvlášť s ohledem na množství kondenzátorů v napájení) - čekal jsem všechno možné ale tohle ne ... Onen GND spoj navíc stačí na libovolné straně posunout o pár cm od GND pinu a už to zase nejede, takže pozor na země (zvlášť na kontaktním poli)!

2.1 Taktování

   Použitý MCU samozřejmě chodí minimálně na 20MHz, ale při experimentování jsem zkoušel trochu přitlačit. 24MHz nebyl problém, což mě docela překvapilo. Můj prastarý ATmega32 se začal pochybně chovat už nad 18MHz, kdy program fungoval, ale jen když byl zarovnán od sudé adresy FLASH ;-). Tak jsem zkusil 27MHz a kupodivu stále bez problému. Větší krystal jsem nenašel, tak jsem ze stolních usazenin vyhrabal 32MHz oscilátor a po pár wait-cyklech navíc pro SRAM a IDE to kupodivu chodí bez obtíží. To se hodí zvlášť pro vícekanálové MODy. Nevím jestli je to náhoda nebo takhle chodí všechny novější ATmega644, takže pokud to někdo zkoušel a má podobnou zkušenost, případně odhalil nějakou skrytou nefunkčnost, nechť se ozve, docela by mě to zajímalo (můj kus je typ -20PU, série 0617). Jinak na 6V1 to jelo i na 40MHz, ale to už se nelíbilo ostatním komponentám ;-).

3. Programové vybavení

   Program je opět kompletně v ASM, ale tentokrát jsem ho pečlivě dělil do několika souborů, takže už to není jedna 10k+ řádků dlouhá nudle jako jiné moje "produkty". Navíc jsem hojně využíval makra a komentoval, takže by kód měl být docela čitelný.
   K mému překvapení to celé nejen hraje lépe, ale taky vlastní mix bere jen asi 60% výkonu MCU oproti původní verzi. Po pár úpravách se ukázalo, že výkon MCU s novým SW postačuje na 8-kanálové MODy při 21kHz vzorkování.
   Skladbu lze, podobně jako u minulé verze, nahrát přes sériový port bez řízení toku nebo načíst z HDD nebo CF karty se souborovým systémem FAT16. V menu je podporována jedna úroveň adresářů, kterých může být maximálně 255, stejně jako skladeb. Pro přehlednost jsem přidal řazení podle názvu.
   Zdrojáky a překlad pro TDA1543, zdrojáky a překlad pro TDA1545.

3.1 Ovládání

   Ovládání by mělo být zřejmé ze schématu. V zásadě to chodí tak, že je nejřív otestována externí SRAM. Pokud je jí alespoň 64KB, tak je vše OK a pokud ne, tak program záměrně zatuhne. Dále je testováno IDE zařízení. Pokud tam je a má správný formát (FAT16), tak přehrávač vstoupí do menu adresářů. Odtud se lze dostat buďto do menu skladeb v adresáři nebo přímo do přehrávacího módu. Pokud něco nesedí, tak přejde přehrávač do režimu, kde tahá data pouze z USARTu. Načtení dat z USARTu lze také spustit tlačítkem COM. Sosání dat z USARTu je ukončeno, když 1,5s nic nepříjde - data lze poslat libovolným terminálem, není použita parita ani řízení toku, MCU to stíhá bez problému.
   Nepodporované skladby by měl přehrávač přeskočit, ale není to vždy zaručeno, protože se netestuje kompletní soubor, ale jen pár hlavních položek hlavičky.

3.2 Nastavení

   Na začátku hlavního modulu "m644_modplay.asm" je většina nastavení pro celý přehrávač. Stručný popis významu položek uvádí tabulka.

Název parametru Význam
XTAL Frekvence hodin
HCOC Přidá wait-cyklus navíc do SRAM komunikace (obvykle nutné nad 24MHz)
USRDIV Dělička pro USART, baud=XTAL/(16*(USRDIV+1))
MEMTST Zapne kompletní test SRAM (trvá to asi 1s/1MB/20MHz), vhodné při oživování
STORA Zapne IDE interface, jinak pouze načítání přes sériák
SRATE Požadovaná vzorkovací frekvence (od 4 do asi 48kHz, možná víc)
DAC Typ audio sběrnice, 1543=I2S, 1545=TDA1545
STEREO Zapne stereo mixing, jinak jsou oba kanály shodné
LINRES Zapne lineární interpolaci při resamplingu (bere nějaký ten výkon MCU navíc)
DRAWVU Zapne VU-metry na LCD (bere asi 5% výkonu MCU)
MAXCH Maximální podporovaný počet kanálů, minimálně 4, maximálně až 32, ale vezme si to hodně RAM, takže bude třeba zmenšit audio FIFO buffer (defaultně 16)

   Další nastavení jsou roztrušena po celém souboru, ale do těch obvykle není nutné vrtat. Jediné, co stojí za zmíňku, je velikost audio FIFO. Tento buffer by měl být co největší - pokud bude přehrávač provozován s malým počtem kanálů (MAXCH), pak se uvolní nějaká ta RAM a je ho možné prodloužit. Nemůže ale být kratší než 1kB, protože je sdílen modulem "storage.asm" jako datový buffer.

3.3 Fuse bity

   Vzhledem k frekvenci oscilátoru by měla být naprogramovaná pojistka CKOPT (amplituda oscilátoru). To je občas nezbytné kvůli blízkosti pinů USARTu, který dost ruší. Dál by měl být vypnutý JTAG, protože jinak patřičná část portc nemá tvrdou log.1 a náběžná hrana dat je pak dlouhá - chyby při zápisu. Možná by to šlo pořešit i zvedacími rezistory, ale nezkoušel jsem.

4. Podporované efekty a formáty

   Dokáže přehrát nekomprimované MODy, teoreticky s libovolným počtem kanálů (pochopitleně při adekvátně nízkém vzorkování).


Podporované efekty
# Název efektu Stav implementace
0 Arpeggio funkční
1 Portamento up funkční
2 Portamento down funkční
3 Tone-portamento funkční
4 Vibrato funkční, pouze sinus
5 Tone-portamneto + Volume slide funkční
6 Vibrato + Volume slide funkční
7 Tremolo není - skoro se nepoužívá
8 Panning (stereováha) není a nebude, mix bere víc výkonu
9 Nastevení ofsetu vzorku funkční
A Volume slide funkční
B Skok na jiný list pouze vpřed
C Nastav hlasitost funkční
D Skok v listu funkční
E0 Nastav filtr není
E1 Portamento up jemně funkční
E2 Portamento down jemně funkční
E3 Glissandro není a nebude, nepoužívá se
E4 Vibrato waveform není
E5 Fine-tune není
E6 Pattern loop není
E7 Tremolo waveform není
E9 Retrig note funkční
EA Volume slide up jemně funkční
EB Volume slide down jemně funkční
EC Cut note funkční
ED Note delay funkční
EE Pattern delay není
EF Invert loop není
F Set speed/tempo funkční

   Efekty jsem se snažil odladit tak, aby se chovaly identicky s MP trackerem takže by to mělo znít stejně. Pokud najdete nějaký MOD, který by se výrazněji lišil, tak mi ho pošlete abych mohl poladit algoritmus.

5. ProTracker formát

   Od posleně se mi podařilo sehnat poněkud detailnější dokumentaci, což je také hlavní důvod, proč to tentokrát chodí tak dobře. Pár dokumentací ke stažení uvádí následující tabulka:

Dokumentace Popis
FH-MFDL2.ZIP Původní dokumentace, hrubý popis většiny formátů
MOD-FORM.TXT Kvalitní dokumentace z nějaké mid2mod utilitky
MODFILXX.TXT Rovněž kvalitní dokumentace z MOD playeru TNT MP11

5.1 Koverze do ProTracker formátu

   Protože existuje poměrně málo kvalitních vícekanálových MODů, rozhodl jsem se pro pokus s konverzí hudby z novějších formátů. To samozřejmě naráží na několik problémů. Předně všechny novější formáty nemají nic jako "Set volume" efekt - k tomuto účelu je vyhrazena samostatná položka každé "noty", takže paralelně s nastavením hlasitosti může být vykonán jiný efekt. To pochopitelně znemožňuje převod do ProTrackeru, resp. jeden z efektů bude zrušen. Tyto kolize je nutné ručně odstranit/poopravit před vlastní konverzí (vskutu zábavná práce ;-).
   Další problém spočívá v tom, že novější formáty umožňují transpozici samplů - změnu vzorkovací frekvence pro notu C-5 z ProTrackerových skoropevných 8363Hz na v podstatě libovolnou hodnotu. ProTracker sice má "fine-tune" nastavení, ale to umožňuje jen velmi jemnou změnu. Jedna možnost je provést resampling, což je hlavně u perkusních nástrojů dost špatný nápad (ořezání výšek). Jiná možnost je korigovat pediody v "notách" tak, aby byly samply přehrávány správně. MP Tracker to bohužel sám neudělá, takže jsem napsal utilitku, která podle nastavení v "*.ini" souboru provede korekci ProTrackeru. Umí jednak korigovat změnu vzorkovací frekvence a také prohazovat kanály, protože některé formáty mají odlišné defaultní nastavení sterováhy.

Utilitka ke stažení: ProTracker_convertor.zip (120kB).


6. Několik nahrávek z MOD-playeru

   Čistě pro představu jak to zní a vypadá v chodu přikládám následující dvě videa. V prvním jsou přehrány nějaké ty 4-12 kanálové MODy, v dalším pak 28-kanálový soundtrack ze známého dema Dope (dle mého názoru asi nejlepší demo z oné éry).
   Poslední video není z tohoto přehrávače - je to nová verze, která umí skoropřímo přehrávat ScreamTracker 3, ale ještě jsem to nezdokumentoval, takže zatím jen to video.



(c) 2011, Stanislav Mašláň - Všechna práva vyhrazena.

Last update: 15.3.2011 Up