У нас есть два места в одном и том же объекте 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()
увеличивает его фазу, что происходит в конце блока кода.
Я прав?
Редактировать: Нет, этого не может быть, тогда зачем вам ставить частоту в вектор дважды? Это не изменило бы вывод по моей логике.
Из моих тестов 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;
};
Других решений пока нет …