受 Andre michelle 的启发,我正在 AS3 中构建一个色调矩阵。我设法创建了矩阵并生成了不同的声音。它们听起来不太好,但我已经到了那里我遇到的一个大问题是,当设置播放多个点时,这听起来很可怕。我搜索了很多并找到了添加剂合成方法,但不知道如何将其应用于 as3。有谁知道如何同时播放多个声音?任何提示?
我的演示在 www.inklink.co.at/tonematrix
受 Andre michelle 的启发,我正在 AS3 中构建一个色调矩阵。我设法创建了矩阵并生成了不同的声音。它们听起来不太好,但我已经到了那里我遇到的一个大问题是,当设置播放多个点时,这听起来很可怕。我搜索了很多并找到了添加剂合成方法,但不知道如何将其应用于 as3。有谁知道如何同时播放多个声音?任何提示?
我的演示在 www.inklink.co.at/tonematrix
哦,常见的声音是可怕的......
检查维基?理解起来并不难……即使您对数学知之甚少……您应该这样做 - 编程音乐并不容易。
所以:
让我们首先定义一些东西:
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,正如我所说,这并不难。
我也不知何故忽略了奈奎斯特频率......
我已经尝试过你的演示,并认为它实际上听起来不错。你的意思是它听起来不那么好?少了什么东西?我的主要兴趣领域是音乐,我没有发现任何问题,只是有点令人沮丧,因为在创建序列后,我觉得需要添加新的声音!如果我能够记录我正在玩的东西,我会发给你的。
不过,进入添加剂合成看起来并不轻松。你想把它推多远,你想创建某种形式的合成器吗?