【问题标题】:Generate a non-sinusoidal tone生成非正弦音调
【发布时间】:2015-02-20 20:36:56
【问题描述】:

是否可以根据特定公式生成音调?我试过用谷歌搜索它,但我能找到的唯一东西是关于正常的正弦波,比如this other SO question。所以我想知道是否可以根据其他类型的公式生成音调?

在另一个 SO 问题上,我确实找到了指向 this demo page 的链接,但该页面似乎只是下载声音文件并使用它们来改变声音的音高。

我已经尝试使用多个振荡器来组合正弦波,基于 this answer,效果与预期一样:

window.ctx = new webkitAudioContext();
window.osc = [];

function startTones() {
  osc[0] = ctx.createOscillator(),
  osc[1] = ctx.createOscillator()
  osc[0].frequency.value = 120;
  osc[1].frequency.value = 240;
  osc[0].connect(ctx.destination);
  osc[1].connect(ctx.destination);
  osc[0].start(0);
  osc[1].start(0);
}

function stopTones() {
  osc[0].stop(0);
  osc[1].stop(0);
}
<button onclick="startTones();">Start</button>
<button onclick="stopTones();">Stop</button>

所以现在我想知道,是否有可能制作一个不基于添加这样的正弦波的波,例如锯齿波 (x - floor(x)),或正弦波的乘法 (sin(PI*440*x)*sin(PI*220*x))?

PS:我可以不支持某些浏览器 - 只要它仍然可以在至少一个中运行(尽管越多越好)。

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    所有(周期)波可以表示为正弦波的加法,WebAudio 有一个基于谐波级数合成波形的功能,context.createPeriodicWave(real, imag)

    所提供的realimag 输入数组的连续元素指定每个谐波的相对幅度和相位。

    如果您想通过程序创建波形,那么理论上您可以使用所需波形填充数组,对其进行 FFT,然后将生成的 FFT 分量传递给上述函数。

    (WebAudio 恰好原生支持锯齿波,顺便说一句)

    【讨论】:

    • 哦,我不知道supported other waveforms too。顺便感谢那个链接,看起来它很有用。 PS:你知道custom 周期波是如何工作的吗?
    • "custom" 是您在设置 PeriodicWave 时得到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2012-01-08
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    相关资源
    最近更新 更多