0

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

我的演示在 www.inklink.co.at/tonematrix

4

2 回答 2

2

哦,常见的声音是可怕的......

检查维基?理解起来并不难……即使您对数学知之甚少……您应该这样做 - 编程音乐并不容易。

所以:

让我们首先定义一些东西:

var harmonics:Array = new Array();

谐波是我们将存储单个谐波的数组。每个孩子将是另一个数组,包含[“幅值”](技术上的音量)、[“频率”]和[“波长”](周期)。我们还需要一个函数,它可以在给定振幅波长偏移量(从波的开始)的情况下为我们提供波的相位。对于方波,例如:

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,正如我所说,这并不难。

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

于 2010-09-06T18:36:04.050 回答
0

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

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

于 2010-09-06T16:42:04.090 回答