Vlákno názorů k článku Hudba a zvuk na PC: PC Speaker, Covox a Adlib od ondra.novacisko.cz - K PC Speakeru je třeba dodat ještě toto....

  • Článek je starý, nové názory již nelze přidávat.
  • 7. 5. 2009 14:34

    ondra.novacisko.cz (neregistrovaný)
    K PC Speakeru je třeba dodat ještě toto. Existovali dva způsoby, jak přehrávat na PC Speakeru samplovanou hudbu a zvuky.

    1) Ruční PWM
    2) použití časovače.

    První varianta vyžadovala, aby se procesor plně věnoval přehrávání, tedy odměřování přesných míst, kdy překlopit hradlo 61. Tahle varianta byla použita většinou pouze pro přehrávání krátkých ukázkových zvuků (pamatuju si, na nějakou žábu, která skákala po zelených kolečkách, kde při skoku udělala efektní žup!) a pak také jako ovladač zvukové karty pro Windows 3.1. Bylo vhodné při přehrávání zakazovat přerušení, aby při přehrávání nenarušovalo odměřování. Ve Windows ovladači to bylo možné nastavit (pak se ale počítač po dobu přehrávání úplně zasekl). Ve Windows ovladači nebylo možné přehrávat delší zvuky, protože díky neexistenci přepínání úloh a nutnosti vyčlenit 100% procesoru na výpočet PWM nebylo prakticky možné nic jiného dělat.

    Druhou variantu jsem poprvé viděl u MODPlayeru. V té době jsem už trošku znal variantu 1), proto mne až vyrazilo dech, že MODPlayer nejen že umí přehrávat samplovanou hudbu, ale také ji mixuje, zobrazuje kdejaká blikátka a co víc, bylo možné tlačítkem spawnovat do DOS command line a za současného hraní muziky normálně dál pracovat. Posléze jsem našel i vysvětlení tohoto fíglu.

    Základ byl v čipu 8253, který se na bráně 42 přeprogramoval tak, aby generoval krátke pulsy na základě osmibitové hodnoty. Tento puls byl víceméně kratší, než perioda kmitočtu kolem cca 16kHz. Proto nebylo problém naprogramovat přerušovací rutinu, která rychlostí 16kHz neustále plnila bránu 42, čímž spouštěla čítač a na PC Speakeru generovala krátké pulsy. PWM za podpory HW byla na světě. Podmínkou bylo, že rychlost přerušení nebude vyšší než nějakých cca 18kHz, zároveň nesměla být nižší než nějakých 12kHz. Při vyšším kmitočtu se stávalo, že delší pulsy nebyly ukončeny a tak mohl zvuk znít přebuzeně. Nižší kmitočty naopak působily velice nepříjemné pískání, protože PC Speaker z každým taktem vyrobil právě jeden pulz.

    Ještě bych dodal, že v tomhle režimu byl PC Speaker spíš šestibitový a navíc byla převodní tabulka nelineární. Když jsem to časem implementoval sám, ve svých projekech, tak většinou ta převodní tabulka byla vykradena právě z MOD playeru :-)
  • 7. 5. 2009 14:53

    jaryn (neregistrovaný)
    Ja jsem si tento prehravac zalozeny na druhe variante delal na zaklade clanku v casopisu BYTE . Bylo to v ASM docela dobre to tam tenkrat popisovali, taky jsem se nestacil divit.
  • 7. 5. 2009 20:09

    vtech (neregistrovaný)
    JOJO! Na tehle serii clanku (myslim, ze to psal Weiss) jsem se naucil x86 assembler.
  • 7. 5. 2009 22:11

    Pavel Tišnovský
    Zlatý podporovatel
    Díky za perfektní doplnění. Pochopil jsem to správně tak, že se třetí kanál 8253 přepnul na monostabilní klopný obvod, tj. čítal až do zadané hodnoty a potom změnil stav? To by vlastně byla PWM pomocí změny střídy, ta se skutečně dost často používá, například v některých fázových měničích (tomu moc nerozumím, dělá do toho tchán, ale NN část je celkem pochopitelná).

    Tj. přerušovací rutina musela být naprogramována, aby se volala s frekvencí 4,77 MHz/3/256 že? (4,77/3 je frekvence vstupních hodin, 256 je max. hodnota, do které čítač v režimu monostabilu čítat, pokud se plní jen spodní byte).
  • 10. 5. 2009 10:45

    jk (neregistrovaný)
    Podobně (s monostabilním módem 8253) se dělala PWM i na tom Sharpu. Rozlišní bylo na Sharpu spíš 6 bitů v závislosti na vzorkovací frekvenci. Perioda byla dělaná statickým počtem vykonaných instrukcí s předem známou délkou trvání (kvůli přesnosti se na přerušení spolehnout nedalo).
  • 11. 5. 2009 12:08

    ondra.novacisko.cz (neregistrovaný)
    Ta frekvence je 4.77/4 = 1.193182MHz (zdroj je En Wikipedia)
    Rychlost přerušení muselo být 1,193182/64 = 18632,8 Hz, což zhruba odpovídá frekvenci, na které běžel MOD player.

    Čítač 8253 lze naprogramovat do režímu MKO (MOD 1) - přesný postup neznám, ale vygooglit se to dá.

    V zásadě se tedy použivalo dvou čítačů. První kanál (tedy brána 40) se programovala na rychlost 18632Hz a sloužila pro přerušovací rutinku. Třetí kanál (tedy brána 42) se programovala do režimu MKO s plněním jednoho byte, a periodicky se tam zapisovalo šestibitové číslo (čili čítal jen do max 63)
  • 11. 5. 2009 12:33

    ondra.novacisko.cz (neregistrovaný)
    Oprava, pravděpodobně se použival MOD 0, protože řídící slovo bylo 90H

    10010000

    10 = select channel 2
    01 = load LSB only
    000 = MOD 0
    0 = not BCD

    MOD 0 = In this mode, the counter will start counting from the initial COUNT value loaded into it, down to 0. Counting rate is equal to the input clock frequency.

    The OUT pin is set low after the Control Word is written, and counting starts one clock cycle after the COUNT programmed. OUT remains low until the counter reaches 0, at which point OUT will be set high until the counter is reloaded or the Control Word is written.