获取网络音频的音量

时间:2016-12-08 15:01:08

标签: javascript audio midi web-audio web-audio-api

我正在尝试设置一个速度值,即midi信号中的值。速度范围从0到127。

关于web audio api的文档尽管做得很好,但并没有真正说明这一点。

此刻我正在播放声音:

  play(key, startTime) {    
    this.audioContext.decodeAudioData(this.soundContainer[key], (buffer) => {
      let source = this.audioContext.createBufferSource(); 
      source.buffer = buffer;                   
      source.connect(this.audioContext.destination);
      source.start(startTime);
     });
  }

我没有找到任何使用范围从0到127的速度值的东西。但是我发现gain node应用了增益。

所以我的功能现在是这样的:

  play(key:string, startTime, velocity) {    
    this.audioContext.decodeAudioData(this.soundContainer[key], (buffer) => {
      let source = this.audioContext.createBufferSource(); 
      source.buffer = buffer;                   
      source.connect(this.gainNode);
      this.gainNode.connect(this.audioContext.destination);
      this.gainNode.gain.value = velocity;
      source.start(startTime);
     });
  }

Eehhh ......如果我将midi速度值应用于增益,我显然有一种非常响亮的声音。所以我想知道这两个问题中的任何一个:

  • 我可以以某种方式直接使用速度值吗?
  • 如何将速度值转换为增益?

2 个答案:

答案 0 :(得分:2)

MIDI specification说:

  

速度字节的解释留给接收仪器。通常,消息的数值越大,速度控制效果越强。例如,如果将速度应用于音量(输出电平),则较高的速度值将产生更响亮的音符。 64(40H)的值对应于mezzo-forte音符[...]优选地,速度到音量的应用应该是指数函数。

通用MIDI规格不再具体。

DLS Level 1 specification说:

  

根据以下公式,通过凹面变换将MIDI音符速度值转换为dB衰减:

     

注意 dB = 20×log 10 (127 2 / Velocity 2

     

并用于控制音量或包络发生器峰值电平。

然后,您必须将此衰减映射到增益因子,即gain = velocity² / 127²

许多硬件合成器允许选择不同的曲线来将速度映射到音量。

答案 1 :(得分:0)

我不知道它是否正确,因为我对声音知之甚少,但这似乎有用:

this.gainNode.gain.value = velocity / 100;

因此速度为127 =增益为1.27

最终我认为更好的是将127分中的1分,每个分别对应于它们各自的midi值。但是代码更容易这样,所以是的,它可以工作。