Welcome, Guest. Please login or register.


Author Topic: SID lejátszó (Read 249547 times)

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #165 on: 2017.January.23. 21:26:43 »
Szerintem 16 tábla van mindenből, de azt nem egészen értem, miért ismétlődik a pulsetable háromszor. :oops: A zajgenerátornak elvileg 16 mintát kellene előállítania a "normál" hullámformák egy periódusának az ideje alatt, ami 256 méretű ismétlődés nélküli táblánál a frekvenciát még 16-al osztva érhető el. Így azonban 8 MHz-es gépen 15625 Hz-es megszakítással gyakorlatilag csak 10 bites lenne a zaj frekvenciájának a felbontása, de kevésbé ismétlődne. 7812.5 Hz-nél így számíthatók a frekvenciák:
- négyszög/háromszög/fűrész: SID frekvencia / 2
- zaj: SID frekvencia / 2 / (minták száma a táblázatban / 16)

A kisebb táblázatokkal lehetne minden hullámformából 32 (összesen 32K, azaz 2 szegmens), vagy továbbra is 16, de az egy lapon is elfér.
Igen, most módosítás közben vettem észre, épp a minták méretét felezem, egyelőre manuálisan, de meguntam :lol:
A frekvenciaszámítást már feleztem :), de lehet még ez is a kétszerese annak, amit számítottál, ha eljutok odáig, tesztelem.
Valami beugrott a pulse tábla 2 ismétlésével kapcsolatban, mintha csináltam volna dinamikus pulse tábla változtatást futás közben, de szerencsére mindent tele szoktam vágni kommentekkel, így konnyebben megfejtem :ds_icon_cheesygrin:

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #166 on: 2017.January.23. 22:26:00 »
Generáltam új 3szög táblát, zajt feleztem, a kódban a többit is, majd holnap folytatom.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #167 on: 2017.January.24. 09:17:59 »
A hullámformák torzításának van jelentősége? Nem tudom, hogy ez bug vagy valójában jobb minőségű emuláció. :oops:
[ Guests cannot view attachments ]

Összehasonlításképpen az emulált (reSID 1.0) 6581 kimenete ilyen, de a torzítás több tényezőtől is függ. A 0 szint közelében a "töréseket" a D/A konverzió rossz minősége eredményezi, a 8580 javítja ezt a hibát.
[ Guests cannot view attachments ]

Szerk.: a file formátum már tartalmazza a burkológörbéket is, tehát azokat nem a lejátszó emulálja? Ha igen, akkor egy csatorna állapotának a leírásához 4 byte is elég:
- frekvencia (2 byte), zaj esetén talán már a file adatban megfelelően osztva
- PWM felső bitek (5 bit / 1 byte)
- aktuális hangerő (5 bit / 1 byte)
- hullámforma (2 bit), gyűrűmoduláció (1 bit), ezeket tartalmazhatja az előző két byte közül az egyik (talán a PWM lenne célszerűbb)

Így egy 8K-s blokk 682 50 Hz-es megszakításra elég, ami kb. 13.6 másodperc.
« Last Edit: 2017.January.24. 13:20:38 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #168 on: 2017.January.24. 13:23:11 »
A hullámformák torzításának van jelentősége? Nem tudom, hogy ez bug vagy valójában jobb minőségű emuláció. :oops:
Nem akarom rádkenni, de úgy emlékszem te ajánlottad, hogy ne legyen lineáris, mert úgy jobb lesz a kimenet :)

Szerk.: a file formátum már tartalmazza a burkológörbéket is, tehát azokat nem a lejátszó emulálja? Ha igen, akkor egy csatorna állapotának a leírásához 4 byte is elég:
- frekvencia (2 byte), zaj esetén talán már a file adatban megfelelően osztva
- PWM felső bitek (5 bit / 1 byte)
- aktuális hangerő (5 bit / 1 byte)
- hullámforma (2 bit), gyűrűmoduláció (1 bit), ezeket tartalmazhatja az előző két byte közül az egyik

