じ☆ve冰风 发表于 2026-8-2 21:44:01

Master Volume Control

Volume Control+2016/04/23

Creator name: Ru/むっくRu (Rutan) | (English Translation by tale)​

Overview
A script that allows you to set the volume. It can be added as an option to the title screen and/or main menu.

Features
You can adjust the volume (0:Mute~100:Max) ← Decrease / Increase →
Controls: Left arrow key decreases, right arrow key increases
The following audio are added to the module: BGM, BGS, SE, ME
Bars and numbers are included. Code reorganized (2016/04/23)

For more details, see the item settings in the script.

Screens

http://i.imgur.com/H1FD5zN.jpg



http://i.imgur.com/WsuAfKX.jpg


Installation
Paste this script above Main.

Script link
https://raw.githubusercontent.com/ovate/torigoya-rgss3/main/torigoya_MasterVolume.rb

                Code:       
# coding: utf-8
#===============================================================================
# ■ Master Volume Control for RGSS3
#-------------------------------------------------------------------------------
# 2016/04/23 By Ru/むっくRu (Rutan) | English translation by tale 2017/02/10
# License - Public Domain, allows commercial use and credit is not necessary
#-------------------------------------------------------------------------------
# Add functions related to volume adjustment
#
# ● Volume adjustment - items are added to the title screen and main menu
#
# ● Audio - The following items are added to the module
# Audio.bgm_vol …… BGM
# Audio.bgs_vol …… BGS
# Audio.se_vol…… SE
# Audio.me_vol…… ME
# Audio.bgm_vol=Numerical variable …… BGM(0~100)
# Audio.bgs_vol=Numerical variable …… BGS(0~100)
# Audio.se_vol=Numerical variable…… SE(0~100)
# Audio.me_vol=Numerical variable…… ME(0~100)
#
#-------------------------------------------------------------------------------
# 【Changelogs】
# 2021/10/22 BGS volume control fix
# 2016/04/23 Code reorganized
# 2013/05/25 Fixed error drop when changing type of volume change item
# 2012/12/17 Allows the volume to be saved without the base script. (Script organization)
# 2012/06/13 Redesign layout. Added setting item. (Organizing scripts)
# 2012/01/02 Ini changed reading HZM_VXA base script for RGSS3 (Change to dependent)
# 2011/12/29 BGS Fixed a bug that causes error during playback
# 2011/12/26 BGM Fixed a bug that causes the volume to be adjusted when mute
# 2011/12/13 ini Allows cooperation with reading
# 2011/12/01 Released
#-------------------------------------------------------------------------------

#===============================================================================
# ● Item settings
#===============================================================================
module HZM_VXA
module AudioVol
    # ● Do you want to display the volume adjustment on the title screen?
    #    ※To redefine the menu items on the title screen,
    #      If you introduce another script that tamper with the menu titles
    #      There's a possibility of conflict.
    #  true…… Display
    #  false …… Don't display
    TITLE_FLAG = true
    # Item name to be displayed on title screen
    TITLE_NAME      = "Volume Control"

    # ● Do you want the volume adjustment displayed on the menu screen?
    #  true…… Display
    #  false …… Don't display
    MENU_FLAG = true
    # Name of the setting in Main Menu.
    MENU_NAME      = "Volume Control"

    # ● Types of Volume arrangement
    #  0 …… BGM/BGS/SE/ME Set all at once
    #   1 …… BGM+BGS と SE+ME Set with 2 kinds of
    #   2 …… BGM/BGS/SE/ME Set by each of 4 types
    TYPE = 2

    # ● Volume Control Settings Name.
    CONFIG_ALL_NAME= "Volume"      # Used when type "0" is selected
    CONFIG_BGM_NAME= "BGM"         # Used when type "1" "2" is selected
    CONFIG_BGS_NAME= "BGS"         # Used when type "2" is selected
    CONFIG_SE_NAME   = "SE"          # Used when type "1" "2" is selected
    CONFIG_ME_NAME   = "ME"          # Used when type "2" is selected
    CONFIG_EXIT_NAME = "Exit"

    # ● Volume adjustment by Increments
    ADD_VOL_NORMAL =5            # Amount of increment of left and right keys
    ADD_VOL_HIGH   = 25            # LR Variation amount of key

    # ● Window width of volume setting screen
    WINDOW_WIDTH   = 200

    # ● Volume gauge color from the menu interface
    COLOR1 = Color.new(255, 255, 255)
    COLOR2 = Color.new( 64,64, 255)

    # ● Save function of volume setting
    #    Game.ini, By storing volume information in
    #    You can also adjust the volume when you start up
    #    true…… Save
    #    false …… Don't save
    USE_INI = true
end
end

#===============================================================================
# ↑ Set up here ↑
# ↓ or less, script part ↓
#===============================================================================

module Audio
#-----------------------------------------------------------------------------
# ● Volume setting: BGM
#-----------------------------------------------------------------------------
def self.bgm_vol=(vol)
    @hzm_vxa_audioVol_bgm = self.vol_range(vol)
end
#-----------------------------------------------------------------------------
# ● Volume setting: BGS
#-----------------------------------------------------------------------------
def self.bgs_vol=(vol)
    @hzm_vxa_audioVol_bgs = self.vol_range(vol)
end
#-----------------------------------------------------------------------------
# ● Volume setting: SE
#-----------------------------------------------------------------------------
def self.se_vol=(vol)
    @hzm_vxa_audioVol_se = self.vol_range(vol)
end
#-----------------------------------------------------------------------------
# ● Volume setting: ME
#-----------------------------------------------------------------------------
def self.me_vol=(vol)
    @hzm_vxa_audioVol_me = self.vol_range(vol)
end
#-----------------------------------------------------------------------------
# ● Volume range specification
#-----------------------------------------------------------------------------
def self.vol_range(vol)
    vol = vol.to_i
    vol < 0 ? 0 : vol < 100 ? vol : 100
end
#-----------------------------------------------------------------------------
# ● Volume acquisition: BGM
#-----------------------------------------------------------------------------
def self.bgm_vol
    @hzm_vxa_audioVol_bgm ||= 100
end
#-----------------------------------------------------------------------------
# ● Volume acquisition: BGS
#-----------------------------------------------------------------------------
def self.bgs_vol
    @hzm_vxa_audioVol_bgs ||= 100
end
#-----------------------------------------------------------------------------
# ● Volume acquisition: SE
#-----------------------------------------------------------------------------
def self.se_vol
    @hzm_vxa_audioVol_se ||= 100
end
#-----------------------------------------------------------------------------
# ● Volume acquisition: ME
#-----------------------------------------------------------------------------
def self.me_vol
    @hzm_vxa_audioVol_me ||= 100
end
end

class << Audio
#-----------------------------------------------------------------------------
# ● Playback: BGM
#-----------------------------------------------------------------------------
alias hzm_vxa_audioVol_bgm_play bgm_play
def bgm_play(filename, volume = 100, pitch = 100, pos = 0)
    hzm_vxa_audioVol_bgm_play(filename, self.bgm_vol * volume / 100, pitch, pos)
end
#-----------------------------------------------------------------------------
# ● Playback: BGS
#-----------------------------------------------------------------------------
alias hzm_vxa_audioVol_bgs_play bgs_play
def bgs_play(filename, volume = 100, pitch = 100, pos = 0)
    hzm_vxa_audioVol_bgs_play(filename, self.bgs_vol * volume / 100, pitch, pos)
end
#-----------------------------------------------------------------------------
# ● Playback: SE
#-----------------------------------------------------------------------------
alias hzm_vxa_audioVol_se_play se_play
def se_play(filename, volume = 100, pitch = 100)
    hzm_vxa_audioVol_se_play(filename, self.se_vol * volume / 100, pitch)
end
#-----------------------------------------------------------------------------
# ● Playback: ME
#-----------------------------------------------------------------------------
alias hzm_vxa_audioVol_me_play me_play
def me_play(filename, volume = 100, pitch = 100)
    hzm_vxa_audioVol_me_play(filename, self.me_vol * volume / 100, pitch)
end
#-----------------------------------------------------------------------------
# ● Old Version Compatibility
#-----------------------------------------------------------------------------
if true
    alias volBGM bgm_vol
    alias volBGS bgs_vol
    alias volSE se_vol
    alias volME me_vol
    alias volBGM= bgm_vol=
    alias volBGS= bgs_vol=
    alias volSE= se_vol=
    alias volME= me_vol=
