Welcome, Guest. Please login or register.


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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #180 on: 2017.January.25. 19:59:29 »
Készítettem SID adat konvertáló programot is, ennek a kimenete (továbbra is ugyanazzal a Cybernoid II példával) 8354 byte tömörítve ha 8K a blokk méret, és 6640 byte 16K esetén. De nem tudom, jó-e a konverzió, mert nincs mivel lejátszani. :) Különösen a burkológörbe emulációnál fordulhat elő hiba. A program a sidrec.lua kimenetét konvertálja.

[ Guests cannot view attachments ]

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #181 on: 2017.January.26. 08:44:23 »
Készítettem SID adat konvertáló programot is, ennek a kimenete (továbbra is ugyanazzal a Cybernoid II példával) 8354 byte tömörítve ha 8K a blokk méret, és 6640 byte 16K esetén. De nem tudom, jó-e a konverzió, mert nincs mivel lejátszani. :) Különösen a burkológörbe emulációnál fordulhat elő hiba. A program a sidrec.lua kimenetét konvertálja.

Könnyen megeshet, hogy a burkológörbe emuláció jobb, mint a SIDPlayerben :D
Egyelőre még küzdök az eredeti verzió átalakításával, nem kezdtem el még az új csomagolós lejátszást :oops:
Megy, de satnyán szól, kiszedtem belőle az osztó táblát, a zaj tábla 256 nem ismétlődő elemet tartalmaz.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #182 on: 2017.January.26. 11:34:51 »
Könnyen megeshet, hogy a burkológörbe emuláció jobb, mint a SIDPlayerben :D

Elsősorban nem a minőség a probléma, legalábbis az 50 Hz-es mintavételezés korlátai között, hanem hogy bugos lehet. :oops: Az emuláció valójában 1 MHz-es, és azt konvertálja 50 Hz-re a 20000 ciklus alatti átlagos szint számításával. Ez ugyan pazarló megoldás, de így is elfogadható a sebessége, és könnyen átalakítható lenne 50 Hz helyett más frekvenciára. A burkológörbe generátor pontos működéséről itt és itt lehet olvasni (reSID forráskód), a konvertáló program azonban ennél egyszerűbb.

A kimeneti formátum leírása:
* minden csatorna 4 "regiszter"
* ezek közül az első a frekvencia alsó 8 bitje, zaj esetén a frekvenciát a program 4 bittel jobbra lépteti
* a második a frekvencia felső 8 (illetve zajnál csak 4 marad) bitje
* a harmadik az aktuális hangerő 5 biten (0..31), ez tartalmazza a burkológörbét és a 24-es SID regisztert is
* a negyedik a hullámforma és a PWM:
- 7. bit = gyűrűmoduláció
- 5-6. bit = hullámforma (00h: háromszög, 20h: fűrész, 40h: négyszög, 60h: zaj)
- 0-4. bit = kitöltési tényező felső 5 bitje, csak négyszögjelnél, egyébként mindig 0
Ha nincs hullámforma kiválasztva vagy a "teszt" bit beállított, akkor a negyedik byte 40h, azaz 0 kitöltési tényezőjű "négyszögjel". Több hullámforma egyidejű engedélyezése esetén (a valódi hardvertől eltérően) csak az egyik érvényes, zaj > fűrész > négyszög > háromszög prioritással.

Egy blokkon belül (amelynek a mérete a parancssorban állítható, alapértelmezés szerint 8192) először az első csatorna első regiszterének az összes értéke található, utána a második regiszter, stb. Az utolsó két byte a blokkban ténylegesen használt minták száma, ami általában 682, de az utolsóban kevesebb is lehet.

A kimeneti file tömörítése a decompress_m2_8K rutinnal kompatibilis formátumban:

epcompress -raw -m2 -9 -blocksize 8192 -maxoffs 8192 dave_data.bin dave_data.bin

Kisebb javítások:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

A sidrec.lua a trigger bit 0->1 átmeneténél az előző megszakításban 0-ra állítja. Ennek az a célja, hogy ha csak nagyon rövid ideig 0 (az előző értéke 1 volt, és az aktuális megszakítás 0-ra állítja majd azonnal újra 1-re új hang indításához), akkor ez az információ ne vesszen el. A sid_conv.cpp-ben javítottam azt az esetet ha nincs kiválasztott hullámforma, ez most 0 hangerejű és kitöltési tényezőjű négyszögjel lesz.

