Java 重新实施;“音调矩阵”;音频玩具

Java 重新实施;“音调矩阵”;音频玩具,java,audio,memory-management,jfugue,Java,Audio,Memory Management,Jfugue,有一个非常酷的音频“玩具”叫。我想把它重新实现为一个Java小程序。我试过使用的是播放器。播放单独的音符以获得声音,线程。睡眠用于计时,但结果很糟糕 JFugue在第17次(是的,我算过)调用播放器后停止响应。播放和线程。睡眠太不规律,无法产生良好的节奏 你会推荐什么?基本上,我正在寻找一种简单的方法来动态生成单个音符。因此,在声音播放前的一小部分时间,我需要能够查看数据并告诉音频库要播放哪些音符。(可能有多个音符处于和谐状态。)我猜你忘了在JFugue中关闭音符,或者有一个bug,它忘了在开始

有一个非常酷的音频“玩具”叫。我想把它重新实现为一个Java小程序。我试过使用的是播放器。播放单独的音符以获得声音,
线程。睡眠
用于计时,但结果很糟糕

JFugue在第17次(是的,我算过)调用
播放器后停止响应。播放
线程。睡眠
太不规律,无法产生良好的节奏


你会推荐什么?基本上,我正在寻找一种简单的方法来动态生成单个音符。因此,在声音播放前的一小部分时间,我需要能够查看数据并告诉音频库要播放哪些音符。(可能有多个音符处于和谐状态。)

我猜你忘了在JFugue中关闭音符,或者有一个bug,它忘了在开始播放音符时停止播放

使用MIDI是一种非常简单的方法来完成您所说的任务。下面是midi软件包中有用方法的一个大杂烩,可以帮助您入门:

Synthesizer synth = MidiSystem.getSynthesizer();
synth.open();
MidiChannel midiChannel = synth.getChannels()[0];
midiChannel.allNotesOff();
currentInstrument = synth.getAvailableInstruments()[index];
System.out.println("Switching instrument to #" + index + ": " + currentInstrument.getName());
synth.loadInstrument(currentInstrument);
midiChannel.programChange(currentInstrument.getPatch().getBank(), currentInstrument.getPatch().getProgram());
midiChannel.noteOn(noteNumber, velocity);
midiChannel.noteOff(noteNumber);