RSS Twitter Facebook

2006/12/26 (2006年12月 のアーカイブ)

信号系と制御系

そんな感じでモジュール間の接続を処理するとして、やっぱり問題はパフォーマンスなのだ。理想は全てのPin間の接続に従って毎サンプルの処理をしたいのだが、さすがにできそうもないので、信号系の接続と制御系の接続を別処理する事にする。

OSCからVCF、VCAへと流れる音信号の本線が信号系で、その他のCV、EG、LFOなどのモジュレーション系の信号が制御系だ。信号系はサンプル毎の処理で、制御系は1msec毎に処理する事にする。48KHzサンプルだと48サンプル毎に一回制御系の信号を処理する感じだ。本当は信号系の処理を基本にして制御系の処理を間引く程度でなんとかしたいのだが、やってみるとそれでも厳しい。しょがないので、信号系のPinにバッファを持たせて制御系の処理、つまり1msec単位でモジュール毎の処理を回していく。

class ControlInPin {
 ControlOutPin *in;
public:
 void Connect(ControlOutPin *opin);
};
class ControlOutPin {
 float fValue[kNumPoly];
public:
 ・
 ・
};
class SignalInPin {
 SignalOutPin *in;
public:
 void Connect(SignalOutPin *opin);
};
class SignalOutPin {
 float fValue[kBlockSize][kNumPoly];
public:
 ・
 ・
};

ちなみに作りたいのはポリフォニックシンセなので、各PinはkNumPoly分のチャンネルを持たせる事にする。なんだか結構重たくなりそうなのだ。ふにゃふにゃ。InPinとかOutPinとかSignalPinとかControlPinとか、クラスを継承していきたいと思わなくもないが、そうすると欠点はコードの総量が見えづらくなるのだよな。「あれ、この処理はなんでこんなに重いのだ?」みたいなのが実はずっと親の方に原因があったりするとはまるので、その辺は調整しつつ。

Posted by g200kg : 2006/12/26 01:20:54