kimentettem a dave regisztereket a midi lejátszóból:
Erre a célra használható a midiconv is, például az
itt található Bad Apple demóhoz ezek a parancsok konvertálják a zenét:
./bin/midiconv_linux64 eleclove.mid musicdat.dav envelope.txt -quant4 -render
./bin/daveconv_linux64 musicdat.xr8 musicdat.dav:e4,n,f 0
./bin/epcompress -raw -m4 -X musicdat.xr8 musicdat.m4A -render paraméter a lényeges, ennek a használatakor DAVE regiszter adat lesz a kimenet. A -quant4 célja itt csak az, hogy minden negyedhang időtartama pontosan osztható legyen 4 50 Hz-es megszakítással, így nem egyenetlen a zene időzítése.
nade fogtam a daveconv.cpp-t és lefordítottam xorplay formátumra: (egyébként nem igazán világos nekem a sok paraméter, azokat használtam jobb híján, amivel az exorcist zenéje lett konvertálva)
Konvertálásnál fontos, hogy a formátum és a betöltési cím megfelelő legyen, az Exorcist zenéjénél használt paraméterekhez a legjobb az Exorcist lejátszó rutinját beépíteni. Vagy a fenti példához a badapple.asm-ben található rutint. A csomagban és
itt is megtalálható daveconv.cpp egyébként kissé továbbfejlesztett, hatékonyabban kódolja a hosszú szüneteket.
Azonban mostanában kísérletezek ilyen célra jobb formátummal, mert a daveconv több zenénél nem igazán hatékony, és a fix méretű burkológörbe terület is nehézkes. Mindenesetre a paraméterek jelenleg ezek:
./bin/daveconv_linux64 OUTFILE INFILE[:[OPTIONS][,THRESHOLD[,MAXDUR]]] [LOADADDR]
Options (comma separated list):
r: reserve 8 bytes at the beginning of the envelope buffer
h: hold previous frequency if volume is zero
z: zero frequency if volume is zero
e0..e4: envelope buffer size (2^(N+9) bytes, default: e3 (4096))
n: non-interleaved envelope data
p1..p8: number of note parameter tables, default: p2 (2048 bytes)
d: use only one note parameter table (same as p1)
s: find the threshold and max. duration for minimum data size
f: find the threshold and max. duration for minimum file sizeA leglényegesebbek az "e" és "n" (burkológörbe terület mérete és formátuma), a "d" vagy "p", és a LOADADDR. Az utóbbi általában ugyanaz, mint a lejátszó forráskódjában a musicData cím, és ha negatív, akkor a zene adat a burkológörbék elé kerül. Itt például 0x1000 a helyes érték:
; xorplay8K.s
; daveconv file.xr8 file.dav:e4,n,f 0x1000
musicInit:
ld hl, (trackOffsets)
xor a
di
out (0a7h), a
inc a
ld (envTimer0), a
ld (envTimer1), a
ld (envTimer2), a
ld (envTimer3), a
ld (trackPtr0), hl
ld hl, (trackOffsets + 2)
ld (trackPtr1), hl
ld hl, (trackOffsets + 4)
ld (trackPtr2), hl
ld hl, (trackOffsets + 6)
ld (trackPtr3), hl
; ei
ret
macro daveChnPlay fr, vr, lenvt, ltptr
.lenv: ld a, 1 ; * envelope timer
dec a
jr nz, .l5
.ltp: ld hl, trackOffsets + 8 ; * data pointer
or (hl)
inc hl
jr nz, .l1
or (hl)
if fr == 0a0h
jr z, musicRestart
endif
inc hl
ld b, (hl)
inc hl
ld e, (hl)
inc hl
if fr != 0a6h
ld d, (hl)
inc hl
endif
ld (.ltp + 1), hl
jp .l4
.l1: ld d, high noteParamTable
ld b, a
djnz .l2
ld d, high (noteParamTable + 0400h)
ld a, (hl)
inc hl
.l2: ld (.ltp + 1), hl
ld l, a
ld h, d
ld a, (hl)
inc h
ld b, (hl)
inc h
ld e, (hl)
if fr != 0a6h
inc h
ld d, (hl)
endif
if fr == 0a0h
or a
jr z, musicRestart
endif
.l4: ld l, b
ld h, a
and 0fh
ld (.lenv + 1), a ; duration
xor h
rra
rra
rra
rra ; envelope H
add a, high envelopeData
ld h, a
if fr != 0a6h
ld (.l6 - 2), de
else
ld a, e
ld (.l6 - 1), a
endif
jp .l6 ; Carry = 0
.l5: ld (.lenv + 1), a
ld hl, envelopeData ; * envelope position
inc hl
if fr != 0a6h
ld de, 0000h ; * frequency
else
ld a, 00h ; * channel 3 control
endif
.l6: ; Z = 0
if fr != 0a6h
ld a, e
endif
out (fr), a
if fr != 0a6h
ld a, d
out (fr + 1), a
endif
ld a, (hl)
out (vr), a
rla
jr c, .l7
ld (.l5 + 4), hl
.l7: ld a, h
add a, c ; C = high 1000h
ld h, a
ld a, (hl)
out (vr + 4), a
lenvt equ .lenv + 1
ltptr equ .ltp + 1
endm
musicRestart:
call musicInit
musicPlay:
ld c, high 1000h
daveChnPlay 0a0h, 0a8h, envTimer0, trackPtr0
daveChnPlay 0a2h, 0a9h, envTimer1, trackPtr1
daveChnPlay 0a4h, 0aah, envTimer2, trackPtr2
daveChnPlay 0a6h, 0abh, envTimer3, trackPtr3
ret
musicData equ 1000h
assert (musicData & 00ffh) == 0
envelopeData equ musicData
noteParamTable equ musicData + 2000h
trackOffsets equ musicData + 2800h