gen~ phasor() 是做什么的?(将 Max/MSP gen 转换为 C++)



我们在同一个 gen~ 带有相量的代码框对象中有两个位置:

wander = phasor(in8/dense);
...some code later...
phas = (triangle(phasor(freq), sharp)*len-rot_x/(2*pi))%1;

我知道phasor()会产生上升的锯齿,输出值为 0 到 1。我理解phasor()是频率的论点。我不明白的是,当您需要随着时间的推移产生 0 以外的值时,phasor()如何输出给定频率的 0 到 1 的值。似乎phasor(frequency)应该始终输出 0,除非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;
};

最新更新