Amuse é um sequenciador MIDI e SFX em tempo real, com efeitos básicos, áudio posicional 3D e recursos de saída surround.
O projeto foi projetado para compatibilidade com grupos de áudio e dados de músicas encontrados em jogos PC/N64/GCN/GBA usando o mecanismo de áudio MusyX ; fornecendo uma biblioteca de tempo de execução alternativa para sequenciar as bibliotecas de áudio desses jogos.
Download
É fornecido um programa de linha de comando simples para carregar e reproduzir AudioGroups a partir de arquivos de jogos ou arquivos brutos ( .proj
, .pool
, .sdir
, .samp
).
[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%
O programa de linha de comando requer um ambiente de janelas e abrirá uma pequena janela de 100x100 ao lado do seu terminal/cmd. Esta janela deve estar na frente, pois através dela escuta todos os eventos do teclado.
Se um teclado MIDI estiver conectado e reconhecido pelo seu sistema operacional antes amuseplay
ser iniciado, você poderá controlar diretamente o sequenciador usando entrada física.
No OS X e Linux, amuseplay
anunciará uma porta MIDI-IN virtual para outros aplicativos de áudio encaminharem suas mensagens MIDI. Isso permite que aplicativos de tracker, bateria eletrônica e DAW produzam áudio amostrado usando o Amuse diretamente.
amuseconv <in-path> <out-path> [gcn|n64|pc]
Nota: amuseconv
atualmente suporta apenas conversão de SNG para MIDI e vice-versa. Para extrair MIDIs em lote de um dos arquivos de jogo listados abaixo, execute amuseconv <data-file> <destination-dir>
amuseplay <data-file> [<songs-file>]
— ou — Arraste e solte o arquivo de dados no executável amuseplay (o Windows e muitos gerenciadores de arquivos freedesktop suportam isso)
amuserender <data-file> [<songs-file>] [-r <sample-rate-out>] [-v <volume 0.0-1.0>]
- ou - Arraste e solte o arquivo de dados no executável amuseplay (Windows e muitos gerenciadores de arquivos do freedesktop suportam isso)
Nota: o arquivo .wav será emitido em <group-name>-<song-name>.wav
. Se a opção -r
não for especificada, a taxa será padronizada para 32KHz
N64 ROM file
de Indiana Jones e a Máquina Infernal (N64)AudioGrp.pak
MidiData.pak
AudioGrp.pak MidiData.pak
para ouvir SongGroup 53 (sons de navio sequenciados)AudioGrp.pak
para ouvir qualquer SFXGroupAudioGrp.pak
pmario.proj
pmario.slib
pmario.proj pmario.slib
para ouvir SongGroups (eventos SFX sequenciados)pmario.proj
para ouvir qualquer SFXGroupstarfoxm.pro
starfoxs.pro
midi.wad
starfoxm.pro midi.wad
para ouvir apenas músicas do SongGroup 0 (música)starfoxs.pro midi.wad
para ouvir outros SongGroups (ambiente sequenciado)starfoxs.pro
para ouvir qualquer SFXGroupN64 ROM file
de Star Wars Episódio I: Battle for Naboo (N64)N64 ROM file
(PC) data.dat
data.dat
data.dat
.proj
.pool
.sdir
.samp
brutosA instalação do tempo de execução do MSVC++ 2015 pode ser necessária se você ainda não o instalou/atualizou: https://www.microsoft.com/en-us/download/details.aspx?id=48145
A API Amuse expõe interatividade total entre um aplicativo cliente (mecanismo de jogo) e o mecanismo sequenciador. Ao contrário da natureza orientada por interrupções das implementações originais do console (onde o chip de áudio 'solicita' mais áudio conforme necessário), o Amuse é totalmente síncrono. Isso significa que o cliente deve bombear periodicamente o mecanismo de áudio (normalmente uma vez por quadro de vídeo) para manter o sistema de áudio do sistema operacional alimentado.
O cliente deve fornecer a implementação para alocação e mixagem de vozes de áudio, pois isso pode diferir drasticamente de alvo para alvo. amuse::IBackendVoiceAllocator
é a interface virtual pura a ser implementada para isso. Alternativamente, se o Boo estiver presente na árvore do projeto CMake, o Amuse será compilado com um backend que suporta várias APIs populares de áudio de baixo nível. Windows, OS X e Linux têm excelente suporte dessa forma.
Aqui está um exemplo de uso:
# 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 ;
}