[英]Getting Multiple Audio Inputs in Processing
我正在編寫一個處理草圖,需要訪問多個音頻輸入,但Processing只允許訪問默認行。我嘗試直接從Java Mixer獲取Lines(在Processing中訪問),但我仍然只獲得信號從我的機器上當前設置為默認的任何一行。
我已經開始在尋找通過OSC從SuperCollider發送聲音,推薦這里 。 但是,由於我對SuperCollider非常陌生,他們的文檔和支持更專注於生成聲音而不是訪問輸入,我的下一步可能是玩Beads和Jack,如此處所示 。
有沒有人有(1)其他建議,或(2)從SuperCollider或Beads / Jack到Processing獲取多個輸入的具體示例?
先感謝您!
編輯:聲音將用於為自定義音樂可視化提供動力(想想iTunes可視化工具,但更多的歌曲特定)。 我們有多個mp3工作; 現在我需要的是能夠從每個麥克風獲得一個float []緩沖區。 希望有9種不同的麥克風,但如果更可行,我們將滿足4。
對於硬件,此時,我們只使用麥克風和XLR到USB電纜。 (考慮過前置放大器,但到目前為止這已經足夠了。)我目前在Windows上,但我認為我們最終會切換到Mac。
這是我對Beads的嘗試(它適用於筆記本電腦,因為我先做了那個,但耳機緩沖區全部為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()
我添加Jack的嘗試包含以下內容:
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 ......)
幾年前我遇到了同樣的問題,我使用了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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.