如何在Processing中更改mp3的音量(级别)?

时间:2015-12-02 08:18:07

标签: java audio arduino processing

我想用Processing和Arduino制作简单的音序器。

我的理想是:

  1. 在Arduino上安装变阻器并将模拟序列号发送到Processing。
  2. 声音的音量将随加工过程中变阻器的模拟数量而变化。
  3. 我尝试过的事情:

    1. 导入并使用Minim。
    2. 成功将变阻器的模拟数量从Arduino发送到Processing
    3. 在浮动卷上设置模拟编号
    4. 在void loop()上使用setGain(volume)但是音量没有改变。
    5. 在void loop()上使用setVolume(volume)但是音量没有改变。
    6. 当声音开始播放时,声音的音量只改变了一次。

      我尝试使用ESS但是我无法导入库,即使我把它放在Processing的库文件夹中。

      我可以在处理中播放声音来改变音量吗?

      这是我的信息:

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

      谢谢。

1 个答案:

答案 0 :(得分: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(如果用analogRead()读取电位器,你将处理0-1023的值,所以一定要将它们除以4,然后再发送给它们处理

使用map()的一个好处是你可以根据需要反转音量:

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

玩得开心!

<强>更新 baoga对setVolume不起作用提出了一个很好的观点。 我在控制台中看到了这一点:

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

似乎是Minim的引擎盖下的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);
}