SinusoidalSynthesis.cxx
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 #include "SinusoidalSynthesis.hxx"
00023
00024 #include "SpectrumConfig.hxx"
00025 #include "ProcessingFactory.hxx"
00026
00027
00028
00029 namespace CLAM
00030 {
00031
00032 namespace Hidden
00033 {
00034 static FactoryRegistrator<ProcessingFactory, SinusoidalSynthesis> regSinusoidalSynthesis("SinusoidalSynthesis");
00035 }
00036
00037
00038 void SinusoidalSynthesis::AttachChildren()
00039 {
00040 mSinSpectralSynthesis.SetParent(this);
00041 mSynthSineSpectrum.SetParent(this);
00042 mPhaseMan.SetParent(this);
00043 mSpectrumAdder.SetParent(this);
00044 mOverlapAddSin.SetParent(this);
00045 }
00046
00047 SinusoidalSynthesis::SinusoidalSynthesis(const SMSSynthesisConfig& cfg)
00048 : mInputSinSpectralPeaks("InputSinPeaks",this)
00049 , mOutputSpectrum("OutputSpectrum",this)
00050 , mOutputAudio("OutputAudio",this)
00051 , mCurrentTimeControl("CurrentTime",this)
00052 , mCurrentPitch("CurrentPitch",this)
00053 {
00054 mCurrentFrame = 0;
00055 Configure(cfg);
00056 AttachChildren();
00057 }
00058
00059 SinusoidalSynthesis::~SinusoidalSynthesis()
00060 {
00061
00062 }
00063
00064 bool SinusoidalSynthesis::ConfigureChildren()
00065 {
00066
00067
00068
00069 mConfig.GetSpectralSynth().SetResidual(false);
00070 if(!mSinSpectralSynthesis.Configure(mConfig.GetSpectralSynth()))
00071 return false;
00072
00073
00074 if(!mSynthSineSpectrum.Configure(mConfig.GetSynthSineSpectrum()))
00075 return false;
00076
00077
00078 if(!mPhaseMan.Configure(mConfig.GetPhaseMan()))
00079 return false;
00080
00081 mPhaseMan.Init();
00082
00083
00084 if(!mSpectrumAdder.Configure(SpecAdder2Config()))
00085 return false;
00086
00087
00088 if(!mOverlapAddSin.Configure(mConfig.GetOverlapAddSin()))
00089 return false;
00090
00091 return true;
00092 }
00093
00094 void SinusoidalSynthesis::ConfigureData()
00095 {
00096 mAudioFrame.SetSize(mConfig.GetHopSize()*2);
00097 mOutputAudio.SetSize( mAudioFrame.GetSize()/2 );
00098
00099 mOutputAudio.SetHop( mConfig.GetHopSize() );
00100
00101 mOutputSpectrum.GetData().SetSize( mAudioFrame.GetSize()/2+1);
00102 mOutputSinSpectrum.GetData().SetSize( mAudioFrame.GetSize()/2+1);
00103 }
00104
00105
00106 bool SinusoidalSynthesis::ConcreteConfigure(const ProcessingConfig& c)
00107 {
00108 CopyAsConcreteConfig(mConfig, c);
00109 ConfigureChildren();
00110 ConfigureData();
00111 mCurrentTimeControl.DoControl(-1.0);
00112 return true;
00113 }
00114
00115 bool SinusoidalSynthesis::Do(void)
00116 {
00117 bool result = Do(mInputSinSpectralPeaks.GetData(),
00118 mOutputSpectrum.GetData(),
00119 mOutputAudio.GetAudio());
00120
00121 mInputSinSpectralPeaks.Consume();
00122
00123 mOutputSinSpectrum.Produce();
00124 mOutputSpectrum.Produce();
00125 mOutputAudio.Produce();
00126
00127 return result;
00128 }
00129
00130
00131 bool SinusoidalSynthesis::Do(
00132 SpectralPeakArray& inputSinusoidalPeaks,
00133 Audio& outputAudio)
00134 {
00135 Spectrum tmpOutputSpec;
00136
00137
00138
00139 return Do(inputSinusoidalPeaks,tmpOutputSpec,outputAudio);
00140
00141 }
00142
00143 bool SinusoidalSynthesis::Do(
00144 SpectralPeakArray& inputSinusoidalPeaks,
00145 Spectrum& outputSpectrum,
00146 Audio& outputAudio)
00147 {
00148
00149
00150
00151
00152
00153
00154 TData currentTime = 0;
00155 if (mCurrentTimeControl.GetLastValue() < -0.9)
00156 {
00157 int framesize = outputAudio.GetSize();
00158
00159 TData samplerate = mConfig.GetSynthSineSpectrum().GetSamplingRate();
00160 currentTime = TData( mCurrentFrame*framesize ) / samplerate;
00161 }
00162 else
00163 {
00164 currentTime = mCurrentTimeControl.GetLastValue();
00165 }
00166 mPhaseMan.mCurrentTime.DoControl( currentTime );
00167 mCurrentFrame ++;
00168
00169 mPhaseMan.mCurrentPitch.DoControl(mCurrentPitch.GetLastValue());
00170 mPhaseMan.Do(inputSinusoidalPeaks);
00171
00172 outputSpectrum.SetSize(mConfig.GetSpectrumSize());
00173 mSynthSineSpectrum.Do(inputSinusoidalPeaks,outputSpectrum);
00174
00175 mSinSpectralSynthesis.Do(outputSpectrum, mAudioFrame);
00176
00177
00178 mOverlapAddSin.Do(mAudioFrame, outputAudio);
00179
00180 return true;
00181 }
00182
00183 bool SinusoidalSynthesis::Do(Frame& in)
00184 {
00185 if(in.GetCenterTime()<0) return false;
00186
00187
00188 InitFrame(in);
00189
00190 mCurrentPitch.DoControl(in.GetFundamental().GetFreq(0));
00191
00192
00193
00194
00195
00196 in.GetOutSpec().SetSize(mConfig.GetSpectrumSize());
00197 in.GetOutSpec().SetSpectralRange(in.GetResidualSpec().GetSpectralRange());
00198 in.GetSinusoidalSpec().SetSpectralRange(in.GetResidualSpec().GetSpectralRange());
00199
00200 return Do(in.GetSpectralPeakArray(),in.GetOutSpec(),in.GetSynthAudioFrame());
00201
00202 }
00203
00204 bool SinusoidalSynthesis::Do(Segment& in)
00205 {
00206 return Do(in.GetFrame(in.mCurrentFrameIndex++));
00207 }
00208
00209
00210 void SinusoidalSynthesis::InitFrame(Frame& in)
00211 {
00212 in.AddOutSpec();
00213 in.AddSinusoidalSpec();
00214 in.AddSinusoidalAudioFrame();
00215 in.AddResidualAudioFrame();
00216 in.AddSynthAudioFrame();
00217 in.UpdateData();
00218
00219 in.GetSinusoidalAudioFrame().SetSize(mConfig.GetFrameSize());
00220 in.GetResidualAudioFrame().SetSize(mConfig.GetFrameSize());
00221 in.GetSynthAudioFrame().SetSize(mConfig.GetFrameSize());
00222
00223 }
00224
00225 }
00226