java - 如何在处理中更改 mp3 的音量(级别)?

标签 java audio arduino processing

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

我的理想是:

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

我尝试过并做了什么:

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

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

我尝试使用 ESS,但即使我将其放入 Process'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);
}

谢谢。

最佳答案

您似乎从 Arduino 正确读取了该值,但您没有将其缩放/映射到最小值所期望的值。

看起来您可能正在从 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);

玩得开心!

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

关于java - 如何在处理中更改 mp3 的音量(级别)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34037807/

相关文章:

iphone - 有带控件的iOS音乐播放器吗?

android - 在实时移动图上绘制安卓记录样本的振幅

java - Ant 抛出错误 "java returned 1"

java - 程序运行时执行语句/代码

unix - 使用 ffmpeg 将 m4a 拆分为多个文件

c - 在C中使用直方图过滤数据

asynchronous - Arduino 如何处理中断?

android - 从 'byte*' 到 'byte' 的无效转换

java - 如何在 Storm 中发射和收集数组列表?

java - JDBC MySQL 存储过程抛出异常 "Parameter number 2 is not an OUT parameter"?