Cambiar los efectos de sonido

For all things Churrera. ¿Estás haciendo un juego? ¿quieres proponer un cambio? ¿tienes alguna duda? ¡Cuéntanoslo!

Moderador: na_th_an

Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Cambiar los efectos de sonido

Mensajepor son_link » Vie, 03 Ene 2014, 12:44

He estado trasteando con BeepFX y he creado nuevos efectos de sonido para el juego (disparo, contenedor de energía y enemigo derrotado)
¿Como los meto en el juego?
Se que hay que editar beeper.h, pero no se que lineas tengo que modificar. Gracias por adelantado
LOAD TAPE ERROR
Imagen
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Cambiar los efectos de sonido

Mensajepor na_th_an » Vie, 03 Ene 2014, 12:50

Tienes que exportar los sonidos en ensamblador y modificar los que hay. Hay que saber un poco de ASM (al menos lo básico) para saber qué se está haciendo.

Esto es un ejemplo de beeper.h con los sondios exportados de BeepFX

Código: Seleccionar todo

// Churrera Engine
// ===============
// Copyleft 2010, 2011, 2012, 2013 by The Mojon Twins

// beeper.h
// Cointains Beeper sound effects

// Most effects have been taken off BeepFX's demo project.
// So I guess they should be credited to Shiru again ;)

#asm

.sound_play
   
   ld hl, soundEffectsData   ;address of sound effects data

   ;di
   push iy

   ld b,0
   ld c,a
   add hl,bc
   add hl,bc
   ld a,(hl)
   inc hl
   ld h,(hl)
   ld l,a
   push hl
   pop ix         ;put it into ix

.readData
   ld a,(ix+0)      ;read block type
   or a
   jr nz,readData_sound
   pop iy
   ;ei
   ret
   
.readData_sound
   ld c,(ix+1)      ;read duration 1
   ld b,(ix+2)
   ld e,(ix+3)      ;read duration 2
   ld d,(ix+4)
   push de
   pop iy

   dec a
   jr nz,sfxRoutineNoise



;this routine generate tone with many parameters

.sfxRoutineTone
   ld e,(ix+5)      ;freq
   ld d,(ix+6)
   ld a,(ix+9)      ;duty
   ld (sfxRoutineTone_duty + 1),a
   ld hl,0

.sfxRoutineTone_l0
   push bc
   push iy
   pop bc
.sfxRoutineTone_l1
   add hl,de
   ld a,h
.sfxRoutineTone_duty
   cp 0
   sbc a,a
   and 16
.sfxRoutineTone_border
   or 0
   out ($fe),a

   dec bc
   ld a,b
   or c
   jr nz,sfxRoutineTone_l1

   ld a,(sfxRoutineTone_duty + 1)
   add a,(ix+10)   ;duty change
   ld (sfxRoutineTone_duty + 1),a

   ld c,(ix+7)      ;slide
   ld b,(ix+8)
   ex de,hl
   add hl,bc
   ex de,hl

   pop bc
   dec bc
   ld a,b
   or c
   jr nz,sfxRoutineTone_l0

   ld c,11
.nextData
   add ix,bc      ;skip to the next block
   jr readData

;this routine generate noise with two parameters

.sfxRoutineNoise
   ld e,(ix+5)      ;pitch

   ld d,1
   ld h,d
   ld l,d
.sfxRoutineNoise_l0
   push bc
   push iy
   pop bc
.sfxRoutineNoise_l1
   ld a,(hl)
   and 16
.sfxRoutineNoise_border
   or 0
   out ($fe),a
   dec d
   jr nz,sfxRoutineNoise_l2
   ld d,e
   inc hl
   ld a,h
   and $1f
   ld h,a
.sfxRoutineNoise_l2
   dec bc
   ld a,b
   or c
   jr nz,sfxRoutineNoise_l1

   ld a,e
   add a,(ix+6)   ;slide
   ld e,a

   pop bc
   dec bc
   ld a,b
   or c
   jr nz,sfxRoutineNoise_l0

   ld c,7
   jr nextData
   
