Pum
GBCero
NOTA : Si una imagen no se ve lo suficientemente grande. Click derecho sobre ella y "Abrir imagen en pestaña nueva
Ejemplo en Vídeo (Inglés y Largos, 7 partes. En la parte 6 se recomienda ver la descripción del video):
- Parte 1:
- Parte 2:
- Parte 3:
- Parte 4:
- Parte 5:
- Parte 6:
- Parte 7:
En Este tutorial veremos como insertar una canción desde 0 en la ROM muy detalladamente
Programas que se usarán (Se proporcionan en descarga al final del tutorial)
- Emulador VBA-M / GamBatte / BGB *
- Anvil Studio
- C-Point
- Gold Finger
- Editor de Textos (Recomiendo Notepad++)
- Midi2GSC
- GSCImport
- MAF
* GamBatte Y BGB emularán el audio más fielmente al sonido original de una GameBoy, pero ten en cuenta que mucha más gente usa VBA-M para jugar ROMs.
Durante el tutorial usaré una canción de ejemplo con su resultado final al principio.
-
Antes de nada, necesitamos nuestra MIDI de 4 canales. Podemos conseguirla de dos formas: Modificando una MIDI ya existente, o creando nosotros una desde cero. Lo segundo es bastante complicado, laborioso y largo. A menos que seas muy bueno creando música no se recomienda lanzarte a componer.
Para este ejemplo, cogeremos la canción que suena en Pokemon Conquest en el castillo de veneno:
Hay que tener en cuenta que no porque una canción esté en una ROM va a estar formateada como MIDI. Hay canciones que pueden estar en formato .wav y entonces no podemos hacer nada.
Esta canción existe como MIDI por internet. Pero yo decidí extraerla directamente de la ROM del juego por si acaso. Esto no es materia de este tutorial. -
Abrimos la MIDI con Anvil Studio, vemos que tiene 15 canales (El primero esta inutilizado) (Ver imagen)
Una vez hayamos escuchado la midi varias veces. Debemos localizar los trozos de audio principales que queremos en un nuestro midi de 3 canales.
Principalmente vamos a querer uno que es un sonido de fondo repetitivo, y dos sonidos que caracterizan a la canción.
Para hacer pruebas podemos silenciar canales que no nos interesan (Ver imagen)
y volver a reproducir hasta que nos queden tres y sigamos oyendo la melodía principal. En ciertas situaciones puede que queramos más de tres canales para que la canción nos suene como queramos. Lo que se puede hacer es coger esas porciones de audio e intentar meterlas en uno de los tres canales. Pero ten en cuenta siempre que solo disponemos de 3 canales. (El canal de drums nunca se debería de usar como un 4º canal de audio, los drums son drums y punto)
Ten en cuenta que muchos canales son duplicados de otros en ciertos momentos con otros tonos/instrumentos para darle profundidad/estilo a la canción. -
Tras analizar la canción, decido que los canales que voy a usar son el 2, el 7 y el 13. Sin embargo en el canal 4 tiene una parte de la melodía al final que me interesa, aprovecho que el canal 2 no tiene nada durante la reproducción de esa parte y veo que la podré poner en ella. (Ver Imagen)
Ahora debo eliminar el resto de canales y quedarme con esos tres (más el nº 4 para copiar la parte que quiero usar en el 2, luego se habla de eso). Para eliminar un canal simplemente haz click derecho sobre el y dale a "Delete Track". O si no selecciona el canal que desees eliminar dándole a la derecha de todo donde deberá aparecer un ✓ en rojo, y después dale, arriba de todo donde dice Track, a delete; luego confirma.
Una vez eliminados todos los canales de sobra debemos ver si es viable usar los tres que tenemos. Con viable me refiero a lo siguiente para cada canal independientemente:
NOTA: Antes de explicar esto, añadir que para poder acceder a las notas del canal de forma detallada para lo que nosotros queremos debemos tener nuestro canal seleccionado, después le damos a View --> Piano Roll Edition. Ahí podremos ver los semitonos, cada nota con su duración, etc... Y ponemos, donde dice Grid, 1/16.
- A la hora de que nuestra midi sea reproducida por el emulador, tenemos que tener en cuenta que la nota más corta posible es una semicorchea. Si nuestra canción tiene notas más pequeñas, tendremos que modificarlas para que sean mínimo semicorcheas. En ciertas canciones esto es imposible o extremadamente tedioso, ya que al hacerlas semicorcheas unas notas empiezan a ponerse sobre otras, y los canales se ralentizan respecto a otros. En nuestro ejemplo tenemos este problema, pero por suerte se puede solucionar. Ver apartado de DyD para una posible solución
Si nos encontramos esto :
Lo cambiaríamos para que quede así :
Como podemos ver, eliminamos parte de la nota anterior para hacer sitio a las dos notas.
Esas notas eran fusas (1/2 de semicorchea) ya que teníamos puesto el grid a 1/16 (que es como debe estar) Y ya dijimos que el mínimo era semicorchea. (Ver imagen)
- A la hora de que nuestra midi sea reproducida por el emulador, tenemos que tener en cuenta que dos notas, en el mismo canal, con el mismo tono, seguidas pero separadas, sonarán como una en el emulador sumando sus duraciones. Si por ejemplo en nuestro canal de ritmo tenemos esto, podemos hacer varias cosas. Por ejemplo podemos eliminar las notas dos a dos, de forma que siempre nos quede un hueco del tamaño de una semicorchea entre las notas, ya que ahí tendremos que insertar un silencio. Otra posibilidad es subir o bajar las notas dos a dos de Semitono. Por ejemplo si tenemos 10 notas seguidas en el semitono 'D#', podemos cambiar las que estén las posiciones impares (primera, tercera, quinta, séptima y novena) de semitono al 'D' o al 'E', y ver como suena. Para subir o bajar una nota de semitono, ponemos el ratón encima por el medio del rectángulo hasta que el puntero cambie a una línea vertical con dos flechas en las esquinas, entonces mantenemos pulsado y movemos hacia arriba o abajo.
Si por ejemplo, tenemos esto :
A la hora de sonar, equivaldría a esto :
Entonces podemos hacer bien esto (según la importancia del canal puedo sonar igual o peor) :
O esto (más posibilidad de que suene bien) :
- A la hora de que nuestra midi sea reproducida por el emulador, tenemos que tener en cuenta que dos notas del mismo canal no pueden sonar al mismo tiempo, aunque tengan distinto tono. En nuestra canción esto sucede pero muy minoritariamente, y es fácil de eliminar. Pero en ciertas canciones esto puede ser la razón principal por la que suenan bien, y tratar de modificar eso nos llevará a una canción que sonará mucho peor y para nada a como era antes. Lo mejor es mirar canal a canal, nota a nota buscando notas que se reproduzcan al mismo tiempo. Generalmente te vas a encontrar de dos tipos:
- Notas duplicadas/triplicadas/etc (Ver imagen)
Con este tipo de repetición es con la que más problemas vamos a tener, en este caso habría que eliminar una de las líneas de semicorcheas (la del medio probablemente) y eliminar las notas que suenen al mismo tiempo que las corcheas de la linea inferior. Lo probé y no sonaba mal, pero en una parte más adelante de esa canción (no es la de este ejemplo) fue imposible de editar y que sonara decentemente. Quizá alguien a quien se le diera bien esto hubiera podido.
- Pequeñas transposiciones de notas (Ver imagen)
Este es común en ciertas canciones, y en la que estamos editando pasa igual (la imagen es de nuestra canción). Estos son fáciles de solucionar si no son muy grandes y comunes. En el caso de la imagen, simplemente cogimos la nota que duraba 3 semicorcheas y la acortamos una para que dure dos, y justo cuando acabe empiece la siguiente. Para acortarla pon el ratón a la derecha del rectángulo que representa la nota y, cuando el puntero del ratón cambie a la linea horizontal con dos flechas, mantén pulsado y muévete hacia la izquierda. Si coges la nota por la izquierda en vez de por la derecha, te permitirá mover la nota pero no acortarla/alargarla.
Debemos mirar los tres canales uno a uno en busca de estas transposiciones y eliminarlas.
- Notas duplicadas/triplicadas/etc (Ver imagen)
Si vemos que nuestra midi no tiene estos problemas, o que si los tiene, los podemos solucionar, seguimos. - A la hora de que nuestra midi sea reproducida por el emulador, tenemos que tener en cuenta que la nota más corta posible es una semicorchea. Si nuestra canción tiene notas más pequeñas, tendremos que modificarlas para que sean mínimo semicorcheas. En ciertas canciones esto es imposible o extremadamente tedioso, ya que al hacerlas semicorcheas unas notas empiezan a ponerse sobre otras, y los canales se ralentizan respecto a otros. En nuestro ejemplo tenemos este problema, pero por suerte se puede solucionar. Ver apartado de DyD para una posible solución
-
Decía que aquella parte del canal número 4 me interesaba, y que me cabía en el canal 2 ya que mientras esa parte del canal 4 se reproducía, el 2 está en silencio. Lo más sencillo es hacer lo siguiente:
- Primero cambiamos de visualización dándole a View --> Composer.
- Después, en el 4º canal nos posicionamos en la primera nota que queremos mover al 2do canal (Ver imagen)
- Ahora mantenemos pulsado la tecla Shift (La que tiene una flecha que apunta hacia arriba, encima de Ctrl) y pulsamos la tecla de moverse hacia la derecha. Esto irá seleccionando notas a medida que vamos pulsando, nos guiamos por la gráfica que hay arriba a la derecha, y cuando tengamos nuestro segmento seleccionado, lo copiamos con Ctrl+C. Debimos tener seleccionado esto aproximadamente (Ver imagen) Nótese el zoom al 50%:
- Ahora nos vamos al canal 2 y le hacemos click derecho encima, le damos a "clone track" y un canal exactamente igual nos aparecerá debajo (si no está justo debajo, muévelo encima del original pulsando en él y dándole a "Move track up in list" varias veces), esto nos servirá como guía para más tarde. Tras esto, seleccionamos la misma cantidad de tiempo que antes, esta vez seleccionando los descansos que hay en el canal. (Ver imagen)
Una vez que creemos que tenemos aproximadamente la misma cantidad de tiempo, pulsamos Shift+Insert y nos pegará lo que copiáramos antes (alternativamente, ir a Edit --> Paste Insert). Es posible que no esté tal cual estaba en el canal 4, para calibrarlo bien, ponemos el canal 4 justo debajo del canal 2 haciéndole click derecho encima y dándole a "Move track up in list". (Ver imagen)
Fíjense que el segmento que hemos insertado comienza en 0:44:539
- Ahora simplemente insertamos silencios en el canal 2 hasta que veamos que coincida perfectamente lo que pegamos con lo del canal 4 (con coincidir me refiero a que sucedan en el mismo espacio de tiempo). Para comprobar exactamente si coinciden, miramos arriba de todo donde dice "Time", y miramos el tiempo, cambiamos al canal 4 y si coinciden es que insertamos bien. Si no coinciden inserta descansos en un canal u otro según corresponda hasta que coincidan.
En nuestro caso lo insertamos bien, ya que el mismo segmento comenzaba también en el mili segundo 0:44:539 en el canal 4.
- Repetimos la comparación con el clon del antiguo canal 2 para ver si lo que está después de lo que pegamos al canal está donde tiene que estar. Tras ponerlo todo bien, borramos el canal 4 y el clon del canal 2. Y guardamos.
En nuestro caso parece que nos sobran dos semicorcheas, ya que si miramos el canal 2 donde insertamos (en Piano roll Editor) vemos esto justo en las notas que estaban en el canal dos después de lo que insertamos (Fíjense en el tiempo):
Vemos que empieza en 1:21:692, si ahora cambiamos al canal original que clonamos antes:
Entonces lo que hacemos es recortar dos semicorcheas la nota larga que formaba parte de lo que insertamos, seleccionamos dos semicorcheas vacías y pulsamos supr (Para seleccionarlas mantener pulsado donde la flecha azul está y mover hacia la derecha/izquierda)
- Primero cambiamos de visualización dándole a View --> Composer.
-
Ahora ya tenemos nuestros tres canales y sabemos que son viables, tenemos que escoger qué canal será el del ritmo y cuales los otros dos, yo personalmente pongo el del ritmo de tercero y los otros dos antes (el que tenga menos notas de 2º).
Tras esto, podemos añadir la introducción de la canción porque es una canción de batalla (lo que suena cuando la pantalla parpadea antes de entrar en batalla después de que un entrenador/pkmn te rete/ataque), en mi caso quiero usar esta canción para la batalla de gimnasio, entonces cogí la MIDI de la introducción de la batalla de gimnasio de Johto, la copié y la pegué en nuestro midi canal a canal. La introducción debe durar 32 Semicorcheas. Yo edité la intro para que suene bien con la nueva canción ya que no es realmente del estilo GBC. Esto no es necesario pero le puede dar un toque interesante si se hace bien.
Guardamos nuevamente, y ahora eliminamos todos los canales menos uno, el cual guardamos dándole a File --> Export Midi-0 Format File... , reabrimos el fichero que tiene los tres canales, rechazamos guardar y repetimos para los otros dos canales, nombrándolos de forma distinta.
Ahora que tenemos los tres canales debemos crear los puntos de loop para cada canal. Hacer el loop no es tan complicado. Abrimos el midi correspondiente al canal 1. En nuestro ejemplo, el inicio del loop sería exactamente en la primera semicorchea (sea una nota o un silencio) tras el intro, es decir en el segundo ~0.02:824. Cuando tengamos el marcador de tiempo en la cantidad que queremos, vamos a arriba donde dice "New cue" y cuando nos pida el nombre ponemos "[" (sin comillas).
Esto no es algo forzoso, puedes poner el inicio del loop donde tú quieras, pero tienes que estar 100% seguro de que los tres canales tienen el comienzo del loop en el mismo milisegundo. Repetimos para el final de la canción pero el cue debe llamarse "]" (sin comillas), si uno de los tres canales acaba antes que algún otro, inserta silencios para que su loop no comience antes de tiempo. Para poder comparar los tres canales al mismo tiempo, puedes abrir otras dos instancias de Anvil Studio para abrir los dos canales restantes allí. Todos los canales deben acabar en el mismo momento. Tras esto volvemos a exportar como Midi-0 format y repetimos para los otros dos canales. -
Posible eventualidad : Hay notas con duraciones fusas
Si tenemos por ejemplo esto:
O esto :
Deberemos recurrir al método de Doblar Y Dividir
Este método consiste en doblar la duración de todas las notas de la canción, y al mismo tiempo doblamos el tempo (Lo de dividir viene de que al editar el ASM, cuanto más grande sea el tempo, más lenta irá la canción, de forma que técnicamente dividiremos el tempo).
Ventajas:
- Permite usar una canción con notas demasiado cortas (fusas o menores)
Desventajas:
- Si el tempo es mayor de 150, no se podrá representar correctamente en Anvil Studio, ya que el máximo es 300, sin embargo probablemente sí se pueda reproducir en el emulador con el tempo correcto.
- Incrementará el tamaño de la canción, ya que todas las notas con duración entre 8 y 15 requerirán una nota más para su representación.
Antes de explicar como aplicar el método de Doblar y Dividir (A partir de ahora se le denominará "DyD" para abreviar), hay que tener en cuenta que esto no nos solucionará todo siempre que tengamos notas fusas, si observamos la segunda imagen, veremos como hay notas que duran 2 semicorcheas y media, y otras cantidades irrepresentables por el emulador. Habrá que hacer trabajo extra.
Lo que tenemos que hacer, es modificar estas notas para que tengan una duración exacta medible en semicorcheas. Nuestro ejemplo anterior podría quedar así:
Sin embargo esto puede sonar horrible según la canción, es recomendable usar DyD en estos casos para simplificar la diferencia entre el original y el modificado, ya que tendremos más precisión al doblar las notas.
Lo mejor es reproducir con Anvil Studio y ver como suena tras aplicar DyD.
Es importante darse cuenta de la diferencia de precisión que tenemos al usar DyD, si miramos la imagen anterior, a la derecha del todo podemos ver una nota que dura 1 semicorchea, luego 1 que dura 2 semicorcheas, y finalmente 1 que dura 1 semicorchea. Esto quedó así tras arreglar la canción que se veía en la imagen anterior sin haber aplicado DyD.
Como podemos ver en esta imagen, las notas sin modificar son así (tras cambiar el Grid a 1/32 note) :
Se ve como las notas duran aproximadamente 1 semicorchea + 1 semifusa
Si aplicamos el mismo método de aproximar la notas a una cantidad entera de semicorcheas, nos quedará algo así:
No hemos aplicado DyD aún, pero si nos fijamos, como dije antes el Grid está a 1/32, lo cual es el doble de lo normal (1/16). Esto quiere decir que lo que estamos viendo es exactamente como nos quedará la canción tras aplicar DyD.
Así es como hubiera quedado si no hubiéramos cambiado el Grid o si no hubiéramos aplicado DyD :
Tengamos en cuenta que las notas antes de tocar nada tenían la duración de 1.25 semicorcheas (1 semifusa es 1/4 de semicorchea)
En la primera imagen en la que cambiamos el Grid a 1/32, se ve que las notas siguen una progresión de 3-2-3-3-2-3-3-2-...
En la segunda imagen en la que dejamos el Grid a 1/16, se ve que las notas siguen una progresión de 1-2-1-1-2-1-1-2-...
Hay que tener en cuenta que en la primera imagen la progresión habrá que dividirla entre 2, ya que doblaremos el tempo.
Entonces nos quedará algo así:
- Grid 1/32 : 1.5 - 1 - 1.5 - 1.5 - 1 - 1.5 - 1.5 - 1
- Grid 1/16 : 1 - 2 - 1 - 1 - 2 - 1 - 1 - 2
- Original : 1.25 - 1.25 - 1.25 - 1.25 - 1.25 - 1.25 - 1.25 - 1.25
Márgenes de Error (Original - Grid):
- Grid 1/32 : (-0.25) - (0.25) - (-0.25) - (-0.25) - (0.25) - (-0.25) - (-0.25) - (0.25)
- Grid 1/16 : (0.25) - (-0.75) - (0.25) - (0.25) - (-0.75) - (0.25) - (-0.75) - (0.25)
Como se puede obvservar, el márgen de error es menor la mayor parte de las veces usando DyD, por eso recomiendo usarlo si es necesario.
Ahora veamos cómo se aplica DyD
- Primero seleccionamos el primer canal en la MIDI, clickeamos en Track y después le damos a Quantize -> All tracks in song. (Ver imagen)
- Después seleccionamos "Stretch/Compress Time", y ponemos 2/1 (Ver Imagen)
Si por la razón que sea sólo se modifica el canal seleccionado, habrá que hacer esto con cada canal individualmente.
- Finalmente, doblamos el tempo. Si el tempo varía a medida que progresa la canción, es recomendable ir una a una, en cada cambio de tempo, empezando desde el principio hasta el final, dándole a "Insert tempo change at the current position" (Para cambiar el tempo basta con darle al botón que pone tempo, junto con una nota representativa del tempo actual, casi siempre una negra). (Ver imagen)
-
Ahora hablemos del canal de Percusión, o canal Drums.
En primer lugar, si la canción originalmente no tenía ningún canal de percusión, (tiene que poner "10 drums")
Entonces no se debería usar un cuarto canal y la canción solo tendrá 3 canales, se puede crear un cuarto canal con percusión de cero a mano si se cree necesario y se tiene los conocimientos musicales necesarios para que suene acorde con la canción.
Si la canción sí tiene un canal de Percusión, entonces habrá que analizarlo y ver si será representable por el emulador.
Generalmente las reglas para ver si el canal de Percusión es usable son estas:
- No hay más de 5 notas diferentes
- No hay muchos instrumentos distintos, y si los hay, se puede escuchar 1 instrumento principal
- El instrumento principal son Tambores, o un instrumento similar
Si se cumple esto (en cierta medida), entonces podremos usar el canal.
Una forma más natural de ver si podremos usar el canal de Percusión, es simplemente poner dicho canal en Solo, y escucharlo. Si podemos oír un Tambor constantemente (aunque varíe fuerza), podremos usar el canal.
Ahora pasa un pequeño problema, la representación de instrumentos en Anvil Studio no tiene nada que ver con la que usa el emulador de G/S/C.
Como dije antes no debe haber más de 5 notas diferentes de tambor, esto es así ya que es la máxima cantidad de tambores que suele haber en un Drumkit
Un drumkit es un conjunto de instrumentos que usa el emulador, cada drumkit tiene 12 instrumentos, uno por cada posible tono. Si bien muchos tonos suelen ser el mismo instrumento pero con diferente fuerza al sonar.
En total hay 6 drumkits en Pokemon G/S/C, generalmente los más usados son el 0, el 3 y el 5.
Podría decir qué instrumentos tiene cada drumkit, pero lo mejor es coger este archivo ASM hecho para poder oír los posibles instrumentos en cada drumkit.
Para usarlo simplemente ábrelo con NotePad++, e insértalo en una ROM limpia de pruebas usando gscImport (puedes ver los puntos finales del tutorial de cómo insertar el contenido de un fichero .asm en una ROM), una vez insertado, puedes modificar el campo pkmsSetDrums para cambiar el drumkit, entre 0 y 5. Tras cambiar el drumkit vuelve a insertar el fichero y así podrás probar todos los drumkits.
Generalmente el drumkit que más se usa es el 5, antes mencioné el 0 y el 3, ya que esos se pueden usar puntualmente, pero el 0 es demasiado ruidoso, y el 3 tiene menos tambores que el 5, aunque es un poco más ruidoso.
Lo que yo hago más comúnmente es coger el canal de percusión y modificarlo todo de forma que solo se usen 5 notas, de la C a la E, siendo la C el Tambor con más fuerza y E el tambor con menor fuerza. Sabiendo esto se modifica el canal de drums para que use solo esas notas y ya está.
Si bien es cierto, hay más notas con otros instrumentos (como triángulos), usa el ASM de prueba que se menciona arriba para poder localizar otras notas que, a tu criterio, puedan ser útiles para representar un sonido que no sea un Tambor.
Por ejemplo, así estaba el principio de un canal de Percusión antes de que yo lo modificara:
Y así quedó tras modificarlo, usando los 5 Tambores del drumkit 5.
Finalmente decir que una nota en el canal de drums durará lo mínimo siempre, es decir,
db (ntC | 15) y db (ntC | 0) sonarán exactamente igual, solo que el primero ocupará más tiempo.
Análogamente, db (ntC | 15) sería exactamente lo mismo que db (ntC | 0) + db (ntRst | 14)
Sabiendo esto, nunca se deben poner descansos en el 4 canal para ahorrar espacio en la ROM. Aún así existe una excepción, que es cuando tenemos un descanso que dura más de 16 semicorcheas. Si por ejemplo tenemos
db (ntC | 15) + db (ntC | 15) + db (ntC | 15) , pero en realidad solo tiene que sonar una nota, habría que substituir las dos últimas C por Rst.
Eso es más o menos todo respecto a la Percusión, si quieres ir más allá podrías modificar los drumkits con ASM para que usen los 12 instrumentos que tú quieras, pero eso es bastante más avanzado. -
Ahora ya acabamos con Anvil Studio. Lo siguiente es abrir MIDI2gsc, nos pedirá uno a uno los midis de nuestra canción, se los damos en el orden que decidimos antes.
Esto nos habrá creado un archivo .asm con los datos de la canción dentro de la carpeta donde estaba el primer MIDI. Lo abrimos con Notepad++ (O cualquier editor decente) y veremos esto:
Ahora explicaremos los comandos que se pueden usar en el fichero .asm (puedes ver el fichero pkms.asm donde aparecen todos los comandos posibles):
- SONG_START EQU $0, esto es la dirección que se usará para localizar el loop. Simplemente pon la dirección donde se va a insertar la canción, de esta forma, el loop se podrá insertar correctamente.
- pkmsSetTempo 0, $70 es el tempo de la canción, lo más habitual suele ser un valor entre 60 y 80, pero eso depende del tempo que se usara en Anvil Studio. Ten en cuenta que si usaste DyD probablemente el tempo valga entre 30 y 50.
Este comando se puede usar en cualquier momento de la canción, pudiendo crear un efecto interesante donde el tempo poco a poco crece/decrece. Sin embargo asegúrate que un cambio de tempo nunca sucede mientras una nota se está reproduciendo, para asegurarte, mira dónde estas insertando el cambio de tempo, y comprueba que, en ese específico instante, en los 4 canales, o hay un descanso o una nota está a punto de sonar / acaba de finalizar de sonar. Si no haces esto habrá glitches de desincronización.
- pkmsSetVolume $77, es volumen general, lo podemos dejar así de momento, y bajarlo/subirlo tras hacer las pruebas.
- Podemos hacer que la canción suene en stéreo escribiendo lo siguiente:
db $EF
db $xx
Los valores de xx pueden ser:
- FF : El canal sonará en Mono (ambos lados igual)
- F0 : El canal sonará por la izquierda
- 0F : El canal sonará por la derecha
Esto se puede cambiar en cualquier momento de la canción, si eres creativo puedes crear efectos interesantes con esto. Pero ten en cuenta que esto se ignorará completamente si el jugador tiene el juego puesto en modo "Mono".
- pkmsSetDuty cambia la modulación del canal, donde 0 = 12.5%, 1 = 25%, 2 = 50% y 3 = 25% invertido. Yo suelo usar el 2, pero depende de la canción.
- pkmsSetNtr $C, 11, 8 es un comando muy importante: La C representa la velocidad innata del canal, independiente del tempo, el 11 representa el volumen propio del canal, y 8 representa la duración de la nota. Lo mejor es experimentar con estos valores según lo que oigamos en las pruebas.
El tercer argumento de este comando (el 8 en el ejemplo de arriba) es muy útil, ya que nos permite hacer que las notas crezcan o decrezcan su volumen en el tiempo.
Un valor entre el 0 y el 7 hará que la nota poco a poco decaiga desde su volumen inicial (el segundo argumento) hasta el silencio, cuanto menor sea el número más rápido decaerá.
El valor 8 hará que la nota tenga un volumen constante
Un valor entre 9 y $F hará que la nota poco a poco crezca desde su volumen inicial hasta el volumen máximo (correspondiente a poner $F en el segundo argumento)
Veamos esto con un ejemplo:
Se puede notar al principio de esa canción cómo se usan notas que crecen en volumen y luego decrecen
Todo esto lo está reproduciendo el primer canal, así es como está el fichero ASM (Imagen con explicaciones) :
- pkmsSetVel 1,2 : Este comando solo se usa en el tercer canal (Wave). Recibe dos argumentos, el primero nos indica el volumen del canal, y el segundo nos indica que tipo de instrumento sonará en el canal.
El primer argumento puede ser contra intuitivo, ya que cuanto menor sea el valor mayor volumen tendrá. Desgraciadamente este valor es poco utilizable ya que a partir de 3 el canal es casi inexistente. Generalmente solo vas a usar 1 ó 2 en el primer argumento.
El segundo argumento dirá qué instrumento se usará para el canal, lo mejor es probar con distintos valores y ver cual suena mejor, ten en cuenta que los valores más altos suenan más fuerte. Los más comunes son el 2 y el 4.
En ocasiones puede ser útil probar un valor alto y hacer que se transforme en el canal principal de la canción durante un tramo. Un ejemplo de esto podría ser éste (de 0:11 a 0:24):
Eso que se oye es el efecto de pkmsSetVel 1, 10 (durante el resto de la canción es pkmsSetVel 1, 2)
- pkmsSetMod : Esto creará un efecto de Vibrato, lo que hace es que la nota suene ondulada, aproximadamente como una onda sinusoidal
Recibe 3 argumentos:
- El primero es un valor que ocupa 1 byte entero, y es el retardo que esperará vibrato para aplicar su efecto.
- El segundo es un valor que ocupa medio byte, y es la velocidad del efecto. Si miramos el link de antes y vemos la representación de una onda sinusoidal, este argumento sería el Período de la onda. Cuanto mayor sea más rápidamente variará el volumen.
- El tercero es también un valor de medio byte, y es la cantidad de variación del efecto. Nuevamente mirando la representación gráfica de una onda sinusoidal, este argumento sería la Amplitud de onda. Cuanto mayor sea mayor será la diferencia de volúmenes.
Ejemplo : pkmsSetMod $10, $F, 2
- SONG_START EQU $0, esto es la dirección que se usará para localizar el loop. Simplemente pon la dirección donde se va a insertar la canción, de esta forma, el loop se podrá insertar correctamente.
-
Ahora tenemos que insertar los silencios entre notas separadas. Esto tiene que hacerse porque el generador del fichero ASM asume que si tras una nota no hay nada, la nota que estaba antes seguirá hasta que se encuentre otra nota distinta o acabe la canción.
Gráficamente Imagen Importante:
Vamos por números:
- El 0 nos muestra lo que es el espacio de una octava, cuando nos salimos de una octava a una nota fuera de ella (solo verticalmente), debemos indicárselo a la game boy, en este caso vemos que la primera operación es db oct2 , ya que estas notas que muestro no son el comienzo de la canción, y antes de la nota '2' había notas más arriba. Puede verse en el documento con las lineas azules separando entre ocatavas,
- El 1 nos indica el tamaño que representa a la nota más pequeña, la semicorchea
- Del 2 al 11 son notas con la mínima duración (semicorcheas), se corresponden a los números del documento de la derecha en la imagen. Por ejemplo la 2 es ntF# | 0 , ntF# nos indica el tono de la nota, que al verla en la imagen se ve que corresponde con F#, y 0 es la duración. Como se puede ver, 0=1 , 1=2 , etc hasta 15=16. Esto quiere decir que si una nota dura 1 semicorchea, se apuntará como 0 debido a como se almacena esto en 4 bits. (Si apuntáramos de 1 a 16, para representar el 16 necesitaríamos 8 bits (0001 0000), apuntando del 0 (0000) al 15 (1111) solo necesitamos 4 bits.
- La nota 12 vemos que tiene de duración 1 en el código asm.
- La nota 13 es un descanso (ntRst) que tiene de duración 1. ESTO es lo que tienen que arreglar. Esto está así porque yo lo edité. Pero normalmente nos hubiera mostrado, en la nota 12, db (ntF# | 3) , y luego pasaría a la nota 14. Esto causaría que la nota 12 dure el doble, y que la 14 suene justo después, que no es lo que queremos.
- Las notas 14 y 15 son normales, después de la 15 cambiamos de Barra (la barra verde) , cada barra tiene 16 semicorcheas. Cada vez que decimos lo que dura una nota podemos salirnos de la barra, pero cuando vayamos a la siguiente ten en cuenta que empezamos más adelante (se verá con detalle con el 17).
- La nota 16 originalmente duraba lo que dura la 16 + lo que dura la 17 + lo que dura la 18. Esto es debido a lo que dije antes. Originalmente el documento asm pondría ntC | 15 y luego en la barra siguiente ntC | 14 y luego ntC# | 0 (lo que es la nota 19). Lo primero es cortar esa ntC a su valor real , 5 , ya que ocupa 6 semicorcheas.
- Ahora, el 17. Todo ese espacio como vimos antes era antes el tono C de la nota 16. Para calcular los ntRst que debemos poner, operamos así:
- En primer lugar contamos cada barra vacía como 16, en este caso hay 0.
- Después sumamos a lo que teníamos los espacios de la primera y última barra, en este caso hay 10 espacios en la primera barra y 14 en la última.
- Tenemos 0*16+14+10, ahora restamos 1 a cada operando.
- Tenemos 0*15+13+9, ahora sumamos y nos da 22
- Ahora le restamos 15 a este número, nos da 7, por lo tanto debemos poner un descanso de duración 15, y otro de duración 7.
- Ejemplo: si hubiéramos encontrado 7 barras, 5 vacías, la primera tuviera 8 espacios y la última 10:
- 16*5+8+10
- 15*5+7+9 = 91
- 91/15 = 6.066
- 6*15 = 90
- 91-90 = 1
- Pondríamos 6 (ntRst | 15) y 1 (ntRst | 1)
- Como podemos observar entre los dos ntRst hay separación de barras. Esto se debe a que tras el primer silencio de 16 semicorcheas, nos pasamos a la siguiente barra (Exactamente donde el marcador marrón indica). Entonces el siguiente descanso de 8 semicorcheas se pone tras el cambio de barra, aunque estemos ya a la mitad de ésta. Habría que hacer lo mismo para nuestro ejemplo de antes, Pondríamos separaciones de barras entre cada (ntRst | 15) y habría que ver dónde nos localizamos tras el (ntRst | 0).
- Como podemos ver el Channel_Loop está ahí, debido al "[" que pusiéramos antes con el cue.
- En eso consistirá nuestro trabajo con el asm, asegurarnos de que todas las notas acaban cuando tienen que hacerlo. Podríamos haber insertado manualmente los silencios como notas con volumen 1 una por una, pero puede llevar más tiempo y ser más prole a errores.
- Al final de cada canal asegurémonos de que pone
pkmsJump Channel#_Loop + SONG_START (siendo # el número del canal ; 1 , 2, 3 ó 4)
- El 0 nos muestra lo que es el espacio de una octava, cuando nos salimos de una octava a una nota fuera de ella (solo verticalmente), debemos indicárselo a la game boy, en este caso vemos que la primera operación es db oct2 , ya que estas notas que muestro no son el comienzo de la canción, y antes de la nota '2' había notas más arriba. Puede verse en el documento con las lineas azules separando entre ocatavas,
-
Podemos usar el programa MAF para simplificar este trabajo. El link de descarga proporcionado abajo explica detalladamente lo que puede hacer este programa, pero sus usos más útiles serían:
- Comprobar que los 4 canales tienen la misma cantidad de notas
Si usamos la 4 función de MAF, podremos ver cuantas notas tiene cada canal, deben tener exactamente las mismas, si no el loop se desincronizará.
- Simplificar el trabajo en una zona donde todas las notas son iguales
Por ejemplo aquí :
Podemos ver muchas notas de duración 0, con descansos de duración 0 entre cada una. Esto en el asm aparecerá sin los descansos por las razones ya explicadas. Este es el caso perfecto para usar MAF.
Iríamos a la función 2, si le indicamos el canal, entre que barras se encuentran nuestras notas, y la duración máxima de nota de 0. El programa nos actualizará el fichero poniendo todos los descansos correspondientemente.
Esto funciona porque todas las notas tienen la misma duración, entonces, como le dijimos que la duración de nota máxima es 0, y el programa va a encontrar todas las notas de duración 1, lo que hará será sobre-escribir dichas notas poniéndoles de duración 0, y tras la nota pondrá un descanso correspondiente a la resta entre la la duración encontrada y la duración máxima dada (en este caso todo 0s)
- Comprobar que los 4 canales tienen la misma cantidad de notas
-
Ahora debemos importar el fichero asm al ROM. Primero nos conseguimos una ROM limpia de G/S/C, y luego ejecutamos gscImport.exe
NOTA : Para asegurarte de que funciona, mete gscImport , todos sus complementos y el fichero asm en una carpeta en el escritorio que no tenga espacios ni caracteres raros (como tildes , ñ's, etc..). También asegúrate de que el fichero asm no tiene ningún espacio.
Tras abrir gscImport le damos a donde pone Inject music into ROM. Después le damos a Load ASM y seleccionamos nuestro fichero asm. Tras esto le damos a Load RBY ROM y seleccionamos la ROM donde vamos a insertar la canción. En Inject offset ponemos el offset donde insertamos la canción, en nuestro caso $1FC00C. En Pointer (Hex) Pondríamos el 3-byte pointer al offset que acabamos de poner. En nuestro caso sería 7F 0C 40 (ya que hay que invertir los dos ultimos bytes). Para calcularlo usamos C-Pointer. Por último le das a "Compile BIN File" Si gscimport te sigue dando error, comenta con una screenshot de lo que te dice
Ahora que ya tenemos la canción arreglada e insertada, debemos decirle al juego que la reproduzca. Primero debemos saber qué canción substituir (ya que no nos molestaremos ahora de repuntar la lista de cabeceras). Aquí tienes una lista de las canciones en el juego (de 00 a 5D en G/S , de 00 a 66 en Cristal).
También se puede ver en este Spoiler:
Music
00 nothing
01 title screen
02 Route 1
03 Route 3
04 Route 12
05 Train Ride
06 Kanto Gym Leader fight
07 Kanto Trainer fight
08 Kanto Wild Pokémon fight
09 Pokémon Center
0A Look! Hiker
0B Look! Lass
0C Look! Officer
0D Heal Pokémon sound
0E Lavender Town
0F Route 2
10 Mount Moon
11 Show Me Around
12 Game Corner
13 Bicycle
14 Hall of Fame
15 Viridian City
16 Celadon City
17 Trainer Victory
18 Wild Pokémon Victory
19 Gym Leader Victory
1A Mount Moon Square
1B Gym
1C Pallet Town
1D Professor Oak’s Pokémon Talk
1E Professor Oak
1F Rival
20 After the Rival Fight
21 Surfing
22 Evolution
23 National Park
24 Credits
25 Azalea Town
26 Cherrygrove City
27 Look! Kimono Girl
28 Union Cave
29 Johto Wild Pokémon
2A Johto Trainer Fight
2B Route 30
2C Ecruteak City
2D Violet City
2E Johto Gym Fight
2F Champion Fight
30 Rival Fight
31 Rocket Fight
32 Elm’s Lab
33 Slowpoke Well
34 Route 29
35 Route 36
36 S.S. Aqua
37 Look! Youngster
38 Look! Beauty
39 Look! Rocket
3A Look! Pokémaniac
3B Look! Sage
3C New Bark Town
3D Goldenrod City
3E Vermilion City
3F Pokémon Channel!
40 Poké Flute Channel
41 Tin Tower
42 Sprout Tower
43 Burned Tower
44 Lighthouse
45 Lake of Rage
46 Indigo Plateau
47 Route 37
48 Rocket Hideout
49 Dragon’s Den
4A Johto Wild Pokémon (nighttime)
4B Ruins of Alph radio signal
4C Successful Capture
4D Route 26
4E Mom
4F Victory Road
50 Pokémon Lullaby
51 Pokémon March
52 Gold/Silver Opening
53 Gold/Silver Opening (part 2)
54 New Game or Continue?
55 Ruins of Alph (inside)
56 Rocket theme (overworld)
57 Dancing Hall
58 Counting the Points (Bug‐Catching Contest)
59 Bug‐Catching Contest
5A Lake of Rage, Rocket’s radio signal
5B Printer
5C Post‐credits
5D Clair
5E
Estas son solo de Cristal:
5F Mobile Adapter
60 Buena’s Password
61 Look! Mysticalman
62 Crystal Opening
63 Battle Tower theme
64 Wild Pokémon Battle (Raikou/Entei/Suicune)
65 Battle Tower lobby
66 Pokémon Center
Una vez escogida, debemos ir a la lista de 3-byte punteros a los cabezales de las canciones. Como mi canción es de Batalla de líder de gimnasio, iré a la 2E porque quiero ver como se sincroniza el audio con las animaciones. Si quereis probar rápidamente una canción podéis substituir la del Menú inicio (01).
Dichos punteros a los cabezales se encuentran en la dirección $E906E
La fórmula para encontrar el nuestro sería
Código:E906E + 3*N
En mi caso sería la posición $E90F8 , la 01 sería la $E9071.
Una vez localizado el puntero, escribiremos la dirección del cabezal. Nosotros insertamos la canción en $1FC00C para tener desde $1FC000 hasta $1FC00B libres para poner la cabecera. Debido a esto escribimos $1FC000 usando C-Point y vemos que el puntero a ese offset es 7F4000. Esto es [Bank][Pointer] entonces escribimos 7F 00 40 ya que el puntero intercambia los bytes de lugar. 7F siendo el Bank y 00 40 el puntero invertido.
Ahora nos vamos a dicho cabezal que aún no hemos creado. El cabezal se compone de los siguientes valores:
[AB][XX][XX][01][YY][YY][02][ZZ][ZZ]
Donde :
- 'A' Es la cantidad de canales , 0 = 1 , 4 = 2 , 8 = 3 y C = 4. En nuestro caso pondríamos un 8.
- 'B' Nos dice a que canal corresponde el pointer siguiente , 0 = 1 , 1 = 2 , 2 = 3 y 3 = 4. En nuestro caso ponemos 0. Entonces nos quedaría este byte (el $1FC000) como $80.
- XX XX Nos dice el puntero al primer canal (ya que dejamos 0 en el byte de antes), como lo insertamos en $1FC00C, el puntero será 400C, entonces, debido a que tenemos que invertir los dos bytes de posición ponemos 0C 40.
- 01 Nos dice a que canal corresponde el siguiente puntero, en este caso el 01 nos indica que será del segundo canal. Lo ponemos tal cual.
- YY YY Puntero al segundo canal (ya que dejamos 01 en el anterior byte). Para saber donde empieza dicho canal hacemos una búsqueda de los bytes FF y DB (Ver imagen)
Nos los encontrará y el offset donde está el DB es donde comienza el segundo canal. Esto se debe a que FF corresponde a pkmsEndSound (que como vimos está al final de cada canal en el fichero asm), y DB corresponde a pkmsSetDuty (que está en varios canales, por eso lo buscamos con FF) y pkmsSetDuty está al principio del canal 2.
- 02 Igual que el 01 , pero para el tercer canal.
- ZZ ZZ Igual que con YY YY, solo que para el canal 3 en vez de buscar FF DB, buscamos FF D8.
Recuerda invertir los punteros.
En mi caso el cabezal me quedó así : 80 0C 40 01 3B 43 02 03 44 00 00 00 (comienzo canal1)
Y ya está, ahora ejecutamos la ROM y probamos la canción. Tras oírla podemos cambiar detalles en el asm como el Tempo, el volumen, la modulación, etc. Si cambias valores de este estilo simplemente vuelve a insertarla con gscImport y ya está. Pero si eliminas o añades alguna cosa, revisa los punteros del cabezal.
Agradecimientos:
Descargas de los Programas:
GSCimport + Midi2GSC : Aquí
Anvil Studio : Aquí
C-Point : Aquí
NotePad++ : Aquí
VBA-M : Aquí
GamBatte : Aquí
BGB : Aquí
GoldFinger : Aquí
MAF : Aquí
Anvil Studio : Aquí
C-Point : Aquí
NotePad++ : Aquí
VBA-M : Aquí
GamBatte : Aquí
BGB : Aquí
GoldFinger : Aquí
MAF : Aquí
Video de como me quedo al final mi canción en el juego (el tempo esta cambiado para que vaya mas rápido):
Cualquier Error, duda o problema por favor coméntenlo abajo.
Última edición: