Получение нескольких аудиовходов в обработке

В настоящее время я пишу скетч обработки, которому требуется доступ к нескольким аудиовходам, но обработка позволяет получить доступ только к строке по умолчанию. Я пытался получить линии прямо из микшера Java (доступ к ним осуществляется в рамках обработки), но я все еще получаю только сигнал из какой строки в настоящее время установлено значение по умолчанию на моей машине.

Я начал рассматривать отправку звука через OSC из SuperCollider, как рекомендовано здесь. Однако, поскольку я очень новичок в SuperCollider, а их документация и поддержка больше сосредоточены на создании звука, чем на доступе к входным данным, моим следующим шагом, вероятно, будет игра с Beads и Jack, как было предложено здесь.

Есть ли у кого-нибудь (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? Или наоборот — сначала найти там мой микрофон, а потом передать его от Джека в Processing?

(Простите мою неопытность и еще раз спасибо! Недостаток знаний о Джеке заставляет меня задуматься, не стоит ли мне вместо этого вернуться к SuperCollider...)


person Aemilia    schedule 21.06.2016    source источник
comment
Не могли бы вы предоставить больше контекста (например, что вы будете делать с входящим звуком), некоторую информацию об используемом вами оборудовании и, возможно, примеры кода, показывающие, что вы уже пробовали?   -  person mbaytas    schedule 22.06.2016
comment
@mbaytas Расширил сообщение, включив в него информацию о проекте и текущем оборудовании, а также добавил примеры кода.   -  person Aemilia    schedule 23.06.2016


Ответы (1)


У меня была такая же проблема несколько лет назад, и я использовал комбинацию JACK, JNAJack и Beads. Вы можете следить за этим Ветку группы Google Beads для получения более подробной информации.

В то время мне приходилось использовать эта версия 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());
    }

}
person George Profenza    schedule 21.06.2016
comment
Спасибо! Столкнулся с ошибкой не удается найти родную библиотеку выше. Вероятно, проблема с JNA или JNAJack? Я попытался добавить jna.jar в папку кода скетча и поместить org\jaaudiolibs\jnajack в папку библиотек Processing. - person Aemilia; 23.06.2016
comment
Тогда я использовал eclipse, так как было намного проще обрабатывать все различные библиотеки, которые в основном были в простом формате java (и не использовали структуру папок библиотеки обработки). Сможете ли вы вместо этого использовать eclipse? - person George Profenza; 23.06.2016
comment
@Aemilia Я загрузила свой старый проект eclipse здесь. Вы должны иметь возможность распаковать его и импортировать в eclipse. Убедитесь, что у вас работает Jack и ваши входы маршрутизируются по мере необходимости. По умолчанию он будет искать 1 аудиовход в строке 26. Вы можете настроить его на основе строки 25 (которая пытается использовать 4 аудиовхода) в соответствии с вашими потребностями. - person George Profenza; 23.06.2016