Így egy 8K-s blokk 682 50 Hz-es megszakításra elég, ami kb. 13.6 másodperc.
Igazad van, vegyesen mentek, és így is van, 12 fájlt ment az 5-ös verzióju SIDPlayer, az biztos, hogy a fent felsoroltakat mentem, azt nem tudom még milyen elrendezésben. Az biztos, hogy az 1-2 file a frekvencia, az is lehet, hogy már 16-tal osztott változatban.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #169 on: 2017.January.24. 21:07:48 »
Nem akarom rádkenni, de úgy emlékszem te ajánlottad, hogy ne legyen lineáris, mert úgy jobb lesz a kimenet :)

Nem emlékszem erre, vagy hogy miért pont ilyen legyen (azaz a háromszög például szinusz abszolút értékéhez hasonló), de nem lehetetlen. :oops: Talán a legjobb lenne megnézni a régebbi hozzászólásokat.

Quote
Igazad van, vegyesen mentek, és így is van, 12 fájlt ment az 5-ös verzióju SIDPlayer, az biztos, hogy a fent felsoroltakat mentem, azt nem tudom még milyen elrendezésben. Az biztos, hogy az 1-2 file a frekvencia, az is lehet, hogy már 16-tal osztott változatban.

A konvertáló táblázat alapján DAVE frekvenciának tűnik, de lehet, hogy célszerűbb lenne az eredeti SID frekvenciát tárolni, és esetleg csak a zajnál osztani. Ha a lejátszás frekvenciája 7812.5 vagy 15625 Hz, akkor a SID frekvencia egyszerűen konvertálható (kettővel vagy néggyel osztás).

Tömörített formátum lejátszásához talán hasznos lehet ez az átalakított rutin, bár jobban is meg lehetett volna írni. Nem használja az AF', BC', DE', HL' és IY regisztereket, és csak a 3. lapra ír fix blokk mérettel.

[ Guests cannot view attachments ]

Példa:

Code: ZiLOG Z80 Assembler
  1.         ld    de, 0c000h
  2. l1:     ld    ix, input_buf + 1
  3.         ld    a, 80h
  4. l2:     call  decompressDataBlock
  5.         jr    z, l2
  6.         jr    l1

A DE a kimeneti puffer aktuális pozíciója (8K blokk méretnél C000h, E000h, C000h, E000h, ...), az IX és A regiszterek pedig a bemenetre mutatnak. Visszatéréskor a Z bit 0 az utolsó blokk után, a példa ebben az esetben visszaugrik az adat elejére. Az egyes blokkok hivatkozhatnak az előző tartalmára, és elvileg kezeli a laphatár átlépését is (azaz ha olyan sorozatot kell ismételni ami FFFFh után C000h címen folytatódik).
« Last Edit: 2017.January.24. 21:12:31 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #170 on: 2017.January.24. 21:44:39 »
Köszi szépen, egyelőre azon küzdök ,hogy sikerüljön átalakítani az 50Hz-es adatszolgáltatást megszakításban, egyelőre sokat fagyizok. :D
Tömörített lejátszáshoz tuti hasznos lesz az átalakított rutin, köszönöm szépen, még nem tudom, hogy mi lesz a megvalósítás, egyelőre az alap ötlet, hogy 500h egybefüggő "regiszter" adat, így 12*500h adat lesz csomagolva egy blokkba, vagy ezek többszöröse, attól függ, hogy mennyi szabad szegmens marad 128K-s gép esetén, vagy még az is lehet, hogy megpróbálom átalakítani kisebb blokkra.
Most úgy működik, hogy kicsomagolom az első LZ-s blokkot, és C004-re elkezdem másolni 12-esével ugorva, utána a 2. LZ blokk C005-re 12-esével, és így tovább, így lehet szépen sorban olvasni, és a szabad memória korlátozza be, hogy milyen hosszan játsza le. Maximum kitömörített adatblokk 32k lehet, ami majd 11 perces SID hosszt jelent.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #171 on: 2017.January.24. 22:09:45 »
Nem emlékszem erre, vagy hogy miért pont ilyen legyen (azaz a háromszög például szinusz abszolút értékéhez hasonló), de nem lehetetlen. :oops: Talán a legjobb lenne megnézni a régebbi hozzászólásokat.
Nem ilyen torzításra emlékszem , olyanra hogy a magasabb értékek felé tolódjon a minta, tehát abból legyen több, ne legyen lineáris, de lehet álmodtam, mert a fórumon nem találok semmit :)
A kész verzióban átalakítom lineáris mintákká.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #172 on: 2017.January.24. 22:25:27 »
Na végre megszólalt, azt nem mondom ,hogy minden tökéletes, a zajjal vannak bajok, lesz még mit javítani, mire a kicsomagolás on the fly bekerül :D

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #173 on: 2017.January.24. 22:34:48 »
Tömörített lejátszáshoz tuti hasznos lesz az átalakított rutin, köszönöm szépen, még nem tudom, hogy mi lesz a megvalósítás, egyelőre az alap ötlet, hogy 500h egybefüggő "regiszter" adat, így 12*500h adat lesz csomagolva egy blokkba, vagy ezek többszöröse

