31 "key",
"SMSHarmonizer",
32 "category",
"SMS Transformations",
33 "description",
"SMSHarmonizer",
36 static FactoryRegistrator<ProcessingFactory, SMSHarmonizer>
reg =
metadata;
43 if ( mConfig.GetNumberOfVoices()==0 )
49 mIgnoreResidual = mConfig.GetIgnoreResidual();
58 int n_voices = mConfig.GetNumberOfVoices();
62 mVoicesPitch.
Resize(n_voices,
"Pitch",
this);
63 mVoicesGain.
Resize(n_voices,
"Gain",
this);
64 mVoicesDetuningAmount.
Resize(n_voices,
"Voice Detuning",
this);
65 mVoicesDelay.
Resize(n_voices,
"Voice Delay",
this);
66 for (
int i=0; i < mVoicesPitch.
Size(); i++)
68 mVoicesGain[i].SetBounds(0.,2.);
69 mVoicesGain[i].SetDefaultValue(0.);
70 mVoicesGain[i].DoControl(0.);
72 mVoicesPitch[i].SetBounds(-24.,24.);
73 mVoicesPitch[i].SetDefaultValue(0.);
74 mVoicesPitch[i].DoControl(0.);
76 mVoicesDetuningAmount[i].SetBounds(0.,1.);
77 mVoicesDetuningAmount[i].SetDefaultValue(0.);
78 mVoicesDetuningAmount[i].DoControl(0.);
80 mVoicesDelay[i].SetBounds(0.,1.);
81 mVoicesDelay[i].SetDefaultValue(0.);
82 mVoicesDelay[i].DoControl(0.);
90 return Do( in.GetSpectralPeakArray(),
94 out.GetSpectralPeakArray(),
111 outSpectrum = inSpectrum;
115 mSinusoidalGain.
Do(outPeaks,outPeaks);
122 for (
int i=0; i < mVoicesPitch.
Size(); i++)
124 TData gain = mVoicesGain[i].GetLastValue();
128 TData amount = mVoicesPitch[i].GetLastValue() +
frand()*mVoicesDetuningAmount[i].GetLastValue();
129 amount =
CLAM_pow( 2., amount/12. );
132 mPitchShift.
Do( inPeaks,
140 mSinusoidalGain.
Do(mtmpPeaks,mtmpPeaks);
142 TData delay = mVoicesDelay[i].GetLastValue();
146 mPeaksDelay.
Do(mtmpPeaks, mtmpPeaks);
149 outPeaks = outPeaks + mtmpPeaks;
151 if (!mIgnoreResidual)
152 mSpectrumAdder.
Do(outSpectrum, mtmpSpectrum, outSpectrum);