MIDI 楽器を使用して MIDI を録音する Java アプリケーションを作成しています。遅延を回避するために、プロジェクト JAsioHostを使用して ASIO ドライバーで Java を使用しています。
現在、各ノートに純粋な正弦波を生成しています。次のコードのように、Java が提供するシンセサイザーを使用してサウンドを生成したいと考えています。
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
public class Main {
public static void main(String[] args) {
Synthesizer synthesizer = null ;
MidiChannel [] channels = null ;
try {
synthesizer = MidiSystem.getSynthesizer() ;
synthesizer.open();
channels = synthesizer.getChannels();
channels[0].programChange(1) ;
channels[0].noteOn( 70, 40) ;
Thread.sleep( 3000) ;
} catch (MidiUnavailableException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
channels[ 0 ].noteOff(70) ;
}
}
これを実現するには、noteOn 関数が呼び出されたときにシンセサイザーによって生成されたオーディオに対応する、サンプリングされたオーディオを含む float 配列を取得する必要があります (これにより、配列を使用してドライバーでオーディオを生成できます)。これを行う方法を知っている人はいますか?
noteOn 関数の実装を表示して、ミキサーに送信される前にサンプリングされたオーディオを含む配列がコードのある時点にあるかどうかを確認しようと考えていましたが、それを見つける場所がわかりません。
synthesizer.open()
ps:ドライバーの実行中にミキサーを開くことができないため、アプリケーションの実行中にメソッドを呼び出すことができません。