Ezzel a megoldással (nem az egészet csomagolja ki, hanem mindig csak két blokkot, az aktuális lejátszása közben a "háttérben" készül el a következővel) a 8K blokk méret 682 50 Hz-es megszakításhoz elég: 682 * 12 = 8184 byte, és még marad 8 ahol tárolható például a ténylegesen használt adat mérete az utolsó blokknál. Ha a 3. lapra kerül a puffer, akkor a 0. és az 1. lapon lehet a bemeneti file (az itt tárolható tömörített adat korlátozza a méretét), az 1. és 2. lapon pedig a hangminták, az előbbit a megszakításkezelő rutin átmenetileg belapozza. A video RAM pedig a 3. lapon amikor az 50 Hz-es megszakítás a képernyőt frissíti. De nem tudom, megéri-e ilyen átalakítás.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #174 on: 2017.January.25. 08:51:40 »
Ezzel a megoldással (nem az egészet csomagolja ki, hanem mindig csak két blokkot, az aktuális lejátszása közben a "háttérben" készül el a következővel) a 8K blokk méret 682 50 Hz-es megszakításhoz elég: 682 * 12 = 8184 byte, és még marad 8 ahol tárolható például a ténylegesen használt adat mérete az utolsó blokknál. Ha a 3. lapra kerül a puffer, akkor a 0. és az 1. lapon lehet a bemeneti file (az itt tárolható tömörített adat korlátozza a méretét), az 1. és 2. lapon pedig a hangminták, az előbbit a megszakításkezelő rutin átmenetileg belapozza. A video RAM pedig a 3. lapon amikor az 50 Hz-es megszakítás a képernyőt frissíti. De nem tudom, megéri-e ilyen átalakítás.
A jobb tömöríthetőség miatt számoltam 12*500h-s blokkal, ami eleve elvetélt, elszámolt ötlet volt, de még így is meggondolandó, hogy egyszerre 2 blokkot csomagoljak ki, az elsőben lenne az 1. hat "regiszter", a másodikban meg a 2. hat, 2 szegmenssel megoldva, de ez még odébb van, egyelőre műödjön a felezett hangmintákkal rendelkező verzió az eredeti kicsomagolással :)
Egyelőre pont jónak tűnik a majd 8K-s kicsomagoló mostani verziója :) Ha esetleg a lapozás miatt kell alakítani valamit, majd hozzáalakítom a lejátszót;)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #175 on: 2017.January.25. 11:42:56 »
de még így is meggondolandó, hogy egyszerre 2 blokkot csomagoljak ki, az elsőben lenne az 1. hat "regiszter", a másodikban meg a 2. hat, 2 szegmenssel megoldva

Ezt nem egészen értem. :oops: A két blokk méretű puffernek az általam leírt megoldásban az a célja, hogy az egyik blokk lejátszása közben lehessen a következőt kicsomagolni (aminek az időtartama változó lehet, de elvileg elég gyors ahhoz, hogy a lejátszás ne tudja utolérni a kitömörítést):
- a lejátszás indítása előtt, még tiltott megszakításnál feltölteni a teljes puffert (2 blokk)
- utána a lejátszó rutin megszakításból elkezdi "fogyasztani" a C000h blokkot, amikor eléri a végét, akkor E000h-ra ugrik
- a főprogram figyeli a lejátszási pozíciót, ha átlép az E000h blokkra, akkor C000h-ra elkezdi kicsomagolni a következőt
- ezt követően ha az E000h-s blokk lejátszása is befejeződik, akkor a lejátszási pozíció C000h-ra ugrik, amit a főprogram figyel és elkezdi kitömöríteni a negyedik blokkot E000h-ra
- az előző három lépés ciklusban ismétlődik, ha elfogyott a tömörített adat, akkor az olvasási pozíciója visszaugrik az elejére ismétlődő lejátszáshoz

Egy blokkon belül az első 682 byte az első regiszterből 682 minta, utána a második regiszterből 682 minta, stb., ez összesen 682 * 12 = 8184 byte. A fennmaradó 8 byte fejléc céljára használható, ami jelezheti például ha a blokk valójában 682-nél kevesebb mintát tartalmaz (a mérete ilyenkor is 8K). Nem biztos, hogy ez a megoldás ideális, de a regiszterenként rendezett adatblokk talán jobban tömöríthető, ha valamivel bonyolultabb is a lejátszása.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #176 on: 2017.January.25. 13:13:40 »
Igen,  sejtettem, hogy ez a cél :) Én meg továbbgondoltam, a tömöríthetőség miatt, hogy mindezt lehetne 2 16K-s szegmenssel, ami a lejátszást bonyolítaná, egyik az aktív adat, a másik meg az épp kicsomagolásra kerülő adat, de még a holdban se járok, ezért az egész csak puszta elmélkedés.
Pont a tömörítés hatékonysága miatt (nem tudom még mennyivel lenne kisebb a kimeneti fájl, lehet meg sem éri) gondolkoztam el azon ,hogy duplázni az adatokat, és az első 8KB-ba csak az első hat blokk kerül, a másodikba a második 6 blokk, és a feljebb leírt módon lehet használni őket, ugyanaz, mint amit leírtál, csak lapozgatással, de gyanúsan tényleg nem éri meg, lehet le se tesztelem majd, ha odáig jutok.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #177 on: 2017.January.25. 13:21:24 »
Nem biztos, hogy ez a megoldás ideális, de a regiszterenként rendezett adatblokk talán jobban tömöríthető, ha valamivel bonyolultabb is a lejátszása.
Igen, ezen is gondolkoztam, hogyha marad elég idő, akkor esetleg érdemes-e az adatot szétszórni regiszter sorrendbe, és a mostani gyors ( veremkezelős kiolvasással olvasni ), vagy érdemes-e az általad elsőre használt regisztersorrendes tömörítésre áttérni, akkor a fájl nagyobb, de gyorsabb az olvasás.
Töprengésem jelenlegi állása szerint 2x8K-s 682 mintás megoldás tűnik a legoptimálisabb megoldásnak. :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #178 on: 2017.January.25. 14:53:49 »
Én meg továbbgondoltam, a tömöríthetőség miatt, hogy mindezt lehetne 2 16K-s szegmenssel, ami a lejátszást bonyolítaná, egyik az aktív adat, a másik meg az épp kicsomagolásra kerülő adat, de még a holdban se járok, ezért az egész csak puszta elmélkedés.

Az itt található egyszerű SID kártyás lejátszó valójában így működik (egy 16K-s blokk = 655 * 25 regiszter), a 8K-s változatot - ami bonyolítja a kicsomagoló rutint és a lejátszás 50 Hz-es részét - azért ajánlottam hogy a hangminta lejátszás közben ne kelljen sokat lapozni, és így még nem kerül gyakran használt szegmens video RAM-ba 128K-s gépen:
- 2 szegmens hangminta (1-2. lap)
- 1 szegmens (2*8K) puffer a tömörítetlen regiszter adat számára (3. lap)
- 1 szegmens bemeneti file puffer (1. lap), ez már lehet video RAM is a kevésbé intenzív hozzáférés miatt
Az is egy lehetőség hogy a hangminta memória csak egy szegmens méretű legyen, de akkor 32 helyett csak 16 táblázat lehet az egyes hullámformákhoz.

