Página 1 de 4

Cambiar los efectos de sonido

Publicado: Vie, 03 Ene 2014, 12:44
por son_link
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

Re: Cambiar los efectos de sonido

Publicado: Vie, 03 Ene 2014, 12:50
por na_th_an
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

$this->bbcode_second_pass_code('', '// 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.

Re: Cambiar los efectos de sonido

Publicado: Vie, 03 Ene 2014, 14:34
por son_link
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.

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 12:39
por son_link
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?

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 13:17
por na_th_an
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.

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 13:39
por son_link
$this->bbcode_second_pass_quote('na_th_an', 'N')o. 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?

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 13:42
por Nightwolf
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)

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 13:45
por na_th_an
$this->bbcode_second_pass_quote('son_link', '')$this->bbcode_second_pass_quote('na_th_an', 'N')o. 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".

Re: Cambiar los efectos de sonido

Publicado: Mié, 12 Feb 2014, 14:21
por son_link
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

Re: Cambiar los efectos de sonido

Publicado: Jue, 13 Feb 2014, 12:11
por son_link
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.