Welcome, Guest. Please login or register.


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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #150 on: 2017.January.22. 15:29:54 »
én mind a két verziónál külön fájlba teszem minden regiszter tartalmát , és minden megszakításban eltárolom az értékeket, így marha sok adat kerül ki, de jobban tömöríthető

Erra a megoldásra már gondoltam én is, hamarosan készítek ilyen változatot is. Talán lehetne egy 16K-s blokkban 655 minta a 25 SID regiszterből (az első 655 byte a 0. regiszter, utána az 1. regiszter, stb.), ami 13.1 másodperc 50 Hz-es megszakításnál. Tömörítetlenül sem feltétlenül lenne sokkal nagyobb, mivel egy megszakítás gyakran 8 regisztert is módosít.
« Last Edit: 2017.January.22. 15:33:20 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #151 on: 2017.January.22. 18:02:59 »
Erra a megoldásra már gondoltam én is, hamarosan készítek ilyen változatot is. Talán lehetne egy 16K-s blokkban 655 minta a 25 SID regiszterből (az első 655 byte a 0. regiszter, utána az 1. regiszter, stb.), ami 13.1 másodperc 50 Hz-es megszakításnál. Tömörítetlenül sem feltétlenül lenne sokkal nagyobb, mivel egy megszakítás gyakran 8 regisztert is módosít.
Bocs, most megnéztem a SIDBasic-nél hogyan csináltam, csak 12 regisztert mentettem, mivel a többi nincs használatban, minden regiszter egy file:
Rambo song1 esetén lett 12*10669 byte a regiszter mentés, és ezt LZ-vel tömörítettem, így Rambo1.s64 5477 byte lett.
Ez a megoldás tök jó, csak helypazarló, mert ki kell csomagolni mindent előre, és így pl 128K-s gépen csak a zene felét játsza le a lejátszó.
Bár lehet, hogy itt már bármilyen tömörítés, lassítana annyit, hogy a sima SIDBasic-nél minőségromlást okozna, a SIDBasic Int-nél meg a megszakítás sebességét kéne csökkenteni.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #152 on: 2017.January.22. 20:11:31 »
Valóban sokat javít a tömörítésen az adatblokkok fent leírt módon való rendezése, az alábbi file kicsomagolva 344064 byte (kb. 4 és fél perc): :)

[ Guests cannot view attachments ]

Forráskód:

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Szerk.: kisebb javítás:
[ Guests cannot view attachments ]

A tömörítés itt is a már leírt módon (16K-s blokkok és szótár méret) történik.

Bár lehet, hogy itt már bármilyen tömörítés, lassítana annyit, hogy a sima SIDBasic-nél minőségromlást okozna, a SIDBasic Int-nél meg a megszakítás sebességét kéne csökkenteni.

Átlagosan nem lassít sokat, egy blokk kicsomagolása jellemzően 0.12-0.14 másodperc, bár ez függ az adattól is, ha ilyen nagy mértékben (30x) tömöríthető, akkor az idő nagy részében csak LDIR utasítást kell futtatni. :) És a blokkok lejátszásának az időtartama 13.1 másodperc. Talán pazarlás is a gyorsabb de nagy méretű rutin használata (illetve itt biztosan, de ez csak egy példa). Azonban a lejátszásnak teljesen megszakításból kell futnia, mert a főprogramban túl hosszú ideig tart a nagy blokkok feldolgozása.
« Last Edit: 2017.January.24. 10:57:56 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #153 on: 2017.January.23. 08:37:25 »
A tömörítés itt is a már leírt módon (16K-s blokkok és szótár méret) történik.

