Autor Tema: Goattracker y efectos de sonido  (Leído 13335 veces)

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Goattracker y efectos de sonido
« en: Julio 03, 2018, 22:17:50 »
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

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!
« última modificación: Julio 04, 2018, 10:01:29 por PacoBlog64 »
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Goattracker y efectos de sonido
« Respuesta #1 en: Julio 04, 2018, 12:38:32 »
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.
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13630
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Goattracker y efectos de sonido
« Respuesta #2 en: Julio 04, 2018, 13:28:05 »
Me alegro :)
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #3 en: Julio 06, 2018, 10:48:36 »
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?

LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Goattracker y efectos de sonido
« Respuesta #4 en: Julio 06, 2018, 11:14:22 »
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: [Seleccionar]
!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

Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

Zub

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 150
  • SYS 0
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #5 en: Noviembre 08, 2018, 19:02:19 »
Hola compañeros!

Estoy con problemas de goattracker... Supuestamente hago todo bien pero los sfx no suenan ni de coña como lo hacen en el editor... De hecho algunos ni suenan..

Ejemplo un sonidito de bomba cayendo que se exporta así:

      dc.b $B3,$68,$00,$C3,$41,$C3,$C2,$C2,$C1,$C1,$C0,$C0,$BF,$BF,$BE,$BE
              dc.b $BD,$BD,$BC,$BC,$BB,$BB,$BA,$BA,$B9,$B9,$B8,$B8,$B7,$B7,$B6,$40
            dc.b $B5,$B5,$B4,$B3,$B2,$00

No suena una mierda. Adjunto el .INS original..

Cualquier ayuda será bienvenida!!

danytoon

  • Visitante
Re:Goattracker y efectos de sonido
« Respuesta #6 en: Noviembre 09, 2018, 02:26:53 »
A ver, que aquí hay bastantes entendidos de SID... @uctumi @darro99 o el mismo @PacoBlog64 , que ha trasteao ya :)
« última modificación: Noviembre 09, 2018, 02:55:59 por Dany »

Zub

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 150
  • SYS 0
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #7 en: Noviembre 09, 2018, 11:18:39 »
El que he puesto parece que es porque usa pulse width y la herramienta ins2snd no tiene en cuenta esa información.

Vuestros sfx usan pulsetable? Como haceis?


PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Goattracker y efectos de sonido
« Respuesta #8 en: Noviembre 09, 2018, 17:38:05 »
Hola @Zub , que yo sepa, los instrumentos que crees con Goattracker no deben tener "accesorios" como tablas de pulsos, filtros o velocidad. Se tiene que poner todo "a pelo". Al menos así es como logré que me funcionaran los míos. Si quieres que las notas tengan algún efecto (subidas o bajadas de tono) tienes que ponerlo en la wave table y nota a nota, nada de poner al final de la wave table del instrumento que haga un loop y vuelva al principio, por ejemplo.

He probado tu efecto y si cambio el 41 del tipo de onda por 11 u 81, por ejemplo, suena un efecto como de caída. Creo que el problema está ahí, en el tipo de onda.
« última modificación: Noviembre 11, 2018, 18:11:32 por PacoBlog64 »
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

Narcisound

  • Retrokiosko & Onslaught Member
  • Commodore Master
  • *****
  • Mensajes: 495
  • MASTERSID
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #9 en: Diciembre 03, 2018, 21:01:55 »
Para que el SID creado con GoatTracker deje una o dos pistas para los FX ¿Hay que indicarlo en algún sitio del programa o simplemente compones la música en una sola pista y dejas los canales 2 y 3 sin meter dato alguno para despues disparar los efectos desde el mismo código del juego?

Gracias.

PD. En su día aluciné con la música compuesta por Jeroen Tel de los Maniacs of Noise para el grandísimo HAWK EYE. Sobre todo por los "tunes" creados para los niveles del juego. Todos usando un solo canal y combinando muy bien bajo, baterías y arpegios varios.

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Goattracker y efectos de sonido
« Respuesta #10 en: Diciembre 04, 2018, 00:01:39 »
Para que el SID creado con GoatTracker deje una o dos pistas para los FX ¿Hay que indicarlo en algún sitio del programa o simplemente compones la música en una sola pista y dejas los canales 2 y 3 sin meter dato alguno para despues disparar los efectos desde el mismo código del juego?

En mi caso lo que he hecho es poner la música en los canales 1-2 y desde el código, cuando tengo que lanzar un FX, lo hago así, indicando que tiene que usar el 3er canal:
Código: [Seleccionar]
          lda #<fx_strong_hit                  ;Address in A,Y
          ldy #>fx_strong_hit
          ldx #$0e                        ;Channel index in X (0, 7 or 14). $0e = 14
          jsr MUSIC_PLAYBACK+3

