Registrarse

[Música] Inserción de MIDIs

Gold

Porrero a tiempo parcial
Miembro insignia
=====OJO, este es un tutorial semicompleto, debido a que aun faltan detalles para no sobreescribir datos, pero de momento si es posible insertar midis correctamente=====

Bienvenidos, este es uno de mis mayores logros en el hacking GBC, es insertar una melodia al rom, cabe mencionar que para hacerlo facil debemos de contar con el MIDI2GSC de Froggestspirit.

========================
Objetivo del tutorial
========================
Poner nuestra propia musica al juego, es algo dificil, pero esto le dara mas estilo a nuestro hack, asi que esto es algo bastante necesario

========================
¿Que necesitamos?
========================

• Gold Finger (o cualquier editor hex)
• Anvil Studio (buscadlo en google)
• A-Point
• MIDI2GSC de Froggestspirit
• Una MIDI de 4 canales
• Wordpad
Este documento sobre cabezales de musica

==========================
Paso 1: Separando los canales
==========================
Primero debemos de tomar una melodia MIDI, yo usare para el tutorial la melodia de Ciudad Celeste de HG/SS adaptada a 4 canales, la abriremos con el Anvil studio, e inmediatamente veremos la lista de canales e instrumentos, deben de ser solo 4 canales los que deben mostrarse (si hay mas deben de reorganizar la MIDI para que queden solo 4l), ahora lo que haremos es separar la melodia por canal, osea guardaremos cada canal como una sola MIDI, quedando MIDI1.mid, MIDI2.mid, MIDI3.mid y MIDI4.mid.

Para esto en anvil studio solo le damos click derecho a los canales que se eliminaran, y le damos a "Delete Track", quedando solo un canal, y le damos click a file>Save as a MIDI format 0, recordemos que es obligatorio que cada canal este en ese formato, guardamos y listo.

Repetimos el proceso para los otros tres canales, y estamos con el paso 1.

===========================
Paso 2: Loopeando Los Canales
===========================
ahora viene un paso muy dificil, que es loopear la melodia, ya que debemos de loopear cada canal manualmente con anvil studio, para ello abrimos el primer canal, y luego nos iremos en anvil studio a view>piano roll editor
Ahora veremos las notas del canal 1, ahora reproducimos la melodia, y cuando lleguemos al punto donde queremos que inicie la melodia, pausamos rapidamente, y nos iremos a donde dice "cue" y le daremos "add", se nos desplegara una ventana para poner el nombre del loop, ahi pondremos el simbolo de abrir corchete, osea "[", le damos Ok, y ya hemos insertado el inicio del loop
Ahora volvemos a reproducir la melodia, y cuando lleguemos a donde queremos que termine la melodia le damos rapidamente pausa, y volveremos a darle a "add cue", esta vez ingresaremos "]" que es donde acaba el loop, le damos ok, guardamos como "Midi format 0" y listo, tenemos nuestro loop insertado, repetimos el proceso para el resto de canales.

============================
Paso 3: Ensamblando la Melodia
============================
Ahora que tenemos los 4 canales debidamente loopeados, procedemos a ensamblar la melodia, para ello abriremos la aplicacion "Midi2gsc.exe"(requiere .Net 4.0) y se nos abrira una ventana de seleccion de archivos, ahora buscaremos en la pc donde dejamos los canales, seleccionamos el primer canal, luego nos pedira los otros tres canales, al seleccionar los canales se cerrara el programa, pero nos ha creado un archivo con el nombre de nuestra melodia con formato .asm, ahora copiaremos ese archivo a la carpeta "songs" que esta dentro de la carpeta donde tenemos el MIDI2GSC, y ya tenemos ensamblada la melodia.

=========================
Paso 4: Organizando el .Asm
=========================
Ahora debemos de modificar el archivo .asm que nos generaron, para ello debemos de usar wordpad, asi que abrimos el programa, y abriremos el archivo .asm, ahora se nos abrira como un texto comun, ahora debemos irnos a donde dice "SONG_START_EQU $0" y reemplazaremos el 0 por la offset donde pondremos la Melodia, usando este documento sabemos donde estan los cabezales de cada melodia, como yo reemplazare la melodia del menu continue/new game me ire a $F7971, donde empieza segun el puntero el primer canal, quedando ahora "SONG_START_EQ $F7971", guardamos y listo, con esto el loop quedara perfecto al ponerlo al ROM.
====================================
Paso 5: Generando el Binario e Insertando
====================================
Ahora nos dispondremos a crear el archivo binario que se insertara al ROM, para ello vamos a la carpeta donde tenemos el MIDI2GSC, y abriremos la aplicacion "gscimport.exe" ahora se nos abrira el programa, y nos situaremos debajo de "ASM > BIN", marcaremos la casilla "inject to rom" y mas arriba le damos "load asm" y se nos abre la ventana de navegacion, y nos iremos a songs, y ahi seleccionamos el archivo .asm de nuestra melodia, ahora minimizamos y abrimos a-point, y calculamos el puntero de 3-bytes donde pondremos la melodia, lo copiamos, y volvemos al gscimport, y en el primer campo,debajo de la direccion del archivo .asm, pondremos la direccion de dondre pondremos la MIDI, y en el campo de abajo pondremos el puntero de 3-bytes de la direccion de arriba, y le damos al boton "Make BIN", nos dara una notificacion que se compilo el .bin correctamente, y luego un aviso que la MIDI fue inyectada al ROM, ahora la melodia esta dentro del ROM.
============================
Paso 6: Repunteando Canales
============================
Ahora abriremos el ROM con gold finger, y nos iremos al cabezal de la melodia, en mi caso $F7900, los datos del cabezal estan organizados asi:

vvww01xx02yy03zz

Que se traduce como:
vv= byte random
ww=puntero de 2-bytes del canal 1
xx=puntero de 2-bytes del canal 2
yy=puntero de 2-bytes del canal 3
zz=puntero de 2-bytes del canal 4

Ahora con el documento de melash (traducido por jepsen) sobre el formato de musica de GBC nos dispondremos a reorganizar manualmente los 4 canales de la melodia, ahora los reorganizaremos, guardamos y ¡listo! ya tienes insertada la MIDI en tu juego ^^

Ahora abre tu rom y vete al area donde pusiste tu midi, y comprueba tu mismo como quedo tu melodia. Si organizaste mal la melodia o si loopeaste mal, vuelve a repetir el proceso.

Es todo, recuerden que aun se investiga como poner una melodia sin sobreescribir ningun dato, asi que si lo saben, ¡compartanlo perras!
 
Última edición:

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: [GBC][WIP]Inserccion de Melodias

Gracias a Data Crystal he encontrado que en 0xE906E se ubica la tabla de punteros de los cabezales de cada midi, y como estan dispersos por varios bancos la estructura es de punteros de 3-bytes, por lo cual podemos poner una MIDI donde sea.

Con esto concluyo la investigacion, y muevo q tutoriales el tema.
 

Xuuki

holi
Respuesta: [GBC]Inserccion de Melodias MIDI

Ahora abriremos el ROM con gold finger, y nos iremos al cabezal de la melodia, en mi caso $F7900, los datos del cabezal estan organizados asi:

vvww01xx02yy03zz

Que se traduce como:
vv= byte random
ww=puntero de 2-bytes del canal 1
xx=puntero de 2-bytes del canal 2
yy=puntero de 2-bytes del canal 3
zz=puntero de 2-bytes del canal 4
vengo a explicar mejor esto

vv en realidad seria algo como ab
a determina el numero de canales, por lo que no es forzosamente que sean 4 canales.
para determinar esto se hace de una forma algo rara
00?-1 canal
40- 2 canales
80- 3 canales
C0- 4 canales

ahora b, determina el numero de canal (de 0 a 3), por lo que los siguientes 2 bytes son el pointer de ese canal, en este caso el canal 1

para que quede mejor explicado pongo un ejemplo

[FONT=&quot][C0][ww] [01][xx] [02][yy] [03][zz][/FONT]
[FONT=&quot][4 canales | numero de canal (1)][pointer del canal1][numero de canal (2)][Pointer del canal2][/FONT]...

cuando logre recordar mas cosas las pondre aqui para tener un mejor tutorial ;)
 
Última edición:

Chamber

Miembro insignia
Miembro insignia
Respuesta: [GBC]Inserccion de Melodias MIDI

Vez @javcdark, nada te cuesta aportar jaja.

Creo que con esa explicacion resulta un poco mas simple el tutorial, pero a decir verdad me resulta complicado aun.

GALLEGO DONDE ESTAS?¡??????
 

Pum

GBCero
Respuesta: GBC | Otros | Inserción de MIDIs

Revivamos...

Se dice que
Gracias a Data Crystal he encontrado que en 0xE906E se ubica la tabla de punteros de los cabezales de cada midi, y como estan dispersos por varios bancos la estructura es de punteros de 3-bytes, por lo cual podemos poner una MIDI donde sea.
Pero yo miré en ese offset y las direcciones no se corresponden a las cabeceras que están en Éste documento. Según esa lista la primera canción está en 0xE9492 pero en la tabla de 3pointers que está en 0xE906E, el primer pointer es 3A 85 51 , que traducido a offset es 0xE9185 , que no corresponde con 0xE9492 aunque está cerca. Puede que esto sea un error en el documento?

Sigo investigando, los punteros no van por orden, el último puntero apunta al Bank 33, meintras que el primero apunta al bank 3A

Parece que la lista del documento, aunque le falte muchas canciones, las que tiene están bien. Miré la posicion del 3byte pointer de la canción del SS aqua (La primera en aquella lista) y está en la posición Nº 53 (35 en hex) y en la lista de Aquí esta canción aparece en la pos 36 (en hex), por lo que, como se ignora 00, está correcto. Es posible entonces que las canciones sí estén en orden pero algunas que estén antes en el ROM estén más tarde en la lista.

Voy a dar por hecho que al documento le faltan muchas canciones por falta de datos imagino.

Aún así en el offset 0xE9185 se puede ver la estructura vvww01xx02yy03zz , ya que los bytes aparecen así: C0 91 51 01 91 51 02 91 51 03 51 FF, pero el segundo pointer nos da 3A B1 77, que es el offset 0xEB7B1, bastante lejano de, aparentemente la supuesta segunda canción en 0xEA267.

El primer pointer está en 0xE906E-0xE9070, y el último en 0xE9182-0xE9184, 0xE9182-0xE906E da $114, %276 , al dividirlo entre 3 (ya que son 3byte pointers) da 92 canciones , que en hex es 5C , que es la cantidad que se muestra Aquí. Si bien acaba en 5D es porque no se contó 00. Entonces esta tabla de punteros contiene los offsets de TODAS las canciones, el problema es que la documentación es mala ya que faltan canciones y los pointers estan desordenados.

Ahora voy a intentar cargarme la canción Nº 21 ya que es una duplicada de la Nº 13, según mis cálculos debería estar en 0xE90D1

Al final conseguí encontrar GSCImport y seguí los pasos, pero pasaba esto :

El problema de arriba lo conseguí solucionar, tras tiempo conseguí encontrar los ejecutables que faltaban (Xlink y RBGasm)

Luego el problema era otro:


Veo que el primer error es porque intenta borrar un archivo que no existe (el .bin), luego no puede abrir el archivo que acaba de crear y por último no puede encontrar el .obj para eliminarlo.

Lo de arriba lo solucioné ejecutando el programa en el escritorio, parece que el programa tiene errores leyendo PATHs

Ahora me pondré con el .bin y a hacer tests.