Igen, ezen is gondolkoztam, hogyha marad elég idő, akkor esetleg érdemes-e az adatot szétszórni regiszter sorrendbe, és a mostani gyors ( veremkezelős kiolvasással olvasni ), vagy érdemes-e az általad elsőre használt regisztersorrendes tömörítésre áttérni, akkor a fájl nagyobb, de gyorsabb az olvasás.

Az előbb említett lejátszónál legalábbis sokkal hatékonyabb ha mind a 25 regiszter külön 655 byte-os blokkba kerül, amit így tud lejátszani:
Code: ZiLOG Z80 Assembler
  1. .l1:    ld    hl, 8000h                 ; * sidDataReadPos
  2.         ld    de, 10000h - (655 + 1)
  3.         ...        ; puffer pozíció ellenőrzése, hogy elérte-e a blokk végét
  4. .l4:    ld    bc, 655 * 25 + 1
  5.         add   hl, bc
  6.         ld    bc, 190fh
  7. .l5:    ld    a, b
  8.         dec   a
  9.         out   (0eh), a
  10.         add   hl, de
  11.         outi
  12.         jr    nz, .l5
  13.         ld    (sidDataReadPos), hl
Tehát a ciklusban ADD HL, DE utasítás kell a következő regiszterhez. De ez 50 Hz-es frekvencián nem nagy probléma, ha 20-25% CPU idő marad erre akkor az még mindig kb. 16000-20000 Z80 ciklus. Az így rendezett 4 és fél perces Cybernoid II példa file tömörítve 11238 byte, ha viszont az egyszerűbben lejátszható R0,R1,...R24,R0,R1,... sorrendre konvertálom, akkor már 50918 byte a méret, ami lapozás nélkül nem fér el a memóriában.

A legjobb lenne tesztelni a tömörítést már konvertált 12 regiszteres SID adaton is.

Szerk.: blokk méretek összehasonlítása, ez nem egészen pontos, de nagyjából látható a hatása a tömörítésre. 12 regiszternél valószínűleg kisebb blokk is elég hasonló hatékonysághoz, bár ezt még nem teszteltem.

1024: 55684 byte
2048: 34422 byte
4096: 23209 byte
8192: 16202 byte
16384: 11239 byte
32768: 8700 byte
65536: 7353 byte
« Last Edit: 2017.January.25. 15:24:11 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #179 on: 2017.January.25. 15:58:28 »
Tehát a ciklusban ADD HL, DE utasítás kell a következő regiszterhez. De ez 50 Hz-es frekvencián nem nagy probléma, ha 20-25% CPU idő marad erre akkor az még mindig kb. 16000-20000 Z80 ciklus. Az így rendezett 4 és fél perces Cybernoid II példa file tömörítve 11238 byte, ha viszont az egyszerűbben lejátszható R0,R1,...R24,R0,R1,... sorrendre konvertálom, akkor már 50918 byte a méret, ami lapozás nélkül nem fér el a memóriában.
Engem ez meg is győzött, sorrendbe rendezett regiszterek nem lesznek tömörítve, marad az ugrálós lejátszás, és dobom is ki a veremkezelős olvasást, legalább az olvasás alatt is engedélyezett lesz az interrupt (igaz, a mostani olvasás mellett se nagyon volt interrupt vesztés)

A legjobb lenne tesztelni a tömörítést már konvertált 12 regiszteres SID adaton is.

Szerk.: blokk méretek összehasonlítása, ez nem egészen pontos, de nagyjából látható a hatása a tömörítésre. 12 regiszternél valószínűleg kisebb blokk is elég hasonló hatékonysághoz, bár ezt még nem teszteltem.

1024: 55684 byte
2048: 34422 byte
4096: 23209 byte
8192: 16202 byte
16384: 11239 byte
32768: 8700 byte
65536: 7353 byte
Az 1-12-ig rendezett adaton nem tudom érdemes-e a fentieket látva, de letesztelem, a lenti táblázat alapján a 8192 pedig ideális választás.
Köszönöm szépen az infót, és SID kártyás lejátszó leírást, szerintem maradok a két szegmens hangmintánál, meg szeretném tartani a dinamikus PWM állítási lehetőséget.