受到安德烈·米歇尔的启发,我正在AS3中建立一个音调矩阵。 我设法创建矩阵并生成不同的声音。他们听起来不那么好,但我到了那里 我遇到的一个大问题是,当设置多个点播放时,听起来很可怕。我google了很多,发现了添加剂合成方法,但没有一个线索如何将它应用于as3。 那里的任何人都知道如何一起演奏多种声音?任何提示?
我的演示在www.inklink.co.at/tonematrix
答案 0 :(得分:2)
哦声音太可怕了......
检查维基?这并不难理解......即使你不太了解数学......你应该做什么 - 编程音乐并不容易。
所以:
让我们先定义一下:
var harmonics:Array = new Array();
harmonics 是我们存储各个谐波的阵列。每个子节点都是另一个数组,包含[“幅度”](技术上是音量),[“频率”]和[“波长”](周期)。给定幅度,波长和偏移(从波的开始)我们还需要一个可以给出波的相位的函数。对于方波这样的东西:
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,正如我所说,它并不那么难。
我也不知何故忽略了奈奎斯特频率......
答案 1 :(得分:0)
我已经尝试过你的演示,并认为它实际上听起来很不错。你是什么意思听起来不那么好?少了什么东西?我感兴趣的主要领域是音乐,我没有发现任何错误,只是有点令人沮丧,因为创建一个序列后,我觉得需要添加新的声音!如果我能够记录我正在玩的东西,我会把它发给你。
进入添加剂合成虽然看起来不是一件轻松的事。你想在多大程度上推动它,你想创造某种形式的合成器吗?