0

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:ドライバーの実行中にミキサーを開くことができないため、アプリケーションの実行中にメソッドを呼び出すことができません。

4

0 に答える 0