Szerk.: négyszögjelnél probléma lehet még a hangerő szabályozása, a XOR-olós módszer valójában 1,3,5,7,... szinteket állít be, azaz nulla hangerőnél is van hang. :oops: Talán célszerűbb lenne a hangminta táblázatokban 0 és 63 értékeket használni, a XOR helyett pedig AND utasítást, így azonban a négyszögjel hangerejét 2-vel szorozni kellene, a többi hullámformánál pedig a XOR 0-t AND 63-ra cserélni.
« Last Edit: 2017.January.26. 15:21:59 by IstvanV »

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #183 on: 2017.January.26. 14:45:56 »
Szerk.: négyszögjelnél probléma lehet még a hangerő szabályozása, a XOR-olós módszer valójában 1,3,5,7,... szinteket állít be, azaz nulla hangerőnél is van hang. :oops: Talán célszerűbb lenne a hangminta táblázatokban 0 és 63 értékeket használni, a XOR helyett pedig AND utasítást, így azonban a négyszögjel hangerejét 2-vel szorozni kellene, a többi hullámformánál pedig a XOR 0-t AND 63-ra cserélni.
Úgy emlékszem, hogy a négyszögjel alap adatok 1fh, és 20fh, tehát valóban, ha nulla a hangerő, akkor is van minimális hang, de a többi jelnél a XOR lecserélődik AND-re. A régi 512 byte-os mintával sokkal szebben szól, van egy ötletem mi okozhatja a hibát, ma kipróbálom.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #184 on: 2017.January.26. 16:32:19 »
Tesztelés céljára:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
« Last Edit: 2017.January.26. 22:28:20 by IstvanV »

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #185 on: 2017.January.26. 19:26:51 »
Közben rájöttem, hogy azért csináltam a 3 pwm táblát, mert minden csatornának megvolt a sajátja, ha esetleg ugyanabba a range-be több csatorna esne, de eltérő PWM-mel. Négyszögjel esetén ha 0 a hangerő, akkor AND 00h kerül be a regiszter írás elé :)

Nálam ez a felállás:
00   freq low      (a teljes frekvencia érték)
01   freq high
02   b7-b5 waveforms + b3-b0 volume (00h triangle, 20 sawtooth, 40h pulse, 80h noise(ez már az envelope és a 24-es regiszter által előállított aktuális hangerő)
03   b7 ring mod + b6-b0 pulse waveform

A 2. byte-ot nagy munka lenne nálad átalakítani? Azért kérdem mert nálam erre épül a 256-os ugrótábla.
A hangerő nálam csak 4 bit, nálad 5, de az nem számít, az ugrótáblámba se, és akkor átalakítom úgy a SIDPlayer ezen verzióját, hogy duplázza a hangerőt, a frekvencia elrendezést is a tied alapján, ez sokkal jobb is, mert nem kell előfeldolgozni.
A kitöltési tényezőből minf a 7 bit ki van használva :) 16 tábla, és minden egyes táblán belül 8 dinamikus változtatási lehetőség.
Megvan a satnya hang oka is :) Rosszul tértem át a 256 byte-es "sample"-kra, pont a dinamikus kitöltésnél feleztem két helyen, ahol nem kellett volna :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #186 on: 2017.January.26. 20:02:10 »
A 2. byte-ot nagy munka lenne nálad átalakítani? Azért kérdem mert nálam erre épül a 256-os ugrótábla.

Megoldható, csak feltételeztem, hogy javítja a tömöríthetőséget ha a hangerő nincs összekeverve a hullámformával, mivel ugyanazt a burkológörbét több hullámforma is használhatja. De nem tudom, ez valóban jelentős-e a gyakorlatban.

Quote
A kitöltési tényezőből minf a 7 bit ki van használva :) 16 tábla, és minden egyes táblán belül 8 dinamikus változtatási lehetőség.

Ha már dinamikus változtatás, akkor talán lehetne 8 bites is, táblázat nélkül. :)

