00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "3BandSpectralAM.hxx"
00023 #include "ProcessingFactory.hxx"
00024
00025 namespace CLAM
00026 {
00027 namespace Hidden
00028 {
00029 static FactoryRegistrator<ProcessingFactory, ThreeBandAM> regThreeBandAM("ThreeBandAM");
00030 }
00031
00032
00033 bool ThreeBandAM::Do(const Spectrum& in, Spectrum& out)
00034 {
00035 if ( !mConfig.GetPreserveOuts() )
00036 {
00037 out = in;
00038 }
00039
00040 int spectrumSize = in.GetSize();
00041
00042 TData spectralResolution = spectrumSize/in.GetSpectralRange();
00043
00044 mLFOscillator.GetInControl("Pitch").DoControl(mLowPitchCtl.GetLastValue());
00045 mMFOscillator.GetInControl("Pitch").DoControl(mMidPitchCtl.GetLastValue());
00046 mHFOscillator.GetInControl("Pitch").DoControl(mHighPitchCtl.GetLastValue());
00047
00048 mLFOscillator.GetInControl("Amplitude").DoControl(mModAmplitudeCtl.GetLastValue());
00049 mMFOscillator.GetInControl("Amplitude").DoControl(mModAmplitudeCtl.GetLastValue());
00050 mHFOscillator.GetInControl("Amplitude").DoControl(mModAmplitudeCtl.GetLastValue());
00051
00052
00053 mLFOscillator.GetInControl("SamplesBetweenCalls").DoControl((spectrumSize-1)/2);
00054 mMFOscillator.GetInControl("SamplesBetweenCalls").DoControl((spectrumSize-1)/2);
00055 mHFOscillator.GetInControl("SamplesBetweenCalls").DoControl((spectrumSize-1)/2);
00056
00057
00058 DataArray& oMag = out.GetMagBuffer();
00059
00060 int lowCutoff = Round(mLowCutoffFreqCtl.GetLastValue()* spectralResolution);
00061 int highCutoff = Round(mHighCutoffFreqCtl.GetLastValue()* spectralResolution);
00062
00063 TData modFactorLF,modFactorMF, modFactorHF;
00064 mLFOscillator.Do(modFactorLF);
00065 mMFOscillator.Do(modFactorMF);
00066 mHFOscillator.Do(modFactorHF);
00067
00068 TData currentGain = 1+modFactorLF;
00069 for(int i = 0; i<spectrumSize; i++)
00070 {
00071 if(i>highCutoff)
00072 currentGain = (1+modFactorHF);
00073 else if(i>lowCutoff)
00074 currentGain = (1+modFactorMF);
00075 oMag[i] *= currentGain;
00076 }
00077 return true;
00078 }
00079
00080
00081 }
00082