AS3 加色合成。播放多个生成的声音

Posted

技术标签:

【中文标题】AS3 加色合成。播放多个生成的声音【英文标题】:AS3 additive tone synthesis. playing multiple generated sounds 【发布时间】:2010-09-06 16:20:36 【问题描述】:

受 Andre michelle 的启发,我正在 AS3 中构建一个色调矩阵。 我设法创建了矩阵并生成了不同的声音。它们听起来不太好,但我快到了 我遇到的一个大问题是,当设置播放多个点时,这听起来很可怕。我搜索了很多并找到了添加剂合成方法,但不知道如何将其应用于 as3。 有谁知道如何同时播放多个声音?有什么提示吗?

我的演示位于 www.inklink.co.at/tonematrix

【问题讨论】:

【参考方案1】:

哦,这声音太可怕了……

检查过维基?这并不难理解...即使您对数学不太了解...您应该这样做 - 编程音乐并不容易。

所以:

让我们先定义一些东西:

var harmonics:Array = new Array();

harmonics 是我们将存储单个谐波的数组。每个孩子将是另一个数组,包含 ["amplitude"](技术上的音量)、["frequency"] 和 ["wavelength"](周期)。我们还需要一个函数,它可以在给定振幅波长偏移(从波的开始)给定波的相位.对于方波类似:

function getSquarePhase(amp:Number, wl:Number, off:Number):Number 
    while (off > wl)off -= wl;
    return (off > wl / 2 ? -amp : amp); // Return amp in first half, -amp in 2.

如果需要,您可以添加其他类型,甚至自定义矢量波。

现在是更难的部分。

var samplingFrequency; // set this to your SF

function getAddSyn(harmonics:Array, time:Number):Number 
    if (harmonics.length == 1) // We do not need to perform AS here
        return getSquarePhase(harmonics[0]["amplitude"], harmonics[0]["wavelength"], time);
     else 
        var hs:Number = 0;
        hs += 0.5 * (harmonics[0]["amplitude"] * Math.cos(getSquarePhase(harmonics[0]["amplitude"], harmonics[0]["wavelength"], time)));
        // ^ You can try to remove the line above if it does not sound right.
        for (var i:int = 1; i < harmonics.length; i++)
            hs += (harmonics[0]["amplitude"] * Math.cos(getSquarePhase(harmonics[0]["amplitude"], harmonics[0]["wavelength"], time)) * Math.cos((Math.PI * 2 * harmonics[0]["frequency"] / samplingFrequency) * time);
            hs -= Math.sin(getSquarePhase(harmonics[0]["amplitude"], harmonics[0]["wavelength"], time)) * Math.sin((Math.PI * 2 * harmonics[0]["frequency"] / samplingFrequency) * time);
        

        return hs;
    

这一切都是从***转换而来的(弱:D),我可能在某处那里犯了一个错误......但我认为你应该明白......如果没有,尝试自己从***转换AS,正如我所说,这并不难。

我也不知何故忽略了奈奎斯特频率...

【讨论】:

音乐中没有可怕的声音。你可以有基本的声音,侵略性的声音,扭曲的声音等......但可怕,不;) 好吧,这并不可怕!但我必须在攻击、衰减、维持和释放方面工作...... 感谢 Aurel300!我现在正在工作,所以我可能没有时间测试它。我一回到家,我会尝试并发布结果!非常感谢你。关于数学,是的,我知道,我必须学习很多!【参考方案2】:

我已经尝试过您的演示,并认为它实际上听起来不错。你的意思是它听起来不那么好?少了什么东西?我的主要兴趣领域是音乐,我没有发现任何问题,只是有点沮丧,因为在创建序列后,我觉得需要添加新的声音!如果我能够记录我正在玩的东西,我会发给你的。

不过,进入加法合成领域看起来并不轻松。你想推多远,你想创建某种形式的合成器吗?

【讨论】:

:) 谢谢 PatrickS,基本上我想学习如何在 AS3 中生成声音,并学习数学和一点声音理论 :) 最后我会尝试迈出一步音序器并将其与 arduino 板连接以制作真正的合成器,但这是项目的梦想部分...... 诚然,当播放两种声音时,您的声音会饱和,我昨天在播放时忽略了这一点:) 您可能需要在播放多个声音时检查幅度设置,这不应该一个重大问题。实际上,很多电子音乐家并不介意失真,但公平地说,用户应该对其进行某种形式的控制。

以上是关于AS3 加色合成。播放多个生成的声音的主要内容,如果未能解决你的问题,请参考以下文章

PortAudio:通过调用函数播放多个生成的声音

声音合成:使用 AS3 在频率之间插值

如何使用流体合成器从 C# 中的声音字体生成声音

ActionScript 3 AS3停止播放的所有声音

Moviepy输出视频MP4文件Windows媒体播放器播放无画面只有声音问题的解决办法

Moviepy输出视频MP4文件Windows媒体播放器播放无画面只有声音问题的解决办法