.soundEffectsData
   defw soundEffectsData_sfx0
   defw soundEffectsData_sfx1
   defw soundEffectsData_sfx2
   defw soundEffectsData_sfx3
   defw soundEffectsData_sfx4
   defw soundEffectsData_sfx5
   defw soundEffectsData_sfx6
   defw soundEffectsData_sfx7
   defw soundEffectsData_sfx8
   defw soundEffectsData_sfx9
   defw soundEffectsData_sfx10
   defw soundEffectsData_sfx11
   
.soundEffectsData_sfx0
   defb 0x01
   defw 0x000a,0x03e8,0x00c8,0x0016,0x1680
   defb 0x00
.soundEffectsData_sfx1
   defb 0x01
   defw 0x0064,0x0014,0x01f4,0x0002,0x0010
   defb 0x00
.soundEffectsData_sfx2
   defb 0x02
   defw 0x0001,0x03e8,0x000a
   defb 0x01
   defw 0x0014,0x0064,0x0190,0xfff0,0x0080
   defb 0x02
   defw 0x0001,0x07d0,0x0001
   defb 0x00
.soundEffectsData_sfx3
   defb 0x01
   defw 0x0014,0x00c8,0x0d48,0x000a,0x0040
   defb 0x00
.soundEffectsData_sfx4
   defb 0x01
   defw 0x0050,0x0014,0x03e8,0xffff,0x0080
   defb 0x00
.soundEffectsData_sfx5
   defb 0x01
   defw 0x0004,0x03e8,0x03e8,0x0190,0x0080
   defb 0x00
.soundEffectsData_sfx6
   defb 0x01
   defw 0x0002,0x0fa0,0x0190,0x00c8,0x0040
   defb 0x01
   defw 0x0002,0x0fa0,0x00c8,0x00c8,0x0020
   defb 0x00
.soundEffectsData_sfx7
   defb 0x01
   defw 0x000a,0x03e8,0x00c8,0x0002,0x0010
   defb 0x01
   defw 0x0001,0x0fa0,0x0000,0x0000,0x0000
   defb 0x01
   defw 0x000a,0x03e8,0x00c8,0xfffe,0x0010
   defb 0x01
   defw 0x0001,0x07d0,0x0000,0x0000,0x0000
   defb 0x01
   defw 0x000a,0x03e8,0x00b4,0xfffe,0x0010
   defb 0x01
   defw 0x0001,0x0fa0,0x0000,0x0000,0x0000
   defb 0x00
.soundEffectsData_sfx8
   defb 0x02
   defw 0x0001,0x03e8,0x0014
   defb 0x01
   defw 0x0001,0x03e8,0x0000,0x0000,0x0000
   defb 0x02
   defw 0x0001,0x03e8,0x0001
   defb 0x00
.soundEffectsData_sfx9
   defb 0x02
   defw 0x0014,0x0032,0x0101
   defb 0x00
.soundEffectsData_sfx10
   defb 0x02
   defw 0x0064,0x01f4,0x0264
   defb 0x00
.soundEffectsData_sfx11
   defb 0x01
   defw 0x0014,0x01f4,0x00c8,0x0005,0x0110
   defb 0x01
   defw 0x0001,0x03e8,0x0000,0x0000,0x0000
   defb 0x01
   defw 0x001e,0x01f4,0x00c8,0x0008,0x0110
   defb 0x01
   defw 0x0001,0x07d0,0x0000,0x0000,0x0000
   defb 0x00
#endasm

/*
   TABLA DE SONIDOS

   n   Sonido
   ----------
   1   Salto
   2   enemy hit
   3   killzone hit
   4   countdown
   5   coin
   6   object
   7   talk 1
   8   key in lock
   9   shoot
   10   explosion
   11   talk 2   
   
*/

void peta_el_beeper (unsigned char n) {
   // Cargar en A el valor de n
   asm_int [0] = n;
   #asm
      push ix
      push iy
      ld a, (_asm_int)
      call sound_play
      pop ix
      pop iy
   #endasm
}


Tiene el asm pegado arriba y en la función peta_el_beeper, que es la que se llama desde el engine, simplemente se carga el valor de "n" en el registro "A" y se llama a sound_play, que es el código que exporta BeepFX.

No es algo precisamente trivial.
Como diría Rorshach: "Urm..."
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Cambiar los efectos de sonido

Mensajepor son_link » Vie, 03 Ene 2014, 14:34

