3BandSpectralAM.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 "3BandSpectralAM.hxx"
00023 #include "ProcessingFactory.hxx"
00024
00025 namespace CLAM
00026 {
00027 namespace Hidden
00028 {
00029 static const char * metadata[] = {
00030 "key", "ThreeBandAM",
00031 "category", "Spectral Transformations",
00032 "description", "ThreeBandAM",
00033 0
00034 };
00035 static FactoryRegistrator<ProcessingFactory, ThreeBandAM> reg = metadata;
00036 }
00037
00038
00039 bool ThreeBandAM::Do(const Spectrum& in, Spectrum& out)
00040 {
00041 if ( !mConfig.GetPreserveOuts() )
00042 {
00043 out = in;
00044 }
00045
00046 int spectrumSize = in.GetSize();
00047
00048 TData spectralResolution = spectrumSize/in.GetSpectralRange();
00049
00050 SendFloatToInControl(mLFOscillator,"Pitch",mLowPitchCtl.GetLastValue());
00051 SendFloatToInControl(mMFOscillator,"Pitch",mMidPitchCtl.GetLastValue());
00052 SendFloatToInControl(mHFOscillator,"Pitch",mHighPitchCtl.GetLastValue());
00053
00054 SendFloatToInControl(mLFOscillator,"Amplitude",mModAmplitudeCtl.GetLastValue());
00055 SendFloatToInControl(mMFOscillator,"Amplitude",mModAmplitudeCtl.GetLastValue());
00056 SendFloatToInControl(mHFOscillator,"Amplitude",mModAmplitudeCtl.GetLastValue());
00057
00058
00059 SendFloatToInControl(mLFOscillator,"SamplesBetweenCalls",(spectrumSize-1)/2);
00060 SendFloatToInControl(mMFOscillator,"SamplesBetweenCalls",(spectrumSize-1)/2);
00061 SendFloatToInControl(mHFOscillator,"SamplesBetweenCalls",(spectrumSize-1)/2);
00062
00063
00064 DataArray& oMag = out.GetMagBuffer();
00065
00066 int lowCutoff = Round(mLowCutoffFreqCtl.GetLastValue()* spectralResolution);
00067 int highCutoff = Round(mHighCutoffFreqCtl.GetLastValue()* spectralResolution);
00068
00069 TData modFactorLF,modFactorMF, modFactorHF;
00070 mLFOscillator.Do(modFactorLF);
00071 mMFOscillator.Do(modFactorMF);
00072 mHFOscillator.Do(modFactorHF);
00073
00074 TData currentGain = 1+modFactorLF;
00075 for(int i = 0; i<spectrumSize; i++)
00076 {
00077 if(i>highCutoff)
00078 currentGain = (1+modFactorHF);
00079 else if(i>lowCutoff)
00080 currentGain = (1+modFactorMF);
00081 oMag[i] *= currentGain;
00082 }
00083 return true;
00084 }
00085
00086
00087 }
00088