Java JSyn Loopstation
Я пытаюсь запрограммировать программу Looptation на 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
Вот как выглядит 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)
}
Запись работает абсолютно нормально. Я даже могу начать накладывать записи (т.е. записывать сразу в два файла) и воспроизводить их с помощью внешней программы. Но когда я пытаюсь воспроизвести их, синтезатор никогда не просыпается, и я также изо всех сил пытаюсь представить, как я буду воспроизводить несколько файлов одновременно. Спасибо за вашу помощь:)
1 ответ
В общем, вы не хотите спать в своей программе, если вы не упорядочиваете события. Просто поставьте в очередь образцы в ответ на события Button и дайте им работать.
Если файлы достаточно малы, вы можете просто загрузить их в память. Затем вы можете поставить в очередь несколько файлов в любое время. Возможно, вам придется увеличить размер кучи виртуальной машины Java.
Вот пример: https://github.com/philburk/jsyn/blob/master/tests/com/jsyn/examples/PlaySample.java
Если сэмплы слишком велики, вам придется передавать их с диска, используя несколько потоков, что более сложно.
Вы можете сделать все образцы одинакового размера. Тогда они останутся в фазе. Или вы можете вызвать их в определенных тактах, используя временные метки.