end
end

# For the title screen
if HZM_VXA::AudioVol::TITLE_FLAG
class Window_TitleCommand < Window_Command
    if true
      # ↑ If you change true to false,
      #    This makes the menu items on title screen aliased instead of redefining
      #    It will be implemented.
      #    Conflicting with other menu titles extended scripts would be unlikely to happen,
      #    As a side effect, the volume setting item is added under shutdown.
      #    According to your needs……(・x・)
      #---------------------------------------------------------------------------
      # ● Create command list (redefinition)
      #---------------------------------------------------------------------------
      def make_command_list
      add_command(Vocab::new_game, :new_game)
      add_command(Vocab::continue, :continue, continue_enabled)
      add_command(HZM_VXA::AudioVol::TITLE_NAME, :hzm_vxa_audioVol)
      add_command(Vocab::shutdown, :shutdown)
      end
    else
      #---------------------------------------------------------------------------
      # ● Creating command list
      #---------------------------------------------------------------------------
      alias hzm_vxa_audioVol_make_command_list make_command_list
      def make_command_list
      hzm_vxa_audioVol_make_command_list
      add_command(HZM_VXA::AudioVol::TITLE_NAME, :hzm_vxa_audioVol)
      end
    end
end
class Scene_Title < Scene_Base
    #---------------------------------------------------------------------------
    # ● Creating Command Window
    #---------------------------------------------------------------------------
    alias hzm_vxa_audioVol_create_command_window create_command_window
    def create_command_window
      hzm_vxa_audioVol_create_command_window
      @command_window.set_handler(:hzm_vxa_audioVol, method(:hzm_vxa_audioVol_command_config))
    end
    #---------------------------------------------------------------------------
    # ● Command
    #---------------------------------------------------------------------------
    def hzm_vxa_audioVol_command_config
      close_command_window
      SceneManager.call(HZM_VXA::AudioVol::Scene_VolConfig)
    end
end
end

# メニューに追加
if HZM_VXA::AudioVol::MENU_FLAG
class Window_MenuCommand
    #---------------------------------------------------------------------------
    # ● For adding a custom command
    #---------------------------------------------------------------------------
    alias hzm_vxa_audioVol_add_original_commands add_original_commands
    def add_original_commands
      hzm_vxa_audioVol_add_original_commands
      add_command(HZM_VXA::AudioVol::MENU_NAME, :hzm_vxa_audioVol)
    end
end
class Scene_Menu
    #---------------------------------------------------------------------------
    # ● Creating Command Window
    #---------------------------------------------------------------------------
    alias hzm_vxa_audioVol_create_command_window create_command_window
    def create_command_window
      hzm_vxa_audioVol_create_command_window
      @command_window.set_handler(:hzm_vxa_audioVol, method(:hzm_vxa_audioVol_command_config))
    end
    #---------------------------------------------------------------------------
    # ● Call volume from the setting screen
    #---------------------------------------------------------------------------
    def hzm_vxa_audioVol_command_config
      SceneManager.call(HZM_VXA::AudioVol::Scene_VolConfig)
    end
end
end

