Project1

标题: BGM含前奏后无限循环系统(补丁教程已发布) [打印本页]

作者: TERENCE    时间: 2009-4-22 08:51
标题: BGM含前奏后无限循环系统(补丁教程已发布)
本帖最后由 精灵使者 于 2012-10-4 19:20 编辑

BUG已经更正,补丁教程已发布
http://rpg.blue/viewthread.php?tid=130527

前言:
虽然没比紫苏发的  扩展音频模块  来的强悍....


但至少此种前奏+后循环思路
可以解决OGG播放播放位置的指针的问题

很久以前有人在RMVX里提出RMXP是否也能达到该效果
BGM前奏+无限循环主旋律播放
http://rpg.blue/thread-97749-1-1.html

现在RMXP也能90%模拟 无DLL即可实现,
若哪裡仍有BUG我没发现请告知(至少现在我还没找到)。

使用本系统时,在Audio资料夹下建立专门放前奏的资料夹PRELUDE

如果要剪辑音频,这裡提供一个简易又容易上手的软件。

Audacity音频编辑软件:(无法编辑MIDI)
可以利用此编辑软件把前奏跟主循环剪辑分開......
http://rpg.blue/thread-106349-1-1.html

# 使用注意事项:
(1) 音频格式就是RM默认的那些 :mid  ogg  wav  mp3  wma
(2) 前奏命名与主循环的音频命名相同
(3) 前奏可有可无,本系统会自动判定
(4) 前奏和后循环音频格式也可以互相搭配无限制
(5) 前奏命名相同但格式不同时,优先级是:mid → ogg → wav → mp3 → wma
(6) 此系统利用ME来播放前奏,所以当淡出BGM时会影响ME

# 本系统缺点:(无法100%完美模拟 BGM前奏+无限循环主旋律播放)
  一般原声素材音频剪辑完(含剪辑掉头跟尾的空白期)后,
  头跟尾仍会有一小段空白期,每次循环时容易会顿一下,
  OGG格式则没有这个问题,所以主循环的音频推荐用OGG格式,
  但这也不是完全完美....第一次读入播放OGG档时,
  如果主循环太长,播放前,RM读入会耗时(播放前会有空白期)。
  目前标题画面无法使用有前奏的BGM,前奏沒播完就播放主循环,
  原因不明......= =
  1. #==============================================================================
  2. # ■ BGM含前奏后无限循环系统
  3. # §§  (无DLL即可实现,90%模拟)
  4. #------------------------------------------------------------------------------
  5. # 作者:TERENCE (龙皇)
  6. #==============================================================================
  7. class Game_System
  8.   #--------------------------------------------------------------------------
  9.   # ● 前奏布林代数控制初始化
  10.   #--------------------------------------------------------------------------
  11.   alias new_initialize initialize
  12.   def initialize
  13.     @bgm_boolean = false
  14.     new_initialize
  15.   end
  16.   #--------------------------------------------------------------------------
  17.   # ● BGM 前奏 副档名 判断
  18.   #--------------------------------------------------------------------------
  19.   def music_extname(bgm)
  20.     return ".mid" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mid")
  21.     return ".ogg" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".ogg")
  22.     return ".wav" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wav")
  23.     return ".mp3" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".mp3")
  24.     return ".wma" if FileTest.exist?("Audio/PRELUDE/" + bgm.name + ".wma")
  25.     return nil
  26.   end  
  27.   #--------------------------------------------------------------------------
  28.   # ● 演奏 BGM
  29.   #     bgm : 演奏的 BGM
  30.   #--------------------------------------------------------------------------
  31.   def bgm_play(bgm)
  32.     @playing_bgm = bgm
  33.     if bgm != nil and bgm.name != ""
  34.       # 提取前奏命名
  35.       if @prelude_me == nil
  36.         prelude_name = nil
  37.       else
  38.         prelude_name = @prelude_me.name
  39.       end
  40.       # 播放前奏前判定是否同首BGM
  41.       if @playing_bgm.name != prelude_name
  42.         @bgm_boolean = false
  43.         Audio.me_stop
  44.       end
  45.       # 前奏判定播放
  46.       if music_extname(bgm) != nil and @bgm_boolean == false
  47.         prelude_play(bgm)
  48.         @bgm_boolean = true
  49.       end
  50.       Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch)
  51.     else
  52.       Audio.bgm_stop
  53.       Audio.me_stop
  54.     end
  55.     Graphics.frame_reset
  56.   end
  57.   #--------------------------------------------------------------------------
  58.   # ● BGM 的淡出  (NOTE:此时也会影响到ME)
  59.   #     time : 淡出时间 (秒)
  60.   #--------------------------------------------------------------------------
  61.   def bgm_fade(time)
  62.     @playing_bgm = nil
  63.     Audio.bgm_fade(time * 1000)
  64.     Audio.me_fade(time * 1000)
  65.     @bgm_boolean = false
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 还原 BGM
  69.   #--------------------------------------------------------------------------
  70.   def bgm_restore
  71.     bgm_play(@memorized_bgm)
  72.     @bgm_boolean = false
  73.   end
  74.   #--------------------------------------------------------------------------
  75.   # ● PRELUDE 的演奏
  76.   #     me : 演奏的 ME
  77.   #--------------------------------------------------------------------------
  78.   def prelude_play(me)
  79.     @prelude_me = me
  80.     if me != nil and me.name != ""
  81.       Audio.me_play("Audio/PRELUDE/" + me.name, me.volume, me.pitch)
  82.     else
  83.       Audio.me_stop
  84.     end
  85.     Graphics.frame_reset
  86.   end
  87. end