Átlagosan nem lassít sokat, egy blokk kicsomagolása jellemzően 0.12-0.14 másodperc, bár ez függ az adattól is, ha ilyen nagy mértékben (30x) tömöríthető, akkor az idő nagy részében csak LDIR utasítást kell futtatni. :) És a blokkok lejátszásának az időtartama 13.1 másodperc. Talán pazarlás is a gyorsabb de nagy méretű rutin használata (illetve itt biztosan, de ez csak egy példa). Azonban a lejátszásnak teljesen megszakításból kell futnia, mert a főprogramban túl hosszú ideig tart a nagy blokkok feldolgozása.
Úgy fest, akkor át kell dolgoznom a SIDBasic Int-et, bár ha a vezérlést is be kéne tenni 50Hz-es megszakításba, lehet még csökkenteni kéne a lejátszási frekvenciát. Viszont arra gondoltam, ha betenném a vezérlő rutin meghívását a kicsomagoló rutin sűrűbben futó részébe, és csak akkor meghívni, ha lenne videó interrupt, ezzel nem kéne megpiszkálni a digi lejátszást, és maradhatna a sebesség.
Amúgy eddig max 32K-s fájlok lehettek, és 2000h byte-onként szórtam szét utána az adatatot, így lehet lejátszani pl a Rambonak a felét 128K-s gépen.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #154 on: 2017.January.23. 11:24:28 »
Problémát okozhat még a lapozás és a kicsomagoló rutin regiszter használata (bár az utóbbi javítható némi lassulás árán). Ha jól látom, egy keveset talán lehetne gyorsítani a megszakításkezelő rutinon, például át lehetne másolni 0038h kezdőcímre (így megtakarítható egy JP), és az egyik index regiszter helyett a DE'-t is lehetne használni: a hangminta cím a BC'-be kerülne, és 8 ciklussal gyorsabb lenne a kód (4 DD/FD prefix helyett 2 EX DE, HL). De ez nem sok javulás, a lapozás mentése és visszaállítása többet lassítana (minimum 36 ciklust, és 25 lenne a video megszakítás).
« Last Edit: 2017.January.23. 11:29:35 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #155 on: 2017.January.23. 12:25:26 »
Az sokat rontana a minőségen ha 512 helyett 256 lenne egy hangminta mérete? Így egyszerűsíteni lehetne a kódon és a memóriaigény is a felére csökkenne. Az első csatorna például 28 ciklust gyorsulna:

Code: ZiLOG Z80 Assembler
  1.         LD    BC, 068E
  2.         ADD   IX, BC
  3.         LD    A, H
  4.         AND   00
  5.         XOR   IXH
  6.         LD    E, A
  7.         LD    A, IXL
  8.         RLA
  9.         RL    E
  10.         LD    A, 4D
  11.         ADC   A, A
  12.         LD    D, A
  13.         LD    A, (DE)
  14.         XOR   18
  15.         OUT   (A9), A

Helyette:

Code: ZiLOG Z80 Assembler
  1.         LD    BC, 068E
  2.         ADD   IX, BC
  3.         LD    A, H
  4.         AND   00
  5.         XOR   IXH
  6.         LD    C, A
  7.         LD    B, 9A
  8.         LD    A, (BC)
  9.         XOR   18
  10.         OUT   (A9), A

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #156 on: 2017.January.23. 13:19:25 »
Az sokat rontana a minőségen ha 512 helyett 256 lenne egy hangminta mérete?  Így egyszerűsíteni lehetne a kódon és a memóriaigény is a felére csökkenne. Az első csatorna például 28 ciklust gyorsulna:
512 byte a hangminta mérete? :)
Úgy emlékeztem, hogy 256, amúgy tuti nem rontana sokat, sőt le is kéne cserélni, mert a hangmintákat is én dobtam össze, és nem eredeti SID digizett minták.
28 ciklus már egész jó, abba pl majdnem belefér a megszakítás típusának ellenőrzése.
Ha lesz időm, ránézek majd, tudsz generálni optimalizált 256 byte-os hangmintát?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #157 on: 2017.January.23. 13:41:13 »
512 byte a hangminta mérete? :)