# Volume Configuration Window
module HZM_VXA
module AudioVol
    class Window_VolConfig < Window_Command
      #-------------------------------------------------------------------------
      # ● Generate
      #-------------------------------------------------------------------------
      def initialize
      @mode = HZM_VXA::AudioVol::TYPE.to_i
      super(0, 0)
      self.x = (Graphics.width- self.window_width ) / 2
      self.y = (Graphics.height - self.window_height) / 2
      end
      #-------------------------------------------------------------------------
      # ● Acquire command symbol
      #-------------------------------------------------------------------------
      def command_symbol(index)
      @list[:symbol]
      end
      #-------------------------------------------------------------------------
      # ● Command extend data
      #-------------------------------------------------------------------------
      def command_ext(index)
      @list[:ext]
      end
      #-------------------------------------------------------------------------
      # ● Window width
      #-------------------------------------------------------------------------
      def window_width
      HZM_VXA::AudioVol::WINDOW_WIDTH
      end
      #--------------------------------------------------------------------------
      # ● Acquire alignment
      #--------------------------------------------------------------------------
      def alignment
      command_symbol(@now_drawing_index) == :cancel ? 1 : 0
      end
      #-------------------------------------------------------------------------
      # ● Command generate
      #-------------------------------------------------------------------------
      def make_command_list
      make_command_list_actions
      make_command_list_exit
      end
      #-------------------------------------------------------------------------
      # ● Command: action
      #-------------------------------------------------------------------------
      def make_command_list_actions
      case @mode
      when 0
          add_command(HZM_VXA::AudioVol::CONFIG_ALL_NAME,:all)
      when 1
          add_command(HZM_VXA::AudioVol::CONFIG_BGM_NAME,:bgm)
          add_command(HZM_VXA::AudioVol::CONFIG_SE_NAME,   :se)
      else
          add_command(HZM_VXA::AudioVol::CONFIG_BGM_NAME,:bgm)
          add_command(HZM_VXA::AudioVol::CONFIG_BGS_NAME,:bgs)
          add_command(HZM_VXA::AudioVol::CONFIG_SE_NAME,   :se)
          add_command(HZM_VXA::AudioVol::CONFIG_ME_NAME,   :me)
      end
      end
      #-------------------------------------------------------------------------
      # ● Command: cancel
      #-------------------------------------------------------------------------
      def make_command_list_exit
      add_command(HZM_VXA::AudioVol::CONFIG_EXIT_NAME, :cancel)
      end
      #-------------------------------------------------------------------------
      # ● Drawing items
      #-------------------------------------------------------------------------
      def draw_item(index)
      @now_drawing_index = index
      super
      case command_symbol(index)
      when :all, :bgm, :bgs, :se, :me
          draw_item_volume_guage(index)
      end
      end
      #-------------------------------------------------------------------------
      # ● Drawing items: volume gauge
      #-------------------------------------------------------------------------
      def draw_item_volume_guage(index)
      vol =
          case command_symbol(index)
          when :all, :bgm
            Audio.bgm_vol
          when :bgs
            Audio.bgs_vol
          when :se
            Audio.se_vol
          when :me
            Audio.me_vol
          end
      draw_gauge(item_rect_for_text(index).x + 96 - 8, item_rect_for_text(index).y, contents_width - 96, vol/100.0, HZM_VXA::AudioVol::COLOR1, HZM_VXA::AudioVol::COLOR2)
      draw_text(item_rect_for_text(index), vol, 2)
      end
      #-------------------------------------------------------------------------
      # ● Increase volume
      #-------------------------------------------------------------------------
      def vol_add(index, val)
      call_flag = false

      case command_symbol(index)
      when :all
          call_flag = add_vol_bgm(val)
          Audio.bgs_vol = Audio.bgm_vol
          Audio.se_vol = Audio.bgm_vol
          Audio.me_vol = Audio.bgm_vol
      when :bgm
          call_flag = add_vol_bgm(val)
          Audio.bgs_vol = Audio.bgm_vol if @mode == 1
      when :bgs
          call_flag = add_vol_bgs(val)
      when :se
          call_flag = add_vol_se(val)
          Audio.me_vol = Audio.se_vol if @mode == 1
      when :me
          call_flag = add_vol_me(val)
      end

      if call_flag
          Sound.play_cursor
          redraw_item(index)
      end
      end
      def add_vol_bgm(val)
      old = Audio.bgm_vol
      Audio.bgm_vol += val
      if music = RPG::BGM.last and music.name.size > 0
          Audio.bgm_play("Audio/BGM/#{music.name}", music.volume, music.pitch, music.pos)
      end
      Audio.bgm_vol != old
      end
      def add_vol_bgs(val)
      old = Audio.bgs_vol
      Audio.bgs_vol += val
      if music = RPG::BGS.last and music.name.size > 0
          Audio.bgs_play("Audio/BGS/#{music.name}", music.volume, music.pitch, music.pos)
      end
      Audio.bgs_vol != old
      end
      # def add_vol_bgs(val)
      # old = Audio.bgs_vol
      # Audio.bgs_vol += val
      # Audio.bgs_vol != old
      # end
      def add_vol_se(val)
      old = Audio.se_vol
      Audio.se_vol += val
      Audio.se_vol != old
      end
      def add_vol_me(val)
      old = Audio.me_vol
      Audio.me_vol += val
      Audio.me_vol != old
      end
      #--------------------------------------------------------------------------
      # ● Process when the button is pressed
      #    ※Ignore if it's on the volume setting
      #--------------------------------------------------------------------------
      def process_ok
      case current_symbol
      when :bgm, :bgs, :se, :me
          return
      else
          super
      end
      end
      #-------------------------------------------------------------------------
      # ● Key operation
      #-------------------------------------------------------------------------
      def cursor_left(wrap = false)
      vol_add(@index, -HZM_VXA::AudioVol::ADD_VOL_NORMAL)
      end
      def cursor_right(wrap = false)
      vol_add(@index,HZM_VXA::AudioVol::ADD_VOL_NORMAL)
      end
      def cursor_pageup
      vol_add(@index, -HZM_VXA::AudioVol::ADD_VOL_HIGH)
      end
      def cursor_pagedown
      vol_add(@index,HZM_VXA::AudioVol::ADD_VOL_HIGH)
      end
    end
    class Scene_VolConfig < Scene_MenuBase
      #-------------------------------------------------------------------------
      # ● Start processing
      #-------------------------------------------------------------------------
      def start
      super
      create_help_window
      @command_window = Window_VolConfig.new
      @command_window.viewport = @viewport
      @command_window.set_handler(:cancel,   method(:return_scene))
      @help_window.set_text("You can adjust the volume(0:Mute~100:Max)\n← Decrease / Increase →")
      end
      #-------------------------------------------------------------------------
      # ● End processing
      #-------------------------------------------------------------------------
      def terminate
      super
      @command_window.dispose
      if HZM_VXA::AudioVol::USE_INI
          HZM_VXA::Ini.save('AudioVol', 'BGM', Audio.bgm_vol)
          HZM_VXA::Ini.save('AudioVol', 'BGS', Audio.bgs_vol)
          HZM_VXA::Ini.save('AudioVol', 'SE', Audio.se_vol)
          HZM_VXA::Ini.save('AudioVol', 'ME', Audio.me_vol)
      end
      end
    end
