Получение нескольких аудио входов в обработке
В настоящее время я пишу эскиз обработки, который должен иметь доступ к нескольким аудиовходам, но обработка разрешает доступ только к строке по умолчанию. Я попытался получить линии прямо из микшера Java (доступ к которому осуществляется через обработку), но я все еще получаю только сигнал от того, какая строка в настоящее время установлена на моей машине по умолчанию.
Я начал смотреть на отправку звука через OSC от SuperCollider, как рекомендовано здесь. Однако, поскольку я очень новичок в SuperCollider и их документация и поддержка больше сосредоточены на создании звука, чем на доступе к входам, моим следующим шагом, вероятно, будет поиграться с Бисером и Джеком, как предлагается здесь.
Есть ли у кого-нибудь (1) другие предложения или (2) конкретные примеры получения нескольких входов от SuperCollider или Beads/Jack для обработки?
Заранее спасибо!
Изменить: звук будет использоваться для питания пользовательских музыкальных визуализаций (подумайте, визуализатор iTunes, но гораздо более специфичны для песни). У нас это работает с несколькими mp3-файлами; Теперь мне нужно получить буфер float[] для каждого микрофона. Надеемся получить 9 разных микрофонов, хотя мы согласимся на 4, если это более выполнимо.
Для аппаратного обеспечения на данный момент мы просто используем микрофоны и кабели XLR-USB. (Рассматривал предусилитель, но пока этого было достаточно.) Сейчас я работаю на Windows, но думаю, что в конечном итоге мы перейдем на Mac.
Здесь была моя попытка только с бисером (он отлично работает для ноутбука, так как я делаю это первым, но в буфере гарнитуры есть все 0; если я переключу их и сначала поставлю гарнитуру, буфер гарнитуры будет правильным, но ноутбук будет содержать все 0):
void setup() {
size(512, 400);
JavaSoundAudioIO headsetAudioIO = new JavaSoundAudioIO();
JavaSoundAudioIO laptopAudioIO = new JavaSoundAudioIO();
headsetAudioIO.selectMixer(5);
headsetAudioCon = new AudioContext(headsetAudioIO);
laptopAudioIO.selectMixer(4);
laptopAudioCon = new AudioContext(laptopAudioIO);
headsetMic = headsetAudioCon.getAudioInput();
laptopMic = headsetAudioCon.getAudioInput();
} // setup()
void draw() {
background(100,0, 75);
laptopMic.start();
laptopMic.calculateBuffer();
laptopBuffer = laptopMic.getOutBuffer(0);
for (int j = 0; j < laptopBuffer.length - 1; j++)
{
println("laptop; " + j + ": " + laptopBuffer[j]);
line(j, 200+laptopBuffer[j]*50, j+1, 200+laptopBuffer[j+1]*50);
}
laptopMic.kill();
headsetMic.start();
headsetMic.calculateBuffer();
headsetBuffer = headsetMic.getOutBuffer(0);
for (int j = 0; j < headsetBuffer.length - 1; j++)
{
println("headset; " + j + ": " + headsetBuffer[j]);
line(j, 50+headsetBuffer[j]*50, j+1, 50+headsetBuffer[j+1]*50);
}
headsetMic.kill();
} // draw()
Моя попытка добавить Джека содержит следующую строку:
ac = new AudioContext(new AudioServerIO.Jack(), 44100, new IOAudioFormat(44100, 16, 4, 4));
но я получаю ошибку:
Jun 22, 2016 9:17:24 PM org.jaudiolibs.beads.AudioServerIO$1 run
SEVERE: null
org.jaudiolibs.jnajack.JackException: Can't find native library
at org.jaudiolibs.jnajack.Jack.getInstance(Jack.java:428)
at org.jaudiolibs.audioservers.jack.JackAudioServer.initialise(JackAudioServer.java:102)
at org.jaudiolibs.audioservers.jack.JackAudioServer.run(JackAudioServer.java:86)
at org.jaudiolibs.beads.AudioServerIO$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.UnsatisfiedLinkError: Unable to load library 'jack': Native library (win32-x86-64/jack.dll) not found in resource path ([file:/C:/Users/...etc...)
А когда я в Джеке, я не вижу свой микрофон (который мне кажется огромным красным флагом, хотя я совершенно не знаком с Джеком). Должен ли этот AudioContext отображаться как вход в Jack? Или наоборот - сначала найди там мой микрофон, а затем доставь его от Джека к обработке?
(Прости мою неопытность и еще раз спасибо! Мой недостаток знаний в Джеке заставляет меня задаться вопросом, должен ли я вернуться к SuperCollider вместо этого...)
1 ответ
У меня была такая же проблема несколько лет назад, и я использовал комбинацию JACK, JNAJack и Beads. Вы можете следовать этой теме Beads Google Group для более подробной информации.
В то время мне приходилось использовать эту версию Beads (2012-04-23), но я надеюсь, что эти изменения, вероятно, уже вошли в основной проект.
Для справки вот базовый класс, который я использовал:
import java.util.Arrays;
import org.jaudiolibs.beads.AudioServerIO;
import net.beadsproject.beads.analysis.featureextractors.FFT;
import net.beadsproject.beads.analysis.featureextractors.PowerSpectrum;
import net.beadsproject.beads.analysis.segmenters.ShortFrameSegmenter;
import net.beadsproject.beads.core.AudioContext;
import net.beadsproject.beads.core.AudioIO;
import net.beadsproject.beads.core.UGen;
import net.beadsproject.beads.ugens.Gain;
import processing.core.PApplet;
public class BeadsJNA extends PApplet {
AudioContext ac;
ShortFrameSegmenter sfs;
PowerSpectrum ps;
public void setup(){
//defining audio context with 6 inputs and 6 outputs - adjust this based on your sound card / JACK setup
ac = new AudioContext(new AudioServerIO.Jack(),512,AudioContext.defaultAudioFormat(6,6));
//getting 4 audio inputs (channels 1,2,3,4)
UGen microphoneIn = ac.getAudioInput(new int[]{1,2,3,4});
Gain g = new Gain(ac, 1, 0.5f);
g.addInput(microphoneIn);
ac.out.addInput(g);
println("no. of inputs: " + ac.getAudioInput().getOuts());
//test get some FFT power spectrum data form the
sfs = new ShortFrameSegmenter(ac);
sfs.addInput(ac.out);
FFT fft = new FFT();
sfs.addListener(fft);
ps = new PowerSpectrum();
fft.addListener(ps);
ac.out.addDependent(sfs);
ac.start();
}
public void draw(){
background(255);
float[] features = ps.getFeatures();
if(features != null){
for(int x = 0; x < width; x++){
int featureIndex = (x * features.length) / width;
int barHeight = Math.min((int)(features[featureIndex] *
height), height - 1);
line(x, height, x, height - barHeight);
}
}
}
public static void main(String[] args) {
PApplet.main(BeadsJNA.class.getSimpleName());
}
}