ああ、一般的な音はひどいものでした...
ウィキをチェックしましたか?理解するのはそれほど難しいことではありません...数学の多くを知らなくても...あなたがすべきこと-音楽のプログラミングは簡単ではありません。
それで:
最初に何かを定義しましょう:
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を自分で変換してみてください。私が言ったように、それはそれほど難しいことではありません。
私もどういうわけかナイキスト周波数を無視しました...