如何在 Processing 中更改 mp3 的音量(级别)?
How to change the mp3's volume (levels) in Processing?
我想用 Processing 和 Arduino 制作简单的音序器。
我的理想是:
- 在 Arduino 上安装变阻器并将模拟序列号发送到 Processing。
- 处理时声音的音量会随着变阻器的模拟数变化。
我尝试过的和做过的:
- 导入并使用 Minim。
- 成功从Arduino发送变阻器模拟数到Processing
- 在浮动量上设置模拟数字
- 在 void loop() 上使用 setGain(volume) 但音量没有改变。
- 在 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);
}
我想用 Processing 和 Arduino 制作简单的音序器。
我的理想是:
- 在 Arduino 上安装变阻器并将模拟序列号发送到 Processing。
- 处理时声音的音量会随着变阻器的模拟数变化。
我尝试过的和做过的:
- 导入并使用 Minim。
- 成功从Arduino发送变阻器模拟数到Processing
- 在浮动量上设置模拟数字
- 在 void loop() 上使用 setGain(volume) 但音量没有改变。
- 在 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);
}