2016-06-21 26 views
3

Ich schreibe gerade eine Processing-Skizze, die auf mehrere Audioeingänge zugreifen muss, aber die Verarbeitung erlaubt nur den Zugriff auf die Standardzeile. Ich habe versucht, Zeilen direkt aus dem Java Mixer zu holen), aber ich bekomme immer noch nur das Signal von der Zeile, die momentan auf meinem Gerät als Standard eingestellt ist.Mehrere Audioeingänge in Bearbeitung bekommen

Ich habe angefangen, den Sound über OSC von SuperCollider zu senden, wie empfohlen here. Da ich aber neu bei SuperCollider bin und deren Dokumentation und Unterstützung eher auf die Erzeugung von Sound als auf den Zugriff auf Eingänge ausgerichtet ist, wird mein nächster Schritt wahrscheinlich darin bestehen, mit Beads und Jack herumzuspielen, wie es here vorgeschlagen wurde.

Hat jemand (1) andere Vorschläge oder (2) konkrete Beispiele, wie man mehrere Eingaben von SuperCollider oder Beads/Jack zur Verarbeitung bekommt?

Vielen Dank im Voraus!

Bearbeiten: Der Sound wird verwendet, um benutzerdefinierte Musikvisualisierungen anzutreiben (denke an den iTunes Visualizer, aber viel mehr Song-spezifisch). Wir arbeiten mit mehreren MP3s. Nun, was ich brauche, ist in der Lage, einen Puffer float [] von jedem Mikrofon zu bekommen. Wir hoffen, 9 verschiedene Mikrofone zu haben, obwohl wir uns mit 4 zufrieden geben werden, wenn das machbar ist.

Für Hardware, an dieser Stelle verwenden wir nur Mikrofone und XLR zu USB-Kabel. (Habe einen Vorverstärker in Erwägung gezogen, aber bisher reicht das.) Ich bin momentan bei Windows, aber ich denke, dass wir letztendlich auf einen Mac wechseln werden.

Hier war mein Versuch mit nur Beads (es funktioniert gut für den Laptop, da ich das zuerst, aber der Headset-Puffer hat alle Nullen; wenn ich sie umschalte und das Headset zuerst, wird der Headset-Puffer korrekt sein , aber der Laptop wird alle 0) enthalten:

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

bei Zugabe von Jack Mein Versuch, diese Zeile enthält:

ac = new AudioContext(new AudioServerIO.Jack(), 44100, new IOAudioFormat(44100, 16, 4, 4)); 

aber ich habe den Fehler:

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

Und wenn ich in Jack bin, sehe ich mein Mikrofon nicht (das scheint für mich eine riesige rote Fahne zu sein, obwohl ich Jack völlig neu bin). Sollte dieser AudioContext als Input in Jack erscheinen? Oder umgekehrt - finde zuerst mein Mikrofon und dann von Jack zu Processing?

(Verzeihen Sie meine Unerfahrenheit, und nochmals vielen Dank! Mein Mangel an Wissen in Jack macht mich fragen, ob ich Supercollider stattdessen erneut sollte ...)

+0

Könnten Sie etwas mehr Kontext zu machen (zB, was Sie mit dem eingehenden Audio tun), einige Infos Abou die Hardware, die Sie verwenden, und Vielleicht Codebeispiele, die zeigen, was Sie bereits versucht haben? – mbaytas

+0

@baytas Der Beitrag wurde erweitert, um Informationen über das Projekt und die aktuelle Hardware aufzunehmen und Codebeispiele hinzuzufügen. – Aemilia

Antwort

0

ich das gleiche Problem vor ein paar Jahren und ich war früher ein Kombination von JACK, JNAJack und Beads. Sie können diese Beads Google Group thread für weitere Details folgen.

Damals musste ich this version of Beads (2012-04-23) verwenden, aber ich hoffe, dass diese Änderungen es wahrscheinlich in das Hauptprojekt inzwischen geschafft haben.

Als Referenz hier ist die Grundklasse I verwendet:

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

} 
+0

Danke! In den oben genannten Fehler "kann native Bibliothek nicht finden". Wahrscheinlich ein Problem mit JNA oder JNAJack? Ich habe versucht, jna.jar zum Code-Ordner der Skizze hinzuzufügen und org \ jaudiolibs \ jnajack in den Bibliotheksordner von Processing zu setzen. – Aemilia

+0

Ich habe damals Eclipse verwendet, da es viel einfacher war, all die verschiedenen Bibliotheken zu handhaben, die hauptsächlich im Java-Format waren (und keine Ordnerstruktur der Verarbeitungsbibliothek verwendeten). Wären Sie in der Lage, stattdessen eclipse zu verwenden? –

+0

@Aemilia Ich habe mein altes Eclipse-Projekt [hier] (http://lifesine.eu/so/BeadsJNA.zip) hochgeladen. Sie sollten in der Lage sein, es zu entpacken und es in Eclipse zu importieren. Stellen Sie sicher, dass Jack läuft und Ihre Eingaben nach Bedarf weitergeleitet werden. Standardmäßig wird in Zeile 26 nach 1 Audioeingang gesucht. Sie können dies anhand der Zeile 25 (die versucht, 4 Audioeingänge zu verwenden) an die Anforderungen Ihres Setups anpassen. –