Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Fix para reproducir MIDIs

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Fix para reproducir MIDIs

Mensaje por Wecoc el 2018-08-20, 18:57

E aquí un tema relacionado con scripts para XP sobre el que quería profundizar un poco.
Pongo el problema tal como lo redacté tiempo atrás en otra parte.

@Wecoc escribió:El RPG maker XP permite reproducir músicas en formato MIDI (.mid) por defecto, es más, las canciones del RTP tienen ese formato.

El problema es que en el programa/juego no suenan como un MIDI puro, ya que usa un sintetizador que hace que suenen raro, con cierta reverberación.
En algunas canciones puede suponer una mejora, mientras que en otras la hace sonar peor... Y según el juego si buscas un estilo más old-school puede ser un problema.

La respuesta lógica sería pasar el MIDI a OGG pero eso tiene algunas desventajas, no soy experto en esta cuestión pero creo que con eso se pierden los loop-points y puede dar un "salto" al loopear entre otras cosas.

La idea entonces sería usar un module Audio externo que reproduzca los MIDI sin ese efecto de reverberación, e idealmente poder activarlo y desactivarlo (es decir, seguir teniendo la opción de usar el que viene por defecto en algunos tracks)

De casualidad he descubierto que el script MCI Audio Player de ForeverZer0 reproduce los MIDI sin el sintetizador, así que lo único que nos queda es poder activarlo y desactivarlo. Llegué a la conclusión que activarlo o desactivarlo mediante una variable puede traer problemas así que en vez de eso definí cuatro globales que contendrán los nombres de esas canciones que sí usen el sintetizador por defecto. Óbviamente si no hay ninguna no necesitáis el fix, solo el MCI Audio Player.

Código:
#==============================================================================
# ** [XP] MCI Player MIDI fix
#------------------------------------------------------------------------------
# Este script requiere el MCI Audio Player de ForeverZer0
# El MCI Player reproduce los MIDI de modo distinto a como lo hace el RPG maker
# XP por defecto, suenan sin reverberación. En algunos casos puede interesar
# mantener el modo por defecto del maker, de ahí este pequeño parche.
# Ponlo debajo del MCI Player y encima de main.
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
#==============================================================================

module Audio
  class << self
    
#==============================================================================
# Define aquí las canciones que usarán el sintetizador por defecto del maker
#------------------------------------------------------------------------------
 BGM_DEFAULT_SYN = ["pandem01", "pandem02"]
 BGS_DEFAULT_SYN = []
 ME_DEFAULT_SYN  = []
 SE_DEFAULT_SYN  = []
#==============================================================================

    alias mci_midfix_bgm_play bgm_play unless $@
    def bgm_play(filename, volume = 100, pitch = 100, start = 0)
      name = filename.match(/\/([^\/]+?)$/)[1]
      if BGM_DEFAULT_SYN.include?(name)
        mci_bgm_play(filename, volume, pitch)
        return
      end
      mci_midfix_bgm_play(filename, volume, pitch, start)
    end
    
    alias mci_midfix_bgs_play bgs_play unless $@
    def bgs_play(filename, volume = 100, pitch = 100, start = 0)
      name = filename.match(/\/([^\/]+?)$/)[1]
      if BGS_DEFAULT_SYN.include?(name)
        mci_bgs_play(filename, volume, pitch)
        return
      end
      mci_midfix_bgs_play(filename, volume, pitch, start)
    end
    
    alias mci_midfix_me_play me_play unless $@
    def me_play(filename, volume = 100, pitch = 100, start = 0)
      name = filename.match(/\/([^\/]+?)$/)[1]
      if ME_DEFAULT_SYN.include?(name)
        mci_me_play(filename, volume, pitch)
        return
      end
      mci_midfix_me_play(filename, volume, pitch, start)
    end
    
    alias mci_midfix_se_play se_play unless $@
    def se_play(filename, volume = 100, pitch = 100, start = 0)
      name = filename.match(/\/([^\/]+?)$/)[1]
      if SE_DEFAULT_SYN.include?(name)
        mci_se_play(filename, volume, pitch)
        return
      end
      mci_midfix_se_play(filename, volume, pitch, start)
    end
    
    def bgm_stop
      @mixers['BGM'].stop
      mci_bgm_stop
    end

    def bgs_stop
      @mixers['BGS'].stop
      mci_bgs_stop
    end
    
    def me_stop
      @mixers['ME'].stop
      mci_me_stop
    end
    
    def se_stop
      @mixers['SE'].stop
      mci_se_stop
    end
  end
end

class Game_System
  alias bgm_midfix_play bgm_play unless $@
  def bgm_play(bgm)
    bgm_stop if @playing_bgm.name != bgm.name
    bgm_midfix_play(bgm)
  end
  
  alias bgs_midfix_play bgs_play unless $@
  def bgs_play(bgs)
    bgs_stop if @playing_bgs.name != bgs.name
    bgs_midfix_play(bgs)
  end
end

Eso sí, el script MCI Player permite empezar una canción desde un determinado milisegundo; las canciones que usen el sintetizador por defecto no tienen esa opción.

Spoiler:
Hay otra posibilidad que podría hacerse de modo muy parecido, que es en un menú de Opciones permitir al jugador seleccionar si usar un modo o el otro.
Si queréis eso es cosa vuestra porque en cada menú de Opciones se integrará distinto
avatar
Wecoc
Administrador
Administrador



Créditos 12241

Gracias : 639

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.