24#include "../../../ui/BrushHandle.h"
29#include "../../../../TrackArt.h"
30#include "../../../../TrackArtist.h"
31#include "../../../../TrackPanelDrawingContext.h"
33#include "../../../../WaveClip.h"
34#include "../../../../WaveTrack.h"
35#include "../../../../prefs/SpectrogramSettings.h"
36#include "../../../../ProjectSettings.h"
39#include <wx/dcmemory.h>
40#include <wx/graphics.h>
49 {
wxT(
"Spectrogram"),
XXO(
"&Spectrogram") }
80 std::make_shared<SpectralData>(pOldData->GetSR());
81 pNewData->CopyFrom(*pOldData);
82 pOldData->clearAllData();
86 if (&
mView == &view) {
88 std::make_shared<SpectralData>(pOldData->GetSR());
89 pNewData->CopyFrom( *pOldData );
108 view.mpSpectralData->CopyFrom(*pBackupData);
123 std::weak_ptr<BrushHandle> &holder,
125 const std::shared_ptr<SpectrumView> &pTrackView,
126 const std::shared_ptr<SpectralData> &mpData)
130 auto result = std::make_shared<BrushHandle>(
131 std::make_shared<SpectrumView::SpectralDataSaver>(*pTrackView),
133 st, viewInfo, mpData, projectSettings);
140 auto pTrack = pTrackView->FindTrack();
141 if (!pTrack->GetSelected() || !viewInfo.bAdjustSelectionEdges)
154 for (
const auto wt :
TrackList::Get(project).Any< WaveTrack >() ) {
155 if (
auto pWaveTrackView =
157 for (
const auto &pSubView : pWaveTrackView->GetAllSubViews()) {
158 if (
const auto sView =
dynamic_cast<SpectrumView*
>(pSubView.get()))
169 const auto wt = std::static_pointer_cast< WaveTrack >(
FindTrack() );
170 std::vector<UIHandlePtr> results;
172#ifdef EXPERIMENTAL_BRUSH_TOOL
177 pProject, std::static_pointer_cast<SpectrumView>(shared_from_this()),
179 results.push_back(result);
185 state, pProject, currentTool, bMultiTool, wt
193#ifdef EXPERIMENTAL_HALF_WAVE
195 gPrefs->Read(
wxT(
"/GUI/CollapseToHalfWave"), &bHalfWave,
false);
196 if( bHalfWave && minimized)
202 constexpr auto max = std::numeric_limits<float>::max();
203 const bool spectrumLinear =
204 (wt->GetSpectrogramSettings().scaleType ==
207 wt->SetSpectrumBounds( spectrumLinear ? 0.0f : 1.0f, max );
221 return std::make_shared<SpectrumVRulerControls>( shared_from_this() );
229 if (
const auto pDest =
dynamic_cast< SpectrumView*
>( destSubView ) ) {
230 pDest->mpSpectralData = std::make_shared<SpectralData>(
mpSpectralData->GetSR());
239(
const float *spectrum,
float bin0,
float bin1,
unsigned nBins,
240 bool autocorrelation,
int gain,
int range)
247 if ((
int)(bin1) == (
int)(bin0)) {
248 value = spectrum[(int)(bin0)];
250 float binwidth= bin1 - bin0;
251 value = spectrum[(int)(bin0)] * (1.f - bin0 + (int)bin0);
253 bin0 = 1 + (int)(bin0);
254 while (bin0 < (
int)(bin1)) {
255 value += spectrum[(int)(bin0)];
259 if ((
int)(bin1) >= (
int)nBins) {
263 value += spectrum[(int)(bin1)] * (bin1 - (int)(bin1));
269 int index, limitIndex;
270 if (autocorrelation) {
273 index = std::max(0.0f,
std::min(
float(nBins - 1),
274 (nBins - 1) - (2 * nBins) / (std::max(1.0f, bin0))
276 limitIndex = std::max(0.0f,
std::min(
float(nBins - 1),
277 (nBins - 1) - (2 * nBins) / (std::max(1.0f, bin1))
281 index = std::min<int>(nBins - 1, (
int)(floor(0.5 + bin0)));
282 limitIndex = std::min<int>(nBins, (
int)(floor(0.5 + bin1)));
284 value = spectrum[index];
285 while (++index < limitIndex)
286 value = std::max(value, spectrum[index]);
288 if (!autocorrelation) {
290 value = (value + range + gain) / (
double)range;
292 value =
std::min(1.0f, std::max(0.0f, value));
299 float selBinCenter,
float selBinHi,
int dashCount,
bool isSpectral )
303 if ((selBinCenter >= 0) && (bin0 <= selBinCenter) &&
304 (selBinCenter < bin1))
306 if ((0 == dashCount % 2) &&
307 (((selBinLo >= 0) && (bin0 <= selBinLo) && ( selBinLo < bin1)) ||
308 ((selBinHi >= 0) && (bin0 <= selBinHi) && ( selBinHi < bin1))))
310 if ((selBinLo < 0 || selBinLo < bin1) && (selBinHi < 0 || selBinHi > bin0))
320 const std::shared_ptr<SpectralData> &mpSpectralData,
323 auto &dc = context.
dc;
325 bool onBrushTool = artist->onBrushTool;
326 const auto &selectedRegion = *artist->pSelectedRegion;
327 const auto &zoomInfo = *artist->pZoomInfo;
329#ifdef PROFILE_WAVEFORM
354 enum { DASH_LENGTH = 10 };
357 true, track, clip, rect, selectedRegion, zoomInfo };
358 const wxRect &hiddenMid =
params.hiddenMid;
361 if (hiddenMid.width <= 0) {
365 const double &t0 =
params.t0;
366 const double &tOffset =
params.tOffset;
367 const auto &ssel0 =
params.ssel0;
368 const auto &ssel1 =
params.ssel1;
369 const double &averagePixelsPerSample =
params.averagePixelsPerSample;
370 const double &rate =
params.rate;
371 const double &hiddenLeftOffset =
params.hiddenLeftOffset;
372 const double &leftOffset =
params.leftOffset;
373 const wxRect &mid =
params.mid;
377#ifdef EXPERIMENTAL_SPECTRAL_EDITING
378 freqLo = selectedRegion.f0();
379 freqHi = selectedRegion.f1();
382 const int &colorScheme =
settings.colorScheme;
386#ifdef EXPERIMENTAL_FIND_NOTES
387 const bool &fftFindNotes =
settings.fftFindNotes;
388 const double &findNotesMinA =
settings.findNotesMinA;
389 const int &numberOfMaxima =
settings.numberOfMaxima;
390 const bool &findNotesQuantize =
settings.findNotesQuantize;
392#ifdef EXPERIMENTAL_FFT_Y_GRID
393 const bool &fftYGrid =
settings.fftYGrid;
396 dc.SetPen(*wxTRANSPARENT_PEN);
402 wxImage image((
int)mid.width, (
int)mid.height);
405#ifdef EXPERIMENTAL_SPECTROGRAM_OVERLAY
407 unsigned char *alpha = image.GetAlpha();
409 unsigned char *data = image.GetData();
411 const auto half =
settings.GetFFTLength() / 2;
412 const double binUnit = rate / (2 * half);
413 const float *freq = 0;
417 const double pps = averagePixelsPerSample * rate;
419 waveTrackCache, freq, where,
420 (
size_t)hiddenMid.width,
425 float minFreq, maxFreq;
426 track->GetSpectrumBounds(&minFreq, &maxFreq);
432 float *bins = (
float*)alloca(
sizeof(*bins)*(hiddenMid.height + 1));
437 float nextBin = std::max( 0.0f,
std::min(
float(nBins - 1),
438 settings.findBin( *it, binUnit ) ) );
441 for (yy = 0; yy < hiddenMid.height; ++yy) {
443 nextBin = std::max( 0.0f,
std::min(
float(nBins - 1),
444 settings.findBin( *++it, binUnit ) ) );
449#ifdef EXPERIMENTAL_FFT_Y_GRID
452 scale2 = (lmax - lmin) / log2,
456 for (
int yy = 0; yy < mid.height; ++yy) {
457 float n = (float(yy) / mid.height*scale2 - lmin2) * 12;
458 float n2 = (float(yy + 1) / mid.height*scale2 - lmin2) * 12;
459 float f = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n / 12.0f + lmin2);
460 float f2 = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n2 / 12.0f + lmin2);
461 n = logf(f / 440) / log2 * 12;
462 n2 = logf(f2 / 440) / log2 * 12;
463 if (floor(n) < floor(n2))
471 if (!updated && clipCache.mSpecPxCache->valid &&
472 ((
int)clipCache.mSpecPxCache->len == hiddenMid.height * hiddenMid.width)
473 && scaleType == clipCache.mSpecPxCache->scaleType
474 && gain == clipCache.mSpecPxCache->gain
475 && range == clipCache.mSpecPxCache->range
476 && minFreq == clipCache.mSpecPxCache->minFreq
477 && maxFreq == clipCache.mSpecPxCache->maxFreq
478#ifdef EXPERIMENTAL_FFT_Y_GRID
479 && fftYGrid==fftYGridOld
481#ifdef EXPERIMENTAL_FIND_NOTES
482 && fftFindNotes == artist->fftFindNotesOld
483 && findNotesMinA == artist->findNotesMinAOld
484 && numberOfMaxima == artist->findNotesNOld
485 && findNotesQuantize == artist->findNotesQuantizeOld
493 clipCache.mSpecPxCache = std::make_unique<SpecPxCache>(hiddenMid.width * hiddenMid.height);
494 clipCache.mSpecPxCache->valid =
true;
495 clipCache.mSpecPxCache->scaleType = scaleType;
496 clipCache.mSpecPxCache->gain = gain;
497 clipCache.mSpecPxCache->range = range;
498 clipCache.mSpecPxCache->minFreq = minFreq;
499 clipCache.mSpecPxCache->maxFreq = maxFreq;
500#ifdef EXPERIMENTAL_FIND_NOTES
501 artist->fftFindNotesOld = fftFindNotes;
502 artist->findNotesMinAOld = findNotesMinA;
503 artist->findNotesNOld = numberOfMaxima;
504 artist->findNotesQuantizeOld = findNotesQuantize;
507#ifdef EXPERIMENTAL_FIND_NOTES
508 float log2 = logf( 2.0f ),
509 lmin = logf( minFreq ), lmax = logf( maxFreq ), scale = lmax - lmin,
515#ifdef EXPERIMENTAL_FIND_NOTES
517 float maxima0[128], maxima1[128];
519 f2bin = half / (rate / 2.0f),
520 bin2f = 1.0f / f2bin,
521 minDistance = powf(2.0f, 2.0f / 12.0f),
522 i0 = expf(lmin) / binUnit,
523 i1 = expf(scale + lmin) / binUnit,
525 const size_t maxTableSize = 1024;
530#pragma omp parallel for
532 for (
int xx = 0; xx < hiddenMid.width; ++xx) {
533#ifdef EXPERIMENTAL_FIND_NOTES
535 const int x0 = nBins * xx;
537 for (
int i = maxTableSize - 1; i >= 0; i--)
541 for (
int i = (
int)(i0); i < (int)(i1); i++) {
542 float freqi = freq[x0 + (int)(i)];
543 int value = (int)((freqi + gain + range) / range*(maxTableSize - 1));
546 if (value >= maxTableSize)
547 value = maxTableSize - 1;
551 for (
int i = maxTableSize - 1; i >= 0; i--) {
552 int index = indexes[i];
554 float freqi = freq[x0 + index];
555 if (freqi < findNotesMinA)
559 for (
int m = 0; m < maximas; m++) {
561 float maxm = maxima[m];
562 if (maxm / index < minDistance && index / maxm < minDistance) {
568 maxima[maximas++] = index;
569 if (maximas >= numberOfMaxima)
576#define f2pix(f) (logf(f)-lmins)/(lmaxs-lmins)*hiddenMid.height
579 for (
int i = 0; i < maximas; i++) {
580 int index = maxima[i];
581 float f = float(index)*bin2f;
582 if (findNotesQuantize)
584 f = expf((
int)(log(f / 440) / log2 * 12 - 0.5) / 12.0f*log2) * 440;
587 float f0 = expf((log(f / 440) / log2 * 24 - 1) / 24.0f*log2) * 440;
588 maxima0[i] = f2pix(f0);
589 float f1 = expf((log(f / 440) / log2 * 24 + 1) / 24.0f*log2) * 440;
590 maxima1[i] = f2pix(f1);
595 bool inMaximum =
false;
598 for (
int yy = 0; yy < hiddenMid.height; ++yy) {
599 const float bin = bins[yy];
600 const float nextBin = bins[yy+1];
604 (freq + nBins * xx, bin, nextBin, nBins, autocorrelation, gain, range);
605 clipCache.mSpecPxCache->values[xx * hiddenMid.height + yy] = value;
610#ifdef EXPERIMENTAL_FIND_NOTES
613 float i0 = maxima0[it];
618 float i1 = maxima1[it];
620 value =
findValue(freq + x0, bin, nextBin, nBins, autocorrelation, gain, range);
621 if (value < findNotesMinA)
641 (freq + nBins * xx, bin, nextBin, nBins, autocorrelation, gain, range);
643 clipCache.mSpecPxCache->values[xx * hiddenMid.height + yy] = value;
649 float selBinLo =
settings.findBin( freqLo, binUnit);
650 float selBinHi =
settings.findBin( freqHi, binUnit);
651 float selBinCenter = (freqLo < 0 || freqHi < 0)
653 :
settings.findBin( sqrt(freqLo * freqHi), binUnit );
655 const bool isSpectral =
settings.SpectralSelectionEnabled();
657 const int begin = hidden
659 : std::max(0, (
int)(zoomInfo.GetFisheyeLeftBoundary(-leftOffset)));
660 const int end = hidden
662 :
std::min(mid.width, (
int)(zoomInfo.GetFisheyeRightBoundary(-leftOffset)));
663 const size_t numPixels = std::max(0,
end -
begin);
671 for (
int ii =
begin; ii <
end; ++ii) {
672 const double time = zoomInfo.PositionToTime(ii, -leftOffset) - tOffset;
689 int fisheyeLeft = zoomInfo.GetFisheyeLeftBoundary(-leftOffset);
692 int selectedX = zoomInfo.TimeToPosition(selectedRegion.t0(), -leftOffset);
695#pragma omp parallel for
699 int windowSize = mpSpectralData->GetWindowSize();
700 int hopSize = mpSpectralData->GetHopSize();
701 double sr = mpSpectralData->GetSR();
702 auto &dataHistory = mpSpectralData->dataHistory;
705 dataHistory.push_back(mpSpectralData->dataBuffer);
708 std::map<long long, std::set<int>> hopBinMap;
709 for(
auto vecIter = dataHistory.begin(); vecIter != dataHistory.end(); ++vecIter){
710 for(
const auto &hopMap: *vecIter){
711 for(
const auto &binNum: hopMap.second)
712 hopBinMap[hopMap.first].insert(binNum);
717 auto yyToFreqBin = [&](
int yy){
718 const double p = double(yy) / hiddenMid.height;
720 float convertedFreqBinNum = convertedFreq / (sr / windowSize);
726 return static_cast<int>(
lrintf(convertedFreqBinNum));
729 for (
int xx = 0; xx < mid.width; ++xx) {
730 int correctedX = xx + leftOffset - hiddenLeftOffset;
735 if (!zoomInfo.InFisheye(xx, -leftOffset)) {
739 int specIndex = (xx - fisheyeLeft) * nBins;
740 wxASSERT(specIndex >= 0 && specIndex < (
int)specCache.
freq.size());
741 uncached = &specCache.
freq[specIndex];
747 (zoomInfo.PositionToTime(xx, -leftOffset) - tOffset));
750 (zoomInfo.PositionToTime(xx+1, -leftOffset) - tOffset));
752 bool maybeSelected = ssel0 <= w0 && w1 < ssel1;
753 maybeSelected = maybeSelected || (xx == selectedX);
756 std::set<int> *pSelectedBins =
nullptr;
757 std::set<int>::iterator freqBinIter;
758 auto advanceFreqBinIter = [&](
int nextBinRounded){
759 while (freqBinIter != pSelectedBins->end() &&
760 *freqBinIter < nextBinRounded)
764 bool hitHopNum =
false;
766 int convertedHopNum = (w0.as_long_long() + hopSize / 2) / hopSize;
767 hitHopNum = (hopBinMap.find(convertedHopNum) != hopBinMap.end());
769 pSelectedBins = &hopBinMap[convertedHopNum];
770 freqBinIter = pSelectedBins->begin();
771 advanceFreqBinIter(yyToFreqBin(0));
775 for (
int yy = 0; yy < hiddenMid.height; ++yy) {
777 maybeSelected =
false;
778 const float bin = bins[yy];
779 const float nextBin = bins[yy+1];
780 auto binRounded = yyToFreqBin(yy);
781 auto nextBinRounded = yyToFreqBin(yy + 1);
784 && freqBinIter != pSelectedBins->end()
785 && binRounded == *freqBinIter)
786 maybeSelected =
true;
789 advanceFreqBinIter(nextBinRounded);
801 (xx + leftOffset - hiddenLeftOffset) / DASH_LENGTH, isSpectral);
807 const float value = uncached
808 ?
findValue(uncached, bin, nextBin, nBins, autocorrelation, gain, range)
809 : clipCache.mSpecPxCache->values[correctedX * hiddenMid.height + yy];
811 unsigned char rv, gv, bv;
814#ifdef EXPERIMENTAL_FFT_Y_GRID
815 if (fftYGrid && yGrid[yy]) {
821 int px = ((mid.height - 1 - yy) * mid.width + xx);
822#ifdef EXPERIMENTAL_SPECTROGRAM_OVERLAY
824 alpha[px]= wxMin( 200, (value+0.3) * 500) ;
833 dataHistory.pop_back();
834 wxBitmap converted = wxBitmap(image);
838 memDC.SelectObject(converted);
840 dc.Blit(mid.x, mid.y, mid.width, mid.height, &memDC, 0, 0, wxCOPY, FALSE);
855 const wxRect & rect )
858 const auto &blankSelectedBrush = artist->blankSelectedBrush;
859 const auto &blankBrush = artist->blankBrush;
861 context, rect, track, blankSelectedBrush, blankBrush );
864 for (
const auto &clip: track->
GetClips()){
876 auto &dc = context.
dc;
884 channel->UpdateLocationsCache();
886 const auto wt = std::static_pointer_cast<const WaveTrack>(
887 FindTrack()->SubstitutePendingChangedTrack());
891#if defined(__WXMAC__)
892 wxAntialiasMode aamode = dc.GetGraphicsContext()->GetAntialiasMode();
893 dc.GetGraphicsContext()->SetAntialiasMode(wxANTIALIAS_NONE);
897 wxASSERT(waveTrackView.use_count());
899 auto seletedClip = waveTrackView->GetSelectedClip().lock();
900 DoDraw( context, wt.get(), seletedClip.get(), rect );
902#if defined(__WXMAC__)
903 dc.GetGraphicsContext()->SetAntialiasMode(aamode);
911 return std::make_shared< SpectrumView >( view );
920#include "../../../../Menus.h"
922#include "../../../../RefreshCode.h"
923#include "../../../../prefs/PrefsDialog.h"
924#include "../../../../prefs/SpectrumPrefs.h"
925#include "../../../../widgets/AudacityMessageBox.h"
926#include "../../../../widgets/PopupMenuTable.h"
938 void OnSpectrogramSettings(wxCommandEvent &);
946void SpectrogramSettingsHandler::OnSpectrogramSettings(wxCommandEvent &)
948 class ViewSettingsDialog final :
public PrefsDialog
973 if (gAudioIO->IsBusy()){
976"To change Spectrogram Settings, stop any\n playing or recording first."),
977 XO(
"Stop the Audio First"),
978 wxOK | wxICON_EXCLAMATION | wxCENTRE);
992 ViewSettingsDialog dialog(
993 mpData->pParent, mpData->project,
title, factories, page);
995 if (0 != dialog.ShowModal()) {
1009 {
"SubViews/Extra" },
1010 std::make_unique<PopupMenuSection>(
"SpectrogramSettings",
1012 PopupMenuTable::Computed< WaveTrackPopupMenuTable >(
1015 static const int OnSpectrogramSettingsID =
1020 const auto displays = view.GetDisplays();
1021 bool hasSpectrum = (displays.end() != std::find(
1022 displays.begin(), displays.end(),
1031 return std::make_unique<Entry>(
"SpectrogramSettings",
1033 OnSpectrogramSettingsID,
1034 XXO(
"S&pectrogram Settings..."),
1035 (wxCommandEventFunction)
1036 (&SpectrogramSettingsHandler::OnSpectrogramSettings),
1037 SpectrogramSettingsHandler::Instance(),
1042 menu.Enable(
id, !gAudioIO->IsBusy());
1052 const auto keyCode =
event.GetKeyCode();
1054 (keyCode == WXK_BACK || keyCode == WXK_DELETE ||
1055 keyCode == WXK_NUMPAD_DELETE)
1063 event.Skip(!capture);
1070 event.Skip(!capture);
1081 event.Skip(!capture);
1085#ifdef EXPERIMENTAL_SPECTRAL_EDITING
1087#include "../../../ui/SelectHandle.h"
1088#include "../../../../CommonCommandFlags.h"
1090#include "../../../../SpectrumAnalyst.h"
1091#include "../../../../commands/CommandContext.h"
1101 for (
auto wt : tracks.Selected<
const WaveTrack >() ) {
1103 bool hasSpectrum = (displays.end() != std::find(
1104 displays.begin(), displays.end(),
1107 if ( hasSpectrum ) {
1128 auto &project = context.
project;
1131 const double f0 = selectedRegion.
f0();
1132 const double f1 = selectedRegion.f1();
1133 const bool haveSpectralSelection =
1136 if (haveSpectralSelection)
1140 selectedRegion.setFrequencies
1144 selectedRegion.setFrequencies(mLastF0, mLastF1);
1151 auto &project = context.
project;
1152 DoNextPeakFrequency(project,
true);
1157 auto &project = context.
project;
1158 DoNextPeakFrequency(project,
false);
1166 return std::make_unique< Handler >(); } };
1169 return project.AttachedObjects::Get< Handler >(
key );
1173#define FN(X) (& Handler :: X)
1181 XXO(
"To&ggle Spectral Selection"),
FN(OnToggleSpectralSelection),
1184 XXO(
"Next &Higher Peak Frequency"),
FN(OnNextHigherPeakFrequency),
1187 XXO(
"Next &Lower Peak Frequency"),
FN(OnNextLowerPeakFrequency),
1196 Placement{
wxT(
"Select/Basic"), { OrderingHint::After,
wxT(
"Region") } },
1197 Shared( SpectralSelectionMenu() )
void GetColorGradient(float value, AColor::ColorGradientChoice selected, int colorScheme, unsigned char *__restrict red, unsigned char *__restrict green, unsigned char *__restrict blue)
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
AttachedItem sAttachment2
std::shared_ptr< UIHandle > UIHandlePtr
wxEvtHandler CommandHandlerObject
const ReservedCommandFlag & TracksExistFlag()
EffectDistortionSettings params
XXO("&Cut/Copy/Paste Toolbar")
PrefsPanel::Factory SpectrumPrefsFactory(WaveTrack *wt)
static bool ShouldCaptureEvent(wxKeyEvent &event, SpectralData *pData)
static WaveTrackSubView::Type sType
static WaveTrackSubViewType::RegisteredType reg
static UIHandlePtr BrushHandleHitTest(std::weak_ptr< BrushHandle > &holder, const TrackPanelMouseState &st, const AudacityProject *pProject, const std::shared_ptr< SpectrumView > &pTrackView, const std::shared_ptr< SpectralData > &mpData)
static const WaveTrackSubViews::RegisteredFactory key
static Settings & settings()
std::shared_ptr< Subclass > AssignUIHandlePtr(std::weak_ptr< Subclass > &holder, const std::shared_ptr< Subclass > &pNew)
WaveTrackPopupMenuTable & GetWaveTrackMenuTable()
@ ColorGradientUnselected
@ ColorGradientTimeAndFrequencySelected
@ ColorGradientTimeSelected
static void PreComputeGradient()
static bool gradient_inited
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
static AudioIOBase * Get()
Client code makes static instance from a factory of attachments; passes it to Get or Find as a retrie...
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
AudacityProject & project
std::shared_ptr< Track > FindTrack()
float PositionToValue(float pp) const
Iterator begin(float nPositions) const
Dialog that shows the current PrefsPanel in a tabbed divider.
virtual void SavePreferredPage()=0
PrefsDialog(wxWindow *parent, AudacityProject *pProject, const TranslatableString &titlePrefix=XO("Preferences:"), PrefsPanel::Factories &factories=PrefsPanel::DefaultFactories())
virtual long GetPreferredPage()=0
std::vector< PrefsPanel::PrefsNode > Factories
A simple profiler to measure the average time lengths that a particular task/function takes....
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
A short-lived object, during whose lifetime, the contents of the WaveTrack are assumed not to change.
const std::shared_ptr< const SampleTrack > & GetTrack() const
static void SnapCenterOnce(SpectrumAnalyst &analyst, ViewInfo &viewInfo, const WaveTrack *pTrack, bool up)
static const int UndefinedFrequency
void Populate(const SpectrogramSettings &settings, SampleTrackCache &waveTrackCache, int copyBegin, int copyEnd, size_t numPixels, sampleCount numSamples, double offset, double rate, double pixelsPerSecond)
std::vector< float > freq
std::vector< sampleCount > where
void Grow(size_t len_, const SpectrogramSettings &settings, double pixelsPerSecond, double start_)
std::vector< HopsAndBinsMap > dataHistory
static bool ProcessTracks(AudacityProject &project)
Spectrogram settings, either for one track or as defaults.
Used for finding the peaks, for snapping to peaks.
AudacityProject * mpProject
SpectralDataSaver(SpectrumView &view)
~SpectralDataSaver() override
void Init(AudacityProject &project, bool clearAll) override
static void ForAll(AudacityProject &project, std::function< void(SpectrumView &view)> fn)
void DoSetMinimized(bool minimized) override
unsigned CaptureKey(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
void DoDraw(TrackPanelDrawingContext &context, const WaveTrack *track, const WaveClip *selectedClip, const wxRect &rect)
bool IsSpectral() const override
std::shared_ptr< TrackVRulerControls > DoGetVRulerControls() override
std::shared_ptr< SpectralData > mpSpectralData
std::weak_ptr< BrushHandle > mBrushHandle
unsigned KeyDown(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
std::shared_ptr< SpectralData > mpBackupSpectralData
const Type & SubViewType() const override
unsigned Char(wxKeyEvent &event, ViewInfo &viewInfo, wxWindow *pParent, AudacityProject *project) override
std::shared_ptr< SpectralData > GetSpectralData()
void CopyToSubView(WaveTrackSubView *destSubView) const override
std::vector< UIHandlePtr > DetailedHitTest(const TrackPanelMouseState &state, const AudacityProject *pProject, int currentTool, bool bMultiTool) override
void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass) override
SpectrumView(WaveTrackView &waveTrackView, const SpectrumView &src)=delete
static TrackArtist * Get(TrackPanelDrawingContext &)
std::shared_ptr< Subclass > SharedPointer()
static TrackList & Get(AudacityProject &project)
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
virtual void Draw(TrackPanelDrawingContext &context, const wxRect &rect, unsigned iPass)
virtual void DoSetMinimized(bool isMinimized)
static TrackView & Get(Track &)
Holds a msgid for the translation catalog; may also bind format arguments.
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
This allows multiple clips to be a part of one WaveTrack.
sampleCount GetPlaySamplesCount() const
A Track that contains audio waveform data.
WaveClipHolders & GetClips()
static void DrawBoldBoundaries(TrackPanelDrawingContext &context, const WaveTrack *track, const wxRect &rect)
std::pair< bool, std::vector< UIHandlePtr > > DoDetailedHitTest(const TrackPanelMouseState &state, const AudacityProject *pProject, int currentTool, bool bMultiTool, const std::shared_ptr< WaveTrack > &wt)
std::weak_ptr< WaveTrackView > GetWaveTrackView() const
static WaveTrackView & Get(WaveTrack &track)
std::vector< WaveTrackSubView::Type > GetDisplays() const
static bool ClipDetailsVisible(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect)
Positions or offsets within audio files need a wide type.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
std::unique_ptr< BaseItem > BaseItemPtr
std::shared_ptr< BaseItem > BaseItemSharedPtr
AUDACITY_DLL_API void DrawClipFolded(wxDC &dc, const wxRect &rect)
AUDACITY_DLL_API void DrawClipEdges(wxDC &dc, const wxRect &clipRect, bool selected=false)
AUDACITY_DLL_API void DrawBackgroundWithSelection(TrackPanelDrawingContext &context, const wxRect &rect, const Track *track, const wxBrush &selBrush, const wxBrush &unselBrush, bool useSelection=true)
PopupMenuTable::AttachedItem sAttachment
AColor::ColorGradientChoice ChooseColorSet(float bin0, float bin1, float selBinLo, float selBinCenter, float selBinHi, int dashCount, bool isSpectral)
static float findValue(const float *spectrum, float bin0, float bin1, unsigned nBins, bool autocorrelation, int gain, int range)
void DrawClipSpectrum(TrackPanelDrawingContext &context, SampleTrackCache &waveTrackCache, const WaveClip *clip, const wxRect &rect, const std::shared_ptr< SpectralData > &mpSpectralData, bool selected)
AuthorizationHandler handler
A convenient default parameter for class template Site.
static wxRect GetClipRect(const WaveClip &clip, const ZoomInfo &zoomInfo, const wxRect &viewRect, bool *outShowSamples=nullptr)
static WaveClipSpectrumCache & Get(const WaveClip &clip)
bool GetSpectrogram(const WaveClip &clip, SampleTrackCache &cache, const float *&spectrogram, const sampleCount *&where, size_t numPixels, double t0, double pixelsPerSecond)
static SpectrogramSettingsHandler & Instance()
void InitUserData(void *pUserData) override
Called before the menu items are appended.