Code: ZiLOG Z80 Assembler
  1.         ld    a, h
  2. .l3:    and   00h                       ; *
  3.         xor   d
  4.  
  5. ; négyszögjel
  6.         cp    PWM
  7.         sbc   a, a
  8.         and   VOLUMEx2
  9.  
  10. ; egyéb hullámformák
  11.         ld    bc, 4000h
  12.         ld    c, a
  13.         ld    a, (bc)
  14.  
  15.         out   (0a9h), a

Itt 5 byte kódot kell cserélni csatornánként a megszakításkezelő rutinban, ami viszont gyorsul egy keveset. De a 8 bites PWM-nél a gyűrűmoduláció is a hangerő regiszterbe kerül, és 2 bites lesz a hullámforma, tehát módosítani kell az ugrótáblát (de lehet, hogy ugrótábla nélkül is elég gyors lenne a kód).
« Last Edit: 2017.January.26. 20:23:09 by IstvanV »

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #187 on: 2017.January.26. 20:30:54 »
Ha már dinamikus változtatás, akkor talán lehetne 8 bites is, táblázat nélkül. :)
Itt 5 byte kódot kell cserélni csatornánként a megszakításkezelő rutinban, ami viszont gyorsul egy keveset. De a 8 bites PWM-nél a gyűrűmoduláció is a hangerő regiszterbe kerül, és 2 bites lesz a hullámforma, tehát módosítani kell az ugrótáblát (de lehet, hogy ugrótábla nélkül is elég gyors lenne a kód).
Egy zseni vagy :) Dobom az ugrótáblát, amúgy is sokat gyorsult a lejátszó rutin a 256 byte-os hangok miatt, én 5 értéket néztem, ha egyik bit se volt állítva, akkor nullázta a frekvenciát. A módosítással meg kell 4 értéket vizsgálni, pont jó lesz, és ráadásul elmarad 7 darab push, és még pár utasítás ha a pulse waveform változik
Amúgy már így is felére esett össze a program , mind a betöltendő file, mind a memóriában szétterült :)
Egyelőre ezt a módosítást jegelem, szerintem holnap rátérek a menet közbeni kicsomagolásra.

De akkor ez lesz, ha jól értem:
00   freq low      (zajnál 4 bittel eltolva jobbra, 01-re is)
01   freq high
02   b7 ring mod + b6-b5 waveforms + b4-b0 volume (00h triangle, 20 sawtooth, 40h pulse, 60h noise)
03   b7-b0 pulse waveform
és minden bitet kihasználtunk :)

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #188 on: 2017.January.26. 21:42:54 »
Leteszteltem a 682 és a 1364 1 regiszter adathosszúsággal mentett fájlok tömöríthetőségét, és érdekes volt, hogy 8192-es blokkok esetén a 682-es kisebb lett:
eredeti file: 147312 byte volt
LZ-vel csomagolva a régi lejátszóhoz egy regiszter 12008 byte: 6475 byte

682 byte adathossz
commands4096.00     14943 byte
commands8192.00      9384 byte
commands16384.00     8330 byte
commands32768.00     7770 byte
1364 byte adathossz
commands4096.01     12327 byte
commands8192.01     11403 byte
commands16384.01     7933 byte
commands32768.01     7283 byte

blocksize és maxoffs nélküli csomagolás M2-vel:
commandn.00          7139 byte
commandn.01          6732 byte

Teljesen jónak tűnik a 8192-es megoldás 682-es hosszal:)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #189 on: 2017.January.26. 22:27:50 »
De akkor ez lesz, ha jól értem:
00   freq low      (zajnál 4 bittel eltolva jobbra, 01-re is)
01   freq high
02   b7 ring mod + b6-b5 waveforms + b4-b0 volume (00h triangle, 20 sawtooth, 40h pulse, 60h noise)
03   b7-b0 pulse waveform

Módosított konvertáló program, aminek a kimenete ilyen formátumú:
[ Guests cannot view attachments ]

Lua lejátszó:
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

