Könnyen megeshet, hogy a burkológörbe emuláció jobb, mint a SIDPlayerben
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.
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.binKisebb 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.
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.