La inserción de la canción ha sido un éxito, la canción la inserté en 0xFDE20 y llegó hasta 0xFF265. Entonces el espacio en la ROM que he requerido ha sido de 0xFF265-0xFDE20 = $1445 = %5189 espacios (casi 3/8 de un bank). Ahora, debido a que el 3byte pointer que le asigné es el de la canción Nº 21, me pondré a investigar de como asignar mi canción a lo que yo necesito para ver como suena.

Me di cuenta de que no puse el cabezal, pero mirando esto me di cuenta de que el documento documenta cabezales, no las canciones. Pondré el cabezal en 0xFDE20 e insertaré la canción justo después.

Debido a que un cabezal de 4 canales ocupa 12 bytes, insertaré la canción en 0xFDE20 + $C (%12) = 0xFDE2C

Ahora estoy investigando como saber donde comienzan los canales 2, 3 y 4...

Tras analizar ciertas canciones, averigüé que el canal 1 empieza siempre por DA , en canal 2 por DB, el canal 3 por D8 y el canal 4 por E3. Esto ayuda pero esos 4 valores pueden estar en otros sitios de la canción así que no es seguro que encontrar uno de ellos signifique que empieza otro canal.

En mi canción el único E3 que hay está 3 bytes después del D8, haré pruebas a ver que tal va, porque he visto canciones cuyos canales empezaban en el mismo sitio.

Al final me quedó la cabecera así : C0 2C 5E 01 18 65 02 40 67 03 00 6D

Ya conseguí que la canción se escuche en la ROM, desgraciadamente el 4º canal se escucha mal, muy probablemente porque la cabecera no está bien. Seguiré investigando

Estoy mirando otras canciones y algunas no empiezan siempre por DA, puede que esos bytes sean lo más comunes para iniciar un canal pero no sean lo que se usan un 100% de las veces.

De momento todas las canciones que he mirado comienzan su canal Nº 4 con el byte E3... Quizá sea cosa del MIDI... Quizá no se puede usar el instrumento "Drums"...

Según me contó Gallego, el programa no inserta bien el 4º canal. Perfeccionaré los otros 3 canales.

En el emulador, en cualquier canal, cuando una nota suena, esa nota no dejará de sonar hasta que la siguiente note aparezca. Estoy viendo a ver si hay alguna forma de evitar eso o si todas las canciones se cargan así en el emulador.

Las posiciones en la RAM serian la 0xFF13 para el canal 1, 0xFF18 para el canal 2, y 0xFF1D para el canal 3.

Creo que insertando un db (ntRst |0) quizá podría conseguir que se silencie el canal hasta la siguiente nota. Haré pruebas
 
Última edición:

Xuuki

holi
Respuesta: GBC | Otros | Inserción de MIDIs

un pequeño tip que me compartio el finado @Gold _nicksextravagantes

al momento de usar la herramienta, no cargar el rom e "insertarlo" asi, con lo cual en pocos o inclusive 1 intento, generara un archivo .bin

este archivo abrirlo con cualquier editor hex y vuala, tendremos nuestra midi casi lista para insertar, ahora solo copiamos todo el contenido del .bin y lo pegamos en el rom en cuestion (el offset debe coincidir con lo que jayamos puesto en SONG_START_EQ)
------------------------------------
aporte mio XD

otra cuestion es que al probar el midi suene horrible, esto es debido a que la herramienta al momento de conventir al midi a asm, lo hace de forma "estandar" y no como realmente es

para solucionar esto buscamos en el .asm de midi y cambiamos algunos valores para que quede mejor
Código:
NewSong_Channel1:  ;inicio canal 1
        pkmsSetTempo    0, $70 ;$70=velocidad del midi, entre mayor el valor, menor la velocidad
        pkmsSetVolume    $77;
        pkmsSetDuty    1;ni idea 
        pkmsSetNtr    $C, 11, 8;11=volumen del canal(0=silencio,15=maximo),8=duracion de nota,este es el que mayormente genera que suene feo, ya que normalmente se usa 0,1 y 2

