Java JSyn Loopstation

标签 java audio jsyn

我正在尝试在 JSyn 中编写一个循环站程序,其灵感来自类似 this 的东西。 。我的想法是,我可以录制 Wav 文件并从程序中播放它们。在我尝试同时对多个文件执行此操作之前,这种方法效果很好。 我该如何处理这个问题? 我无法创建多个合成器引擎,否则会出现错误,因此我使用线路输出和合成器创建了一个类。但是,如果音频仅在合成器 hibernate 时播放,我如何同时播放多个文件?

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 编程)。它响应鼠标和数字键盘。这有效。 The GUI

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

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)
}

录音效果绝对没问题。我什至可以开始重叠录音(即一次录制到两个文件)并使用外部程序播放它们。 但是,当我尝试播放它们时,合成器永远不会醒来,而且我也在努力想象如何同时播放多个文件。 感谢您的帮助:)

最佳答案

一般来说,除非您正在对事件进行排序,否则您不想在程序中 hibernate 。只需对响应按钮事件的样本进行排队并让它们运行即可。

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

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

如果样本太大,那么您将不得不使用多个线程将它们从磁盘上流式传输,这会更加困难。

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

关于Java JSyn Loopstation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49975398/

相关文章:

java - 集合的自定义 Hibernate 插入,@WhereJoinTable 的对应物

linux - 如何使用 ffplay 和 youtube-dl 在终端中播放 youtube 歌曲

java - 为什么 java 无法播放我的 .wav 文件?

audio - 使用JSyn将LineOut输出直接记录到文件中

java - 在播放期间更改样本的属性

java - java中将数组传递给带有数组参数的方法和var-args有什么区别?

java - 我想将 java 中的数组中的值存储在我自己类型的 arrayList 中。我该怎么做

java - drawString() 方法覆盖了之前的绘图(paintComponent 不清除)

C++ 在控制台应用程序中播放视频音频

android - 消除音量信封重新触发点击 - Android 上的 Jsyn