2015-12-02 82 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

太棒了!如果有帮助,请投票和/或标记答案:) –