A fenti kódrészlet a felső 9 bitet használja a hangminta címzésére, és úgy látom, valóban 512 byte a méret, ez például két négyszögjel 8800h és 8A00h kezdőcímeken:
>8800  20 20 20 20 20 20 20 20
>8808  20 20 20 20 20 20 20 20
...
>8858  20 20 20 20 20 20 20 20
>8860  1F 1F 1F 1F 1F 1F 1F 1F
...
>88F8  1F 1F 1F 1F 1F 1F 1F 1F
>8900  1F 1F 1F 1F 1F 1F 1F 1F
...
>89F8  1F 1F 1F 1F 1F 1F 1F 1F
>8A00  20 20 20 20 20 20 20 20


Quote
28 ciklus már egész jó, abba pl majdnem belefér a megszakítás típusának ellenőrzése.

Egy csatornán 28 ciklus, összesen ennél többet lehet megtakarítani. :)

Quote
Ha lesz időm, ránézek majd, tudsz generálni optimalizált 256 byte-os hangmintát?

Igen, ha ismertek a táblázatok paraméterei, bár az eredeti SID hangminták pontos emulációja nem tudom mennyire fontos a DAVE kimenetének a minőségét figyelembe véve.

Szerk.: a módosított megszakításkezelő rutin ilyen lehetne, ez még gyorsabb az eredetinél és megtakarítja az IX regisztert, de nem használhatja a 2. és 3. lapot hangminták céljára (tehát még egy laphoz még azt is állítani kellene, azonban a blokk méret csökkentésével is meg lehetne oldani ezt a problémát). A "videoIRQHandler" közben engedélyezett a DAVE időzítő megszakítás, és ez egyszerű PUSH utasításokkal mentené a regisztereket és a lapozást.

Code: ZiLOG Z80 Assembler
  1.         org   002fh
  2.  
  3. videoIRQ_:
  4.         ld    a, 31h
  5.         out   (0b4h), a
  6.         ei
  7.         ex    af, af'
  8.         jp    videoIRQHandler
  9.  
  10. ; 0038h
  11.  
  12. irqRoutine:
  13.         ex    af, af'
  14.         in    a, (0b4h)
  15.         and   02h
  16.         jr    z, videoIRQ_
  17.         ld    a, 13h
  18.         out   (0b4h), a
  19. .l1:    ld    a, 00h                    ; *
  20.         out   (0b1h), a
  21.         exx
  22. .l2:    ld    bc, 0000h                 ; *
  23.         ex    de, hl
  24.         add   hl, bc
  25.         ex    de, hl
  26.         ld    a, h
  27. .l3:    and   00h                       ; *
  28.         xor   d
  29.         ld    c, a
  30. .l4:    ld    b, 40h                    ; *
  31.         ld    a, (bc)
  32. .l5:    xor   00h                       ; *
  33.         out   (0a9h), a
  34. .l6:    ld    bc, 0000h                 ; *
  35.         add   iy, bc
  36.         ld    a, d
  37. .l7:    and   00h                       ; *
  38.         xor   iyh
  39.         ld    c, a
  40. .l8:    ld    b, 40h                    ; *
  41.         ld    a, (bc)
  42. .l9:    xor   00h                       ; *
  43.         out   (0adh), a
  44. .l10:   ld    bc, 0000h                 ; *
  45.         add   hl, bc
  46.         ld    a, iyh
  47. .l11:   and   00h                       ; *
  48.         xor   h
  49.         ld    c, a
  50. .l12:   ld    b, 40h                    ; *
  51.         ld    a, (bc)
  52. .l13:   xor   00h                       ; *
  53.         out   (0aah), a
  54.         exx
  55. .l14:   ld    a, 00h                    ; *
  56.         out   (0b1h), a
  57.         ex    af, af'
  58.         ei
  59.         ret
