Что делает gen~ phasor()? (Перевод Max/MSP gen на C++)
У нас есть два места в одном и том же объекте gen~ code с фазором:
wander = phasor(in8/dense);
...some code later...
phas = (triangle(phasor(freq), sharp)*len-rot_x/(2*pi))%1;
Я это понимаю phasor()
выдает пилообразное увеличение, выводя значения от 0 до 1. Я понимаю аргумент phasor()
это частота. Что я не понимаю, так это как phasor()
может выдавать значение от 0 до 1 для данной частоты, когда вам потребуется частота со временем, чтобы получить значение, отличное от 0. Казалось бы, phasor(frequency)
должен всегда выводить 0, если как-то phasor()
отслеживает время и свою фазу.
Если фазор отслеживает время / фазу, как мы можем позвонить phasor()
дважды в одном и том же кодовом поле? Казалось бы, невозможно, чтобы у нас было два значения времени. Если...
... у нас есть одно значение времени / фазы, общее для всех вызовов phasor()
но это последний звонок phasor()
который устанавливает конечную частоту перед phasor()
увеличивает его фазу, что происходит в конце блока кода.
Я прав?
Редактировать: Нет, этого не может быть, тогда зачем вам ставить частоту в вектор дважды? Это не изменило бы вывод по моей логике.
1 ответ
Из моих тестов phasor действительно является объектом осциллятора пилообразной формы, где каждый вызов phasor является уникальным осциллятором, поэтому, если дважды вызвать phasor в одном и том же блоке кода, будут созданы два объекта.
class Phasor
{
public:
double getSample()
{
double ret = phase/PI_z_2;
phase = fmod(phase+phase_inc, TAU); //increment phase
return ret;
}
void setSampleRate(double v) { sampleRate = v; calculateIncrement(); }
void setFrequency(double v) { frequency = v; calculateIncrement(); }
void Reset() { phase = 0.0; }
protected:
void calculateIncrement() { phase_inc = TAU * frequency / sampleRate; }
double sampleRate = 44100.0;
double frequency = 1.0;
double phase = 0.0;
double phase_inc = 0.0;
const double TAU = 2*PI;
};