RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
[Request][Translation] True mp3 looping

0 Members and 1 Guest are viewing this topic.

***
Rep:
Level 91
Blah blah blah...
Project of the Month winner for November 2008
True mp3 looping
Aug 07, 2008



Summary
As most people are aware, mp3s tend to have a "pause" right before looping, and for battle music with an intro sequence that isn't supposed to be repeated, this script is necessary.
A while ago I found a Japanese script which does exactly this using the exact "Frame" of which the song starts and ends its looping. I have posted this script below and hopefully it can be used as a guideline for the English translation.

Features Desired
  • Ability to play from the start of the song, to a selected end, and reloop to a selected beggining.
  • All looping will be done with frames rather than seconds for maximum accuracy
  • All loop editing will be done with file name, so it may apply to all music used in the game.
  • PERFECT LOOPS, so no pauses.



Did you search?
Yes

Where did you search?
  • Google
  • Random japanese vx script sites
  • RMRK, RPGR, hbgames.org, etc

What did you search for?
  • VX Mp3 Looping
  • VX Music Looping
  • VX Battle Theme Looping, etc



Link to the script summary: Click Here (Translated)

Code: Perfect MP3 Looping by Cogwheel [Select]
# MP3ƒ‹[ƒv‰‰‘t Ver VX_1.00
# ”z•zŒ³EƒTƒ|[ƒgURL
# http://members.jcom.home.ne.jp/cogwheel/

#==============================================================================
# ¡ RPG
#------------------------------------------------------------------------------
# @RPG‘S‘̂̃‚ƒWƒ…[ƒ‹‚Å‚·B
#==============================================================================

module RPG
#==============================================================================
# ¡ BGM
#------------------------------------------------------------------------------
# @BGM ‚ðŠÇ—E§Œä‚·‚éƒNƒ‰ƒX‚Å‚·B
#==============================================================================

  class BGM < AudioFile
    @@last = BGM.new
    #--------------------------------------------------------------------------
    # œ BGM ‚̉‰‘t
    #--------------------------------------------------------------------------
    def play
      if @name.empty?
        Audio.bgm_stop
        @@last = BGM.new
      else
        name = "Audio/BGM/"
        start = 0
        loop = 0
        step = [0, 0]
        fin = 0
        case @name
        when "satoc-boss09-2"
          type = "Battle"
          start = 0
          loop = 96040
          fin = 202680
        when "satoc-town07-2"
          type = "Dungeon"
          start = 0
          loop = 31980
          fin = 100000
        else
          type = "Normal"
        end
        if type == "Normal"
          name = @name
        else
          name = $game_audio.name?("Audio/BGM/" + @name)
        end
        $game_audio.bgm_play(name, @volume, @pitch, type, start, loop, fin)
        @@last = self
      end
    end
    #--------------------------------------------------------------------------
    # œ BGM ‚̉‰‘t’âŽ~
    #--------------------------------------------------------------------------
    def self.stop
      $game_audio.bgm_stop
      @@last = BGM.new
    end
    #--------------------------------------------------------------------------
    # œ BGM ‚̃tƒF[ƒhƒAƒEƒg
    #--------------------------------------------------------------------------
    def self.fade(time)
      $game_audio.fadeout_set(time)
      @@last = BGM.new
    end
  end

#==============================================================================
# ¡ ME
#------------------------------------------------------------------------------
# @ME ‚ðŠÇ—E§Œä‚·‚éƒNƒ‰ƒX‚Å‚·B
#==============================================================================

  class ME < AudioFile
    #--------------------------------------------------------------------------
    # œ ME ‚̉‰‘t
    #--------------------------------------------------------------------------
    def play
      if @name.empty?
        Audio.me_stop
      else
        Audio.me_play("Audio/ME/" + @name, @volume, @pitch)
      end
      $game_audio.me_set("Audio/ME/" + @name)
    end
    #--------------------------------------------------------------------------
    # œ ME ‚̉‰‘t’âŽ~
    #--------------------------------------------------------------------------
    def self.stop
      Audio.me_stop
      $game_audio.mecount_set(1)
    end
    #--------------------------------------------------------------------------
    # œ ME ‚̃tƒF[ƒhƒAƒEƒg
    #--------------------------------------------------------------------------
    def self.fade(time)
      Audio.me_fade(time)
      $game_audio.mecount_set(time * Graphics.frame_rate / 1000)
    end
  end
end

#==============================================================================
# ¡ Scene_Map
#------------------------------------------------------------------------------
# @ƒ}ƒbƒv‰æ–ʂ̏ˆ—‚ðs‚¤ƒNƒ‰ƒX‚Å‚·B
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # œ ƒoƒgƒ‹‰æ–ʂւ̐؂è‘Ö‚¦
  #--------------------------------------------------------------------------
  def call_battle
    @spriteset.update
    Graphics.update
    $game_player.make_encounter_count
    $game_player.straighten
    $game_temp.map_bgm = RPG::BGM.last
    $game_temp.map_bgs = RPG::BGS.last
    # RPG::BGM.stop
    RPG::BGS.stop
    Sound.play_battle_start
    $game_system.battle_bgm.play
    $game_temp.next_scene = nil
    $scene = Scene_Battle.new
  end