复制代码
工程范例:
http://rpg.blue/upload_prog ... E_BGM_120789438.rar

[line]10[/line]
后知后觉:合并主题的内容

原帖:
http://rpg.blue/viewthread.php?tid=123326

◎前言
首先我必须感谢君迁子大大,
他是第一个发现有这个问题的人,
发了这麼久到现在才有人发现我的漏洞= =
无论怎样我也谢谢他对我脚本如此的支持...


◎此系统思路的本意 (这个部份你可以跳过)
在解释BUG发生的原因前,先了解ME的特性跟我的思路。
ME的特性:
当一首BGM播放时,突然播放ME,BGM会暂停,
而ME播放完毕时,BGM会从暂停的地方淡入继续播放(有所谓记忆)


我的思路:
利用这样的特性,(从无音乐)一开始....
如果我们在几短时间内播放BGM和ME会发生什麼事呢??
而且又是先放ME再播放BGM(这之间不放等待),在脚本语句中相当於....
Audio.me_play(...
Audio.bgm_play(...

这时RM就发生了很有趣的现象,如下图

这时就產生了只有当ME播放完毕时,BGM才会自动被播放,
这就是BGM含前奏后无限循环的製作思路


◎BUG发生的原因
BUG现象就是战斗胜利ME根本没有播放直接就播放地图BGM,
而且这种现象只会出现在含有前奏的地图BGM。
这是為什麼呢?让我们看看下面的图

一般来说,RM中所有战斗系统的胜利几乎都有个弊病...
就是在战斗胜利时,播完胜利ME时,会出现地图的BGM(感觉很怪)

又因為利用ME播放做出前奏后无限循环系统,
所以导致当含有前奏的地图BGM,会遮蔽胜利的ME播放,而直接播放地图BGM


◎补丁修改
為了解决这个问题,我们必须把新的BGM播放系统挪到后面,
也就是在切换地图画面时,再播放BGM,如下图

我们又知道
$game_system.bgm_play($game_temp.map_bgm)
长拿来还原為战斗开始前的(地图)BGM,所以....

以下是以默认的战斗系统所做的补丁修改教程,如果使用其他的战斗脚本,请找到相对应的位置,如果在新的战斗脚本裡找不到对应的位置,那大概是某个部份还是採用了默认战斗系统的方法函式,这时候往前一个有关战斗脚本里找就对了

(1)先找到 处理战斗画面的类别 class Scene_Battle

(2)再找开始结束战斗回合的地方,也就是获得经验金钱宝物的地方

(3)然后你就会看到附近有一句$game_system.bgm_play($game_temp.map_bgm)

把该句删掉....

(4)同样是class Scene_Battle下,找到战斗结束的地方
def battle_end(result)一般新的战斗系统还是採用默认的函式,
不会重新撰写,使用其他战斗系统的同学,可以直接找默认的地方直接修改=w=

然后根据上图,在切换到地图画面$scene = Scene_Map.new上面做添加

(5)如此一来就挪到后面了><


§ 如果还有什麼问题,请回帖告知=w= §
作者: angelwangm    时间: 2009-4-22 15:35
抢个沙发,看起来不错
作者: 迅雷進    时间: 2009-4-22 17:03
绝对是一个好东西!!! {/se} {/se}
小弟不客气收下了~
作者: swabwind    时间: 2009-4-22 21:45
XP现在也实现了..感谢龙哥{/qiang}
抱走,期待完善
作者: 涂鸦boy    时间: 2009-4-23 02:56
额……  占个位置 我有预感 不知道哪天 说不定会用上  {/qiang}
作者: TERENCE    时间: 2009-4-24 06:16
以下引用swabwind于2009-4-22 13:45:12的发言:

XP现在也实现了..感谢龙哥
抱走,期待完善

谢谢支持先~


100%模拟完善,纯脚本实现 基本上万分困难
要配合DLL才有可能,


可惜的是本龙仔完全没接触过DLL制作的领域
所以根本也不会用RUBY条用DLL。。。

作者: TERENCE    时间: 2009-4-28 04:55
虽然没比紫苏发的  扩展音频模块  来的强悍....


但至少此种前奏+后循环思路
可以解决OGG播放播放位置的指针

於是副标题改了一下.....
作者: 96310376    时间: 2009-6-1 22:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-6-2 00:58
龙皇做得不错哈~~!{/qiang}{/hx}

为什么我清理帖子的时候没有看到这个帖子啊{/fd}
怪事{/fd}
作者: TERENCE    时间: 2009-6-2 05:03
以下引用后知后觉于2009-6-1 16:58:04的发言:

龙皇做得不错哈~~!

为什么我清理帖子的时候没有看到这个帖子啊
怪事

呵呵.....过奖了!


其实龙仔还发了一篇教程帖.....
http://rpg.blue/viewthread.php?tid=114571


(↑众:其实你是来打广告的吧!...PIA)

作者: 后知后觉    时间: 2009-6-2 06:52
嗯~~!

推箱子这个我有看见{/hx}
作者: Tabris_Air    时间: 2009-6-2 08:04
以下引用TERENCE于2009-4-22 0:51:13的发言:
前言:
虽然没比紫苏发的  扩展音频模块  来的强悍....


个人认为仅仅对于前奏+主循环播放的功能来说,
这个要比紫苏的好用一些。毕竟后者是用并行事件控制,
关键是还要数毫秒数= =bb
有这功夫直接砍成两段ogg的方便多了{/hx}

狂砍空之轨迹的OGG中……
作者: TERENCE    时间: 2009-6-2 18:02
以下引用Tabris_Air于2009-6-2 0:04:10的发言:
个人认为仅仅对于前奏+主循环播放的功能来说,
这个要比紫苏的好用一些。毕竟后者是用并行事件控制,
关键是还要数毫秒数= =bb
有这功夫直接砍成两段ogg的方便多了

狂砍空之轨迹的OGG中……

謝謝 Tabris_Air大大 的支持


但是OGG,RPGXP 中不对应流再生,非
一边读取数据一边再生流,OGG 文件要全部读取后才开始播放,

所以第一次首度拨放OGG时,
如果主循环太长,播放前,RM读入会耗时(播放前会有空白期)。
(不适合播放时间较长的主循律的曲子)

请务必注意这一点.........
作者: 君迁子    时间: 2009-8-2 11:40
难道是我设置问题?发现战斗胜利ME消失了,直接跳到地图BGM=v=b
空轨OGG可以完美循环了=v=+
作者: TERENCE    时间: 2009-8-2 11:52
难道是我设置问题?发现战斗胜利ME消失了,直接跳到地图BGM=v=b
空轨OGG可以完美循环了=v=+
君迁子 发表于 2009-8-2 11:40

ME消失??
你的意思是ME没播放完毕就跳脱了??
作者: 君迁子    时间: 2009-8-2 20:04
是战斗胜利ME根本没有播放直接就地图BGM了=v=b
我拿空轨的OGG格式BGM做的测试=v=b
作者: TERENCE    时间: 2009-8-2 20:42
是战斗胜利ME根本没有播放直接就地图BGM了=v=b
我拿空轨的OGG格式BGM做的测试=v=b
君迁子 发表于 2009-8-2 20:04

有工程可以传上来给我看看吗?
作者: 君迁子    时间: 2009-8-2 21:07
工程在此=v=b

PRELUDE_BGM.rar

3.23 MB, 下载次数: 39


作者: TERENCE    时间: 2009-8-2 21:31
工程在此=v=b
君迁子 发表于 2009-8-2 21:07

我已经大概知道,我的脚本(逻辑思考)问题出在哪了......谢谢告知


我会尽快想出修正脚本的办法,请耐心等等看吧!
作者: TERENCE    时间: 2009-8-3 14:26
标题: BGM含前奏后无限循环系统补丁教程与思路
原帖:
http://rpg.blue/viewthread.php?tid=123326

◎前言
首先我必须感谢君迁子大大,
他是第一个发现有这个问题的人,
发了这麼久到现在才有人发现我的漏洞= =
无论怎样我也谢谢他对我脚本如此的支持...


◎此系统思路的本意 (这个部份你可以跳过)
在解释BUG发生的原因前,先了解ME的特性跟我的思路。
ME的特性:
当一首BGM播放时,突然播放ME,BGM会暂停,
而ME播放完毕时,BGM会从暂停的地方淡入继续播放(有所谓记忆)

我的思路:
利用这样的特性,(从无音乐)一开始....
如果我们在几短时间内播放BGM和ME会发生什麼事呢??
而且又是先放ME再播放BGM(这之间不放等待),在脚本语句中相当於....
Audio.me_play(...
Audio.bgm_play(...

这时RM就发生了很有趣的现象,如下图

这时就產生了只有当ME播放完毕时,BGM才会自动被播放,
这就是BGM含前奏后无限循环的製作思路


◎BUG发生的原因
BUG现象就是战斗胜利ME根本没有播放直接就播放地图BGM,
而且这种现象只会出现在含有前奏的地图BGM。
这是為什麼呢?让我们看看下面的图

一般来说,RM中所有战斗系统的胜利几乎都有个弊病...
就是在战斗胜利时,播完胜利ME时,会出现地图的BGM(感觉很怪)

又因為利用ME播放做出前奏后无限循环系统,
所以导致当含有前奏的地图BGM,会遮蔽胜利的ME播放,而直接播放地图BGM


◎补丁修改
為了解决这个问题,我们必须把新的BGM播放系统挪到后面,
也就是在切换地图画面时,再播放BGM,如下图

我们又知道
$game_system.bgm_play($game_temp.map_bgm)
长拿来还原為战斗开始前的(地图)BGM,所以....

以下是以默认的战斗系统所做的补丁修改教程,如果使用其他的战斗脚本,请找到相对应的位置,如果在新的战斗脚本裡找不到对应的位置,那大概是某个部份还是採用了默认战斗系统的方法函式,这时候往前一个有关战斗脚本里找就对了

(1)先找到 处理战斗画面的类别 class Scene_Battle

(2)再找开始结束战斗回合的地方,也就是获得经验金钱宝物的地方


(3)然后你就会看到附近有一句$game_system.bgm_play($game_temp.map_bgm)

把该句删掉....

(4)同样是class Scene_Battle下,找到战斗结束的地方
def battle_end(result)一般新的战斗系统还是採用默认的函式,
不会重新撰写,使用其他战斗系统的同学,可以直接找默认的地方直接修改=w=

然后根据上图,在切换到地图画面$scene = Scene_Map.new上面做添加

(5)如此一来就挪到后面了><


§ 如果还有什麼问题,请回帖告知=w= §
作者: TERENCE    时间: 2009-8-3 14:45
补丁教程已发布!!

作者: 后知后觉    时间: 2009-8-3 17:08
就是在战斗胜利时,播完胜利ME时,会出现地图的BGM(感觉很怪)

我才学脚本的那会儿就把这该死的效果改了- -
作者: 瓦沙尔    时间: 2009-11-22 18:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: 梦幻想    时间: 2009-11-28 21:21
记得很久以前求过这个脚本,那时没人能解答,现在终于有人做出来了……谢谢。
作者: 后知后觉    时间: 2009-12-7 13:25
本帖最后由 后知后觉 于 2010-4-28 19:34 编辑

1.标题无法使用的情况其实是个囧囧的问题
  在Scene_Title里有一行 Audio.me_stop
2.默认的 FileTest.exist?  是无法检测 带有汉字路径的文件名的
  关于这个问题的修复看我下面帖的脚本

  1. PathFileExists = Win32API.new("shlwapi", "PathFileExistsW", "P", "I")
  2. MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", "ILPIPI", "I")
  3. def FileTest.exists?(filename)
  4.   len = MultiByteToWideChar.call(65001, 0, filename, -1, 0, 0) << 1
  5.   buf = " " * len
  6.   MultiByteToWideChar.call(65001, 0, filename, -1, buf, len)
  7.   return PathFileExists.call(buf) == 0 ? false : true
  8. end
复制代码

作者: mmll0070    时间: 2009-12-15 18:06
没有办法作为地图BGM么?我要做SRPG用




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1