О, обычный звук был ужасным ...
Проверено вики? Это не так сложно понять ... Даже если вы не знаете столько математики ... Что вам следует - ПРОГРАММИРОВАТЬ музыку не просто.
Итак:
Давайте сначала определим что-то:
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 из Википедии, как я уже сказал, это не так сложно.
Я тоже как-то игнорировал частоту Найквиста ...