« Last Edit: 2017.January.23. 14:25:24 by IstvanV »

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #158 on: 2017.January.23. 14:48:57 »
És valóban 512-nek tűnik, emlékeimben a 256 élt :lol:
Megnézem a táblázatokat majd, miket alkottam :) Úgy emlékszem, vagy 1 fűrész jel, egy háromszög, és több négyszögjel , ha jól emlékszem 32 a külön PWM-eknek, de megnézem az elosztást is majd.
Ha csökken az adat mérete 256-ra, akkor több PWM-et is használhatunk :)
Köszi szépen.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #159 on: 2017.January.23. 15:00:45 »
A módosított IRQ rutin egyébként (a timer.lua szerint) 0.085408 ms alatt fut le ha nem hibás, az eredeti a lejátszóban pedig 0.094398 ms. Még egy szegmens lapozásával (+ 36 ciklus) kb. azonos lenne a sebesség. Mivel az IM 1 megszakítás még hozzáad az időhöz 13 ciklust (0.00325 ms) és a frekvencia 7812.5 Hz, a hangminta lejátszás CPU fogyasztása eredetileg 76.3% volt, az átalakítás után pedig 69.3%.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #160 on: 2017.January.23. 15:15:04 »
Jobban meggondolva a rövidebb hangminták használatának mégis lehet hátránya: a zaj minőségét rontaná.

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #161 on: 2017.January.23. 16:07:22 »
Jobban meggondolva a rövidebb hangminták használatának mégis lehet hátránya: a zaj minőségét rontaná.
Erre nem gondoltam, lehet ezért lett 512.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #162 on: 2017.January.23. 18:05:45 »
Erre nem gondoltam, lehet ezért lett 512.

Bár ha jól látom, az eredeti zaj táblázatok minden hangmintát nyolcszor ismételnek, tehát valójában csak 64 minta egy teljes ciklus. Lehetne kevésbé ismétlődő adat is, de akkor a zaj frekvencia konverzióján kell módosítani, és kevésbé is lenne pontos (nem tudom, zajnál ez mennyire probléma).

Offline geco

  • EP addict
  • *
  • Posts: 7082
  • Country: hu
    • Támogató Támogató
Re: SID lejátszó
« Reply #163 on: 2017.January.23. 19:55:57 »
Bár ha jól látom, az eredeti zaj táblázatok minden hangmintát nyolcszor ismételnek, tehát valójában csak 64 minta egy teljes ciklus. Lehetne kevésbé ismétlődő adat is, de akkor a zaj frekvencia konverzióján kell módosítani, és kevésbé is lenne pontos (nem tudom, zajnál ez mennyire probléma).
Most jutottam elodáig, hogy fejtegessem én is mit csináltam :D
Először a zajtáblámban nem volt ismétlődés, nagyon rosszul szólt, elkezdtem növelni az ismétlődéseket, és ez lett belőle, viszont, ha lassítanám az olvasást, akkor tuti le lehetne felezni a tábla méretét, és negyedelni az ismétlődést, de lehet rossz a gondolatmenetem.
Így néznek ki a táblák:
noisetable               16 tábla a 16 hangerore
triangletable   equ     noisetable+2000h 16 tábla a 16 hangerore
sawtoothtable   equ     noisetable+4000h 16 tábla a 16hangerore triangletable-bol generálva, egy elem másol, egy elem kihagy, felétol visszafelé ugyanez
pulsetable1     equ     noisetable+6000h alap pulse táblák különbözo PWM-ekre
pulsetable2     equ     noisetable+8000h
pulsetable3     equ     noisetable+0a000h
« Last Edit: 2017.January.23. 21:12:01 by geco »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: SID lejátszó
« Reply #164 on: 2017.January.23. 21:13:55 »
noisetable               8 tábla a 8 hangerore
triangletable   equ     noisetable+2000h 8 tábla a 8 hangerore

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.
« Last Edit: 2017.January.23. 21:18:31 by IstvanV »