Beeper

"Con la composición de Toshio Kai en tus manos te reúnes con el grupo de ingenieros de sonido, no sabéis por dónde empezar. Después de un rato discutiendo, se decide usar la partitura de Kai, la lista de sonidos y los momentos en que la máquina debe reproducirlos para completar el espectáculo de luces y sonido."

Diciembre de 1977. Sala de reuniones del equipo Pac-man.

Sonido electrónico.

Después de dos semanas los ingenieros de sonido te presentan la lista completa con los sonidos grabados en el estudio. Una cinta con los siguientes tonos:

1 "Eat"
2 "Gulp"
3 "Eat Fruit"
4 "Eat Ghost"
5 "Death 1"
6 "Death 2"
7 "Death 3"
8 "Score"

También nos traen dos temas musicales en un disco:

1 "Pac-man Theme"
2 "Pac-man Intermission"

Disponemos de todo lo necesario para crear "el sonido electrónico".

Beep

El ZX Specrum puede reproducir un "pitido" programado mediante combinaciones de funciones que determinan el Tono. EngineZX.asm pone a nuestra disposición esas funciones a través del comando Beep para reproducir "tono" y Crash para reproducir "ruido blanco". Los dos efectos están sincronizados con el juego y le dan continuidad.

Colocar un "Beep" en el lugar correspondiente según el guion que conocemos nos resultará fácil.

"Eat"-EVENT COLLECTBLOCK

Abre el editor MPAGD. Craga tu proyecto Pacman. Selecciona "Collect block" del menú "Events", el script debe quedar así:

EVENT COLLECTBLOCK

; COME

IF SCREEN = 0 ; en el laberinto
    IF F = 0        ; si estamos jugando
    ADD 1 TO N ; suma al contador de puntos de luz
        SCORE 5 ; sumar 5 al marcador
    ENDIF
ENDIF

IF F = 0        ; solo si estamos jugando
    BEEP 16        ; FX Sonido "paku paku"
    ;SOUND 101
ENDIF

AT 22 2
SHOWSCORE

Guarda el texto, cierra el editor de textos, guarda el proyecto.

Reproducimos un Beep 16 cuando comemos un punto de luz.
Dejamos comentado ";SOUND 101" para cuando podamos reproducir un sonido diseñado con un editor externo que veremos más adelante.

Sencillo, eficaz y elegante. Repetimos el proceso para los demás eventos y efectos.

"Gulp"-EVENT PLAYER

Selecciona "Player" del menú "Events", en la sección de detección, cuando come "bola de poder" modificar así:

    IF F = 0          ; solo si estamos "jugando" entonces
SCORE 50          ; suma 50 puntos
BEEP 60           ; sonido "Gulp"
;SOUND 102
    ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

"Eat Fruit"-EVENT SPRITETYPE5

Selecciona "Sprite type 5" del menú "Events", cerca del final del script modificar así:

    SHOWSCORE         ; actualiza marcador SCORE
    IF F = 0           ; solo si estamos "Jugando" entonces
        BEEP 30            ; sonido "Gulp" ; sonido "Eat fruit"
; SOUND 103
    ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

"Eat Ghost"-EVENT PLAYER

Selecciona "Player" del menú "Events", modificar en la sección de detección, casi al final del script para quedar así:

    ADD 1 TO G      ; aumenta TOTAL FANTASMAS POR PANTALLA
    IF F = 0         ; solo si estamos "jugando" entonces
        BEEP 250          ; sonido "Eat Ghost"
;SOUND 104
    ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

"Death*128k"-EVENT SPRITETYPE4

Selecciona "Sprite type 4" del menú "Events", casi al final del script, cuando colisiona con "player" modificar así:

IF F = 0    ; solo en modo "Jugando" entonces
    SUBTRACT 1 TO LIVES    ; resta una vida
    ; SOUND 105   ; sonido "Death 128k"
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

"Death 1,2 y 3"-EVENT SPRITETYPE2

Selecciona "Sprite type 2" del menú "Events", modificar así:

    IF K =1
IF F = 0
            BEEP 120
    ;SOUND 105 ; fx "Death 1"
    DELAY 25    ; esperamos
ENDIF
    ENDIF
    IF K =2
IF F = 0
            BEEP 80
    ;SOUND 106 ; fx "Death 2"
    DELAY 25    ; esperamos
ENDIF
    ENDIF
    IF K =4
