1

TR-808 のサウンドバンクを Java にロードしていて、そのキットを再生したいのですが、問題は、デフォルトのサウンドバンクがドラムと一緒に再生されるのを無効にできないことです。GM サウンドを使用するだけではすべてが機能しますが、SoundBank をロードすると、すべてがマッシュアップされます。

player = MidiSystem.getSequencer();
player.open();
seqTrans = player.getTransmitter();
synth   = MidiSystem.getSynthesizer();
synthRcvr = synth.getReceiver(); 
seqTrans.setReceiver(synthRcvr);  
synth.open();

File file = new File("resources/TR-808.sf2");
Soundbank soundbank = MidiSystem.getSoundbank(file);
// synth.unloadAllInstruments(synth.getDefaultSoundbank()); don't work:(
synth.loadAllInstruments(soundbank);

Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();

ShortMessage instr = new ShortMessage();
instr.setMessage(192, channel, 35, 0);
MidiEvent changeInstrument = new MidiEvent(instr, 1);
track.add(changeInstrument);

for(int i = 1; i < 30; i++){
    ShortMessage a = new ShortMessage();
    a.setMessage(144, channel, 35, 100);
    MidiEvent noteOn = new MidiEvent(a, 4+4*i);
    track.add(noteOn);
}

何かおかしくないですか?

編集

私はこれを見つけました。明らかに、この問題を抱えているのは私だけではありません。

男が書く

ここの誰かが同じ問題を抱えているようで、デフォルトのサウンドバンクが新しいサウンドバンクと同時に再生されます: http://forums.sun.com/thread.jspa?threadID=5182082。ただし、彼らの「解決済み」の返信では、多くの情報は得られません。新しいサウンドバンクの .gm ファイルの場所と関係があります。

悲しいことに、Sun のフォーラムへのリンクはもう機能しません (オラクルさん、私はあなたを見ています!)。投稿は 2009 年のものなので、インターネットの時代にはかなり古いものであり、この問題が解決されることを願っていました-悲しいことにそうではないようです。

Beads Project ( http://beadsproject.net )を使用するように切り替えましたが、Midi サポートも提供しています。オーディオ サンプルは完全に機能しており (Java Audio よりもはるかに優れています!)、近いうちに Midi 実装で運試しをする予定です。誰かが興味を持っている場合は、結果が得られ次第、この質問に更新を投稿できます。

4

1 に答える 1

2

Javadocs によると、これはシーケンサーの予想される動作です。

通話時:

MidiSystem.getSequencer()

Java は、このシーケンサー インスタンスをデフォルトのシンセサイザーに接続します。これは、低解像度のデフォルトのサウンドフォントを使用してサウンドを出力します。カスタム シンセサイザーをシーケンサーに接続すると、シーケンサーは既定のシンセサイザーとカスタム シンセサイザーの両方にサウンドを送信し、2 つのサウンドを作成します。

一方、呼び出すとき:

MidiSystem.getSequencer(false)

Java は、どのシンセサイザーにも接続されていないシーケンサーを作成します。デフォルトでは、このシーケンサーはサウンドを出力しません。作成したカスタムシンセサイザーに接続すると、ロードされたインストゥルメントからの音だけが出力されます。

于 2020-03-18T19:38:15.007 に答える