Két csatorna használatára én is gondoltam, oly módon elképzelve, hogy fixen át lenne konvertálva a kódban az eredeti 8 bites hangminták 2x 4 bitesre, így akkor be is férne a helyére. Lejátszásnál meg kimaradna 8->6 bitre konverzió, és annak helyére mehetne a félbájt szétszedés.
A sebességgel még így is problémák lehetnek
Ha jól látom, ez az eredeti lejátszó ciklus:
. B2E5 06 01 LD B, 01
. B2E7 10 FE DJNZ B2E7
. B2E9 3E 20 LD A, 20
. B2EB 86 ADD A, (HL)
. B2EC CB 3F SRL A
. B2EE CB 3F SRL A
. B2F0 D3 AC OUT (AC), A
. B2F2 23 INC HL
. B2F3 1B DEC DE
. B2F4 7A LD A, D
. B2F5 B3 OR E
. B2F6 20 ED JR NZ, B2E5
Ennek a futásideje midössze 88 ciklus (az LD B, 1 utasítás azonban változhat, nem minden hangminta lejátszási frekvenciája azonos), aminek az átiratban a Spectrum alacsonyabb órajele miatt 78-nak kellene lennie, a frekvencia pedig 45455 Hz
Az első próbálkozás elég lassúra sikerült
Itt a HL a lejátszandó hang kezdőcíme, a BC pedig a hangminták száma. Minden byte felső 4 bitje tartalmazza az A csatorna hangerejét, az alsó 4 bit pedig a B csatornáét. Ez a verzió 155 ciklus, ami kb. 2-szer lassabb.
exx
ld c, 0fdh
ld de, 0ffbfh
ld l, 8
exx
.l1: ld a, (hl) ; 7
inc hl ; 13
exx ; 17
ld h, a ; 21
rrca ; 25
rrca ; 29
rrca ; 33
rrca ; 37
and 0fh ; 44
ld b, d ; 48
out (c), l ; 60
ld b, e ; 64
out (c), a ; 76
ld a, h ; 80
and 0fh ; 87
ld b, d ; 91
inc l ; 95
out (c), l ; 107
ld b, e ; 111
out (c), a ; 123
dec l ; 127
exx ; 131
dec bc ; 137
ld a, c ; 141
or b ; 145
jp nz, .l1 ; 155
Újabb verzió: itt a hangminták nincsenek konvertálva, hanem a konverzió lejátszás közben történik egy 512 byte-os, 512-vel osztható címen kezdődő táblázat segítségével (minden lehetséges hangminta értékhez tartalmazza az A és B csatorna hangerejét). Néhány egyéb kisebb optimalizálást is tartalmaz, így 125 ciklusra gyorsult, ami még mindig több, mint másfélszer lassabb a megfelelő sebességnél.
Itt egyébként az AY programozása sem egészen szabványos módon történik: a regiszterszámot FFFDh helyett C0FDh I/O címre írja, ami bővített Spectrum esetén talán problémát okozhat.
exx
ld bc, 0bffdh
ld de, 0809h
exx
inc bc
ld de, .l2 + 1
jp .l3
.l1: dec de ; 6
exx ; 10
.l2: ld hl, sampleConvTable / 2 ; 20
add hl, hl ; 31
inc b ; 35
out (c), d ; 47
outi ; 63
inc b ; 67
out (c), e ; 79
outi ; 95
exx ; 99
.l3: ldi ; 115
jp pe, .l1 ; 125
Ezen még egy keveset sikerült javítani: a hangmintákat konvertálni kell 7 bitesre (a 0. bitnek mindig 0-nak kell lennie), de ez nem feltétlenül probléma, mert a két 4 bites hangerő kombinációja egyébként sem eredményezhet 7 bitesnél több különböző hangerőt. A táblázat mérete 256 byte-ra csökkent. Egy DEC DE utasítást is sikerült DEC E-re cserélni. Az AY programozása továbbra sem szabványos, és még mindig 112 ciklus a futásidő 78 helyett.
exx
ld bc, 0bffdh
ld de, 0809h
exx
inc bc
ld de, .l2 + 1
jp .l3
align 2
nop
.l1: dec e ; 4
exx ; 8
.l2: ld hl, sampleConvTable ; 18
inc b ; 22
out (c), d ; 34
outi ; 50
inc b ; 54
out (c), e ; 66
outi ; 82
exx ; 86
.l3: ldi ; 102
jp pe, .l1 ; 112
Talán lehetne még javítani rajta, de az I/O port címzés szabványossá tétele viszont némi lassulást eredményezne. Mindenesetre úgy látszik, az eredeti sebességgel problémás lehet a két csatornás lejátszást megoldani. Tehát valószínűleg marad az egyszerű egy csatornás, 4 bites hang, vagy a hangmintákat konvertálni kell alacsonyabb (kb. 30 kHz-es) mintavételezési frekvenciára, attól függően, hogy melyik ront kevésbé a hangminőségen. Az utóbbinak előnye lehet még, hogy helyet szabadítana fel, ahova esetleg elférhetne a konvertált zene és az új kód és táblázatok.