end

#==============================================================================
# ¡ Game_Audio
#------------------------------------------------------------------------------
# @MP3‚̉‰‘tE‚»‚Ì‘¼BGM‚̉‰‘t‘S”Ê‚ðŽi‚éƒNƒ‰ƒX‚Å‚·B
# MP3‚Ì“r’†ƒ‹[ƒv“™‚ɑΉž‚µ‚Ü‚·B
#==============================================================================

class Game_Audio
  #--------------------------------------------------------------------------
  # œ ƒIƒuƒWƒFƒNƒg‰Šú‰»
  #--------------------------------------------------------------------------
  def initialize
    @play = Win32API.new("winmm.dll", "mciSendString", ["p","p","l","l"], "i")
    @play.call("Close all", "\0" * 255, 255, 0)
    @type = "Normal"
    @me_count = 0
    fadein_set(0)
  end
  #--------------------------------------------------------------------------
  # œ BGM ‚̉‰‘t
  #     name       : BGM ƒl[ƒ€
  #     vol        : ƒ{ƒŠƒ…[ƒ€
  #     pitch      : ƒsƒbƒ`
  #     type       : BGM ƒ^ƒCƒv
  #     start      : ‰‰‘tŠJŽnˆÊ’u
  #     loop       : ‰‰‘tƒ‹[ƒvŽžŠJŽnˆÊ’u
  #     fin        : ‰‰‘tƒ‹[ƒvI—¹ˆÊ’u
  #--------------------------------------------------------------------------
  def bgm_play(name, vol, pitch, type, start, loop, fin)
    fadein_set(0)
    if type == "Normal"
      bgm_stop(type) if @name != name
      Audio.bgm_play("Audio/BGM/" + name, vol, 100) if name != ""
    elsif @name != name
      bgm_stop(type)
      status = "\0" * 255
      @play.call("Status " + type + " mode", status, 255, 0)
      if status.unpack("A*")[0] == "paused"
        @play.call("Setaudio " + type + " volume to 0", "\0" * 255, 255, 0)
        @play.call("Play " + type, "\0" * 255, 255, 0)
        fadein_set(1000)
      else
        @play.call("Open " + name + " alias " + type + " type MPEGVideo",
          "\0" * 255, 255, 0)
        @play.call("Setaudio " + type + " volume to " +
          (vol ** 2 / 10).to_s, "\0" * 255, 255, 0)
        @play.call("Play " + type + " from " +
          start.to_s + " to " + fin.to_s, "\0" * 255, 255, 0)
      end
      if @me_count > 0
        fadein_set(0)
        @play.call("Setaudio " + type + " volume to 0", "\0" * 255, 255, 0)
      end
    else
      if @me_count > 0
        @play.call("Setaudio " + type + " volume to 0", "\0" * 255, 255, 0)
      else
        @play.call("Setaudio " + type + " volume to " +
          (vol ** 2 / 10).to_s, "\0" * 255, 255, 0)
      end
    end
    @name = name
    @type = type
    @vol = vol
    @start = start
    @loop = loop
    @fin = fin
  end
  #--------------------------------------------------------------------------
  # œ ƒtƒ@ƒCƒ‹ƒl[ƒ€‚̎擾
  #--------------------------------------------------------------------------
  def name?(name)
    if FileTest.exist?(name + ".mp3")
      return (name + ".mp3")
    elsif FileTest.exist?(name + ".ogg")
      return (name + ".ogg")
    elsif FileTest.exist?(name + ".wav")
      return (name + ".wav")
    elsif FileTest.exist?(name + ".mid")
      return (name + ".mid")
    end
    return "name"
  end
  #--------------------------------------------------------------------------
  # œ ƒtƒF[ƒhƒCƒ“
  #--------------------------------------------------------------------------
  def fadein(time)
    fadein_set(time * 1000)
  end
  #--------------------------------------------------------------------------
  # œ ƒtƒF[ƒhƒCƒ“‚̐ݒè
  #--------------------------------------------------------------------------
  def fadein_set(time)
    @fade_max = @fade_count = time * Graphics.frame_rate / 1000
  end
  #--------------------------------------------------------------------------
  # œ ƒtƒF[ƒhƒAƒEƒg‚̐ݒè
  #--------------------------------------------------------------------------
  def fadeout_set(time)
    if @type == "Normal"
      Audio.bgm_fade(time)
    else
      if @fade_count == 0
        @fade_max = time * Graphics.frame_rate / 1000
        @fade_count = - time * Graphics.frame_rate / 1000
      elsif @fade_count > 0
        @fade_max = (time * @fade_max * Graphics.frame_rate) /
          (1000 * (@fade_max - @fade_count))
        @fade_count = - time * Graphics.frame_rate / 1000
      else
        @fade_max = - (time * @fade_max * Graphics.frame_rate) /
          (1000 * @fade_count)
        @fade_count = - time * Graphics.frame_rate / 1000
      end
    end
  end
  #--------------------------------------------------------------------------
  # œ ‰‰‘t‚Ì’âŽ~
  #--------------------------------------------------------------------------
  def bgm_stop(type = "")
    if @type == "Dungeon" and type == "Battle"
      @play.call("Pause " + @type, "\0" * 255, 255, 0)
    else
      if @type == "Normal"
        Audio.bgm_stop
      else
        @play.call("Stop " + @type, "\0" * 255, 255, 0)
        @play.call("Close " + @type, "\0" * 255, 255, 0)
      end
    end
    @type = "Normal"
  end
  #--------------------------------------------------------------------------
  # œ ME ‰‰‘t‚̐ݒè
  #--------------------------------------------------------------------------
  def me_set(name)
    # Œ»Ý‚ÌBGM‚ª Normal ‚Å‚È‚¢‚Ì‚È‚ç
    if @type != "Normal"
      # BGM ‰‰‘t‚Ì’âŽ~
      @play.call("Setaudio " + @type + " volume to 0", "\0" * 255, 255, 0)
    end
    # ME ‰‰‘t’·‚̎擾
    @play.call("Open " + name?(name) + " alias me type MPEGVideo",
       "\0" * 255, 255, 0)
    length = "\0" * 255
    @play.call("Status me length", length, 255, 0)
    # ME ƒJƒEƒ“ƒg‚̐ݒè
    @me_count = length.unpack("A*")[0].to_i * 60 / 1000 - 90
  end
  #--------------------------------------------------------------------------
  # œ ME ‰‰‘t‚Ì’¼ÚŽw’è
  #--------------------------------------------------------------------------
  def mecount_set(time)
    @me_count = time
  end
  #--------------------------------------------------------------------------
  # œ ƒtƒŒ[ƒ€XV
  #--------------------------------------------------------------------------
  def update
    if @type != "Normal"
      code = "\0" * 255
      @play.call("Status " + @type + " position", code, 255, 0)
      if code.unpack("A*")[0].to_i >= @fin
        @play.call("Seek " + @type + " to " + @loop.to_s, "\0" * 255, 255, 0)
        @play.call("Play " + @type + " to " + @fin.to_s, "\0" * 255, 255, 0)
      end
      if @fade_count > 0
        @fade_count -= 1
        @play.call("Setaudio " + @type + " volume to " +
          ((@vol * (@fade_max - @fade_count) / @fade_max) ** 2 / 10).to_s,
          "\0" * 255, 255, 0)
      elsif @fade_count < 0
        @fade_count += 1
        @play.call("Setaudio " + @type + " volume to " +
          ((- @vol * @fade_count / @fade_max) ** 2 / 10).to_s,
          "\0" * 255, 255, 0)
      end
    end
    if @me_count > 0
      @me_count -= 1
      if @type != "Normal" and @me_count == 0
        fadein_set(1000)
      end
    end
  end
