Registrarse

Construcción de un Voicegroup universal.

Estado
Cerrado para nuevas respuestas.

Samu

Miembro insignia
Miembro insignia
Hola a todos, me gustaría intentar hacer entre todos un voicegroup universal para pokeemerald/pokefirered/pokeruby que se pueda usar como tabla de instrumentos para cualquier midi en decomp.

Como supongo que muchos sabréis en RH binario existe algo similar, que es un parche insertado en la región expandida del ROM (0x1000000-0x1400000) con un supuesto voicegroup universal basado en los de Fire Emblem 7.

Veréis, he extraído dicho voicegroup con mi herramienta (gba2pmd) y he probado con varias midis. El resultado es bastante malo, la verdad (y en gba también lo era). Es por esto que me gustaría intentar hacer un buen voicegroup universal para decomp.

Antes de nada creo que es necesario que os explique como funciona el sistema de sonido en decompilación (en los juegos de gba con m4a como tal).
Aquí tenéis un esquema de los directorios y ficheros que se encuentran involucrados:

Código:
songs.mk
ld_scripts.txt
include/
    constants/
        songs.h
sound/
    voice_groups.inc
    song_table.inc
    programmable_wave_data.inc
    keysplit_tables.inc
    direct_sound_data.inc
    programmable_wave_samples/
        XXX.pcm
        .
        .
        .
    direct_sound_samples/
        XXX.aif
        .
        .
        .
    voicegroups
        voicegroupXXX.inc
        .
        .
        .

INTRODUCCIÓN AL AUDIO EN DECOMP

Lo primero que necesito que entendáis es como funciona el sistema de forma general, para poder entrar más tarde en detalle.

La parte del central del sistema de audio sería la "midi". Un midi no es más que una partitura que contiene una o varias pistas que se reproducen al mismo tiempo, con notas de una determinada duración y un tempo. Además de eso, cada una de esas pistas, está marcada para usar un instrumento.
IMPORTANTE: La midi como tal no tiene los instrumentos, lo único que contiene es un ID de 0-127 para el instrumento.

Los voicegroups, por otro lado, son tablas con 128 entradas, correspondientes cada una de ellas a un instrumento. Alguno ya estará viendo por dónde va la cosa, Cada midi está asociada a un voicegroup en concreto y saca de su tabla los instrumentos. Si una midi usa los instrumentos con ID 3, 12 y 25; lo que hará es usar los instrumentos configurados en las entradas 3, 12 y 25 de su voicegroup.

Las 128 entradas de un voicegroup son instrumentos, y pueden estar configurados de varias maneras, pero me gustaría destacar una por el momento.
Hay unos tipos especiales de instrumento que se llaman "DirectSound", este tipo de instrumentos hacen uso de lo que se denomina sample.
Un sample no es más que un fichero de audio (en este caso .aif) que contiene una única nota de un instrumento real (ej: piano), esta nota generalmente es
C3 (do en pequeña octava). Este tipo de instrumentos lo que hace es alterar la frecuencia del sample en función de la nota que se desea obtener. (así, solo con C3 obtiene artificialmente el audio del resto de las notas).

Básicamente, para que una canción suene decentemente necesitas: la midi y un voicegroup con instrumentos adecuados.
Los midis como tal son fáciles de obtener en multitud de sitios, el problema por lo general es generar un vociegroup adecuado para la canción que se desea usar. Es por esto que la creación de un voicegroup genérico con 128 instrumentos es tan interesante, ya que permitiría insertar instantáneamente y sin casi configuración previa la mayor parte de las midis.


EXPLICACIÓN EXTENDIDA DEL SISTEMA DE AUDIO

Bueno, ahora que tenéis los conocimientos básicos, voy a pasar a explicaros pormenorizadamente los distintos ficheros asociados al sistema de audio y como funciona todo:
  • songs.mk
    Contiene las reglas para construir cada una de las canciones al compilar. Una entrada por canción.
    Código:
    $(MID_SUBDIR)/mus_610.s: %.s: %.mid
    $(MID) $< $@ -E -G199 -V100
    mus_610.s es el nombre del fichero .mid de la canción y el .s generado al compilar. Además de eso, existen varias opciones que se pueden pasar en forma de parámetros a mid2agb para convertir el .mid en .s
    -E: Siempre se usa, documentado como "Exact Gate time" en mid2agb
    -L: No lo he visto usar nunca, etiqueta para el ensamblador
    -V???: Volumen, si no se pone se situa por defecto en 127 (máximo 255)
    -G???: Voicegroup
    -P???: Prioridad (por defecto 0)
    -R???: Reverb (por defecto en off)
    -N???: Avoids compression
    -X???: Dobla la velocidad del tempo de la canción
  • ld_script.txt
    Este fichero contiene únicamente información necesaria para compilación, dentro de song_data es necesario colocar cada uno de los ficheros .s que se añaden en el ROM.
    Código:
        sound/songs/mus_610.o(.rodata);
  • include/constants/songs.h
    Este fichero contiene las constantes con los ids de cada una de las canciones.
    Código:
    #define MUS_610 610
  • sound/song_table.inc
    Es la tabla con las canciones, existe una entrada por canción.
    Código:
    song mus_610, 2, 2    @No recuerdo exactamente que ran estos dos parámetros valores de 0-2
  • sound/voicegroups.inc
    Contiene los includes de cada uno de los voicegroups del ROM
    Código:
    .include "sound/voicegroups/voicegroup191.inc"
        .include "sound/voicegroups/voicegroup192.inc"
        .include "sound/voicegroups/voicegroup193.inc"
  • sound/programmable_wave_data.inc
    Contiene las declaraciones de los samples tipo "programmable_wave_data. (Con nombres excelentemente documentados)
    Código:
    ProgrammableWaveData_86B4830:: @ 86B4830
            .incbin "sound/programmable_wave_samples/86B4830.pcm"
  • sound/direct_sound_wave_data.inc
    Contiene las declaraciones de los samples tipo "Direct Sound" o sonido directo comentados al comienzo de la explicación.
    Código:
    DirectSoundWaveData_sc88_fretless_bass::
        .incbin "sound/direct_sound_samples/8725A2C.bin"
  • sound/keysplit_tables.inc
    No entiendo muy bien como funciona esto "musicalmente", pero son una serie de tablas que luego os diré como se utilizan.
  • sound/direct_sound_samples/XXX.aif
    En esta carpeta están los distintos samples DirectSound en formato de archivos .aif con nombres excelentemente documentados.
    Al compilar se generan ficheros .bin
    Código:
    8725A2C.aif
  • sound/programmable_wave_samples/XXX.pcm
    En esta carpeta están los ficheros de los distintos samples ProgrammableWave en forma de archivos .pcm que se ensamblan en .bin
    Código:
    86B4830.pcm
    Como ya es costumbre, los nombres están excelentemente documentados.
  • sound/voice_groups/voicegroupXXX.inc
    Cada uno de estos ficheros contiene un voicegroup con su tabla de 128 instrumentos.

