Java JSyn循环站

Java JSyn循环站,java,audio,jsyn,Java,Audio,Jsyn,我正试图用JSyn编写一个loopstation程序,它的灵感来自于这样的东西。我的想法是,我可以录制到Wav文件,并从程序中播放它们。在我尝试同时对多个文件执行此操作之前,它一直运行良好。 我该如何处理这个问题? 我不能创建多个合成器引擎,否则我会出错,所以我创建了一个带有行输出和合成器的类。但是如果音频只在合成器睡眠时播放,我如何一次播放多个文件 System.out.println("queue the sample"); samplePlayer.dataQueue.queue(samp

我正试图用JSyn编写一个loopstation程序,它的灵感来自于这样的东西。我的想法是,我可以录制到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库中包含的示例改编的。我自己的大部分编码都是基于

这就是GUI的外观(用JavaSwing编程)。它对鼠标和numpad做出反应。这很有效。

我的输出类的构造函数。这包括合成器和线路输出

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)
}
录音效果非常好。我甚至可以开始重叠录制(即一次录制两个文件)并使用外部程序播放它们。 但是,当我尝试播放它们时,合成器从未唤醒,我也在努力想象如何一次播放多个文件
感谢您的帮助:)

通常,除非您正在对事件排序,否则您不想在程序中睡觉。只需将样本排队以响应按钮事件,然后让它们运行

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

以下是一个例子:

如果样本太大,那么您必须使用多个线程将它们从磁盘上流出来,这会更加困难


您可以使所有样品的尺寸相同。然后它们将保持同步。或者您可以使用时间戳在特定的节拍触发它们。

非常感谢您的帮助!我重新考虑了我的方法。现在我想使用空白的浮动样本(大小都一样),可以通过记录来修改。是否可以直接记录到float样本,或者我必须将它们作为文件写入?通过将它们排队到FixedRateMonoWriter或FixedRateStereoWriter,您可以非常轻松地记录到float样本。你必须开始写作。谢谢,这很有效。对于没有固定尺寸的样品也可以这样做吗?我的想法是,我将根据第一个样本的大小来确定样本的大小。然而,似乎只有一个构造函数用于无限大小的单声道采样,而不是立体声采样。如何录制没有固定大小的立体声样本?更正:对于无限大小的浮点样本,无论是单声道还是立体声,都没有构造函数。