0

我正在尝试在 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)
}

录音工作非常好。我什至可以开始重叠录制(即一次录制到两个文件)并使用外部程序播放它们。但是当我尝试播放它们时,合成器永远不会醒来,我也在努力想象如何一次播放多个文件。谢谢你的帮助 :)

4

1 回答 1

1

通常,除非您正在对事件进行排序,否则您不想在程序中休眠。只需将样本排队以响应 Button 事件并让它们运行。

如果文件足够小,那么您可以将它们加载到内存中。然后,您可以随时将多个文件排队。您可能需要增加 Java 虚拟机的堆大小。

这是一个示例:https ://github.com/philburk/jsyn/blob/master/tests/com/jsyn/examples/PlaySample.java

如果样本太大,那么您将不得不使用多个线程将它们从磁盘中流出来,这更加困难。

您可以使所有样本大小相同。然后它们将保持在相位中。或者您可以使用时间戳在特定节拍触发它们。

于 2018-04-26T04:02:53.633 回答