Commodore 64 > Desarrollo

Goattracker y efectos de sonido

(1/7) > >>

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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa