我正在尝试设置一个速度值,即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速度值应用于增益,我显然有一种非常响亮的声音。所以我想知道这两个问题中的任何一个:
答案 0 :(得分:2)
速度字节的解释留给接收仪器。通常,消息的数值越大,速度控制效果越强。例如,如果将速度应用于音量(输出电平),则较高的速度值将产生更响亮的音符。 64(40H)的值对应于mezzo-forte音符[...]优选地,速度到音量的应用应该是指数函数。
通用MIDI规格不再具体。
根据以下公式,通过凹面变换将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值。但是代码更容易这样,所以是的,它可以工作。