42 for (
auto wt : tracks.Any<
WaveTrack >() ) {
45 if(
auto waveTrackViewPtr =
dynamic_cast<WaveTrackView*
>(&trackView)){
46 for(
const auto &subViewPtr : waveTrackViewPtr->GetAllSubViews()){
47 if(!subViewPtr->IsSpectral())
49 auto sView = std::static_pointer_cast<SpectrumView>(subViewPtr).get();
50 auto pSpectralData = sView->GetSpectralData();
52 if(!pSpectralData->dataHistory.empty()){
53 worker.
Process(wt, pSpectralData);
54 applyCount +=
static_cast<int>(pSpectralData->dataHistory.size());
55 pSpectralData->clearAllData();
63 XO(
"Applied effect to selection"),
64 XO(
"Applied effect to selection"));
68 return applyCount > 0;
72 long long int startSC,
85 long long int startSC,
99 setting.mWindowSize, setting.mStepsPerWindow,
100 setting.mLeadingPadding, setting.mTrailingPadding}
115 const std::shared_ptr<SpectralData>& pSpectralData)
117 mpSpectralData = pSpectralData;
118 const auto &hopSize = mpSpectralData->GetHopSize();
119 auto startSample = mpSpectralData->GetStartSample();
120 const auto &endSample = mpSpectralData->GetEndSample();
123 mStartHopNum = startSample / hopSize - (mStepsPerWindow - 1);
128 startSample = std::max(
static_cast<long long>(0), startSample - 2 * hopSize);
142 mSnapThreshold = threshold;
143 mSnapTargetFreqBin = targetFreqBin;
144 mSnapSamplingRate = wt->
GetRate();
146 startSC = std::max(
static_cast<long long>(0), startSC - 2 * hopSize);
149 1, startSC, winSize))
152 return mSnapReturnFreqBin;
162 mOvertonesThreshold = threshold;
163 mSnapTargetFreqBin = targetFreqBin;
164 mSnapSamplingRate = wt->
GetRate();
166 startSC = std::max(
static_cast<long long>(0), startSC - 2 * hopSize);
169 return move( mOvertonesTargetFreqBin );
173 auto &worker =
static_cast<Worker &
>(transformer);
176 MyWindow &record = worker.NthWindow(0);
178 const double dc = record.mRealFFTs[0];
179 *pSpectrum++ = dc * dc;
180 float *pReal = &record.mRealFFTs[1], *pImag = &record.mImagFFTs[1];
181 for (
size_t nn = worker.mSpectrumSize - 2; nn--;) {
182 const double re = *pReal++, im = *pImag++;
183 *pSpectrum++ = re * re + im * im;
185 const double nyquist = record.mImagFFTs[0];
186 *pSpectrum = nyquist * nyquist;
188 const double &sr = worker.mSnapSamplingRate;
189 const double nyquistRate = sr / 2;
190 const double &threshold = worker.mSnapThreshold;
191 const double &spectrumSize = worker.mSpectrumSize;
192 const int &targetBin = worker.mSnapTargetFreqBin;
194 int binBound = spectrumSize * threshold;
198 for(
int i = -binBound; i < binBound; i++){
199 int idx = std::clamp(targetBin + i, 0,
static_cast<int>(spectrumSize - 1));
203 worker.mSnapReturnFreqBin = idx;
212 auto &worker =
static_cast<Worker &
>(transformer);
215 MyWindow &record = worker.NthWindow(0);
217 const double dc = record.mRealFFTs[0];
218 *pSpectrum++ = dc * dc;
219 float *pReal = &record.mRealFFTs[1], *pImag = &record.mImagFFTs[1];
220 for (
size_t nn = worker.mSpectrumSize - 2; nn--;) {
221 const double re = *pReal++, im = *pImag++;
222 *pSpectrum++ = re * re + im * im;
224 const double nyquist = record.mImagFFTs[0];
225 *pSpectrum = nyquist * nyquist;
227 const double &spectrumSize = worker.mSpectrumSize;
228 const int &targetBin = worker.mSnapTargetFreqBin;
230 float targetValue = record.
mSpectrums[targetBin];
232 double fundamental = targetBin;
233 int overtone = 2, binNum = 0;
235 while ( fundamental >= 1 &&
236 ( binNum =
lrint( fundamental * overtone ) ) < spectrumSize) {
238 constexpr int tolerance = 3;
239 auto begin = pSpectrum + std::max( 0, binNum - (tolerance + 1) );
240 auto end = pSpectrum +
241 std::min<size_t>( spectrumSize, binNum + (tolerance + 1) + 1 );
242 auto peak = std::max_element(
begin,
end );
245 if ( peak ==
begin || peak ==
end - 1 )
248 int newBin = peak - pSpectrum;
249 worker.mOvertonesTargetFreqBin.push_back(newBin);
251 fundamental = double(newBin) / overtone++;
259 auto &worker =
static_cast<Worker &
>(transformer);
262 MyWindow &record = worker.NthWindow(0);
264 const double dc = record.mRealFFTs[0];
265 *pSpectrum++ = dc * dc;
266 float *pReal = &record.mRealFFTs[1], *pImag = &record.mImagFFTs[1];
267 for (
size_t nn = worker.mSpectrumSize - 2; nn--;) {
268 const double re = *pReal++, im = *pImag++;
269 *pSpectrum++ = re * re + im * im;
271 const double nyquist = record.mImagFFTs[0];
272 *pSpectrum = nyquist * nyquist;
275 worker.ApplyEffectToSelection();
280 auto &record = NthWindow(0);
282 for(
auto &spectralDataMap: mpSpectralData->dataHistory){
284 for(
const int &freqBin: spectralDataMap[mStartHopNum]){
285 record.mRealFFTs[freqBin] = 0;
286 record.mImagFFTs[freqBin] = 0;
296-> std::unique_ptr<Window>
298 return std::make_unique<MyWindow>(windowSize);
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
bool ApplyEffectToSelection()
bool DoFinish() override
Called after the last call to ProcessWindow().
int ProcessSnapping(WaveTrack *wt, long long int startSC, int hopSize, size_t winSize, double threshold, int targetFreqBin)
bool DoStart() override
Called before any calls to ProcessWindow.
std::unique_ptr< Window > NewWindow(size_t windowSize) override
Allocates a window to place in the queue.
std::vector< int > ProcessOvertones(WaveTrack *wt, long long int startSC, int hopSize, size_t winSize, double threshold, int targetFreqBin)
Worker(const Setting &setting)
bool Process(WaveTrack *wt, const std::shared_ptr< SpectralData > &sDataPtr)
static bool OvertonesProcessor(SpectrumTransformer &transformer)
static bool Processor(SpectrumTransformer &transformer)
static bool SnappingProcessor(SpectrumTransformer &transformer)
static int FindFrequencySnappingBin(WaveTrack *wt, long long startSC, int hopSize, double threshold, int targetFreqBin)
static std::vector< int > FindHighestFrequencyBins(WaveTrack *wt, long long int startSC, int hopSize, double threshold, int targetFreqBin)
static bool ProcessTracks(AudacityProject &project)
static TrackList & Get(AudacityProject &project)
static TrackView & Get(Track &)
A Track that contains audio waveform data.
double GetRate() const override
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
eWindowFunctions mOutWindowType
eWindowFunctions mInWindowType