Commodore 64 > Desarrollo
Goattracker y efectos de sonido
PacoBlog64:
Hola,
He hecho un SID con GT (Goattracker) que contiene 2 pistas (bajo/batería y guitarra) y en el que he dejado una libre para efectos, ya que los ficheros generados con GT tienen una opción que permite usar una pista para FX. El caso es que sigo las instrucciones de la documentación pero no logro que suene el efecto, aunque sí suena la música correctamente. La música la exporto en formato BIN (con el player incorporado), y el efecto lo creo como instrumento dentro de GT: lo grabo como .ins, lo convierto a binario .snd con INS2SND2 y luego lo uso en mi código ensamblador siguiendo estas instrucciones:
--- Citar ---To init music:
LDA #tunenumber ;Starting from 0
JSR startaddress
To play music:
JSR startaddress+3
To change volume:
LDA #volume ;0-F, F is default
JSR startaddress+6
To play a sound effect
LDA #<sound ;Address of sound effect data
LDX #>sound
LDY #channel ;0-2
JSR startaddress+9
--- Fin de la cita ---
Pero como decía, la música suena y el efecto no. He mirado en otros sitios y teóricamente lo estoy haciendo todo correctamente, pero creo que algo se me escapa. ¿A alguien le ha pasado algo parecido? ¿Sabéis si hay que hacer algo especial para lograr que esto funcione?
¡Gracias!
PacoBlog64:
Misterio resuelto, me respondo a mi mismo: se conoce que los ficheros .snd que contienen los FX son de tipo texto (se importan con !src en ACME cambiando dc.b por !byte) y no de tipo binario (!bin), que es como los importaba erróneamente.
josepzin:
Me alegro :)
Maniako:
Esto es interesante.
Intenté lo mismo pero lo saqué junto al SID y... no funcionó XD.
Podrías pasarme el fichero ya convertido Para ver como funciona?
PacoBlog64:
Ok, te lo mando por privado ;)
Para el resto, el código del reproductor de música y efectos a partir del ejemplo que viene con el código fuente de Goattracker sería algo así (compilador ACME, que es el que uso):
--- Código: ---!to "example2.prg",cbm
; Variables.
ZERO_SID_TEST_MUSIC = $9800
; SID.
MUSIC_INIT = ZERO_SID_TEST_MUSIC
MUSIC_PLAYBACK = ZERO_SID_TEST_MUSIC+3
*=$0801
;lo siguiente equivale a SYS 2064, que inicia el programa
!byte $0C,$08,$0A,$00,$9E,$20,$32,$30,$36,$34,$00,$00,$00,$00,$00
; Example of using playroutine 2 (gamemusic)
;
; playeraddress+0 = init music (A = tunenumber starting from 0)
; playeraddress+3 = play music
; playeraddress+6 = play sound effect (A = sound effect address lowbyte,
; Y = sound effect address highbyte,
; X = channel index 0, 7 or 14)
;
; Remember that this player uses 2 zeropage locations, so save those
; locations before calling the player, if you need all of the ZP.
; The player doesn't depend on their contents between calls at all!
getin = $ffe4
fill_sfxtb lda #<arpeggio2
sta sfxtbllo
lda #>arpeggio2
sta sfxtblhi
lda #<arpeggio1
sta sfxtbllo+1
lda #>arpeggio1
sta sfxtblhi+1
lda #<gunshot
sta sfxtbllo+2
lda #>gunshot
sta sfxtblhi+2
lda #<explosion
sta sfxtbllo+3
lda #>explosion
sta sfxtblhi+3
start: jsr initraster
lda #22
sta $d018
lda #$00
jsr MUSIC_INIT ; inicializa música
ldx #$00
lda #$20
clearscreen: sta $0400,x
sta $0500,x
sta $0600,x
sta $0700,x
inx
bne clearscreen
textloop: lda text,x
jsr convertascii
sta $0400,x
lda #$01
sta $d800,x
inx
cpx #4*40
bcc textloop
idle: lda currraster
ldx #52
jsr printhex
lda maxraster
ldx #55
jsr printhex
jsr getin
cmp #"A"
bcc idle
cmp #"D"+1
bcs idle
playsound: sec
sbc #"A" ;Sound effect number 0-3
tax
lda sfxtbllo,x ;Address in A,Y
ldy sfxtblhi,x
ldx #$0e ;Channel index in X
;jsr $1006 ;(0, 7 or 14)
jsr MUSIC_PLAYBACK+3
jmp idle
printhex: pha
lsr
lsr
lsr
lsr
tay
lda hexnybble,y
jsr convertascii
sta $0400,x
pla
and #$0f
tay
lda hexnybble,y
jsr convertascii
sta $0401,x
rts
convertascii: cmp #$60
bcc ca_ok
sbc #$60
ca_ok: rts
initraster: sei
lda #<raster
sta $0314
lda #>raster
sta $0315
lda #50 ;Set low bits of raster
sta $d012 ;position
lda $d011
and #$7f ;Set high bit of raster
sta $d011 ;position (0)
lda #$7f ;Set timer interrupt off
sta $dc0d
lda #$01 ;Set raster interrupt on
sta $d01a
lda $dc0d ;Acknowledge timer interrupt
cli
irwait: lda maxraster
beq irwait
lda #$00
sta maxraster
rts
raster: nop
nop
nop
nop
nop
lda $d012
sta raster_cmp+1
inc $d020
jsr MUSIC_PLAYBACK ; reproducción de música
lda $d012 ;rastertime it took to
dec $d020 ;execute
sec
raster_cmp: sbc #$00
sta currraster
cmp maxraster
bcc raster_skip
sta maxraster
raster_skip: dec $d019
jmp $ea31
text: !text "Example 2: Game-musicroutine "
!text "Rastertime: / "
!text " "
!text "Press A-D for sound effects. "
hexnybble: !text "0123456789ABCDEF"
maxraster: !byte 0
currraster: !byte 0
sfxtbllo: !byte 0, 0, 0, 0
sfxtblhi: !byte 0, 0, 0, 0
arpeggio2:
!src "sfx_arp2.snd"
arpeggio1:
!src "sfx_arp1.snd"
gunshot:
!src "sfx_gun.snd"
explosion:
!src "sfx_expl.snd"
;explosion = highest pri.
*=ZERO_SID_TEST_MUSIC
!bin "dummy_song.bin" ;Playroutine & music data
--- Fin del código ---
Navegación
[#] Página Siguiente
Ir a la versión completa