Pues nada, tratare de hacerlo por que no tengo ni idea de Asamblador, pero si no me da tiempo, pues lo dejare para mas adelante.
LOAD TAPE ERROR
Imagen
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Cambiar los efectos de sonido

Mensajepor son_link » Mié, 12 Feb 2014, 12:39

Bueno, he empezado a ver si consigo por fin modificar los sonidos, pero me encuentro que el juego se queda pillado hasta que termina de sonar el efecto. Pensé que seria cosa de los que cree, pero pasa incluso copia tal y como pones arriba ¿alguna solución?
LOAD TAPE ERROR
Imagen
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Cambiar los efectos de sonido

Mensajepor na_th_an » Mié, 12 Feb 2014, 13:17

No. El Spectrum 48K no tiene un chip para hacer sonido. Es la CPU quien se encarga de poner valores directamente en el altavoz, por lo que tiene que dedicarse exclusivamente a hacer eso, y a nada más.
Como diría Rorshach: "Urm..."
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Cambiar los efectos de sonido

Mensajepor son_link » Mié, 12 Feb 2014, 13:39

na_th_an escribió:No. El Spectrum 48K no tiene un chip para hacer sonido. Es la CPU quien se encarga de poner valores directamente en el altavoz, por lo que tiene que dedicarse exclusivamente a hacer eso, y a nada más.

¿Y modificando el beeper.h original de la churrera?
LOAD TAPE ERROR
Imagen
Nightwolf
Mensajes: 215
Registrado: Sab, 15 Oct 2011, 11:24

Re: Cambiar los efectos de sonido

Mensajepor Nightwolf » Mié, 12 Feb 2014, 13:42

Amh, Por eso hay esa "parada" cuando coges un item. Si el juego se pone en "modo 128k", ¿sigue pasando ésto? (Imagino que no, ya que el juego de Jarlaxe tiene música y todo)
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Cambiar los efectos de sonido

Mensajepor na_th_an » Mié, 12 Feb 2014, 13:45

son_link escribió:
na_th_an escribió:No. El Spectrum 48K no tiene un chip para hacer sonido. Es la CPU quien se encarga de poner valores directamente en el altavoz, por lo que tiene que dedicarse exclusivamente a hacer eso, y a nada más.

¿Y modificando el beeper.h original de la churrera?


El beeper.h original de la churrera también para la CPU. No hay otra forma de hacer sonido en un 48K, la CPU se tiene que dedicar única y exclusivamente a poner 0s y 1s en un bit de una dirección de E/S que está mapeada casi directamente al altavoz. Lo que pasa es que se usan sonidos cortos para minimizar el efecto.

Otra cosa es que hagas el juego para 128K, con lo que música y efectos se reproducen con el AY. La CPU sólo se tiene que encargar de modificar el estado de este chip cada 20ms, y tarda muy poco, con lo que no existe ninguna "parada".
Como diría Rorshach: "Urm..."
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Cambiar los efectos de sonido

Mensajepor son_link » Mié, 12 Feb 2014, 14:21

Pues nada, lo dejo tal cual, no voy a coger ahora y ponerlo en exclusiva para 128k. Ya para mas adelante si eso haré uno para 128k
LOAD TAPE ERROR
Imagen
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Cambiar los efectos de sonido

Mensajepor son_link » Jue, 13 Feb 2014, 12:11

Bueno, sigo con el tema de cambiar los sonidos.
Uno de los foros de Speccy, hidoki, me dijo de algunos programas y estoy usando uno que los genera de manera aleatoria, http://www.drpetter.se/project_sfxr.html el cual puede exportar a wav y luego ser importado a BeepFX como sample para añadirlo.
Añado las lineas del sample y modifico las lineas del sonido correspondiente, en este caso el 6 que es el del disparo y se compila sin que salga ningún error, pero una vez en el juego al pulsar disparo el juego se para y empieza a sonar ruido.
Compare las lineas con el que genere sin ese sample y salvo las lineas con el sample y las lineas que corresponden al FX son exactamente iguales.
Adjunto el beeper.h y el asm que me genera BeeperFX para ver si alguien sabe si se puede solucionar.
Adjuntos
efectos.zip
(2.51 KiB) Descargado 145 veces
LOAD TAPE ERROR
Imagen

Volver a “La Churrera”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados