ホームに戻る
/*
  nmVst2 サンプルの解説

 2プログラム、2パラメーターの例

  setProgram はホストアプリ内でプログラムを切り替える際に呼ばれる。
  curProgram がどこかで定義されているで現在のプログラム番号を入れておく。

  setProgramName と getProgramName は curProgram を使って設定。

  resume はプラグインのスイッチオン時に呼ばれる。
  おもにバッファのクリアなどを行う。

  setParameter と getParameter はパラメーターを扱う。
  引数が index を持ってくるので適切な対処をする。

  fParam と programs[curProgram].fParam の値は同じであるはずなので、
  常に SetParameter を使うように心がけると良いかもしれない。

  getParameterLabel、getParameterDisplay、getParameterName
  はデータを渡すのみなのでそれほど難しく無い。

  Microsoft Visual C++ 2008
  vst_sdk 2.4 を使用
*/

#include <stdio.h>
#include "audioeffectx.h"

enum{
  kParam1 = 0,
  kParam2,
  kNumParams
};

class nmVst2;

class nmVst2Program{
friend class nmVst2;
public:
  nmVst2Program();
  ~nmVst2Program(){}

private:  
  float fParam1;
  float fParam2;
  char name[24]; // 24文字まで
};

class nmVst2 : public AudioEffectX{
public:
  nmVst2(audioMasterCallback audioMaster);
  ~nmVst2();

  virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);

  virtual void setProgram (VstInt32 program);
  virtual void setProgramName (char* name);
  virtual void getProgramName (char* name);
  virtual bool getProgramNameIndexed (VstInt32 category, VstInt32 index, char* text);
  
  virtual void setParameter (VstInt32 index, float value);
  virtual float getParameter (VstInt32 index);
  virtual void getParameterLabel (VstInt32 index, char* label);
  virtual void getParameterDisplay (VstInt32 index, char* text);
  virtual void getParameterName (VstInt32 index, char* text);

  virtual void resume();
  
  virtual VstPlugCategory getPlugCategory(){return kPlugCategEffect;} // Simple Effect であることを返す

protected:
  nmVst2Program* programs;
  
  float fParam1;
  float fParam2;
};

nmVst2Program::nmVst2Program(){
  fParam1 = 1.;
  fParam2 = 1.;

  strcpy(this->name, "Default");
}

AudioEffect* createEffectInstance(audioMasterCallback audioMaster){
  return new nmVst2(audioMaster);
}

nmVst2::nmVst2(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, 2, 2){

  programs = new nmVst2Program[2];
  fParam1 = 1.f;
  fParam2 = 1.f;

  programs[0].fParam1 = 1.;
  programs[0].fParam2 = 1.;
  programs[1].fParam1 = .5;
  programs[1].fParam2 = .5;

  if(programs){
    // 現在のプログラムを 0 に
    setProgram(0);
  }

  setNumInputs(2);
  setNumOutputs(2);

  setUniqueID ('nmV2');

  resume ();
}

nmVst2::~nmVst2(){
  if(programs){
    delete [] programs;
  }
}

void nmVst2::setProgram(VstInt32 program){
  nmVst2Program* ap = &programs[program];

  curProgram = program;
  setParameter(kParam1, ap->fParam1);
  setParameter(kParam2, ap->fParam2);
}

void nmVst2::setProgramName(char *name){
  strcpy(programs[curProgram].name, name);
}

void nmVst2::getProgramName(char *name){
  if(!strcmp (programs[curProgram].name, "Default")){
    sprintf (name, "%s %02d", programs[curProgram].name, curProgram + 1);
  }
  else{
    strcpy (name, programs[curProgram].name);
  }
}

bool nmVst2::getProgramNameIndexed(VstInt32 category, VstInt32 index, char* text){
  if(index < 2){
    strcpy(text, programs[index].name);
    return true;
  }
  return false;
}

void nmVst2::resume(){
  AudioEffectX::resume();
}

void nmVst2::setParameter(VstInt32 index, float value){
  nmVst2Program* ap = &programs[curProgram];

  switch(index){
    case kParam1:
      fParam1 = ap->fParam1 = value;
      break;
    case kParam2:
      fParam2 = ap->fParam2 = value;
      break;
  }
}

float nmVst2::getParameter(VstInt32 index){
  float v = 0;

  switch(index){
    case kParam1:
      v = fParam1;
      break;
    case kParam2:
      v = fParam2;
      break;
  }
  return v;
}

void nmVst2::getParameterName(VstInt32 index, char *label){
  switch(index){
    case kParam1:
      strcpy(label, "Param1");
      break;
    case kParam2:
      strcpy(label, "Param2");
      break;
  }
}

void nmVst2::getParameterDisplay (VstInt32 index, char *text){
  switch(index){
    case kParam1:
      dB2string(fParam1, text, kVstMaxParamStrLen);
      break;
    case kParam2:
      dB2string(fParam2, text, kVstMaxParamStrLen);
      break;
  }
}

void nmVst2::getParameterLabel(VstInt32 index, char *label){
  switch(index){
    case kParam1:
      strcpy(label, "Param1");
      break;
    case kParam2:
      strcpy(label, "Param2");
      break;
  }
}

void nmVst2::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){
  float* in1 = inputs[0];
  float* in2 = inputs[1];
  float* out1 = outputs[0];
  float* out2 = outputs[1];

  while (--sampleFrames >= 0){
    (*out1++) = (*in1++) * fParam1 * fParam2;
    (*out2++) = (*in2++) * fParam1 * fParam2;
  }
}
inserted by FC2 system