31 "key",
"SegmentSMSHarmonizer",
33 "description",
"SegmentSMSHarmonizer",
36 static FactoryRegistrator<ProcessingFactory, SegmentSMSHarmonizer>
reg =
metadata;
44 for(
int i=0;i<nVoices;i++)
49 mPitchShift.
Do(in,mTmpFrame);
51 AddFrame(mTmpFrame,out,out);
55 out.SetFundamental(mTmpFund);
59 void SegmentSMSHarmonizer::AddFrame(
const Frame& in1,
const Frame& in2,
Frame& out)
63 mSpectrumAdder.
Start();
64 mSpectrumAdder.
Do(in1.GetResidualSpec(),in2.GetResidualSpec(),out.GetResidualSpec());
65 mSpectrumAdder.
Stop();
67 out.SetSpectralPeakArray(in1.GetSpectralPeakArray()+in2.GetSpectralPeakArray());
70 void SegmentSMSHarmonizer::Gain(Frame& inputFrame,
TData gain)
72 SpectralPeakArray& peaks=inputFrame.GetSpectralPeakArray();
73 Spectrum& residual=inputFrame.GetResidualSpec();
75 int nPeaks=peaks.GetnPeaks();
76 int specSize=residual.GetSize();
80 for(
int i=0;i<nPeaks;i++)
82 peakMag[i]=std::min(peakMag[i]+gain,
TData(0));
86 DataArray& resMag = residual.GetMagBuffer();
87 for(
int i=0;i<specSize;i++)
89 resMag[i] = resMag[i]*linGain;