我正在制作一个Java应用程序来使用midi乐器录制midi。我一直在使用Java和ASIO驱动程序使用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()
方法,因为在驱动程序运行时无法打开混音器。