A 8 bites PWM azonban növeli a file méretét, ha ez probléma, akkor mégis célszerűbb lehet csak 7 bitet tárolni. Így viszont felszabadulhat egy bit 6 bites hangerő céljára, bár ezt nagyobb táblázatok nélkül csak a négyszögjel tudná kihasználni:
[ Guests cannot view attachments ]

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #190 on: 2017.January.27. 08:41:25 »
Módosított konvertáló program, aminek a kimenete ilyen formátumú:
Köszi szépen.
A 8 bites PWM azonban növeli a file méretét, ha ez probléma, akkor mégis célszerűbb lehet csak 7 bitet tárolni. Így viszont felszabadulhat egy bit 6 bites hangerő céljára, bár ezt nagyobb táblázatok nélkül csak a négyszögjel tudná kihasználni:
Annyival csak nem növeli a méretét, szerintem maradjunk a 8 bites PWM-nél, a PWM-es megoldásodnak köszönhetően sztem befér az egész program egy szegmensbe, így 32KB csomagolt adat is belapozható egyszerre.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #191 on: 2017.January.27. 12:21:22 »
Köszi szépen.Annyival csak nem növeli a méretét, szerintem maradjunk a 8 bites PWM-nél, a PWM-es megoldásodnak köszönhetően sztem befér az egész program egy szegmensbe, így 32KB csomagolt adat is belapozható egyszerre.

Én úgy számoltam, hogy a bemeneti adat az első két lapon lehet, azaz a teljes 1. lap és a 0. lapon a maradék szabad hely. De ha a file mérete nem túl nagy, akkor még az is egy lehetőség hogy az 1. lapnak csak az első felét használja, akkor megtakarítható a lapozás a hangminta lejátszó rutinban.

Lapozással:
- 0000h - <2000h: kód
- <2000h - 7FFFh: bemeneti file (az 1. lapon lefoglalt szegmens lehet video RAM is 128K-s gépen)
- 4000h - 9FFFh: hangminta táblázatok (3 * 8K, az 1. lapot a megszakításkezelő rutin átmenetileg belapozza), ez lehetőleg ne legyen video RAM
- A000h - BFFFh: szabad, itt lehet kód is, egyéb táblázatok, stb., vagy a sid_conv_2.cpp használata esetén az egyik hullámforma 6 bites hangerővel
- C000h - FFFFh: kicsomagolt bemeneti adat, itt sem előnyös a video RAM

Vagy:
- <2000h - 9FFFh: bemeneti file
- 4000h - 7FFFh, A000-BFFFh: hangminta táblázatok
Így a hangminták nem összefüggő területre kerülnek (amit nem nehéz megoldani), viszont még nagyobb lehet a bemeneti file.

Lapozás nélkül:
- 0000h - <2000h: kód
- <2000h - 5FFFh: bemeneti file
- 6000h - BFFFh: hangminta táblázatok
- C000h - FFFFh: kicsomagolt bemeneti adat

Az eredeti verzióban a hangminták tömörített formátumban találhatók, azonban az új táblázatok így lényegesen nagyobb méretűek lennének, elsősorban az ismétlődés nélküli zaj minták miatt. Ezzel a Lua scripttel generálva az adatot:
[ Guests cannot view attachments ]
a file kb. 8000 byte méretű lesz "-m2 -blocksize 8192 -maxoffs 8192" tömörítéssel, vagy 6500 byte -m0 formátumban. Bár a tömörített táblázatok és az esetleges M0 rutin betöltés után szabadon felülírhatók. A math.randomseed-es sor törlésével minden hangerőnél eltérő lenne a zaj minta, nem tudom biztosan, hogy ez jobb hangot eredményez-e (kevésbé ismétlődik, de a hangerő modulálja).

