我正在制作一个 Java 应用程序来使用 midi 仪器录制 midi。我一直在使用带有 ASIO 驱动程序的 Java,使用 proyect JAsioHost来避免延迟。
目前我正在为每个音符产生纯正弦波。我想使用 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 函数时合成器生成的音频相对应(这样我就可以使用该数组通过驱动程序生成音频)。有谁知道如何做到这一点?
我正在考虑尝试查看 noteOn 函数实现,以查看在代码的某个点是否有一个包含采样音频的数组,然后再将其发送到混音器,但我不知道在哪里可以找到它。
ps:运行我的应用程序时,我无法调用该synthesizer.open()
方法,因为在驱动程序运行时无法打开混音器。