IF F = 0
    BEEP 60
    ;SOUND 107 ; fx "Death 3"
    DELAY 25    ; esperamos
ENDIF
    ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

La muerte de Pac-man la separamos en tres cortes del sonido "Death" para dar la ilusión de continuidad  ( asegúrate de que sean K =1, K=2 y K =4) . Lo hacemos así para dar continuidad al juego mientras "beeper" acapara la atención del "CCP". 

"Score"-EVENT MAINLOOP2

Selecciona "Main loop 2" del menú "Events".

Busca el código dentro de la opción IF SCREEN = 2, modifica BEEP 7    (FX "score") y reemplaza en todos los casos por el código siguiente: 

            BEEP 18     ; reproducir FX "score"
            ;SOUND 108
            DELAY 2

Guarda el texto, cierra el editor de textos, guarda el proyecto.

¿Lo tienes?. Ahora hay banda sonora, movimiento y color, delante de nosotros tenemos un video-juego. Escucha. Pulsa "la quinta de fa mayor" (F5).

Saludos nuevos programas

Tenemos los efectos, sumemos la música. Para realizar la música necesitamos un editor externo al MPAGD, la fuente del sonido determinará cual será. Este es un esquema donde se muestran los formatos y programas que usaremos.
Esquema MPAGD Sound ZX Spectrum

El equipo de ingenieros de sonido ha reunido una buena colección de herramientas para transformar los recursos sonoros en electrónicos. El objetivo es imitar el sonido analógico con algoritmos de manera que ocuparán muy poco en memoria.

Para el ZX Spectrum 48k vamos a construir una Modificación "Beeper" y para el modelo ZX Spectrum 128k la Modificación "AY" que veremos más adelante. Estas dos construcciones montarán la música y los efectos en las dos plataformas de manera automática y transparente para nosotros.

Build

Igual que hicimos con la modificación del Cargador, ahora descarga esta nueva modificación Beeper Beeper-Mod (que también incluye el cargador de "Récords"). Descomprime los archivos que contiene la carpeta "Beeper-Mod-main" para copiarlos en el directorio Suite ZX de tu MPAGD sustituyendo todos los archivos para que el nuevo módulo se integre y funcione. 

No vamos a entrar en detalles, únicamente estudiar las opciones que tenemos. Ahora podemos escoger guardar los marcadores de Récords (o hacerte tu propio cargador) compatible con cualquier juego (mod=1) o usar el cargador minimalista standard (mod=0), cambiar el nombre del juego para la producción final, ejecutar el sonido Standard (modsnd=0) o usar el nuevo módulo integrado para el Beeper (modsnd=1).

Nos disponemos a editar ...\Suite ZX\build.bat con cuidado y seguridad.

rem ------------------------------------------------------
rem MODO
rem 0 = Standard MPAG
rem 1 = Modificación Cargador "Récords" Pac-man compatible
set mod=1
rem ------------------------------------------------------
rem Modificaciones de cargador:
rem nombre para tu juego
set gamename=Pacman48
rem dirección de memoria
set dirmem=32000 (no editar)
rem ------------------------------------------------------
rem Modificaciones de sonido
rem 0 = Standard
rem 1 = Modificaciones para ZX Spectrum 48k Beeper
set modsnd=1
rem ------------------------------------------------------

Lo que vamos a establecer primero para Pac-man es mod=1 para conservar nuestro marcador de récords. Lo segundo que vamos a hacer es cambiar para modsnd=1 y así activar la música y los efectos Beeper. No necesitarás hacer más.

Guarda los cambios que hemos realizado. Ya está. Automáticamente, naturalmente.

Ahora el comando SOUND que hemos añadido al juego ejecutará los sonidos creados con un editor externo.

El trabajo de sonido

Plan A: Buscar si existe alguna versión adecuada de música escrita en un "módulo vt2", que consiste en un archivo de texto con la información que necesita el motor Vortex tracker para ejecutar dicha música.

Si no existe, pasamos al plan B, que es buscar y transformar fuentes de sonido midi. El conversor midi AutoSiril convierte en formato vt2 una canción midi.

Puede que tampoco existan música midi a nuestra disposición, en cuyo caso nos queda el plan C, crear esa música nosotros mismos o pedir ayuda a un músico o música.
 
Todas las opciones se ilustran en el diagrama y podrás repetirlas para tus futuros juegos.