Egy másik lehetséges megoldás Z80 kóddal generálni a táblázatokat, ez csak 128 byte és talán jobban is optimalizálható, a futásideje azonban 1.86 másodperc letiltott memória várakozással, ami lassabb lehet a kitömörítésnél. Valamivel gyorsabb lehetne a hármoszögjelet a fűrészből előállítva (vagy fordítva), mivel a hangminta értékek mindkettőnél azonosak, csak a sorrend változik. :) Szerk.: a fűrészjel pedig szorzás nélkül is megoldható lenne, hasonlóan a vonal rajzolásra használt algoritmushoz.
[ Guests cannot view attachments ]
A zaj itt is átalakítható hogy minden hangerőnél eltérő legyen, a "jr nz, .l4" utasítást kell "jr nz, .l5"-re cserélni.
« Last Edit: 2017.January.27. 12:51:26 by IstvanV »

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #192 on: 2017.January.27. 13:14:55 »
Egy másik lehetséges megoldás Z80 kóddal generálni a táblázatokat, ez csak 128 byte és talán jobban is optimalizálható, a futásideje azonban 1.86 másodperc letiltott memória várakozással, ami lassabb lehet a kitömörítésnél. Valamivel gyorsabb lehetne a hármoszögjelet a fűrészből előállítva (vagy fordítva), mivel a hangminta értékek mindkettőnél azonosak, csak a sorrend változik. :) Szerk.: a fűrészjel pedig szorzás nélkül is megoldható lenne, hasonlóan a vonal rajzolásra használt algoritmushoz.
A zaj itt is átalakítható hogy minden hangerőnél eltérő legyen, a "jr nz, .l4" utasítást kell "jr nz, .l5"-re cserélni.
Szuper, ez nekem szimpibb, most én is legenerálom, de a magam egyszerű módján, így kevesebb a hely, az egész tábla és kód elfér a 0-ás lapon, vagy ha nem, akkor a FILEkezelőt átteszem egy egy másik szegmensre.elméletileg semmit se kell lapozgatni (kivéve a display miatt a videó memóriát az 50Hz-es megszakításban)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #193 on: 2017.January.28. 10:22:35 »
Optimalizált táblázat generálás:
[ Guests cannot view attachments ]

Ez 0.9 másodperc alatt fut le, és rövidebb is az első verziónál (128 helyett 116 byte), a kimenete pedig azonos. Így már talán megfelelő sebességű a tömörített táblázatokhoz képest is.

Még egy lehetséges fejlesztés, hogy a hangminta lejátszás frekvenciája ne csak 7.8125 vagy 15.625 kHz lehessen, hanem a Z80 órajeltől függően gyorsuljon, azaz például 10 MHz-es gépen még nagyobb lehessen, és a 6 és 7.12 MHz-nek is legyen előnye. Így ugyan bonyolultabb a frekvencia konverzió (8*16->24 bites szorzás), de szerintem lenne rá idő. Bár nem tudom, megéri-e, a legtöbben valószínűleg 4 MHz-es gépen futtatnák a programot.
« Last Edit: 2017.January.28. 10:33:07 by IstvanV »

Online geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #194 on: 2017.January.28. 11:20:42 »
Optimalizált táblázat generálás:

Ez 0.9 másodperc alatt fut le, és rövidebb is az első verziónál (128 helyett 116 byte), a kimenete pedig azonos. Így már talán megfelelő sebességű a tömörített táblázatokhoz képest is.
Köszönöm szépen :) Eljutottam már odáig, hogy az új elrendezésű adatokat játsza le (még nem teszteltem, fájlt még nem generáltam hozzá) "folyamatos" kicsomagoló rutinoddal :), és javítottam az EXOS kompatibilitási hibát.
Még egy lehetséges fejlesztés, hogy a hangminta lejátszás frekvenciája ne csak 7.8125 vagy 15.625 kHz lehessen, hanem a Z80 órajeltől függően gyorsuljon, azaz például 10 MHz-es gépen még nagyobb lehessen, és a 6 és 7.12 MHz-nek is legyen előnye. Így ugyan bonyolultabb a frekvencia konverzió (8*16->24 bites szorzás), de szerintem lenne rá idő. Bár nem tudom, megéri-e, a legtöbben valószínűleg 4 MHz-es gépen futtatnák a programot.
Jó ötlet, tuti van rá idő ,mert a jelenlegi állás szerint a processzoridő 30-40%-a szabad ,és ezt csak turbós gépen kéne végrehajtani, megspóroltam a lapozásokat, csak egy van az 50Hz-es megszakításban a display miatt.
0-ás lapon a program, és a 3 tábla, 1-es, 2-es lapon a csomagolt adat, és a 3-as lapon a kicsomagolt.