20#include <wx/wxcrtvararg.h>
28#define TIMETRACK_MIN 0.01
29#define TIMETRACK_MAX 10.0
38 return _(
"Time Track");
44 auto result =
tracks.Add(std::make_shared<TimeTrack>());
45 result->AttachedTrackObjects::BuildAll();
70 const std::optional<double>& oldTempo,
double newTempo)
73 if (!oldTempo.has_value())
75 const auto ratio = *oldTempo / newTempo;
80 double *pT0,
double *pT1
159 std::shared_ptr<TimeTrack> pNewTrack;
162 pNewTrack = pTrack->SharedPointer<
TimeTrack>();
164 pNewTrack = std::make_shared<TimeTrack>();
171 pNewTrack->CleanState();
172 pNewTrack->Init(*
this);
173 pNewTrack->Paste(0.0, *
this);
182 auto result =
Copy(t0, t1,
false);
197 if (
auto pList = track.
GetOwner()) {
198 if (
auto pProject = pList->GetOwner())
208 auto sampleTime = 1.0 /
GetRate(*
this);
209 mEnvelope->CollapseRegion( t0, t1, sampleTime );
215 auto sampleTime = 1.0 /
GetRate(*
this);
216 mEnvelope->PasteEnvelope(t, tt.mEnvelope.get(), sampleTime);
251 mEnvelope->SetExponential(interpolateLog);
256 if (tag ==
"timetrack") {
261 for (
auto pair : attrs)
263 auto attr = pair.first;
264 auto value = pair.second;
268 else if (attr ==
"rangelower")
273 else if (attr ==
"rangeupper")
278 else if (attr ==
"displaylog" && value.TryGet(nValue))
284 else if (attr ==
"interpolatelog" && value.TryGet(nValue))
310 if (tag ==
"envelope")
320 xmlFile.StartTag(
wxT(
"timetrack"));
325 xmlFile.WriteAttr(
wxT(
"rangelower"), GetRangeLower(), 12);
326 xmlFile.WriteAttr(
wxT(
"rangeupper"), GetRangeUpper(), 12);
327 xmlFile.WriteAttr(
wxT(
"displaylog"), GetDisplayLog());
328 xmlFile.WriteAttr(
wxT(
"interpolatelog"), GetInterpolateLog());
330 mEnvelope->WriteXML(xmlFile);
332 xmlFile.EndTag(
wxT(
"timetrack"));
340std::shared_ptr<WideChannelGroupInterval>
355 double expected1 = (5.0 - 2.0) * 0.2 + (13.0 - 5.0) * 1.3;
357 double expected2 = (5.0 - 2.0) / 0.2 + (13.0 - 5.0) / 1.3;
358 if( fabs(value1 - expected1) > 0.01 )
360 wxPrintf(
"TimeTrack: Integral failed! expected %f got %f\n", expected1, value1);
362 if( fabs(value2 - expected2) > 0.01 )
364 wxPrintf(
"TimeTrack: IntegralOfInverse failed! expected %f got %f\n", expected2, value2);
385 if (
auto pTimeTrack = *list.Any<
const TimeTrack>().begin())
386 return pTimeTrack->GetEnvelope();
an object holding per-project preferred sample rate
static Mixer::WarpOptions::DefaultWarp::Scope installer
Installer of the time warper.
static ProjectFileIORegistry::ObjectReaderEntry readerEntry
static const Track::TypeInfo & typeInfo()
std::function< void(double)> ProgressReporter
std::shared_ptr< TrackList > TrackListHolder
std::vector< Attribute > AttributesList
The top-level handle to an Audacity project. It serves as a source of events that other objects can b...
double Integral(double t0, double t1) const
int InsertOrReplace(double when, double value)
Add a point at a particular absolute time coordinate.
double IntegralOfInverse(double t0, double t1) const
void Flatten(double value)
typename GlobalVariable< DefaultWarp, const std::function< const BoundedEnvelope * >, nullptr, Options... >::Scope Scope
static ProjectRate & Get(AudacityProject &project)
A kind of Track used to 'warp time'.
static wxString GetDefaultName()
std::shared_ptr< WideChannelGroupInterval > DoGetInterval(size_t iInterval) override
Retrieve an interval.
void WriteXML(XMLWriter &xmlFile) const override
void SetInterpolateLog(bool interpolateLog)
void HandleXMLEndTag(const std::string_view &tag) override
void Paste(double t, const Track &src) override
Weak precondition allows overrides to replicate one channel into many.
static const TypeInfo & ClassTypeInfo()
Track::Holder PasteInto(AudacityProject &project, TrackList &list) const override
void DoOnProjectTempoChange(const std::optional< double > &oldTempo, double newTempo) override
void SetDisplayLog(bool displayLog)
void Silence(double t0, double t1, ProgressReporter reportProgress={}) override
std::unique_ptr< BoundedEnvelope > mEnvelope
bool GetInterpolateLog() const
bool HandleXMLTag(const std::string_view &tag, const AttributesList &attrs) override
XMLTagHandler * HandleXMLChild(const std::string_view &tag) override
TrackListHolder Clone() const override
BoundedEnvelope * GetEnvelope()
bool GetDisplayLog() const
size_t NIntervals() const override
Report the number of intervals.
void InsertSilence(double t, double len) override
const TypeInfo & GetTypeInfo() const override
void SetRangeLower(double lower)
TrackListHolder Cut(double t0, double t1) override
Create tracks and modify this track.
static TimeTrack * New(AudacityProject &project)
TrackListHolder Copy(double t0, double t1, bool forClipboard) const override
Create new tracks and don't modify this track.
double GetRangeLower() const
double GetRangeUpper() const
void Clear(double t0, double t1) override
bool SupportsBasicEditing() const override
Whether this track type implements cut-copy-paste; by default, true.
void Init(const TimeTrack &orig)
Copy the metadata from another track but not the points.
void SetRangeUpper(double upper)
Abstract base class for an object holding data associated with points on a time axis.
static const TypeInfo & ClassTypeInfo()
std::shared_ptr< TrackList > GetOwner() const
R TypeSwitch(const Functions &...functions)
bool IsLeader() const override
std::shared_ptr< Track > Holder
bool HandleCommonXMLAttribute(const std::string_view &attr, const XMLAttributeValueView &valueView)
const wxString & GetName() const
Name is always the same for all channels of a group.
void Init(const Track &orig)
void WriteCommonXMLAttributes(XMLWriter &xmlFile, bool includeNameAndSelected=true) const
void SetName(const wxString &n)
A flat linked list of tracks supporting Add, Remove, Clear, and Contains, serialization of the list o...
TrackKind * Add(const std::shared_ptr< TrackKind > &t)
static TrackList & Get(AudacityProject &project)
static TrackListHolder Temporary(AudacityProject *pProject, const Track::Holder &left={}, const Track::Holder &right={})
Generates overrides of channel-related functions.
This class is an interface which should be implemented by classes which wish to be able to load and s...
Base class for XMLFileWriter and XMLStringWriter that provides the general functionality for creating...
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
double GetRate(const Track &track)
Empty argument passed to some public constructors.