音量速度以获得网络音频

Posted

技术标签:

【中文标题】音量速度以获得网络音频【英文标题】:Volume velocity to gain web audio 【发布时间】:2016-12-08 15:01:07 【问题描述】:

我正在尝试设置一个速度值,该值位于要增益的 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 速度值应用于增益,我显然会听到非常响亮的声音。所以我想知道这两个问题中的任何一个:

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

【问题讨论】:

【参考方案1】:

MIDI specification 说:

速度字节的解释由接收仪器决定。一般来说,消息的数值越大,速度控制效果越强。例如,如果将力度应用于音量(输出电平),则更高的力度值将产生更响亮的音符。值 64 (40H) 将对应于中音 […] 最好将速度应用于音量应该是指数函数。

通用 MIDI 规范不再具体。

DLS Level 1 specification 说:

凹面变换根据以下公式将 MIDI 音符力度值转换为以 dB 为单位的衰减:

attendB = 20 × log10(1272 / 速度 2)

并馈入以控制音量或包络发生器峰值电平。

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

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

【讨论】:

谢谢,我试过了。结果令人敬畏,这可能是因为我可能误解了您所说的“然后必须将此衰减映射到增益因子”的意思。无论如何,通过自己尝试不同的公式,我发现了一个我发现它提供的动力学足够好(增益 = 速度² / 6400)。它可能在科学上并不准确,但是根据您的公式,我在 80 速度 20*log(16129/6400) = 8 时获得了 8 分贝增益。这还是太负荷了。我会接受这个答案,因为它看起来是正确的,但我猜这不是我会使用的。 要将 dB 映射到一个线性因子(如果这是增益节点使用的),请去掉 20* 对数,并注意衰减与增益相反。所以增益因子是velocity² / 127²【参考方案2】:

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

this.gainNode.gain.value = 速度 / 100 ;

所以 127 的速度 = 1.27 的增益

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

【讨论】:

以上是关于音量速度以获得网络音频的主要内容,如果未能解决你的问题,请参考以下文章

如何将 PCM 音频样本流转换为音量?

您将如何测量一个音频样本中的低音量?

iOS:增加录制音频的音量

VIPERFX完美音质设置方法?

如何增加原始音频字节的音量/幅度

AVAudioPlayer 在进行 WebRTC 音频通话时以非常低的音量播放声音