Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
去年关闭。
Improve this question
有一个非常酷的音频“玩具”,称为ToneMatrix。我想将其重新实现为Java applet。我尝试将JFugue的
JFugue在第17次调用后停止响应(是的,我算过),
您会推荐什么呢?基本上,我正在寻找一种简单的方法来动态生成声音的单个音符。因此,在播放声音之前不到一秒钟,我需要能够查看数据并告诉音频库播放哪些音符。 (很可能会出现多个音符。)
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
去年关闭。
Improve this question
有一个非常酷的音频“玩具”,称为ToneMatrix。我想将其重新实现为Java applet。我尝试将JFugue的
player.play
与声音的单独注释和时序的Thread.sleep
一起使用,但结果令人震惊。JFugue在第17次调用后停止响应(是的,我算过),
player.play
的调用和Thread.sleep
太不规则,无法传递良好的节奏。您会推荐什么呢?基本上,我正在寻找一种简单的方法来动态生成声音的单个音符。因此,在播放声音之前不到一秒钟,我需要能够查看数据并告诉音频库播放哪些音符。 (很可能会出现多个音符。)
最佳答案
我的猜测是您忘记了在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);
08-15 22:49