EnvelopeGenerator.hxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _EnvelopeGenerator_
00023 #define _EnvelopeGenerator_
00024
00025 #include "Processing.hxx"
00026 #include "ProcessingData.hxx"
00027 #include "ProcessingData.hxx"
00028 #include "Envelope.hxx"
00029 #include "AudioOutPort.hxx"
00030 #include "InPort.hxx"
00031
00032 namespace CLAM
00033 {
00034
00035
00036 class EnvelopeGeneratorConfig: public ProcessingConfig
00037 {
00038 public:
00039 DYNAMIC_TYPE_USING_INTERFACE (EnvelopeGeneratorConfig, 4, ProcessingConfig);
00040 DYN_ATTRIBUTE (0, public, TData, Duration);
00041 DYN_ATTRIBUTE (1, public, TData, SampleRate);
00042 DYN_ATTRIBUTE (2, public, bool, FrameEnvelopes);
00043 DYN_ATTRIBUTE (3, public, int, FrameSize);
00044
00045 protected:
00046 void DefaultInit(void)
00047 {
00048 AddAll();
00049 UpdateData();
00050
00051 SetDuration(1.0);
00052 SetSampleRate(44100.0);
00053 SetFrameEnvelopes(false);
00054 SetFrameSize(512);
00055 }
00056 };
00057
00058 class EnvelopeGenerator: public Processing
00059 {
00060 private:
00061 EnvelopeGeneratorConfig mConfig;
00062 TData mX;
00063 TData mDX;
00064 bool mXFrameReset;
00065
00066 InControlTmpl<EnvelopeGenerator> mEnvelopePos;
00067
00068 int UpdateEnvelopePosition(TControlData val)
00069 {
00070 mX=val;
00071 return 0;
00072 }
00073
00074 public:
00075 EnvelopeGenerator(const EnvelopeGeneratorConfig& c = EnvelopeGeneratorConfig())
00076 :
00077 mEnvelopePos("EnvelopePosition",this, &EnvelopeGenerator::UpdateEnvelopePosition),
00078 Input("Input",this),
00079 Output("Output",this)
00080 {
00081 Configure(c);
00082 }
00083
00084 const char * GetClassName() const { return "EnvelopeGenerator";}
00085
00086 InPort<Envelope> Input;
00087
00088 AudioOutPort Output;
00089
00090 const ProcessingConfig &GetConfig() const { return mConfig;}
00091
00092 bool ConcreteConfigure(const ProcessingConfig& c)
00093 {
00094 CopyAsConcreteConfig(mConfig, c);
00095
00096 mXFrameReset = mConfig.GetFrameEnvelopes();
00097 mX = 0;
00098 mDX = TData(1000.)/(mConfig.GetSampleRate()*mConfig.GetDuration());
00099
00100 Output.SetParams(mConfig.GetFrameSize());
00101
00102 return true;
00103 }
00104
00105 void Attach(Envelope& in,Audio& out)
00106 {
00107 Input.Attach(in);
00108 Output.Attach(out);
00109 }
00110
00111 bool Do(void)
00112 {
00113 bool res = Do(Input.GetData(),Output.GetData());
00114 Input.Consume();
00115 Output.Produce();
00116 return res;
00117 }
00118
00119 bool Do(Envelope& in,Audio& out)
00120 {
00121 BPFTmpl<TTime,TData> &envelope = in.GetAmplitudeBPF();
00122 DataArray &audio = out.GetBuffer();
00123 int size = audio.Size();
00124
00125 for (int i=0;i<size;i++)
00126 {
00127 audio[i] = envelope.GetValue(mX);
00128 mX += mDX;
00129 if (mX>1000.0) mX=1000.0;
00130 }
00131 if (mXFrameReset)
00132 mX=0.0;
00133 return true;
00134 }
00135
00136 };
00137
00138 }
00139
00140 #endif
00141
00142