Amuse是一款实时 MIDI 和 SFX 音序器,具有基本效果、3D 位置音频和环绕输出功能。
该项目旨在与使用MusyX音频引擎的 PC/N64/GCN/GBA 游戏中的音频组和歌曲数据兼容;提供备用运行时库用于对这些游戏的音频库进行排序。
下载
提供了一个简单的命令行程序,用于从游戏存档或原始( .proj
、 .pool
、 .sdir
、 .samp
)文件中加载和播放 AudioGroups。
[jacko@ghor ~ ]$ amuseplay test.proj
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░ ████ ████ ┃ ████ ████ ████ ┃ ████ ████ ░░░
░░░ ████ ████ ┃ ████ ████ ████ ┃ ████ ████ ░░░
░░░ ▌W▐█ ▌E▐█ ┃ ▌T▐█ ▌Y▐█ ▌U▐█ ┃ ▌O▐█ ▌P▐█ ░░░
░░░ │ │ ┃ │ │ │ ┃ │ │ ░░░
░░░ A │ S │ D ┃ F │ G │ H │ J ┃ K │ L │ ; ░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
< left/right > : cycle MIDI setup, < up/down > : volume, < space > : PANIC
< tab > : sustain pedal, < window-Y > : pitch wheel, < window-X > : mod wheel
< Z/X > : octave, < C/V > : velocity, < B/N > : channel, < ,/. > : program, < Q > : quit
0 Setup 0, Chan 0, Prog 0, Octave: 4, Vel: 64, VOL: 80%
命令行程序需要窗口环境,并将在终端/cmd 旁边打开一个 100x100 的小窗口。该窗口必须位于最前面,因为它通过它监听完整的键盘事件。
如果在启动amuseplay
之前连接了 MIDI 键盘并被操作系统识别,您可以使用物理输入直接控制音序器。
在 OS X 和 Linux 上, amuseplay
将为其他音频应用程序通告一个虚拟 MIDI-IN 端口,以将其 MIDI 消息路由到。这使得跟踪器、鼓机和 DAW 应用程序能够直接使用 Amuse 生成采样音频。
amuseconv <in-path> <out-path> [gcn|n64|pc]
注意: amuseconv
目前仅支持 SNG 到 MIDI 转换,反之亦然。要从下面列出的游戏文件之一批量提取 MIDI,请运行amuseconv <data-file> <destination-dir>
amuseplay <data-file> [<songs-file>]
—或— 将数据文件拖放到 amuseplay 可执行文件上(Windows 和许多 freedesktop 文件管理器支持此操作)
amuserender <data-file> [<songs-file>] [-r <sample-rate-out>] [-v <volume 0.0-1.0>]
—或— 将数据文件拖放到 amuseplay 可执行文件上(Windows 和许多免费桌面文件管理器支持此)
注意: .wav 文件将在<group-name>-<song-name>.wav
处发出。如果未指定-r
选项,速率将默认为32KHz
N64 ROM file
AudioGrp.pak
MidiData.pak
AudioGrp.pak MidiData.pak
收听 SongGroup 53(顺序船舶声音)AudioGrp.pak
收听任何 SFXGroupAudioGrp.pak
pmario.proj
pmario.slib
pmario.proj pmario.slib
用于收听 SongGroups(顺序 SFX 事件)pmario.proj
收听任何 SFXGroupstarfoxm.pro
starfoxs.pro
midi.wad
starfoxm.pro midi.wad
仅用于收听SongGroup 0歌曲(音乐)starfoxs.pro midi.wad
收听其他 SongGroups(顺序氛围)starfoxs.pro
收听任何 SFXGroupN64 ROM file
N64 ROM file
(PC) data.dat
data.dat
data.dat
.proj
.pool
.sdir
.samp
文件的游戏如果您尚未安装/更新 MSVC++ 2015 运行时,则可能需要安装它:https://www.microsoft.com/en-us/download/details.aspx?id=48145
Amuse API 公开了客户端应用程序(游戏引擎)和定序器引擎之间的完整交互性。与原始控制台实现的中断驱动性质(音频芯片根据需要“请求”更多音频)不同,Amuse 是完全同步的。这意味着客户端必须定期泵送音频引擎(通常每个视频帧一次)以保持操作系统的音频系统正常运行。
客户端必须提供分配和混合音频语音的实现,因为这可能因目标而异。 amuse::IBackendVoiceAllocator
是为此实现的纯虚拟接口。或者,如果 Boo 存在于 CMake 项目树中,Amuse 将使用支持多个流行的低级音频 API 的后端进行编译。 Windows、OS X 和 Linux 都对这种方式提供了极好的支持。
这是一个用法示例:
# include < amuse/amuse.hpp >
# include " MyVoiceAllocator.hpp "
# include " MyAudioGroupLoader.hpp "
int main ( int argc, char * argv[])
{
/* Up to the client to implement voice allocation and mixing */
std::unique_ptr<amuse::IBackendVoiceAllocator> voxAlloc = MakeMyVoiceAllocator ();
/* Application just needs one per audio output (not per channel) */
amuse::Engine snd (*voxAlloc);
/* An 'AudioGroup' is an atomically-loadable unit within Amuse.
* A client-assigned integer serves as the handle to the group once loaded
*/
amuse::IntrusiveAudioGroupData data = LoadMyAudioGroup ();
snd. addAudioGroup (data);
/* Starting a SoundMacro playing is accomplished like so: */
int sfxId = 0x1337 ;
float vol = 1 . 0f ;
float pan = 0 . 0f ;
std::shared_ptr<amuse::Voice> voice = snd. fxStart (sfxId, vol, pan);
/* Play for ~5 sec */
int passedFrames = 0 ;
while (passedFrames < 300 )
{
snd. pumpEngine ();
++passedFrames;
WaitForVSync ();
}
/* Stopping a SoundMacro is accomplished by sending a
* MIDI-style 'KeyOff' message for the voice
*/
voice-> keyOff ();
/* Play for 2 more seconds to allow the macro to gracefully fade-out */
passedFrames = 0 ;
while (passedFrames < 120 )
{
snd. pumpEngine ();
++passedFrames;
WaitForVSync ();
}
/* Clean up and exit */
return 0 ;
}