使用jFugue开发类吉他英雄音乐游戏时播放失误提示音问题求助
针对jFugue实现演奏失误提示音的可行方案
方案1:修复双Player方案的现有问题
- jFugue遵循MIDI 1.0规范,音量/力度参数的合法取值范围是0-127,你设置的200超出了取值上限,才会抛出
NumberFormatException报错,先将提示音音量调整到0-127区间即可解决异常。 - 双Player不存在声卡冲突问题,系统MIDI驱动本身支持多轨混音,不需要额外开线程处理,只需给两个Player分配不同的MIDI通道即可实现同时播放:
// 主曲目Player,使用通道1 Player mainPlayer = new Player(); mainPlayer.play("V0 I[Clean_Guitar] C D E F G A B"); // 失误提示Player,使用通道2,不占用主曲目资源 Player errorPlayer = new Player(); // 触发失误时调用,直接播放走调和弦即可,会和主曲目混音输出 errorPlayer.play("V1 I[Distortion_Guitar] E5b G5b A5b VOLUME 80");
方案2:替代修改播放中Pattern的实现思路
jFugue已提交播放的Pattern确实无法直接修改,但可以直接给当前Player绑定的MIDI接收器实时插入提示音事件,不需要新增Player:
// 先获取当前Player的MIDI接收器 Sequencer sequencer = mainPlayer.getSequencer(); Receiver receiver = sequencer.getTransmitter().getReceiver(); // 触发失误时发送即时音符事件 ShortMessage noteOn = new ShortMessage(); noteOn.setMessage(ShortMessage.NOTE_ON, 2, 62, 90); // 通道2、走调D4、力度90 receiver.send(noteOn, -1); // -1表示立即发送 // 150ms后关闭提示音 Thread.sleep(150); ShortMessage noteOff = new ShortMessage(); noteOff.setMessage(ShortMessage.NOTE_OFF, 2, 62, 90); receiver.send(noteOff, -1);
兜底兼容方案
如果对MIDI参数调整不熟悉,可以提前将失误杂音导出为wav音频文件,触发失误时直接调用Java内置Clip类播放,完全和jFugue播放逻辑解耦,不会出现资源冲突问题。
内容的提问来源于stack exchange,提问作者Alvaro Rodriguez
相关产品推荐
相关产品推荐

