1#include "../CommonCommandFlags.h"
2#include "../LabelTrack.h"
4#include "../MixAndRender.h"
8#include "../ProjectAudioIO.h"
11#include "../ProjectSettings.h"
14#include "../ProjectWindow.h"
15#include "../SelectUtilities.h"
16#include "../ShuttleGui.h"
17#include "../SyncLock.h"
18#include "../TrackPanelAx.h"
19#include "../TrackPanel.h"
20#include "../TrackUtilities.h"
22#include "../WaveClip.h"
24#include "../WaveTrack.h"
25#include "../commands/CommandContext.h"
26#include "../commands/CommandManager.h"
27#include "../effects/EffectManager.h"
28#include "../effects/EffectUI.h"
30#include "../tracks/playabletrack/wavetrack/ui/WaveTrackControls.h"
31#include "../widgets/ASlider.h"
32#include "../widgets/AudacityMessageBox.h"
33#include "../widgets/ProgressDialog.h"
35#include <wx/combobox.h>
37#ifdef EXPERIMENTAL_SCOREALIGN
38#include "../effects/ScoreAlignDialog.h"
39#include "audioreader.h"
40#include "scorealign.h"
41#include "scorealign-glue.h"
57 auto trackRange = tracks.Selected<
WaveTrack >();
61 tracks.MakeUniqueTrackName(
_(
"Mix")),
62 &trackFactory, rate, defaultFormat, 0.0, 0.0, uNewLeft, uNewRight);
68 auto last = *trackRange.rbegin();
69 auto insertionPoint = * ++ tracks.Find( last );
74 if (selectedCount > 0) {
75 firstName = (*trackRange.begin())->GetName();
76 firstColour = (*trackRange.begin())->GetWaveColorIndex();
80 for (
auto &it = trackRange.first, &
end = trackRange.second; it !=
end;)
81 tracks.Remove( *it++ );
86 auto pNewLeft = tracks.Add( uNewLeft );
87 decltype(pNewLeft) pNewRight{};
90 pNewRight = tracks.Add(uNewRight);
91 tracks.MakeMultiChannelTrack(*pNewLeft, 2,
true);
95 if (selectedCount==1) {
96 pNewLeft->SetName(firstName);
98 pNewRight->SetName(firstName);
103 if (selectedCount>=1) {
104 pNewLeft->SetWaveColorIndex(firstColour);
105 pNewLeft->SetSelected(!toNewTrack);
107 pNewRight->SetWaveColorIndex(firstColour);
108 pNewRight->SetSelected(!toNewTrack);
117 std::vector<TrackNodePointer> arr;
118 arr.reserve( tracks.size() );
119 size_t begin = 0, ii = 0;
120 for (
auto iter = tracks.ListOfTracks::begin(),
121 end = tracks.ListOfTracks::end(); iter !=
end; ++iter) {
122 arr.push_back( {iter, &tracks} );
123 if ( iter->get() == insertionPoint )
127 auto mid = arr.end();
129 std::rotate( arr.begin() +
begin, mid, arr.end() );
130 tracks.Permute( arr );
134 if (selectedCount==1) {
135 auto msg =
XO(
"Rendered all audio in track '%s'").Format( firstName );
141 auto msg = (pNewRight
142 ?
XO(
"Mixed and rendered %d tracks into one new stereo track")
143 :
XO(
"Mixed and rendered %d tracks into one new mono track")
145 .
Format( (
int)selectedCount );
149 trackPanel.SetFocus();
161 const auto range = tracks.Any<
WaveTrack >();
163 auto count = selectedRange.
size();
166 for (
auto left : count == 0 ? range : selectedRange )
167 left->SetPan( PanValue );
172 .
PushState(
XO(
"Panned audio track(s)"),
XO(
"Pan Track"), flags);
187static const std::vector< ComponentInterfaceSymbol >
188&
alignLabels() {
static std::vector< ComponentInterfaceSymbol > symbols{
189 { wxT(
"StartToZero"),
XXO(
"Start to &Zero") },
190 { wxT(
"StartToSelStart"),
XXO(
"Start to &Cursor/Selection Start") },
191 { wxT(
"StartToSelEnd"),
XXO(
"Start to Selection &End") },
192 { wxT(
"EndToSelStart"),
XXO(
"End to Cu&rsor/Selection Start") },
193 { wxT(
"EndToSelEnd"),
XXO(
"End to Selection En&d") },
207 double newPos = -1.0;
209 auto channelRange = tracks.Selected<
AudioTrack >();
210 auto trackRange = tracks.SelectedLeaders<
AudioTrack >();
212 auto FindOffset = [](
const Track *pTrack ) {
215 auto firstTrackOffset = [&]{
return FindOffset( *trackRange.begin() ); };
216 auto minOffset = [&]{
return trackRange.min( FindOffset ); };
217 auto avgOffset = [&]{
218 return trackRange.sum( FindOffset ) /
219 std::max(
size_t(1), trackRange.
size() ); };
221 auto maxEndOffset = [&]{
226 delta = -minOffset();
233 ?
XO(
"Aligned/Moved start to zero")
234 :
XO(
"Aligned start to zero");
235 shortAction = moveSel
238 ?
XO(
"Align/Move Start")
242 delta = selectedRegion.t0() - minOffset();
244 ?
XO(
"Aligned/Moved start to cursor/selection start")
245 :
XO(
"Aligned start to cursor/selection start");
246 shortAction = moveSel
247 ?
XO(
"Align/Move Start")
251 delta = selectedRegion.t1() - minOffset();
253 ?
XO(
"Aligned/Moved start to selection end")
254 :
XO(
"Aligned start to selection end");
255 shortAction = moveSel
256 ?
XO(
"Align/Move Start")
260 delta = selectedRegion.t0() - maxEndOffset();
262 ?
XO(
"Aligned/Moved end to cursor/selection start")
263 :
XO(
"Aligned end to cursor/selection start");
266 ?
XO(
"Align/Move End")
270 delta = selectedRegion.t1() - maxEndOffset();
272 ?
XO(
"Aligned/Moved end to selection end")
273 :
XO(
"Aligned end to selection end");
276 ?
XO(
"Align/Move End")
281 newPos = firstTrackOffset();
283 ?
XO(
"Aligned/Moved end to end")
284 :
XO(
"Aligned end to end");
287 ?
XO(
"Align/Move End to End")
288 :
XO(
"Align End to End");
291 newPos = avgOffset();
293 ?
XO(
"Aligned/Moved together")
294 :
XO(
"Aligned together");
297 ?
XO(
"Align/Move Together")
298 :
XO(
"Align Together");
303 for (
auto t : tracks.SelectedLeaders<
AudioTrack >()) {
312 for (
auto channel : channels)
314 channel->SetOffset(newPos + channel->GetStartTime() - trackStart);
317 newPos += (trackEnd - trackStart);
325 for (
auto t : tracks.Any()
327 t->SetOffset(t->GetOffset() + delta);
331 selectedRegion.move(delta);
336#ifdef EXPERIMENTAL_SCOREALIGN
351#define AUDIO_WORK_UNIT 0.004F
352#define MIDI_WORK_UNIT 0.0001F
353#define MATRIX_WORK_UNIT 0.000002F
354#define SMOOTHING_WORK_UNIT 0.000001F
360#define COLLECT_TIMING_DATA
363class ASAProgress final :
public SAProgress {
370 std::optional<ProgressDialog> mProgress;
371 #ifdef COLLECT_TIMING_DATA
373 wxDateTime mStartTime;
380 #ifdef COLLECT_TIMING_DATA
381 mTimeFile = fopen(
"timing-data.txt",
"w");
385 #ifdef COLLECT_TIMING_DATA
389 void set_phase(
int i)
override {
391 float work2, work3 = 0;
392 SAProgress::set_phase(i);
393 #ifdef COLLECT_TIMING_DATA
395 wxDateTime now = wxDateTime::UNow();
396 wxFprintf(mTimeFile,
"Phase %d begins at %s\n",
397 i, now.FormatTime());
399 ms = now.Subtract(mStartTime).GetMilliseconds().ToLong();
404 for (
int j = 0; j < 2; j++) {
405 mFrames[j] = durations[j] / frame_period;
408 for (
int j = 0; j < 2; j++) {
410 (is_audio[j] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[j];
411 mTotalWork += work[j];
413 mTotalCells = mFrames[0] * mFrames[1];
414 work2 = mTotalCells * MATRIX_WORK_UNIT;
420 wxMax(mFrames[0], mFrames[1]) * SMOOTHING_WORK_UNIT * 40;
423 #ifdef COLLECT_TIMING_DATA
425 " mTotalWork (an estimate) = %g\n", mTotalWork);
426 wxFprintf(mTimeFile,
" work0 = %g, frames %g, is_audio %d\n",
427 work[0], mFrames[0], is_audio[0]);
428 wxFprintf(mTimeFile,
" work1 = %g, frames %g, is_audio %d\n",
429 work[1], mFrames[1], is_audio[1]);
430 wxFprintf(mTimeFile,
"work2 = %g, work3 = %g\n", work2, work3);
432 mProgress.emplace(
XO(
"Synchronize MIDI with Audio"),
433 XO(
"Synchronizing MIDI and Audio Tracks"));
436 "Phase %d took %d ms for %g frames, coefficient = %g s/frame\n",
437 i - 1, ms, mFrames[i - 1], (ms * 0.001) / mFrames[i - 1]);
440 "Phase 2 took %d ms for %d cells, coefficient = %g s/cell\n",
441 ms, mCellCount, (ms * 0.001) / mCellCount);
444 "Phase 3 took %d ms for %d iterations on %g frames, "
445 "coefficient = %g s per frame per iteration\n",
446 ms, iterations, wxMax(mFrames[0], mFrames[1]),
447 (ms * 0.001) / (wxMax(mFrames[0], mFrames[1]) * iterations));
450 bool set_feature_progress(
float s)
override {
453 float f = s / frame_period;
454 work = (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * f;
455 }
else if (phase == 1) {
456 float f = s / frame_period;
457 work = (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
458 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * f;
460 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
463 bool set_matrix_progress(
int cells)
override {
466 (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
467 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[1];
468 work += mCellCount * MATRIX_WORK_UNIT;
469 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
472 bool set_smoothing_progress(
int i)
override {
475 (is_audio[0] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[0] +
476 (is_audio[1] ? AUDIO_WORK_UNIT : MIDI_WORK_UNIT) * mFrames[1] +
477 MATRIX_WORK_UNIT * mFrames[0] * mFrames[1];
478 work += i * wxMax(mFrames[0], mFrames[1]) * SMOOTHING_WORK_UNIT;
479 auto updateResult = mProgress->Update((
int)(work), (
int)(mTotalWork));
485long mixer_process(
void *mixer,
float **buffer,
long n)
488 long frame_count = mix->
Process(std::max(0L, n));
502 auto GetTime = [](
const Track *t) {
503 return t->TypeSwitch<
double >(
505 auto stime = w->GetEndTime();
508 for (ndx = 0; ndx < w->GetNumClips(); ndx++) {
509 const auto c = w->GetClipByIndex(ndx);
510 if (c->GetPlaySamplesCount() == 0)
512 stime =
std::min(stime, c->GetPlayStartTime());
517 return l->GetStartTime();
525 std::vector<TrackNodePointer> arr;
527 arr.reserve(tracks.size());
532 for (
auto iter = tracks.ListOfTracks::begin(),
533 end = tracks.ListOfTracks::end(); iter !=
end; ++iter) {
534 const auto &track = *iter;
535 if ( !track->IsLeader() )
539 auto size = arr.size();
540 for (ndx = 0; ndx <
size;) {
541 Track &arrTrack = **arr[ndx].first;
551 auto cmpValue = track->GetName().CmpNoCase(arrTrack.
GetName());
554 track->GetName().CompareTo(arrTrack.
GetName()) > 0 ) )
562 auto time2 = channels.min( GetTime );
567 ndx += channels.size();
580 float newValue = slider->
Get();
583 channel->SetGain(newValue);
594 float newValue = slider->
Get();
597 channel->SetPan(newValue);
623 auto &project = context.
project;
629 auto &project = context.
project;
635 auto &project = context.
project;
650 rate.Printf(wxT(
"%ld"),
lrint(projectRate));
668 S.StartVerticalLay(
true);
672 S.StartHorizontalLay(wxCENTER,
false);
674 cb =
S.AddCombo(
XXO(
"New sample rate (Hz):"),
678 S.EndHorizontalLay();
682 S.AddStandardButtons();
690 if (dlg.ShowModal() != wxID_OK)
696 if (cb->GetValue().ToLong(&lrate) && lrate >= 1 && lrate <= 1000000)
698 newRate = (int)lrate;
703 XO(
"The entered value is invalid"),
711 for (
auto wt : tracks.Selected<
WaveTrack >())
713 auto msg =
XO(
"Resampling track %d").Format( ++ndx );
723 wt->Resample(newRate, progress.get());
730 XO(
"Resampled audio track(s)"),
XO(
"Resample Track"), flags);
734 undoManager.StopConsolidating();
737 window.FinishAutoScroll();
747 auto &project = context.
project;
752 auto soloSimple =
settings.IsSoloSimple();
753 auto soloNone =
settings.IsSoloNone();
759 if (soloSimple || soloNone)
788 auto &project = context.
project;
794 auto &project = context.
project;
800 auto &project = context.
project;
806 auto &project = context.
project;
814 auto &project = context.
project;
817 gPrefs->Read(wxT(
"/GUI/MoveSelectionWithTracks"), &bMoveWith,
false);
832 gPrefs->Read(wxT(
"/GUI/MoveSelectionWithTracks"), &bMoveWith,
false);
833 gPrefs->Write(wxT(
"/GUI/MoveSelectionWithTracks"), !bMoveWith);
838#ifdef EXPERIMENTAL_SCOREALIGN
841 auto &project = context.
project;
845 int numWaveTracksSelected = 0;
846 int numNoteTracksSelected = 0;
847 int numOtherTracksSelected = 0;
848 double endTime = 0.0;
852 tracks.Selected().Visit(
854 numWaveTracksSelected++;
858 numNoteTracksSelected++;
861 numOtherTracksSelected++;
865 if(numWaveTracksSelected == 0 ||
866 numNoteTracksSelected != 1 ||
867 numOtherTracksSelected != 0){
869 XO(
"Please select at least one audio track and one MIDI track.") );
881 CloseScoreAlignDialog();
883 if (
params.mStatus != wxID_OK)
return;
889 auto holder = nt->Duplicate();
890 auto alignedNoteTrack =
static_cast<NoteTrack*
>(holder.get());
893 if (alignedNoteTrack->GetOffset() < 0) {
895 nt->
Clear(alignedNoteTrack->GetOffset(), 0);
896 }
else if (alignedNoteTrack->GetOffset() > 0) {
897 alignedNoteTrack->Shift(alignedNoteTrack->GetOffset());
899 alignedNoteTrack->SetOffset(0);
902 tracks->GetWaveTrackConstArray(
true );
920 ASAProgress progress;
928#ifndef SKIP_ACTUAL_SCORE_ALIGNMENT
929 result = scorealign((
void *) &mix, &mixer_process,
930 2 , 44100.0 , endTime,
931 &alignedNoteTrack->GetSeq(), &progress,
params);
937 if (result == SA_SUCCESS) {
938 tracks->Replace(nt, holder);
940 XO(
"Alignment completed: MIDI from %.2f to %.2f secs, Audio from %.2f to %.2f secs.")
945 .
PushState(
XO(
"Sync MIDI with Audio"),
XO(
"Sync MIDI with Audio"));
946 }
else if (result == SA_TOOSHORT) {
949"Alignment error: input too short: MIDI from %.2f to %.2f secs, Audio from %.2f to %.2f secs.")
953 }
else if (result == SA_CANCEL) {
966 auto &project = context.
project;
975 auto &project = context.
project;
984 auto &project = context.
project;
987 bool bSyncLockTracks;
988 gPrefs->Read(wxT(
"/GUI/SyncLockTracks"), &bSyncLockTracks,
false);
989 gPrefs->Write(wxT(
"/GUI/SyncLockTracks"), !bSyncLockTracks);
995 trackPanel.Refresh(
false);
1002 auto &project = context.
project;
1006 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1015 auto &project = context.
project;
1019 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1028 auto &project = context.
project;
1032 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1041 auto &project = context.
project;
1046 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1055 auto &project = context.
project;
1059 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1068 auto &project = context.
project;
1072 if (track) track->TypeSwitch( [&](
WaveTrack *wt) {
1081 auto &project = context.
project;
1084 trackPanel.OnTrackMenu();
1089 auto &project = context.
project;
1103 auto &project = context.
project;
1113 auto &project = context.
project;
1125 XO(
"Can't delete track with active audio"));
1132 trackPanel.UpdateViewIfNoTracks();
1133 trackPanel.Refresh(
false);
1138 auto &project = context.
project;
1143 if (tracks.CanMoveUp(focusedTrack)) {
1145 trackPanel.Refresh(
false);
1151 auto &project = context.
project;
1156 if (tracks.CanMoveDown(focusedTrack)) {
1158 trackPanel.Refresh(
false);
1164 auto &project = context.
project;
1169 if (tracks.CanMoveUp(focusedTrack)) {
1171 trackPanel.Refresh(
false);
1177 auto &project = context.
project;
1182 if (tracks.CanMoveDown(focusedTrack)) {
1184 trackPanel.Refresh(
false);
1201#define FN(X) (& TrackActions::Handler :: X)
1213 Menu( wxT(
"Tracks"),
XXO(
"&Tracks"),
1215 Menu( wxT(
"Add"),
XXO(
"Add &New") )
1221 Menu( wxT(
"Mix"),
XXO(
"Mi&x"),
1231 return Command( wxT(
"Stereo to Mono"),
1232 XXO(
"Mix Stereo Down to &Mono"),
FN(OnStereoToMono),
1238 Command( wxT(
"MixAndRender"),
XXO(
"Mi&x and Render"),
1241 Command( wxT(
"MixAndRenderToNewTrack"),
1242 XXO(
"Mix and Render to Ne&w Track"),
1243 FN(OnMixAndRenderToNewTrack),
1247 Command( wxT(
"Resample"),
XXO(
"&Resample..."),
FN(OnResample),
1252 Command( wxT(
"RemoveTracks"),
XXO(
"Remo&ve Tracks"),
FN(OnRemoveTracks),
1257 Menu( wxT(
"Mute"),
XXO(
"M&ute/Unmute"),
1258 Command( wxT(
"MuteAllTracks"),
XXO(
"&Mute All Tracks"),
1260 Command( wxT(
"UnmuteAllTracks"),
XXO(
"&Unmute All Tracks"),
1262 Command( wxT(
"MuteTracks"),
XXO(
"Mut&e Tracks"),
1264 Command( wxT(
"UnmuteTracks"),
XXO(
"U&nmute Tracks"),
1268 Menu( wxT(
"Pan"),
XXO(
"&Pan"),
1276 Command( wxT(
"PanRight"),
XXO(
"&Right"),
FN(OnPanRight),
1278 Options{}.LongName(
XO(
"Pan Right") ) ),
1279 Command( wxT(
"PanCenter"),
XXO(
"&Center"),
FN(OnPanCenter),
1281 Options{}.LongName(
XO(
"Pan Center") ) )
1286 Menu( wxT(
"Align"),
XXO(
"&Align Tracks"),
1291 { wxT(
"EndToEnd"),
XXO(
"&Align End to End") },
1292 { wxT(
"Together"),
XXO(
"Align &Together") },
1305 Command( wxT(
"MoveSelectionWithTracks"),
1306 XXO(
"&Move Selection with Tracks (on/off)"),
1307 FN(OnMoveSelectionWithTracks),
1309 Options{}.CheckTest( wxT(
"/GUI/MoveSelectionWithTracks"),
false ) )
1316 Menu( wxT(
"MoveSelectionAndTracks"),
XO(
"Move Sele&ction and Tracks"), {
1324 #ifdef EXPERIMENTAL_SCOREALIGN
1325 Command( wxT(
"ScoreAlign"),
XXO(
"Synchronize MIDI with Audio"),
1332 Menu( wxT(
"Sort"),
XXO(
"S&ort Tracks"),
1333 Command( wxT(
"SortByTime"),
XXO(
"By &Start Time"),
FN(OnSortTime),
1335 Options{}.LongName(
XO(
"Sort by Time") ) ),
1336 Command( wxT(
"SortByName"),
XXO(
"By &Name"),
FN(OnSortName),
1338 Options{}.LongName(
XO(
"Sort by Name") ) )
1344#ifdef EXPERIMENTAL_SYNC_LOCK
1348 Command( wxT(
"SyncLock"),
XXO(
"Sync-&Lock Tracks (on/off)"),
1350 Options{}.CheckTest( wxT(
"/GUI/SyncLockTracks"),
false ) )
1369 Menu( wxT(
"Track"),
XXO(
"&Track"),
1370 Command( wxT(
"TrackPan"),
XXO(
"Change P&an on Focused Track..."),
1373 Command( wxT(
"TrackPanLeft"),
XXO(
"Pan &Left on Focused Track"),
1376 Command( wxT(
"TrackPanRight"),
XXO(
"Pan &Right on Focused Track"),
1377 FN(OnTrackPanRight),
1379 Command( wxT(
"TrackGain"),
XXO(
"Change Gai&n on Focused Track..."),
1382 Command( wxT(
"TrackGainInc"),
XXO(
"&Increase Gain on Focused Track"),
1385 Command( wxT(
"TrackGainDec"),
XXO(
"&Decrease Gain on Focused Track"),
1388 Command( wxT(
"TrackMenu"),
XXO(
"Op&en Menu on Focused Track..."),
1391 Options{ wxT(
"Shift+M") }.SkipKeyDown() ),
1392 Command( wxT(
"TrackMute"),
XXO(
"M&ute/Unmute Focused Track"),
1395 Command( wxT(
"TrackSolo"),
XXO(
"&Solo/Unsolo Focused Track"),
1398 Command( wxT(
"TrackClose"),
XXO(
"&Close Focused Track"),
1402 Command( wxT(
"TrackMoveUp"),
XXO(
"Move Focused Track U&p"),
1405 Command( wxT(
"TrackMoveDown"),
XXO(
"Move Focused Track Do&wn"),
1406 FN(OnTrackMoveDown),
1408 Command( wxT(
"TrackMoveTop"),
XXO(
"Move Focused Track to T&op"),
1411 Command( wxT(
"TrackMoveBottom"),
XXO(
"Move Focused Track to &Bottom"),
1412 FN(OnTrackMoveBottom),
1419 wxT(
"Optional/Extra/Part2"),
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
std::vector< std::shared_ptr< const WaveTrack > > WaveTrackConstArray
constexpr CommandFlag AlwaysEnabledFlag
wxEvtHandler CommandHandlerObject
const ReservedCommandFlag & AudioIONotBusyFlag()
const ReservedCommandFlag & StereoRequiredFlag()
const ReservedCommandFlag & EditableTracksSelectedFlag()
const ReservedCommandFlag & AnyTracksSelectedFlag()
const ReservedCommandFlag & TracksExistFlag()
const ReservedCommandFlag & WaveTracksSelectedFlag()
const ReservedCommandFlag & TrackPanelHasFocus()
EffectDistortion::Params params
void MixAndRender(const TrackIterRange< const WaveTrack > &trackRange, const Mixer::WarpOptions &warpOptions, const wxString &newTrackName, WaveTrackFactory *trackFactory, double rate, sampleFormat format, double startTime, double endTime, WaveTrack::Holder &uLeft, WaveTrack::Holder &uRight)
Mixes together all input tracks, applying any envelopes, amplitude gain, panning, and real-time effec...
an object holding per-project preferred sample rate
std::pair< ListOfTracks::iterator, ListOfTracks * > TrackNodePointer
Pairs a std::list iterator and a pointer to a list, for comparison purposes.
static Settings & settings()
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
Track subclass holding data representing sound (as notes, or samples, or ...)
size_t size() const
How many attachment pointers are in the Site.
Subclass & Get(const RegisteredFactory &key)
Get reference to an attachment, creating on demand if not present, down-cast it to Subclass.
CommandContext provides additional information to an 'Apply()' command. It provides the project,...
TemporarySelection temporarySelection
AudacityProject & project
static EffectManager & Get()
const PluginID & GetEffectByIdentifier(const CommandID &strTarget)
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Lightweight version of ASlider. In other words it does not have a window permanently associated with ...
void Decrease(float steps)
void Increase(float steps)
float Get(bool convert=true)
A LabelTrack is a Track that holds labels (LabelStruct).
Functions for doing the mixdown of the tracks.
size_t Process(size_t maxSamples)
constSamplePtr GetBuffer()
Retrieve the main buffer or the interleaved buffer.
A Track that is used for Midi notes. (Somewhat old code).
void Clear(double t0, double t1) override
AudioTrack subclass that can also be audibly replayed by the program.
const PluginDescriptor * GetPlugin(const PluginID &ID) const
static PluginManager & Get()
bool IsAudioActive() const
static ProjectAudioIO & Get(AudacityProject &project)
void PushState(const TranslatableString &desc, const TranslatableString &shortDesc)
void ModifyState(bool bWantsAutoSave)
static ProjectHistory & Get(AudacityProject &project)
static ProjectRate & Get(AudacityProject &project)
static ProjectSettings & Get(AudacityProject &project)
static ProjectStatus & Get(AudacityProject &project)
void Set(const TranslatableString &msg, StatusBarField field=mainStatusBarField)
static ProjectWindow & Get(AudacityProject &project)
ScoreAlignDialog is \TODO.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
static bool IsSelectedOrSyncLockSelected(const Track *pTrack)
Abstract base class for an object holding data associated with points on a time axis.
void EnsureVisible(bool modifyState=false)
virtual double GetStartTime() const =0
virtual double GetOffset() const =0
virtual double GetEndTime() const =0
static TrackList & Get(AudacityProject &project)
auto Selected() -> TrackIterRange< TrackType >
static auto Channels(TrackType *pTrack) -> TrackIterRange< TrackType >
static TrackPanel & Get(AudacityProject &project)
void RefreshTrack(Track *trk, bool refreshbacking=true)
Holds a msgid for the translation catalog; may also bind format arguments.
static UndoManager & Get(AudacityProject &project)
NotifyingSelectedRegion selectedRegion
static ViewInfo & Get(AudacityProject &project)
static LWSlider * PanSlider(CellularPanel &panel, const WaveTrack &wt)
static LWSlider * GainSlider(CellularPanel &panel, const WaveTrack &wt)
static WaveTrackFactory & Get(AudacityProject &project)
A Track that contains audio waveform data.
double GetEndTime() const override
Get the time at which the last clip in the track ends, plus recorded stuff.
std::shared_ptr< WaveTrack > Holder
Extend wxArrayString with move operations and construction and insertion fromstd::initializer_list.
std::unique_ptr< ProgressDialog > MakeProgress(const TranslatableString &title, const TranslatableString &message, unsigned flags=(ProgressShowStop|ProgressShowCancel), const TranslatableString &remainingLabelText={})
Create and display a progress dialog.
AUDACITY_DLL_API bool DoEffect(const PluginID &ID, const CommandContext &context, unsigned flags)
'Repeat Last Effect'.
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for, if Traits<Type>::iterated_type is defined.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for, if Traits<Type>::iterated_type is defined.
PROJECT_RATE_API sampleFormat SampleFormatChoice()
std::unique_ptr< BaseItem > BaseItemPtr
std::shared_ptr< BaseItem > BaseItemSharedPtr
void DoTrackMute(AudacityProject &project, Track *t, bool exclusive)
void DoMoveTrack(AudacityProject &project, Track *target, MoveChoice choice)
Move a track up, down, to top or to bottom.
void DoTrackSolo(AudacityProject &project, Track *t, bool exclusive)
void DoRemoveTrack(AudacityProject &project, Track *toRemove)
void DoRemoveTracks(AudacityProject &project)
void OnSortTime(const CommandContext &context)
void OnStereoToMono(const CommandContext &context)
void OnMuteSelectedTracks(const CommandContext &context)
void OnTrackGain(const CommandContext &context)
void OnTrackPanRight(const CommandContext &context)
void OnTrackMenu(const CommandContext &context)
void OnTrackMoveBottom(const CommandContext &context)
void OnPanCenter(const CommandContext &context)
void OnTrackMoveDown(const CommandContext &context)
void OnAlignNoSync(const CommandContext &context)
void OnTrackGainDec(const CommandContext &context)
void OnMixAndRenderToNewTrack(const CommandContext &context)
void OnMoveSelectionWithTracks(const CommandContext &WXUNUSED(context))
void OnTrackGainInc(const CommandContext &context)
void OnUnmuteSelectedTracks(const CommandContext &context)
void OnResample(const CommandContext &context)
void OnTrackPan(const CommandContext &context)
void OnTrackSolo(const CommandContext &context)
void OnTrackClose(const CommandContext &context)
void OnSortName(const CommandContext &context)
void OnPanRight(const CommandContext &context)
void OnSyncLock(const CommandContext &context)
void OnAlign(const CommandContext &context)
void OnTrackMute(const CommandContext &context)
void OnPanLeft(const CommandContext &context)
void OnTrackPanLeft(const CommandContext &context)
void OnUnmuteAllTracks(const CommandContext &context)
static void MuteTracks(const CommandContext &context, bool mute, bool selected)
void OnMixAndRender(const CommandContext &context)
void OnTrackMoveUp(const CommandContext &context)
void OnMuteAllTracks(const CommandContext &context)
void OnRemoveTracks(const CommandContext &context)
void OnTrackMoveTop(const CommandContext &context)