Por último usaremos el editor Beepola para compilar la música y convertirla en algoritmos que nuestro juego va a ejecutar con el comando SOUND.

Recursos de sonido

Afortunadamente tenemos las fuentes midi que ahora se incluyen en una carpeta "sound resources" del Suite ZX.

El editor que necesitarás para generar archivos de música vt2 para Pac-man es Vortex tracker 2.5 que ahora se incluye en la carpeta "tools" del Suite ZX.

AutoSiril está disponible en la carpeta Mid2VT_AutoSiril que ahora se incluye en la carpeta "tools" del Suite ZX.

Beepola también está incluido en la carpeta "tools" del Suite ZX.

Canción Pac-man

Abre la carpeta "tools", abre Vortex tracker 2.5.
Abre la carpeta "Mid2VT_AutoSiril" en otra ventana, minimiza su tamaño.

Abre la carpeta "sound resources" que está incluida ahora en el Suite ZX, copia los dos archivos midi: "Pac-man Theme" y "Pac-man Intermission" para pegarlos en la carpeta "Mid2VT_AutoSiril".

Estudio midi

Abre el archivo "Pac-man Theme" con tu editor midi favorito, con la única intención de comprobar que consta de dos pistas y escuchar por separado cada una de ellas para identificar los instrumentos que intervienen. Cierra tu editor midi favorito.

Sea cual sea el número de pistas que pudiera tener nuestra fuente midi, tendremos que reducirlo a 3, que es el límite de pistas (o canales) que puede manejar el editor Vortex tracker 2.5.

Abre tu editor favorito para echar un vistazo al archivo CONVERT.bat que está incluido en la carpeta "Mid2VT_AutoSiril".
 
El archivo CONVERT.bat sirve para ejecutar los comandos de autosiril.exe con las opciones necesarias para definir las tres voces que buscamos. Dentro del archivo se explican en los comentarios, si quieres más detalles puedes leer las instrucciones que están en la carpeta "docs" que acompaña al programa autosiril.exe. La parte final del script deberá quedar así:

rem opciones escogidas para Pac-man theme 
autosiril.exe %1 1m,2du,2me 4 0 1
ren %1e.txt "%name%".VT1.txt

rem opciones escogidas para Pac-man intermission or Pac-man theme
autosiril.exe %1 1me,2m,2p 2 0 1
ren %1e.txt "%name%".VT2.txt

Estudiemos qué hace este script para convertir Pac-man Theme:

El programa ejecuta autosiril.exe. La primera opción es el nombre del archivo midi que vamos a convertir. Después le siguen las configuraciones de los tres canales (o pistas), separados por comas, que manejará el editor Vortex tracker 2.5.

En el primer canal: "1m" mezcla la pista 1 del archivo midi, además le asigna el tipo de instrumento "Mono melody" que será un acorde seguramente.
En el segundo canal: "2du" mezcla la pista 2 del archivo midi, le asigna percusión (drums "d") y elimina el eco ("u" mute echo).
En el último canal: "2me" mezcla la pista 2 del archivo midi, le asigna el tipo de instrumento "Mono melody" y le añade sonido envolvente.
Por último las opciones N1=tempo,N2=eco primario,N3=eco secundario las configuramos para un ritmo de 4x4 (16 negras) y sólo un eco secundario.

Asegúrate de que las opciones sean las escogidas para Pac-man. Cierra el editor.

Estas configuraciones las puedes complicar o simplificar a tu gusto cuando te enfrentes a otros proyectos. Es cuestión de probar y escuchar. Puedes mezclar dos pistas del archivo midi por ejemplo escribiendo "1du-2me" en un sólo canal del editor Vortex tracker 2.5.

Convertir midi a VT2

En el imagen: Convirtiendo midi a VT2

Selecciona y arrastra "Pac-man Theme.mid" para colocarlo encima de CONVERT.bat incluido en la carpeta Mid2VT_AutoSiril, ejecutarás el programa desde el explorador de Windows. Se crearán dos archivos en la carpeta Mid2VT_AutoSiril: Pac-man theme.VT1.txt y Pac-man theme.VT2.txt.

En la imagen: supervisando música.

Selecciona ahora Pac-man theme.VT1.txt y arrástralo dentro del editor Vortex tracker 2.5. Escucha el tema, servirá para judgar la conversión que acabas de realizar y hacer retoques. Listo! Guarda ahora el proyecto desde el editor Vortex tracker 2.5, con la opción "Guardar como", con el nombre pacman_intro, el tipo de archivo vt2 y en la carpeta Beepola (que está incluida en la carpeta Tools).

