Wavetable синтез - синтезирование аккорда - периодическое создание волновой таблицы - PullRequest
0 голосов
/ 12 апреля 2019
//I'm instantiating AudioContext
var audio_context = new AudioContext();
//creating oscillator
var oscillator = audio_context.createOscillator();
//hooking up the oscillator
oscillator.connect(audio_context.destination);

Я знаю, что air_pressure=sin(2pi·frequency·time) представляет стандарт oscillator.type="sine" поэтому волновая таблица для синуса будет:

real = [0, 0], imaginary = [0, 1];

Я хочу, чтобы мой генератор воспроизводил частоту 'частоты' и большую треть звука над ней одновременно, то есть 'frequency'·2^(4/12)', затем

air_pressure=sin(2pi·frequency·time)+sin(2pi·2^(4/12)·frequency·time)

Как должен выглядеть волновой стол сейчас? Должен ли я преобразовать в ряд Фурье, чтобы получить уравнение в виде

air_pressure=a_0·cos(0)+b_0·sin(0)+a_1·cos(1)+b_1·sin(1)+a_2·cos(2)+b_2·sin(2)+...+a_n·cos(n)+b_n·sin(n)?

Как мне это сделать? или есть более простой способ?

Примечание: я не хочу создавать несколько осцилляторов, я хочу установить собственный тип одного осциллятора для достижения полифонии

/*'real' is an array of cosine coefficients,
 'imaginary is an array of sine coefficients in Fourier series representation of a soundwave */
var wave = audio_context.createPeriodicWave(real, imaginary);
//setting custom type of the oscillator:
oscillator.setPeriodicWave(wave);
//frequency manipulation:
oscillator.frequency.value = 110;
//making the oscillator sound:
oscillator.start();
...