También puedes poner la música en 1 solo canal y dejar 2 para los FX, indicando el canal que usará el FX cada vez que se lanza (p.ej.: $07 para el player 1 y $0e para el player 2). No lo he probado pero imagino que funcionará bien.

Jeroen Tel es un monstruo, es uno de mis compositores favoritos y creo que se merece más reconocimiento del que tiene actualmente. Cybernoid I y II, Hawkeye, Out Run Europa, Myth, Golden Axe, Eliminator,...
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

danytoon

  • Visitante
Re:Goattracker y efectos de sonido
« Respuesta #11 en: Diciembre 04, 2018, 00:40:08 »
el Jeroen está muy reconocido eh? Sin embargo, mi favorito siempre será el cabrón del Tim Follin

Sorry...


Narcisound

  • Retrokiosko & Onslaught Member
  • Commodore Master
  • *****
  • Mensajes: 495
  • MASTERSID
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #12 en: Diciembre 06, 2018, 15:06:07 »
Ok, gracias PacoBlog64 por tus explicaciones de como hacerlo.

Y a Dany decirle que Tim Follin es un monstruo del SID, al igual que Martin Galway o Rob Hubbard. Grandes entre los grandes!!

Narcisound

  • Retrokiosko & Onslaught Member
  • Commodore Master
  • *****
  • Mensajes: 495
  • MASTERSID
    • Ver Perfil
Re:Goattracker y efectos de sonido
« Respuesta #13 en: Diciembre 11, 2018, 19:44:09 »
Tengo una duda que me surge.

Si la pista creada para la música de un juego, la cual solo se ha usado el Canal 1 dejando el 2 y 3 para los FX, y en dichos canales se ha puesto el valor CF el cual corresponde a un PATTERN vacio (todo a "... 00000" y no suena NADA de música por ellos).

Mi pregunta es. Los efectos de sonido me imagino que habrá que cargarlos como SONIDOS al final de los usados en la música, por ejemplo, si el último sonido cargado para la música ha sido en la posición: "0C Hit Hat" ¿A partir de la siguiente posición 0D, he de ir cargando el resto de sonidos?

0D - Disparo Nave 1er Jugador
0E - Disparo Nave 2º Jugador
0F - Disparo recibido Nave 1er Jugador
10 - Disparo recibido Nave 2º Jugador
11 - Explosion Naves

Luego, como ya habeis explicado antes, será cuestión de decirle al programa, que sonido vas a hacer sonar y por cual canal, en mi caso, o el 2 o el 3 no?

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Goattracker y efectos de sonido
« Respuesta #14 en: Diciembre 11, 2018, 22:03:57 »
Mi pregunta es. Los efectos de sonido me imagino que habrá que cargarlos como SONIDOS al final de los usados en la música, por ejemplo, si el último sonido cargado para la música ha sido en la posición: "0C Hit Hat" ¿A partir de la siguiente posición 0D, he de ir cargando el resto de sonidos?

0D - Disparo Nave 1er Jugador
0E - Disparo Nave 2º Jugador
0F - Disparo recibido Nave 1er Jugador
10 - Disparo recibido Nave 2º Jugador
11 - Explosion Naves

Luego, como ya habeis explicado antes, será cuestión de decirle al programa, que sonido vas a hacer sonar y por cual canal, en mi caso, o el 2 o el 3 no?

Los sonidos son instrumentos del GT exportados como .ins y convertidos a sonidos (ficheros .snd) con el programa ins2snd que viene con GT. Un fichero .snd contiene, si no me equivoco, instrucciones en ensamblador. Los efectos no tienen porqué estar en el fichero .sid, son instrucciones aparte. Cuando quieres que suene un efecto, cargas en unos registros del programa la dirección de memoria en la que se cargó el efecto y haces un JSR a MUSIC_PLAYBACK+3. Por ejemplo, en ensamblador cargas el efecto así:
Código: [Seleccionar]
*=ZERO_SID_FX
fx_light_hit
!src "recursos_propios/sonidos/light_hit.snd"

Y lo llamas desde el programa así para que suene:
Código: [Seleccionar]
lda #<fx_light_hit                  ;Address in A,Y
ldy #>fx_light_hit
ldx #$0e                        ;Channel index in X (0, 7 or 14)
            jsr MUSIC_PLAYBACK+3

Es importante que, al crear el instrumento/efecto en GT, en la wavetable no pongas ningún loop o no te dejará exportarlo a .snd correctamente (te saldrán errores de exportación). Has de ponerlo todo "linealmente", y está limitado a una longitud concreta que ahora no recuerdo. Te recomiendo que te mires la documentación que viene con GT, ahí explican cómo funciona el tema de los instrumentos y los efectos ;)
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?