"VT2 text module" para Beepola

Abre ahora Beepola.exe que se incluye en la carpeta tools. Selecciona la opción "Import Vortex tracker II text module" del menú "File", busca en la carpeta Beepola el archivo pacman_intro.vt2 que hemos guardado (selecciona "All files" en el tipo de archivo a buscar para que aparezca en el cuadro de diálogo). También puedes importar directamente el archivo Pac-man theme.VT1.txt que está en la carpeta
Mid2VT_AutoSiril si no has hecho ninguna modificación posterior a la conversión con Vortex tracker 2.5.

En la imagen: Compilando música.

Vamos a compilar la música. En el programa Beepola selecciona "Compile song" del menú "tools". Asegúrate de dejar seleccionados los siguientes parámetros:
Output Type: Song Data Only (*.asm).
Beeper Engine: The Music Box.
When the end of the song is reached: Loop back to the defined LOOP START point.
Player Routine: Exit after every note (for in-game music).
Pulsa "OK".
Guarda el archivo generado en la carpeta Sound del Suit ZX, con el nombre Pacman_intro.asm.

Por último prepárate para editar el archivo que acabas de compilar.

Abre el archivo Pacman_intro.asm con tu editor de textos favorito. Debes hacer tres cambios:
Borra la primera línea donde se establece la dirección en memoria del programa ensamblador (ORG xxxxx).
Reemplaza la etiqueta "MUSICDATA" por "Pacman_intro_MUSICDATA".
Por último reemplazar todos los casos "PAT" por "Pacman_intro_PAT".

Guarda los cambios.

Uff. Un poco de lío la primera vez; pero luego se convierte en rutina. La música se ha convertido en electrónica.

Debes repetir el proceso con Pac-man Intermission.mid. Selecciona y arrastra "Pac-man Itermission.mid" para colocarlo encima de CONVERT.bat incluido en la carpeta Mid2VT_AutoSiril. Esta vez escoge el archivo pacman_intermision.VT2.txt que generó Autosiril.exe, el tempo de la cancón será más rápido. Importa este archivo al editor Beepola, compila con el nombre Pacman_intermission.asm y edita el archivo como hemos hecho antes.

En la imagen: Editando archivo final asm.
 
Recuerda cambiar las etiquetas en Pacman_intermission.asm cuando lo crees. Esto evitará duplicados en direcciones de memoria. 
Recuerda: borra la primera línea donde se establece la dirección en memoria del programa ensamblador (ORG xxxxx), reemplaza "MUSICDATA" por "Pacman_intermission_MUSICDATA" y reemplazar todos los casos "PAT" por "Pacman_intermission_PAT".

No olvides guardar los cambios. Ya tenemos la música.

Un consejo. En el editor Beepola puedes seleccionar "Adjust tempo..." del submenú "Song" del menú "Edit" para acelerar en +1, +2, etc. Esto puede ayudar a suavizar el movimiento de tus juegos al mismo tiempo que se ejecuta la música. Puedes usarlo con cuidado para no desvirtuar la música.

music.asm

Prepárate para editar el archivo music.asm que deberá estar en la carpeta Sound incluida ahora en el Suite ZX. Deberá quedar así, sólo estas líneas:

; Tema Intermission
IntermissionTune
include "pacman_intermission.asm"
InitPacmanIntermission
ld hl,IntermissionTune
ret
; Tema Intro
IntroTune
include "pacman_intro.asm"
InitPacmanIntro
ld hl,IntroTune
ret

Guarda el texto.

El programa está escrito en lenguaje ensamblador, lo que hace es integrar en el juego la música que acabamos de compilar. Con las etiquetas IntroTune e IntermissionTune indicamos la dirección de memoria donde se almacenan las canciones. Las mini-rutinas InitPacmanIntermission e InitPacmanIntro colaboran para iniciar el sonido cuando determinan esas direcciones con el registro "hl".

Necesitarás repetir el patrón por cada canción que añadas a tus juegos:

; Tema nombredeltema
nombredeltemaTune
include "nombredeltema.asm"
Initnombredeltema
ld hl,nombredeltemaTune
ret

SelectTunes.asm

Prepárate para crear y editar el archivo SelectTunes.asm que estará en la carpeta Sound. Deberá contener solamente estas líneas.

