2013/10/02

Audacity built-in effects Simple Amplifier

これから少しAudacityのbuilt-in effectsでも作ってみようと思っている。備忘録として、なるべく簡単なサンプルをここに書いておく。

シンプルアンプ

内容は音系プログラムのHello World。複雑なプログラムを作る前にこういうシンプルなものをいろいろ作って確認することが重要。ダイアログもなく音量も0.5に固定。プログラムはNamagiAmp.hとNamagiAmp.cppの2ファイルから構成されている。SimpleMono.hをオーバーライドして作っている。makeすれば、audacityで実行できる。トラックを選択して適用すれば音量が半分になる。
/* NamagiAmp.h */
#ifndef __AUDACITY_EFFECT_NAMAGIAMP__
#define __AUDACITY_EFFECT_NAMAGIAMP__
#include "SimpleMono.h"

class EffectNamagiAmp: public EffectSimpleMono{

 public:
   /* AudacityのEffectに表示される名前 */
   virtual wxString GetEffectName(){
       return wxString(_("NamagiAmp"));
   }
   /* 識別名 */
   virtual wxString GetEffectIdentifier(){
       return wxT("NamagiAmp");
   }
   /* 実行中に表示される名前 */
   virtual wxString GetEffectAction(){
       return wxString(_("NamagiAmp...running"));
   }
   
 private:
   /* 新たに追加した変数 音量 */
   float gain;
   
 protected:
   /* 処理する関数 バッファ(ポインタ)と選択範囲(整数)を渡す */
   virtual bool ProcessSimpleMono(float *buffer,
                                sampleCount len);

};
#endif

上記のヘッダファイルはクラスの宣言だけだが、下で実際の処理を書いている。for文内で、選択したサンプル分に対して、gainを掛けたものをbuffer[i]に書き込むというもの。

sampleCount は Sequence.h ファイルでwxLongLong_tと等価であることがわかる。
typedef wxLongLong_t sampleCount;
A native 64-bit integer type とあるので64bit整数。膨大なサンプル数を扱うのでこれぐらいの大きさが必要というわけだ。
buffer[i]はちゃんと調べてないが、多くの場合はfloatで扱っている。
/* NamagiAmp.cpp */
#include "NamagiAmp.h"

bool EffectNamagiAmp::ProcessSimpleMono(float *buffer,
                                      sampleCount len){
    gain = float(0.5);
    for (sampleCount i = 0; i < len; i++){
        buffer[i] = (float)(buffer[i] * gain);
    }
    /* 処理が無事終わったらtrueを返して終了 */
    return true;
}

実行結果。上段が適用前で下段が適用後。音量が1/2になっている。


Audacity 関係の記事