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

How to change the mp3's volume (levels) in Processing?

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

我的理想是:

  1. 在 Arduino 上安装变阻器并将模拟序列号发送到 Processing。
  2. 处理时声音的音量会随着变阻器的模拟数变化。

我尝试过的和做过的:

  1. 导入并使用 Minim。
  2. 成功从Arduino发送变阻器模拟数到Processing
  3. 在浮动量上设置模拟数字
  4. 在 void loop() 上使用 setGain(volume) 但音量没有改变。
  5. 在 void loop() 上使用 setVolume(volume) 但音量没有改变。

声音的音量仅在声音开始播放时改变一次。

我试过使用ESS,但是即使我把它放在Processing's Libraries的文件夹里也无法导入库。

我可以通过在 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);
}

谢谢。

您似乎正确地从 Arduino 读取了值,但您没有将其缩放 it/mapping 到 minim 期望的值。

看起来您可能正在从 Arduino 读取一个字节,因此您的值是从 0 到 255,但是 minim 的 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);

玩得开心!

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

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