A háromszögjelet, fűrészjelet és zajt táblázattal generálja, minden hangerő értékhez külön táblázatot használva, a négyszöget egyszerű aritmetikai műveletekkel (CP PW, SBC A,A, AND VOLUME), bár ez a valódi SID-hez képest invertált kimenetet eredményez.
Részletesebben:
Minden csatornán az oszcillátor egy 16 bites fázis akkumulátorra épül, amelyhez a beállított frekvencia hangminta megszakításonként hozzáadódik. A kimenetet a felső 8 bit alapján generálja. Valódi SID esetében a fázis 24 bites, és a felső 12 bitből állítja elő a kimenetet. Ezért a frekvenciát az alábbi módon konvertálni kell (N az eredeti SID frekvencia kód, N' a konvertált):
fSID = N * (985248.6 / 16777216)
fSIDBASIC = N' * (fSNDINT / 65536)
N' = N * (985248.6 / 16777216) / (fSNDINT / 65536) = N * 985248.6 / (fSNDINT * 256)
A 985248.6 a PAL C64 órajele Hz-ben (17734475 / 18). Tehát a 4 MHz-es gépen használt 10 kHz-es lejátszási frekvenciánál 0.38486 a szorzó a konvertálásnál, ezt a lejátszó a ténylegesen mért órajel alapján kiszámítja és beállítja. Gyorsabb gépen nagyobb a hangminta megszakítás frekvenciája, azaz jól hallhatóan javul a minőség, de csökken a frekvencia felbontása az egyre kisebb szorzó miatt. 25 kHz-nél (10 MHz-es Z80) még elfogadható a pontosság.
A következő lépés a fázis felső 8 bitjéből a hang előállítása, előbb azonban még az esetleges gyűrűmoduláció effektust kell emulálni. Ez a gyakorlatban a másik csatorna fázisának a felső (15.) bitjével való egyszerű XOR műveletet jelent. A négyszögjel kivételével a lejátszó a hullámformákat 256 méretű táblázatokból olvassa, ezekből 31 van az 5 bites hangerőhöz, összesen tehát 5D00h méretű hangminta táblázat (31 * háromszög, 31 * fűrész, 31 * zaj). Nulla hangerőnél a program a hullámformát négyszögjelre cseréli, így megtakarítható volt 768 byte.
Speciális eset még a zaj, ez a valódi SID-nél minden periódus alatt 16 mintát állít elő (azaz például 1 kHz-es frekvenciát beállítva a zajgenerátor órajele 16 kHz), és csak hosszú idő után ismétlődik a kimenete, mivel 23 bites polinom számlálót (LFSR) használ. Ezért egyszerű 256 méretű táblázattal nem lehet igazán jól emulálni. Zajnál a konvertáló program (sid_conv) a frekvenciát 4 bittel jobbra lépteti, így a normál hullámformákhoz képest 16 periódus után ismétlődik a kimenet, és egy alatt helyesen 16 zaj mintát állít elő. Az ismétlődést csökkenti valamennyire, hogy minden hangerő értéknél eltérő a zaj minta, ez például doboknál javítja a hangot.
A négyszögjelet nem táblázattal, hanem egyszerű aritmetikai műveletekkel generálja a lejátszó, ez még gyorsabb is, mint a táblázat (az A-ban a fázis felső 8 bitje található):
cp PW
sbc a, a
and VOLUME
Azaz a perióduson belül a 8 bitesre konvertált kitöltési tényező (PW) elérése előtt logikai 1 a kimenet (az SBC A, A után 255), utána 0. Ez tulajdonképpen nem helyes, mert a valódi SID négyszögjel generátora invertált kimenetű, a PW előtt 0 és utána 1. De a különbség remélhetőleg nem probléma a gyakorlatban.
A 3 csatorna lejátszását megvalósító rutin így néz ki, az önmódosító kód miatt ez futás közben változik:
. 0043 D9 EXX
. 0044 01 64 08 LD BC, 0864
. 0047 EB EX DE, HL
. 0048 09 ADD HL, BC
. 0049 EB EX DE, HL
. 004A 7C LD A, H
. 004B E6 00 AND 00
. 004D AA XOR D
. 004E 01 00 1F LD BC, 1F00
. 0051 4F LD C, A
. 0052 0A LD A, (BC)
. 0053 D3 A8 OUT (A8), A
. 0055 01 61 06 LD BC, 0661
. 0058 FD 09 ADD IY, BC
. 005A 7A LD A, D
. 005B E6 00 AND 00
. 005D FD AC XOR IYH
. 005F 01 00 16 LD BC, 1600
. 0062 4F LD C, A
. 0063 0A LD A, (BC)
. 0064 D3 AF OUT (AF), A
. 0066 01 86 00 LD BC, 0086
. 0069 09 ADD HL, BC
. 006A FD 7C LD A, IYH
. 006C E6 00 AND 00
. 006E AC XOR H
. 006F FE A0 CP A0
. 0071 9F SBC A, A
. 0072 E6 22 AND 22
. 0074 D3 AC OUT (AC), A
. 0076 D9 EXX
Itt az első két csatornán a hullámforma éppen háromszög (az aufmonty.m64 eleje), a harmadikon pedig 62.5% kitöltési tényezőjű (A0h / 256) négyszög. Gyűrűmodulációnál az AND 00h-k helyére AND 80h kerül. DE' az első csatorna fázisa, IY a második, HL' pedig a harmadik.
A file formátum minden csatornán a következőket tárolja video megszakításonként (összesen 4 byte):
- 16 bites SID frekvencia, zajnál 4 bittel jobbra léptetve
- 1 bit gyűrűmoduláció
- 2 bit hullámforma (kombinált hullámformák nem támogatottak), 0 hangerőnél mindig négyszög
- 5 bit hangerő
- 8 bites négyszögjel kitöltési tényező (az eredeti 12 bites érték felső 8 bitje)
A burkológörbe generátor emulációját a konvertáló program valósítja meg, így a lejátszónak ezzel nem kell foglalkoznia. Ez egyébként 3 számlálóra épül:
- egy 15 bites, ~1 MHz-en futó számláló határozza meg a sebességet, ha az aktuális A/D/R érték és egy táblázat szerint elér egy bizonyos értéket, akkor újraindul és a következő számláló értéke frissülhet
- egy 5 bites számláló emulálja az exponenciális lecsengést, felfutásnál (ATTACK) nem használt, egyébként a kimenetet lineáris szegmensekre osztja (93/255 érték alatt felezi a sebességet, 54/255 alatt negyedeli, stb.)
- végül egy 8 bites számláló a tényleges burkológörbe kimenet, felfutásnál növekszik az értéke és 255 elérésekor lecsengés (DECAY) módra vált, lecsengésnél és elengedésnél 0-ig csökken, az előbbinél csak akkor, ha az értéke nem egyenlő a SUSTAIN 17-szeresével (00h, 11h, 22h, stb.)
A szűrőt és a SYNC effektust nem támogatja a sid_conv és a lejátszó.