gen~phasor() 是做什么的? (将 Max/MSP gen 翻译成 C++)
What does gen~ phasor() do? (Translating Max/MSP gen to C++)
我们有两个地方在同一个gen~ code box object with phasor:
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 跟踪 time/phase,我们如何在同一个 gen 代码框中调用 phasor()
两次?我们似乎不可能有两个时间值。除非...
...我们有一个 time/phase 值在对 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;
const double PI_z_2 = PI/2.0;
};
我们有两个地方在同一个gen~ code box object with phasor:
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 跟踪 time/phase,我们如何在同一个 gen 代码框中调用 phasor()
两次?我们似乎不可能有两个时间值。除非...
...我们有一个 time/phase 值在对 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;
const double PI_z_2 = PI/2.0;
};