【问题标题】:Math related Javascript for Web Audio APIWeb Audio API 的数学相关 Javascript
【发布时间】:2015-03-13 06:58:03
【问题描述】:

我无法解决这个与数学相关的问题。

我正在为一个项目使用jogDial.js 插件。

有了它,我正在尝试模拟一个控制网络音频 api 的 gainNode 的音量刻度盘。

插件可以用这个返回表盘的度数:

console.log("event.target.degree: "+event.target.degree); 
//between +220 and +140 

它也可以用这个来返回旋转:

console.log("event.target.rotation: "+ event.target.rotation);
//between -140 and +140

我发现旋转更容易使用。

模拟来自Harman/Karmon接收器的真实现有表盘,下限在-140的旋转,中间在0,上限在140 的旋转。

这是表盘的实际图像,因此您可以直观地看到(忽略图像中的数字 0 和 40):

我的 GainNode 限制是 01,其中 1 表示 100% 音量,0 表示静音。

-140 度,这应该是音量为 0% 的位置。网络音频 api gainNode.gain.value 为 0

当刻度盘位于 0 度 时,即为中点。音量应为 50%,或 gainNode.gain 的 0.50 值。

拨盘在+140度时,音量应为100%,或者网络音频api的增益值为1

我无法找出一个适用于我的 on("mousemove", function(event){});

的公式

我试过了:

var volumeDial = JogDial(document.getElementById('volume-knob'), {
    debug: true,
    wheelSize: '90%',
    zIndex: '100',
    touchMode: 'wheel',
    knobSize: '3%',
    minDegree: -140,
    maxDegree: 140,
    degreeStartAt: 0
}).on("mousemove", function(event){
    var volume = event.target.rotation;
    console.log("event.target.rotation: "+ event.target.rotation);
    console.log("event.target.degree: "+event.target.degree);
    var theGain;
    theGain = Math.abs(50-(volume*0.3575)-100) *0.01;
    gainNode.gain.value = theGain;
console.log("gainNode.gain.value: "+gainNode.gain.value);
    source.connect(gainNode);
}).on("mouseup", function(event){
    console.log("event.target.rotation: "+event.target.rotation);
    console.log("event.target.degree: "+event.target.degree);
});

问题是它不准确。它接近但不是预期的效果。 0%还是有声音的,从0%到100%在听觉上没有太大区别。

在 0% 时,我的增益值为“0.0005000000237487257”。声音几乎没有寂静,相当响亮。

在 50% 时,我的增益值为 0.5,这是正确的。

在 100% 时,我的增益值为 1.000499963760376。

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    你真正需要的是

    (event.target.rotation + 140) / 280
    

    我什至不确定你从哪里得到这个乘数。

    【讨论】:

    • 那行得通...我还发现了一个完全不同的问题,它影响了它。我必须断开以前的 source.connect 与其他功能的连接,该功能具有自己的设置静态增益级别,然后才能正常工作。
    • 根据旋钮的位置线性调整增益是个坏主意。当增益为 0.5 时,它听起来几乎和 1.0 一样响亮,而不是响亮的一半。你真的想要一个旋钮位置的指数函数,除了当旋钮一直向下时增益应该一直为零(指数函数永远不会完全为零)。类似:if (rotation == -140) gain = 0; else gain = Math.pow(10, (rotation - 140) / 200);(您可能想尝试除 200 以外的除数,看看哪个听起来最好,但这是一般的想法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2022-11-11
    • 2015-11-24
    • 2021-01-03
    • 2013-05-31
    相关资源
    最近更新 更多