para el canal 3 el volumen no se como lo toma, pero lo demas es practicamente igual, y el ultimo canal es el de "drums", pero esa es otra historia totalmente diferente
esto es algo de lo que recuerdo, ya que generalmente no uso la herramienta y hago insercion manual en hex, por lo que no se como se traducirian algunos valores :p
 
  • Me gusta
Reacciones : Pum

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: GBC | Otros | Inserción de MIDIs

Que bien ver como mis investigaciones siguen siendo ampliadas c:

Bueno, algo que había notado desde hace mucho era ese detalle del cuarto canal de las MIDIs insertadas que suenan pésimo, parece que es más fácil no usar midis de cuatro canales que tratar de arreglar el canal 4.

Tambien agradezco a @javcdark por compartir el truco del GSCimport, ya que si inyectamos la melodía directamente desde la aplicación es casi seguro que estropearemos el ROM.

En unos momentos actualizo el tuto con información que han compartido @Pum, si alguien tiene algún dato adicional que compartir, es buen momento para compartirlo (Si, a ti te hablo @Gallego13 )
 
  • Me gusta
Reacciones : Pum

Pum

GBCero
Respuesta: GBC | Otros | Inserción de MIDIs

He de decir que me quedé atascado en lo de las notas que no paran de sonar, agregando notas con 0 de volumen arregla el problema, pero hace que lleve días arreglar una canción simple. Y otro problema que me encuentro es que en el loop, un canal se repite 0.5 segundos (aprox) antes que el otro. No sé si será cosa del emulador....
 

Gelatina

ENTP 6w5
Respuesta: GBC | Otros | Inserción de MIDIs

[...]

aporte mio XD

otra cuestion es que al probar el midi suene horrible, esto es debido a que la herramienta al momento de conventir al midi a asm, lo hace de forma "estandar" y no como realmente es

para solucionar esto buscamos en el .asm de midi y cambiamos algunos valores para que quede mejor
Código:
NewSong_Channel1:  ;inicio canal 1
        pkmsSetTempo    0, $70 ;$70=velocidad del midi, entre mayor el valor, menor la velocidad
        pkmsSetVolume    $77;
        pkmsSetDuty    1;ni idea 
        pkmsSetNtr    $C, 11, 8;11=volumen del canal(0=silencio,15=maximo),8=duracion de nota,este es el que mayormente genera que suene feo, ya que normalmente se usa 0,1 y 2

para el canal 3 el volumen no se como lo toma, pero lo demas es practicamente igual, y el ultimo canal es el de "drums", pero esa es otra historia totalmente diferente
esto es algo de lo que recuerdo, ya que generalmente no uso la herramienta y hago insercion manual en hex, por lo que no se como se traducirian algunos valores :p
pkmsSetDuty es la modulación del canal. Solo sirve con Pulse1 y Pulse2

$X0 12.5%, $X1 25%, $X2 50% y $X3 25% invertido.

- - -

Para ajustar el canal Wave se usa el byte $D8

$D8 $0C $VW

$0C, no se para que sirve.

$VW, V es el volumen, $0W (00%), $1W (100%), $2W (50%), $3W (25%). N es la wavetable ($V0 - $V9).
 
  • Me gusta
Reacciones : Pum

Pum

GBCero
Respuesta: GBC | Otros | Inserción de MIDIs

Bueno al fin pude insertar mi primera canción que no suena horriblemente mal. He de decir que el proceso fue muy tedioso pero bueno este es el resultado, espero que no les sangren los oídos. Aún no conseguí que el loop funcione bien.

A ver quien averigua de donde es la canción.



Mañana miraré a ver si arreglo el loop. Cuando haga unas cuantas midis más montaré una galería si veo que me salen cosas decentes.

Para muchas de las cosas que el tuto dice que se hacen de una forma, casi siempre hay que acabar editando manualmente bastantes cosas del fichero .asm

Edit : Ya arreglé el loop y ahora entiendo perfectamente como funciona. Posiblemente haga un tutorial más detallado en un futuro.
 
Última edición:
Arriba