Bueno, ahora voy a explicaros los distintos tipos de instrumentos que conforman cada una de las entradas del voicegroup.
  • voice_square_1//voice_square_1_alt [sweep], [duty_cycle], [attack], [decay], [sustain], [release]
    [sweep shift] 0-0x7F
    [duty_cycle] 0-3
    [attack] 0-255
    [decay] 0-255
    [sustain] 0-255
    [release] 0-255
    Código:
    voice_square_1 0, 2, 0, 0, 15, 0
  • voice_square_2//voice_square_2_alt [duty_cycle], [attack], [decay], [sustain], [release]
    [duty_cycle] 0-3
    [attack] 0-255
    [decay] 0-255
    [sustain] 0-255
    [release] 0-255
    Código:
    voice_square_2_alt 3, 0, 1, 7, 1
Estos instrumentos "Square Wave" generan sonidos de onda cuadrada como los que se pueden encontrar en las primeras consolas y arcades:
No creo que sea lo que queremos.

  • voice_noise//voice_noise_alt [period], [attack], [decay], [sustain], [release]
    [period] 0-1
    [attack] 0-255
    [decay] 0-255
    [sustain] 0-255
    [release] 0-255
    Código:
    voice_noise_alt 0, 0, 1, 0, 0
Genera ruido blanco, tampoco es lo que estamos buscando.
  • voice_programmable_wave//voice_programmable_wave_alt [wave_samples_pointer], [attack], [decay], [sustain], [release]
    [wave_samples_pointer] nombre del sample usado en el instrumento
    [attack] 0-255
    [decay] 0-255
    [sustain] 0-255
    [release] 0-255
    Código:
    voice_programmable_wave_alt ProgrammableWaveData_86B4890, 0, 7, 15, 2
El sonido generado por este tipo de instrumentos es también similar al encontrado en las primeras consolas, simplemente en este caso la onda no es cuadrada, dando lugar a otro tipo de sonido.
  • voice_directsound [base_midi_key], [pan], [sample_data_pointer], [attack], [decay], [sustain], [release]
    [base_midi_key] Nota del sample (Generalmente C3, codificado como 60)
    [pan] 0-127
    [sample_data_pointer] sample
    [attack] 0-255
    [decay] 0-255
    [sustain] 0-255
    [release] 0-255
    Código:
    voice_directsound 60, 0, DirectSoundWaveData_sc88_french_horn_60, 255, 0, 224, 165
Este tipo de instrumentos ya dan lugar a un sonido más "realista" usando como base el sonido de un instrumento real. Este tipo de entradas son las que tendremos que usar para generar nuestro voicegroup universal.
Tiene modos alternativos: voice_directsound_alt y voice_directsound_no_resample (no se modifica la frecuencia para otras notas -> percusión).

Ahora nos queda lo último y lo más "complicado", los voice_keysplit. En este caso se trata de instrumentos que contienen 128 instrumentos en su interior, vendrían a ser un voicegroup dentro del voicegroup.
  • voice_keysplit [voice_group_pointer], [keysplit_table_pointer]
    [voice_group_pointer] id del voicegroup interno
    [keysplit_table_pointer] id de la tabla keysplit
    Código:
    voice_keysplit voicegroup006, KeySplitTable2
  • voice_keysplit_all [voice_group_pointer]
    [voice_group_pointer] id del voicegroup interno
    Código:
    voice_keysplit_all voicegroup031
El voicegroup universal de binario usa prácticamente en todos los instrumentos voice_keysplit y en los subvociegroups tiene instrumentos DirectSound.



La Propuesta: Construir un Voicegroup Universal
Y para eso he hecho este tema, me gustaría intentar hacer entre todos un voicegroup universal, compuesto por 128 instrumentos DirectSound usando el standard de midis y a ser posible un sample-rate superior a los 13379Hz originales (26758Hz, 31536Hz, 36314Hz) para tener más calidad de audio.

Antes de nada me gustaría saber quien está interesado en hacer este voicegroup para poder discutir que sample rate usar y un reparto del trabajo, así como la creación de un fork de pokeemerald con una rama para el voicegroup en sí donde podamos trabajar todos. Entre varias personas, en 2-3 tardes podemos tenerlo listo.
 

Juanjo

Hacker del pasado... Compilador del presente
Miembro insignia
Me uno al proyecto!
He estado toqueteando un poco el proyecto del decomp y creo que me gustaría avanzar en esta rama porque em gustaab en el RH.
 
Estado
Cerrado para nuevas respuestas.
Arriba