2015-12-02 109 views
2

我想用Processing和Arduino製作簡單的音序器。如何更改處理中的mp3音量(級別)?

我的理想是:對Arduino的變阻器

  1. PUT和模擬發送序列號來處理。
  2. 聲音的音量將在處理時沿着變阻器的模擬數量變化。

我嘗試和做:

  1. 進口和使用微量。
  2. 成功地從阿爾杜伊諾發送變阻器的模擬數處理
  3. 浴液體積
  4. 使用setGain(體積)上的空隙環(),但捲上的模擬數沒有變化。
  5. 在void loop()上使用setVolume(volume),但音量沒有變化。

當聲音開始播放時,聲音的音量只改變一次。

我試圖使用ESS,但我無法導入庫,即使我把它放到了Processing's Libraries的文件夾中。

我可以通過播放處理中的聲音來更改音量嗎?

這裏是我的線:

import processing.serial.*; 
Serial myPort; 
int number; 
float volume; 

import ddf.minim.spi.*; 
import ddf.minim.signals.*; 
import ddf.minim.*; 
import ddf.minim.analysis.*; 
import ddf.minim.ugens.*; 
import ddf.minim.effects.*; 

AudioPlayer player; 
int BUFFER_SIZE = 256; 

Minim minim; 

void setup() { 
    myPort = new Serial(this, "/dev/cu.usbmodem0000", 9600); 
    minim = new Minim(this); 
    player = minim.loadFile("music02.mp3", BUFFER_SIZE); 
    volume = -60; 

    player.setGain(-10); 
    //player.setVolume(-10); 

    delay(200); 

    player.loop(); 

} 


void draw() { 
    player.setGain(volume); 
    //player.setVolume(volume); 
} 


void serialEvent(Serial port) { 
    println(port.read()); 
    volume = port.read(); 
    println(volume); 
    delay(200); 
} 

謝謝。

+0

請告訴我這個問題?更新你嘗試過的東西.. –

+0

我添加了我的嘗試和完成列表。 – bao

回答

2

您似乎正在從Arduino中正確讀取值,但是您沒有對其進行縮放/將其映射到最小預期值。

它看起來像你可能會讀取來自Arduino的一個字節,所以你必須從0到255的值,但微量的setVolume()預期從0.0到1.0

浮點值,你可以嘗試這樣的:

void serialEvent(Serial port) { 
    println(port.read()); 
    volume = map(port.read(),0,255,0.0,1.0); 
    println(volume); 
    delay(200); 
} 

這會工作一樣

void serialEvent(Serial port) { 
    println(port.read()); 
    volume = port.read()/255.0; 
    println(volume); 
    delay(200); 
} 

假設從Arduino的你的價值是從0到255(如果你閱讀電位您將處理0-1023的值,因此在將它們發送到Processing之前,務必將它們除以4。

有關使用map()一個整潔的事情是,你可以扭轉,如果你想音量:

volume = map(port.read(),0,255,1.0,0.0); 

玩得開心!

更新 寶加提出了一個關於setVolume不起作用的好點。 我看到這個控制檯:

=== Minim Error === 
=== Volume is not supported. 

似乎是微量的引擎蓋下的Java代碼似乎無法控制音量的問題。作爲解決方法,我建議使用setGain()代替。請注意,這是以分貝爲單位的(所以0.0,1.0範圍不適用)。 嘗試在draw()去掉語句和東西代替serialEvent()這樣的先行先試:

void serialEvent(Serial port) { 
    int arduinoValue = port.read(); 
    float gain = map(arduinoValue,0,255,-10.0,10.0); 
    println("arduinoValue: " + arduinoValue + " gain: " + gain); 
    player.setGain(gain); 
} 
+0

謝謝你的回答。我可以建立它,並控制從0.0到1.0的數量,但音量沒有改變... – bao

+0

我可以改變音量!非常感謝你! – bao

+0

太棒了!如果有幫助,請投票和/或標記答案:) –