0

我正在制作一个 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()方法,因为在驱动程序运行时无法打开混音器。

4

0 回答 0