音量速度以获得网络音频
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 值。但是,这样代码更容易,所以是的,它可以工作。
【讨论】:
以上是关于音量速度以获得网络音频的主要内容,如果未能解决你的问题,请参考以下文章