14 outgoingFrame =
new Frame();
15 outgoingFrame->AddSpectralPeakArray();
16 outgoingFrame->AddResidualSpec();
17 outgoingFrame->AddFundamental();
18 outgoingFrame->AddSynthAudioFrame();
39 return listOfLoops.size() != 0;
44 listOfLoops.push_back(aSimpleLoop);
60 std::vector<SimpleLoopMetadata>::iterator theIterator;
61 for( theIterator = argListOfLoops.begin(); theIterator != argListOfLoops.end(); theIterator++)
64 listOfLoops.push_back(aSimpleLoop);
78 if (lFrameBufferPosition == simpleLoop.GetEnd())
80 lFrameBufferPosition = simpleLoop.GetStart();
82 indexOfCurrentLoop = ChooseLoopRandomly(lFrameBufferPosition, indexOfCurrentLoop);
99 if ( (lFrameBufferPosition + numberOfCrossfadeFrames) >= simpleLoop.GetEnd() )
102 Frame* frameNearEndLoopFrame = nextFrame;
106 float crossfadeFactor = ( (lFrameBufferPosition + numberOfCrossfadeFrames)
107 - simpleLoop.GetEnd() * 1.0 ) /
108 numberOfCrossfadeFrames;
110 CrossfadeSpectralPeakArrays(frameNearEndLoopFrame->GetSpectralPeakArray(),
111 startLoopFrame->GetSpectralPeakArray(),
112 outgoingFrame->GetSpectralPeakArray(),
115 CrossfadeResidualSpectrum(frameNearEndLoopFrame->GetResidualSpec(),
116 startLoopFrame->GetResidualSpec(),
117 outgoingFrame->GetResidualSpec(),
121 return outgoingFrame;
124 int LoopingSDIFFileReader::ChooseLoopRandomly(
int argFrameBufferPosition,
int argIndexOfCurrentLoop)
133 std::deque<int> validLoopPositions;
134 std::deque<int>::iterator currentLoopIterator = validLoopPositions.end();
135 for (
unsigned int counter = 0; counter < listOfLoops.size(); counter++)
139 if ( argFrameBufferPosition < simpleLoop.GetEnd()
142 validLoopPositions.push_back(counter);
143 if (counter == argIndexOfCurrentLoop)
145 currentLoopIterator = validLoopPositions.end();
146 currentLoopIterator--;
153 if (validLoopPositions.size() > 1 && currentLoopIterator != validLoopPositions.end())
155 validLoopPositions.erase(currentLoopIterator);
158 double randomNumber0To1 = (rand()*1.0) / RAND_MAX;
159 int randomIndex = floor( randomNumber0To1 * validLoopPositions.size() );
161 return validLoopPositions.at(randomIndex);
164 void LoopingSDIFFileReader::CrossfadeSpectralPeakArrays(SpectralPeakArray& sourceSpectralPeaks1,
165 SpectralPeakArray& sourceSpectralPeaks2,
166 SpectralPeakArray& targetSpectralPeaks,
167 float crossfadeFactor)
174 DataArray& srcFreqBuffer1 = sourceSpectralPeaks1.GetFreqBuffer();
175 DataArray& srcMagBuffer1 = sourceSpectralPeaks1.GetMagBuffer();
177 DataArray& srcFreqBuffer2 = sourceSpectralPeaks2.GetFreqBuffer();
178 DataArray& srcMagBuffer2 = sourceSpectralPeaks2.GetMagBuffer();
180 DataArray& targetFreqBuffer = targetSpectralPeaks.GetFreqBuffer();
181 DataArray& targetMagBuffer = targetSpectralPeaks.GetMagBuffer();
183 float flippedCrossfadeFactor = 1.0 - crossfadeFactor;
184 int numberOfPeaks1 = sourceSpectralPeaks1.GetnPeaks();
185 int numberOfPeaks2 = sourceSpectralPeaks2.GetnPeaks();
188 int targetCounter = 0;
189 float semitoneDown = 0.944;
190 float semitoneUp = 1.059;
191 while ( srcCounter1 < numberOfPeaks1 || srcCounter2 < numberOfPeaks2 )
193 float peakDifference = srcFreqBuffer1[srcCounter1] / srcFreqBuffer2[srcCounter2];
196 if ( peakDifference > semitoneDown && peakDifference < semitoneUp )
199 targetFreqBuffer[targetCounter] = (srcFreqBuffer1[srcCounter1] * flippedCrossfadeFactor)
200 + (srcFreqBuffer2[srcCounter2] * crossfadeFactor);
201 targetMagBuffer[targetCounter] = (srcMagBuffer1[srcCounter1] * flippedCrossfadeFactor)
202 + (srcMagBuffer2[srcCounter2] * crossfadeFactor);
211 if (srcCounter1 < numberOfPeaks1)
213 if (srcCounter2 < numberOfPeaks2)
218 else if (peakDifference < semitoneDown)
220 if (srcCounter1 < numberOfPeaks1)
223 targetFreqBuffer[targetCounter] = (srcFreqBuffer1[srcCounter1] * flippedCrossfadeFactor);
224 targetMagBuffer[targetCounter] = (srcMagBuffer1[srcCounter1] * flippedCrossfadeFactor);
230 if (srcCounter2 < numberOfPeaks2)
233 targetFreqBuffer[targetCounter] = (srcFreqBuffer2[srcCounter2] * crossfadeFactor);
234 targetMagBuffer[targetCounter] = (srcMagBuffer2[srcCounter2] * crossfadeFactor);
242 void LoopingSDIFFileReader::CrossfadeResidualSpectrum(Spectrum& sourceSpectrum1,
243 Spectrum& sourceSpectrum2,
244 Spectrum& targetSpectrum,
245 float crossfadeFactor)
247 int size = sourceSpectrum1.GetSize();
248 targetSpectrum.SetSize( size );
250 Array<Complex>& srcComplexBuffer1 = sourceSpectrum1.GetComplexArray();
251 Array<Complex>& srcComplexBuffer2 = sourceSpectrum2.GetComplexArray();
252 Array<Complex>& targetComplexBuffer = targetSpectrum.GetComplexArray();
254 float flippedCrossfadeFactor = 1.0 - crossfadeFactor;
255 for (
int r=0; r < size; r++)
258 targetComplexBuffer[r] = (srcComplexBuffer1[r] * flippedCrossfadeFactor)
259 + (srcComplexBuffer2[r] * crossfadeFactor);