end
end

if HZM_VXA::AudioVol::USE_INI
# If the base script is not installed, it will work with the simplified version
unless defined?(HZM_VXA::Ini)
    module HZM_VXA
      module Base
      GetPrivateProfileInt = Win32API.new('kernel32', 'GetPrivateProfileInt', %w(p p i p), 'i')
      WritePrivateProfileString = Win32API.new('kernel32', 'WritePrivateProfileString', %w(p p p p), 'i')
      end
      class Ini
      INI_FILENAME = './Game.ini'
      def self.load(section, key)
          HZM_VXA::Base::GetPrivateProfileInt.call(section, key, 100, INI_FILENAME).to_i
      end
      def self.save(section, key, value)
          HZM_VXA::Base::WritePrivateProfileString.call(section, key, value.to_i.to_s, INI_FILENAME) != 0
      end
      end
    end
end
# Read volume initial value
Audio.bgm_vol = (HZM_VXA::Ini.load('AudioVol', 'BGM') or 100)
Audio.bgs_vol = (HZM_VXA::Ini.load('AudioVol', 'BGS') or 100)
Audio.se_vol= (HZM_VXA::Ini.load('AudioVol', 'SE') or 100)
Audio.me_vol= (HZM_VXA::Ini.load('AudioVol', 'ME') or 100)
end


Advanced
Use following "code" of the event command, you can call up the volume setting menu.

                Code:       
SceneManager.call(
HZM_VXA::AudioVol::Scene_VolConfig
)


Since it will cause an error if you try to write it in a single line, it's recommended to insert a line like the one above ↑

Credit and Thanks
- Original Author: Rutan
- English translation: tale
- Previous translation: Elemental Crisis (of the first release 2011/12/01)

License - Public Domain, this means commercial use is allow and credit is not necessary


本贴来自国际rpgmaker官方论坛作者:ovate处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/master-volume-control.74752/
页: [1]
查看完整版本: Master Volume Control