end

#==============================================================================
# ¡ ƒI[ƒfƒBƒIƒNƒ‰ƒX‚Ì‹­§ì¬
#==============================================================================

if $game_audio == nil
  $game_audio = Game_Audio.new
end

#==============================================================================
# ¡ Graphics
#------------------------------------------------------------------------------
# @ƒOƒ‰ƒtƒBƒbƒN‘S”ʂ̏ˆ—‚ðs‚¤ƒNƒ‰ƒX‚Å‚·B
#==============================================================================

class << Graphics
  #--------------------------------------------------------------------------
  # œ ƒtƒŒ[ƒ€XV
  #--------------------------------------------------------------------------
  alias :update_audio :update unless method_defined?("update_audio")
  def update
    update_audio
    $game_audio.update
  end
end
« Last Edit: August 07, 2008, 10:15:02 PM by MrMoo »


- -

*
Rep:
Level 97
2014 Most Unsung Member2014 Best RPG Maker User - Engine2013 Best RPG Maker User (Scripting)2012 Most Mature Member2012 Favorite Staff Member2012 Best RPG Maker User (Scripting)2012 Best MemberSecret Santa 2012 ParticipantProject of the Month winner for July 20092011 Best Use of Avatar and Signature Space2011 Best RPG Maker User (Scripting)2011 Most Mature Member2011 Favourite Staff Member2011 Best Veteran2010 Most Mature Member2010 Favourite Staff Member
Well, I can't really translate it, but I could probably take a look and write up some instructions if that's what you want. It sounds like you know how to use it though.

***
Rep:
Level 91
Blah blah blah...
Project of the Month winner for November 2008
I sorta figured how it works by looking at the script and horribly translated instructions.
What I really want is either a full translation of this script, or a script made from scratch similar to this script but simpler to use. I know how it works but I still can't edit it myself at my current knowledge of RGSS2.
Some instructions would be great MA.


- -