# Disharmony XP - Beta Preview
#
# Dieses Script im Scripteditor des RPG Makers installieren
# (den Inhalt dieser Datei in die Zwischenablage kopieren, im RMXP
#  den Scripteditor ffnen, irgendwo links in die Liste klicken,
#  Einfg-Taste drcken, dann rechts ins Textfeld klicken und den
#  Inhalt der Zwischenablage einfgen)
#
# Dieses Skript importiert alle Disharmony-Features, aber integriert
# nur die blichen RMXP-Features in das Audio-Modul. Die anderen
# Features knnen direkt verwendet werden, zum Beispiel:
#
# Audio::Disharmony::BGM.fade_in(time)
# Audio::Disharmony::BGM::Effects.echo
# Audio::Disharmony::BGM::Effects.reverb_ex(in_gain, reverb_mix,
#   reverb_time, high_freq_rt_ratio)
# Audio::Disharmony::BGM::Channels[1].volume = volume
# Audio::Disharmony::SE.play(filename, volume, pitch, panpot)
# Audio::Disharmony::ME.stop
# Audio::Disharmony::BGS.fade(time)
# usw.
module DLL
  def self.new dll, methods
    methods.each do |sym, args|
      methods[sym] = Win32API.new dll, *args
    end
    mod = Module.new
    mod.module_eval do
      methods.each do |sym, api|
        define_method sym do |*args|
          api.call *args
        end
        module_function sym
      end
    end
    mod
  end
end
module Audio
  module Disharmony
    BGM = DLL.new('disharmony', {
      :play => ['HarmonyPlayMusic', ['P'], 'v'],
      :fade_in => ['HarmonyFadeInMusic', ['i'], 'v'],
      :volume= => ['HarmonySetMusicVolume', ['I'], 'v'],
      :pitch= => ['DisharmonySetMusicPitch', ['I'], 'v'],
      :speed= => ['HarmonySetMusicSpeed', ['I'], 'v'],
      :panpot= => ['HarmonySetMusicPanpot', ['I'], 'v'],
      :playing? => ['HarmonyGetMusicPlaying', [], 'i'],
      :looping? => ['HarmonyGetMusicLooping', [], 'i'],
      :position => ['HarmonyGetMidiTick', [], 'I'],
      :fade_out => ['HarmonyFadeOutMusic', ['i'], 'v'],
      :stop => ['HarmonyStopMusic', [], 'v']
    })
    module BGM
      Effects = DLL.new('disharmony', {
        :chorus => ['DisharmonySetChorus', [], 'v'],
        :chorus_ex => ['DisharmonySetChorusEx', ['f']*5, 'v'],
        :compressor => ['DisharmonySetCompressor', [], 'v'],
        :compressor_ex => ['DisharmonySetCompressorEx', ['f']*6, 'v'],
        :echo => ['DisharmonySetEcho', [], 'v'],
        :echo_ex => ['DisharmonySetEchoEx', ['f']*5, 'v'],
        :flanger => ['DisharmonySetFlanger', [], 'v'],
        :flanger_ex => ['DisharmonySetFlangerEx', ['f']*5, 'v'],
        :gargle => ['DisharmonySetGargle', [], 'v'],
        :gargle_ex => ['DisharmonySetGargleEx', ['I'], 'v'],
        :param_eq => ['DisharmonySetParamEq', [], 'v'],
        :param_eq_ex => ['DisharmonySetParamEqEx', ['f']*3, 'v'],
        :reverb => ['DisharmonySetReverb', [], 'v'],
        :reverb_ex => ['DisharmonySetReverbEx', ['f']*4, 'v'],
        :all_off => ['DisharmonyDisableEffects', [], 'v']
      })
      class Channel
        @@proc = Win32API.new('disharmony', 'DisharmonySetMusicChannelVolume',
                              ['I', 'I'], 'v')
        def initialize(id)
          @id = id
        end
        def volume=(value)
          @@proc.call(@id, value)
        end
      end
      Channels = Array.new(17) { |i| Channel.new(i) if i > 0 }
    end
    SE = DLL.new('disharmony', {
      :play => ['HarmonyPlaySoundEx', ['P', 'I', 'I', 'I'], 'v'],
      :stop => ['HarmonyStopSound', [], 'v']
    })
    ME = DLL.new('disharmony', {
      :play => ['DisharmonyPlayMusicEffect', ['P', 'I', 'I', 'I', 'I'], 'v'],
      :fade => ['DisharmonyFadeOutMusicEffect', ['i'], 'v'],
      :stop => ['DisharmonyStopMusicEffect', [], 'v']
    })
    BGS = DLL.new('disharmony', {
      :play => ['DisharmonyPlayBackgroundSound', ['P', 'I', 'I', 'I'], 'v'],
      :fade => ['DisharmonyFadeOutBackgroundSound', ['i'], 'v'],
      :stop => ['DisharmonyStopBackgroundSound', [], 'v']
    })
  end
  def self.bgm_play filename, volume = 100, pitch = 50, speed = 100, panpot = 50
    Disharmony::BGM.play filename
    Disharmony::BGM.volume = volume
    Disharmony::BGM.pitch = pitch
    Disharmony::BGM.speed = speed
    Disharmony::BGM.panpot = panpot
  end
  def self.bgm_stop
    Disharmony::BGM.stop
  end
  def self.bgm_fade time
    Disharmony::BGM.fade_out time
  end
  def self.bgs_play filename, volume = 100, pitch = 50, panpot = 50
    Disharmony::BGS.play filename, volume, pitch, panpot
  end
  def self.bgs_stop
    Disharmony::BGS.stop
  end
  def self.bgs_fade time
    Disharmony::BGS.fade time
  end
  def self.me_play filename, volume = 100, pitch = 50, speed = 100, panpot = 50
    Disharmony::ME.play filename, volume, pitch, speed, panpot
  end
  def self.me_stop
    Disharmony::ME.stop
  end
  def self.me_fade time
    Disharmony::ME.fade time
  end
  def self.se_play filename, volume = 100, pitch = 50, panpot = 50
    Disharmony::SE.play filename, volume, pitch, panpot
  end
  def self.se_stop
    Disharmony::SE.stop
  end
end