; selecciona los temas
cp 1
call z,InitPacmanIntro
cp 2
call z,InitPacmanIntermission

Guarda los cambios.

El programa colabora en la selección del tema para ejecutar en el juego. Escoge según el valor del registro "a" (1 o 2) la mini-rutina que determina la dirección de memoria donde se almacena la canción correspondiente.

El patrón que repetirás para tus otros proyectos será:

                cp n     ; selecciona canción "n"
                call z,Initnombredeltema

Hasta aquí los programas que tendrás que editar, del resto se ocupa la Modificación Beeper que has instalado.

EVENT MAIN LOOP 2

Ordena ejecutar la música en la posición "¡GET READY!"

Abre el editor MPAGD. Selecciona "Main loop 2" del menú "Events". Modifica todo el caso IF SCREEN = 0 (si estamos en el LABERINTO) para quedar así: 

IF SCREEN = 0     ; si estamos en el LABERINTO
    IF F = 1            ; y en modo "enmarcado Jugando"
PUT  16 16 0        ; pinta objetos
PUT  224 16 1
PUT  16 144 2
PUT  224 144 3
AT 22 16            ; pinta marcador
DISPLAY LIVES
AT 9 13
MESSAGE 6     ; GET READY!
IF P = 1            ; si comenzamos en el primer laberinto
            SOUND 1 ; Tema musical Pac-man
    SOUND 0             ; Música sólo una vez
    SOUND 36 ; monitor
    WHILE A = 1 ; repite mientras suena el tema Pac-man
SOUND 96            ; reproduce siguiente nota
SOUND 36            ; monitor
    ENDWHILE
ELSE
            DELAY 25            ; Espera a GET READY!
ENDIF
REDRAW              ; Redibuja
LET F = 0           ; pasa a modo "Jugando"
EXIT                ; salir
    ELSE
        IF F = 3        ; par el modo "enmarcado Insert coin"
            PUT  16 16 0    ; coloca objetos
            PUT  224 16 1
            PUT  16 144 2
            PUT  224 144 3
            LET F = 2       ; pasa a modo "Insert coin"
            EXIT
        ENDIF
    ENDIF
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

El programa hace su trabajo: si comenzamos en el primer laberinto, selecciona la primera canción de la lista: "Pac-man Intro" (SOUND 1). El comando SOUND 0 ("desactiva loop") evita que se repita la canción en un bucle infinito. El comando SOUND 36 coloca un 1 en la variable A si la canción no ha terminado y establece A = 0 cuando la canción alcanza el final. El comando SOUND 96 reproduce la canción una nota más.

    SOUND 36 ; monitor
            WHILE A = 1 ; repite mientras suena el tema Pac-man  SOUND 96            ; reproduce siguiente nota
SOUND 36            ; monitor
    ENDWHILE

Este bucle espera a que acabe la canción para que Pac-man pueda estar ¡Preparado!

Modifica también todo el caso IF SCREEN = 3 (si estamos en INTERMISSION) para quedar así:

IF SCREEN = 3        ; si estamos en INTERMISSION
    IF F = 1            ; y en modo "enmarcado" entonces
INK 7                ; tinta White
PAPER 0              ; papel Black
PUT 8 136 0          ; coloca a "Kokoro"
AT 10 12 MESSAGE 7   ; pinta el nivel
AT 10 18 DISPLAY P
SILENCE             ; apagar Player
SOUND 2             ; reproduce música "Intermission"
;SOUND 0             ; sonar solo una vez
LET F = 2            ; establece ya el modo "Insert coin"
    ENDIF
ENDIF

Guarda el texto, cierra el editor de textos, guarda el proyecto.

El programa hace su trabajo: selecciona la segunda canción de la lista: "Pac-man Intermission" (SOUND 2).

EVENT MAIN LOOP 1

Selecciona "Main loop 1" del menú "Events". Coloca SOUND 96 al principio del script, justo antes del cronómetro.

EVENT MAINLOOP1

SOUND 96

Guarda el texto, cierra el editor de textos, guarda el proyecto.

Main loop 1 se ejecuta siempre cada "frame" del juego, te aseguras la ejecución de la siguiente nota (SOUND 96) cuando debe sonar la música durante la pantalla de Intermission.

GET READY!

Prueba ahora a jugar. ¿Qué te parece? La música hace más épica la aventura.



Comentarios

Entradas populares de este blog

El laberinto