我想用Processing和Arduino制作简单的音序器。
我的理想是:
我尝试过的事情:
当声音开始播放时,声音的音量只改变了一次。
我尝试使用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);
}
谢谢。
答案 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);
}