AS3 аддитивный синтез тона. воспроизведение нескольких сгенерированных звуков - PullRequest
0 голосов
/ 06 сентября 2010

Вдохновленный Андре Мишель, я строю матрицу тонов в AS3.Мне удалось создать матрицу и генерировать разные звуки.Они звучат не очень хорошо, но я добираюсь до этого. У меня есть одна большая проблема: когда настроено играть более одной точки, звучит просто ужасно.Я много гуглил и нашел метод аддитивного синтеза, но понятия не имею, как применить его к as3.Кто-нибудь знает, как играть несколько звуков вместе?Любой намек?

моя демонстрация на www.inklink.co.at/tonematrix

Ответы [ 2 ]

2 голосов
/ 06 сентября 2010

О, обычный звук был ужасным ...

Проверено вики? Это не так сложно понять ... Даже если вы не знаете столько математики ... Что вам следует - ПРОГРАММИРОВАТЬ музыку не просто.

Итак:

Давайте сначала определим что-то:

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 из Википедии, как я уже сказал, это не так сложно.

Я тоже как-то игнорировал частоту Найквиста ...

0 голосов
/ 06 сентября 2010

Я попробовал ваше демо и подумал, что на самом деле это звучит довольно хорошо.Что вы имеете в виду, это звучит не так хорошо?Чего не хватает?Моя основная сфера интересов - музыка, и я не нашел ничего плохого, только это немного расстраивает, потому что после создания последовательности я чувствую необходимость добавлять новые звуки!Если бы мне удалось записать то, с чем я играл, я бы отправил это вам.

Впрочем, переход на аддитивный синтез не выглядит легким делом.Как далеко вы хотите продвинуться, хотите ли вы создать какую-нибудь форму синтезатора?

...