我正在尝试使用this之类的东西在JSyn中编写循环站程序。我的想法是,我可以录制到Wav文件并从程序中播放它们。在我尝试同时对多个文件执行此操作之前,该方法效果很好。
我该如何处理?
我无法创建多个合成器引擎,否则会出现错误,因此我创建了一个类,其中包含行和合成器。但是,如果仅在合成器休眠时播放音频,如何同时播放多个文件?
System.out.println("queue the sample");
samplePlayer.dataQueue.queue(sample);
System.out.println("queued the sample");
// Wait until the sample has finished playing.
do {
mySynth.sleepFor(1); //synth has to sleep while sample is being played
} while (samplePlayer.dataQueue.hasMore()); //this seems to always return true -> synth never wakes up & the program crashes
这是从JSyn库中包含的示例改编而成的。我的大部分编码都基于JSyn Programmer's Guide
这就是GUI的外观(用Java Swing编程)。它响应鼠标和数字键盘。这有效。
我的输出类的构造函数。这包含合成器和输出。
public OutputMix() {
filePath = sampleMachineFrame.filePath; //string containing path to location for sample files
mySynth = JSyn.createSynthesizer();
myLineOut = new LineOut();
mySynth.add(myLineOut);
recorder = new RecordMic[10]; //one recorder for each button (my own class)
player = new PlayFromWav[10]; //one player for each button (my own class)
}
录音功能绝对好。我什至可以开始重叠的录音(即一次录制到两个文件)并使用外部程序播放它们。
但是,当我尝试播放时,它们又回到了合成器中,却从未唤醒,而且我还在努力想象我将如何一次播放多个文件。
谢谢你的帮助 :)
最佳答案
通常,除非要对事件进行排序,否则您不希望进入程序。只需将样本排队以响应Button事件,然后让它们运行即可。
如果文件足够小,则可以将其加载到内存中。然后,您可以随时将多个文件排队。您可能需要增加Java虚拟机的堆大小。
这是一个示例:https://github.com/philburk/jsyn/blob/master/tests/com/jsyn/examples/PlaySample.java
如果样本太大,则必须使用多个线程将它们从磁盘流式传输出去,这更加困难。
您可以使所有样本的大小相同。然后他们将保持同步。或者您可以使用时间戳以特定节拍触发它们。