Amuse は、基本的なエフェクト、3D 位置オーディオ、およびサラウンド出力機能を備えたリアルタイム MIDI および SFX シーケンサーです。
このプロジェクトは、 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 によって認識されている場合は、物理入力を使用してシーケンサーを直接制御できます。
OS X および Linux では、 amuseplay
他のオーディオ アプリケーションの MIDI メッセージのルーティング先となる仮想 MIDI-IN ポートをアドバタイズします。これにより、トラッカー、ドラムマシン、DAW アプリケーションが Amuse を直接使用してサンプリングされたオーディオを生成できるようになります。
amuseconv <in-path> <out-path> [gcn|n64|pc]
注: amuseconv
現在、SNG から MIDI への変換、およびその逆の変換のみをサポートしています。以下にリストされているゲーム ファイルの 1 つから 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
を渡します。AudioGrp.pak
を渡しますAudioGrp.pak
pmario.proj
pmario.slib
pmario.proj pmario.slib
を渡します。pmario.proj
を渡しますstarfoxm.pro
starfoxs.pro
midi.wad
starfoxm.pro midi.wad
を渡します (音楽)starfoxs.pro midi.wad
を渡します。starfoxs.pro
を渡しますN64 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 は完全に同期です。これは、クライアントが定期的に (通常はビデオ フレームごとに 1 回) オーディオ エンジンをポンピングして、OS のオーディオ システムに供給し続ける必要があることを意味します。
オーディオ音声の割り当てとミキシングはターゲットごとに大きく異なる可能性があるため、クライアントはオーディオ音声の割り当てとミキシングの実装を提供する必要があります。 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 ;
}