tracktion-engine 3.0-10-g034fdde4aa5
Tracktion Engine — High level data model for audio applications

« « « Anklang Documentation
Loading...
Searching...
No Matches
tracktion_Time.h
Go to the documentation of this file.
1 /*
2 ,--. ,--. ,--. ,--.
3 ,-' '-.,--.--.,--,--.,---.| |,-.,-' '-.`--' ,---. ,--,--, Copyright 2024
4 '-. .-'| .--' ,-. | .--'| /'-. .-',--.| .-. || \ Tracktion Software
5 | | | | \ '-' \ `--.| \ \ | | | |' '-' '| || | Corporation
6 `---' `--' `--`--'`---'`--'`--' `---' `--' `---' `--''--' www.tracktion.com
7
8 Tracktion Engine uses a GPL/commercial licence - see LICENCE.md for details.
9*/
10
11#pragma once
12
13#include <chrono>
14#include <cstdlib>
15#include <juce_core/juce_core.h>
16
17namespace tracktion { inline namespace core
18{
19
20struct TimeDuration;
21struct BeatDuration;
22
23//==============================================================================
24//==============================================================================
30{
33
35 constexpr TimePosition() = default;
36
38 constexpr TimePosition (const TimePosition&) = default;
39
43 template<typename Type>
45
49 template<typename T1, typename T2>
51
53 constexpr TimePosition& operator= (const TimePosition&) = default;
54
56 template<typename T>
57 static constexpr TimePosition fromSeconds (T positionInSeconds);
58
60 template<typename IntType>
61 static constexpr TimePosition fromSamples (IntType numSamples, double sampleRate);
62
64 constexpr double inSeconds() const;
65
66private:
67 double seconds = 0.0;
68};
69
71[[ nodiscard ]] constexpr TimePosition operator- (TimePosition);
72
74[[ nodiscard ]] constexpr TimeDuration toDuration (TimePosition);
75
77[[ nodiscard ]] constexpr int64_t toSamples (TimePosition, double sampleRate);
78
80[[ nodiscard ]] TimePosition abs (TimePosition);
81
82inline namespace literals
83{
85[[ nodiscard ]] constexpr TimePosition operator""_tp (long double seconds);
86
88[[ nodiscard ]] constexpr TimePosition operator""_tp (unsigned long long seconds);
89}
90
91
92//==============================================================================
93//==============================================================================
99{
101 constexpr TimeDuration() = default;
102
104 constexpr TimeDuration (const TimeDuration&) = default;
105
109 template<typename Type>
111
115 template<typename T1, typename T2>
117
119 constexpr TimeDuration& operator= (const TimeDuration&) = default;
120
122 template<typename T>
123 static constexpr TimeDuration fromSeconds (T positionInSeconds);
124
126 template<typename IntType>
127 static constexpr TimeDuration fromSamples (IntType numSamples, double sampleRate);
128
130 constexpr double inSeconds() const;
131
132private:
133 double seconds = 0.0;
134};
135
137[[ nodiscard ]] constexpr TimeDuration operator- (TimeDuration);
138
140[[ nodiscard ]] constexpr TimePosition toPosition (TimeDuration);
141
143[[ nodiscard ]] constexpr int64_t toSamples (TimeDuration, double sampleRate);
144
146[[ nodiscard ]] TimeDuration abs (TimeDuration);
147
148inline namespace literals
149{
151[[ nodiscard ]] constexpr TimeDuration operator""_td (long double seconds);
152
154[[ nodiscard ]] constexpr TimeDuration operator""_td (unsigned long long seconds);
155}
156
157//==============================================================================
159[[ nodiscard ]] constexpr TimeDuration operator+ (const TimeDuration&, const TimeDuration&);
160
162template<typename Type>
163[[ nodiscard ]] constexpr TimeDuration operator+ (const TimeDuration&, std::chrono::duration<Type>);
164
166[[ nodiscard ]] constexpr TimePosition operator+ (const TimePosition&, const TimeDuration&);
167
169template<typename Type>
170[[ nodiscard ]] constexpr TimePosition operator+ (const TimePosition&, std::chrono::duration<Type>);
171
173[[ nodiscard ]] constexpr TimeDuration operator- (const TimePosition&, const TimePosition&);
174
176[[ nodiscard ]] constexpr TimeDuration operator- (const TimeDuration&, const TimeDuration&);
177
179template<typename Type>
180[[ nodiscard ]] constexpr TimeDuration operator- (const TimeDuration&, std::chrono::duration<Type>);
181
183[[ nodiscard ]] constexpr TimePosition operator- (const TimePosition&, const TimeDuration&);
184
186template<typename Type>
187[[ nodiscard ]] constexpr TimePosition operator- (const TimePosition&, std::chrono::duration<Type>);
188
190[[ nodiscard ]] constexpr TimePosition operator* (const TimePosition&, double);
191
193[[ nodiscard ]] constexpr TimePosition operator/ (const TimePosition&, double);
194
196[[ nodiscard ]] constexpr TimeDuration operator* (const TimeDuration&, double);
197
199[[ nodiscard ]] constexpr TimeDuration operator/ (const TimeDuration&, double);
200
202[[ nodiscard ]] constexpr double operator/ (const TimePosition&, const TimeDuration&);
203
205[[ nodiscard ]] constexpr double operator/ (const TimeDuration&, const TimeDuration&);
206
207//==============================================================================
209[[ nodiscard ]] constexpr bool operator== (const TimePosition&, const TimePosition&);
210
212[[ nodiscard ]] constexpr bool operator!= (const TimePosition&, const TimePosition&);
213
215[[ nodiscard ]] constexpr bool operator== (const TimeDuration&, const TimeDuration&);
216
218[[ nodiscard ]] constexpr bool operator!= (const TimeDuration&, const TimeDuration&);
219
221[[ nodiscard ]] constexpr bool operator< (const TimePosition&, const TimePosition&);
222
224[[ nodiscard ]] constexpr bool operator<= (const TimePosition&, const TimePosition&);
225
227[[ nodiscard ]] constexpr bool operator> (const TimePosition&, const TimePosition&);
228
230[[ nodiscard ]] constexpr bool operator>= (const TimePosition&, const TimePosition&);
231
233[[ nodiscard ]] constexpr bool operator< (const TimeDuration&, const TimeDuration&);
234
236[[ nodiscard ]] constexpr bool operator<= (const TimeDuration&, const TimeDuration&);
237
239[[ nodiscard ]] constexpr bool operator> (const TimeDuration&, const TimeDuration&);
240
242[[ nodiscard ]] constexpr bool operator>= (const TimeDuration&, const TimeDuration&);
243
244
245//==============================================================================
246//==============================================================================
255{
258
260 constexpr BeatPosition() = default;
261
263 constexpr BeatPosition (const BeatPosition&) = default;
264
266 constexpr BeatPosition& operator= (const BeatPosition&) = default;
267
269 template<typename T>
270 static constexpr BeatPosition fromBeats (T positionInBeats);
271
273 constexpr double inBeats() const;
274
275private:
276 double numBeats = 0.0;
277};
278
280[[ nodiscard ]] constexpr BeatPosition operator- (BeatPosition);
281
283[[ nodiscard ]] constexpr BeatDuration toDuration (BeatPosition);
284
287
289[[ nodiscard ]] BeatPosition abs (BeatPosition);
290
291inline namespace literals
292{
294[[ nodiscard ]] constexpr BeatPosition operator""_bp (long double beats);
295
297[[ nodiscard ]] constexpr BeatPosition operator""_bp (unsigned long long beats);
298}
299
300//==============================================================================
301//==============================================================================
310{
312 constexpr BeatDuration() = default;
313
315 constexpr BeatDuration (const BeatDuration&) = default;
316
318 constexpr BeatDuration& operator= (const BeatDuration&) = default;
319
321 template<typename T>
322 static constexpr BeatDuration fromBeats (T durationInBeats);
323
325 constexpr double inBeats() const;
326
327private:
328 double numBeats = 0.0;
329};
330
332[[ nodiscard ]] constexpr BeatDuration operator- (BeatDuration);
333
335[[ nodiscard ]] constexpr BeatPosition toPosition (BeatDuration);
336
339
341[[ nodiscard ]] BeatDuration abs (BeatDuration);
342
343inline namespace literals
344{
346[[ nodiscard ]] constexpr BeatDuration operator""_bd (long double beats);
347
349[[ nodiscard ]] constexpr BeatDuration operator""_bd (unsigned long long beats);
350}
351
352//==============================================================================
354[[ nodiscard ]] constexpr BeatDuration operator+ (const BeatDuration&, const BeatDuration&);
355
357[[ nodiscard ]] constexpr BeatPosition operator+ (const BeatPosition&, const BeatDuration&);
358
360[[ nodiscard ]] constexpr BeatDuration operator- (const BeatPosition&, const BeatPosition&);
361
363[[ nodiscard ]] constexpr BeatDuration operator- (const BeatDuration&, const BeatDuration&);
364
366[[ nodiscard ]] constexpr BeatPosition operator- (const BeatPosition&, const BeatDuration&);
367
369template<typename Type>
370[[ nodiscard ]] constexpr BeatPosition operator* (const BeatPosition&, Type);
371
373[[ nodiscard ]] constexpr BeatPosition operator/ (const BeatPosition&, double);
374
376template<typename Type>
377[[ nodiscard ]] constexpr BeatDuration operator* (const BeatDuration&, Type);
378
380[[ nodiscard ]] constexpr BeatDuration operator/ (const BeatDuration&, double);
381
383[[ nodiscard ]] constexpr double operator/ (const BeatPosition&, const BeatDuration&);
384
386[[ nodiscard ]] constexpr double operator/ (const BeatDuration&, const BeatDuration&);
387
388//==============================================================================
390[[ nodiscard ]] constexpr bool operator== (const BeatPosition&, const BeatPosition&);
391
393[[ nodiscard ]] constexpr bool operator!= (const BeatPosition&, const BeatPosition&);
394
396[[ nodiscard ]] constexpr bool operator== (const BeatDuration&, const BeatDuration&);
397
399[[ nodiscard ]] constexpr bool operator!= (const BeatDuration&, const BeatDuration&);
400
402[[ nodiscard ]] constexpr bool operator< (const BeatPosition&, const BeatPosition&);
403
405[[ nodiscard ]] constexpr bool operator<= (const BeatPosition&, const BeatPosition&);
406
408[[ nodiscard ]] constexpr bool operator> (const BeatPosition&, const BeatPosition&);
409
411[[ nodiscard ]] constexpr bool operator>= (const BeatPosition&, const BeatPosition&);
412
414[[ nodiscard ]] constexpr bool operator< (const BeatDuration&, const BeatDuration&);
415
417[[ nodiscard ]] constexpr bool operator<= (const BeatDuration&, const BeatDuration&);
418
420[[ nodiscard ]] constexpr bool operator> (const BeatDuration&, const BeatDuration&);
421
423[[ nodiscard ]] constexpr bool operator>= (const BeatDuration&, const BeatDuration&);
424
425
426//==============================================================================
427// _ _ _ _
428// __| | ___ | |_ __ _ (_)| | ___
429// / _` | / _ \| __| / _` || || |/ __|
430// | (_| || __/| |_ | (_| || || |\__ \ _ _ _
431// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_)
432//
433// Code beyond this point is implementation detail...
434//
435//==============================================================================
436
437template<typename Type>
439 : seconds (std::chrono::duration<double> (duration).count())
440{
441}
442
443template<typename T1, typename T2>
445 : seconds (std::chrono::duration<double> (duration).count())
446{
447}
448
449template<typename T>
450inline constexpr TimePosition TimePosition::fromSeconds (T positionInSeconds)
451{
452 TimePosition pos;
453 pos.seconds = static_cast<double> (positionInSeconds);
454 return pos;
455}
456
457template<typename IntType>
458inline constexpr TimePosition TimePosition::fromSamples (IntType samplePosition, double sampleRate)
459{
460 return TimePosition::fromSeconds (samplePosition / sampleRate);
461}
462
463inline constexpr double TimePosition::inSeconds() const
464{
465 return seconds;
466}
467
468inline constexpr TimePosition operator- (TimePosition t)
469{
470 return TimePosition::fromSeconds (-t.inSeconds());
471}
472
474{
475 return TimeDuration::fromSeconds (t.inSeconds());
476}
477
478inline constexpr int64_t toSamples (TimePosition p, double sampleRate)
479{
480 return static_cast<int64_t> ((p.inSeconds() * sampleRate)
481 + (p.inSeconds() >= 0.0 ? 0.5 : -0.5));
482}
483
485{
486 return TimePosition::fromSeconds (std::abs (t.inSeconds()));
487}
488
489inline namespace literals
490{
491inline constexpr TimePosition operator""_tp (long double seconds)
492{
493 return TimePosition::fromSeconds (seconds);
494}
495
496inline constexpr TimePosition operator""_tp (unsigned long long seconds)
497{
498 return TimePosition::fromSeconds (seconds);
499}
500}
501
502//==============================================================================
503template<typename Type>
505 : seconds (std::chrono::duration<double> (duration).count())
506{
507}
508
509template<typename T1, typename T2>
511 : seconds (std::chrono::duration<double> (duration).count())
512{
513}
514
515template<typename T>
516inline constexpr TimeDuration TimeDuration::fromSeconds (T positionInSeconds)
517{
518 TimeDuration pos;
519 pos.seconds = static_cast<double> (positionInSeconds);
520 return pos;
521}
522
523template<typename IntType>
524inline constexpr TimeDuration TimeDuration::fromSamples (IntType samplePosition, double sampleRate)
525{
526 return TimeDuration::fromSeconds (samplePosition / sampleRate);
527}
528
529inline constexpr double TimeDuration::inSeconds() const
530{
531 return seconds;
532}
533
534inline constexpr TimeDuration operator- (TimeDuration t)
535{
536 return TimeDuration::fromSeconds (-t.inSeconds());
537}
538
540{
541 return TimePosition::fromSeconds (t.inSeconds());
542}
543
544inline constexpr int64_t toSamples (TimeDuration p, double sampleRate)
545{
546 return static_cast<int64_t> ((p.inSeconds() * sampleRate)
547 + (p.inSeconds() >= 0.0 ? 0.5 : -0.5));
548}
549
551{
552 return TimeDuration::fromSeconds (std::abs (t.inSeconds()));
553}
554
555inline namespace literals
556{
557inline constexpr TimeDuration operator""_td (long double seconds)
558{
559 return TimeDuration::fromSeconds (seconds);
560}
561
562inline constexpr TimeDuration operator""_td (unsigned long long seconds)
563{
564 return TimeDuration::fromSeconds (seconds);
565}
566}
567
568//==============================================================================
569inline constexpr TimeDuration operator+ (const TimeDuration& t1, const TimeDuration& t2)
570{
571 return TimeDuration::fromSeconds (t1.inSeconds() + t2.inSeconds());
572}
573
574inline constexpr TimePosition operator+ (const TimePosition& t1, const TimeDuration& t2)
575{
576 return TimePosition::fromSeconds (t1.inSeconds() + t2.inSeconds());
577}
578
579inline constexpr TimeDuration operator- (const TimePosition& t1, const TimePosition& t2)
580{
581 return TimeDuration::fromSeconds (t1.inSeconds() - t2.inSeconds());
582}
583
584inline constexpr TimeDuration operator- (const TimeDuration& t1, const TimeDuration& t2)
585{
586 return TimeDuration::fromSeconds (t1.inSeconds() - t2.inSeconds());
587}
588
589inline constexpr TimePosition operator- (const TimePosition& t1, const TimeDuration& t2)
590{
591 return TimePosition::fromSeconds (t1.inSeconds() - t2.inSeconds());
592}
593
594template<typename Type>
595inline constexpr TimeDuration operator+ (const TimeDuration& t1, std::chrono::duration<Type> t2)
596{
598}
599
600template<typename Type>
601inline constexpr TimePosition operator+ (const TimePosition& t1, std::chrono::duration<Type> t2)
602{
604}
605
606template<typename Type>
607inline constexpr TimeDuration operator- (const TimeDuration& t1, std::chrono::duration<Type> t2)
608{
610}
611
612template<typename Type>
613inline constexpr TimePosition operator- (const TimePosition& t1, std::chrono::duration<Type> t2)
614{
616}
617
618inline constexpr TimePosition operator* (const TimePosition& t, double ammount)
619{
620 return TimePosition::fromSeconds (t.inSeconds() * ammount);
621}
622
623inline constexpr TimePosition operator/ (const TimePosition& t, double ammount)
624{
625 return TimePosition::fromSeconds (t.inSeconds() / ammount);
626}
627
628inline constexpr TimeDuration operator* (const TimeDuration& t, double ammount)
629{
630 return TimeDuration::fromSeconds (t.inSeconds() * ammount);
631}
632
633inline constexpr TimeDuration operator/ (const TimeDuration& t, double ammount)
634{
635 return TimeDuration::fromSeconds (t.inSeconds() / ammount);
636}
637
638inline constexpr double operator/ (const TimePosition& t1, const TimeDuration& t2)
639{
640 return t1.inSeconds() / t2.inSeconds();
641}
642
643inline constexpr double operator/ (const TimeDuration& t1, const TimeDuration& t2)
644{
645 return t1.inSeconds() / t2.inSeconds();
646}
647
648inline constexpr bool operator== (const TimePosition& t1, const TimePosition& t2) { return t1.inSeconds() == t2.inSeconds(); }
649inline constexpr bool operator!= (const TimePosition& t1, const TimePosition& t2) { return ! (t1 == t2); }
650
651inline constexpr bool operator== (const TimeDuration& t1, const TimeDuration& t2) { return t1.inSeconds() == t2.inSeconds(); }
652inline constexpr bool operator!= (const TimeDuration& t1, const TimeDuration& t2) { return ! (t1 == t2); }
653
654inline constexpr bool operator< (const TimePosition& t1, const TimePosition& t2) { return t1.inSeconds() < t2.inSeconds(); }
655inline constexpr bool operator<= (const TimePosition& t1, const TimePosition& t2) { return t1.inSeconds() <= t2.inSeconds(); }
656inline constexpr bool operator> (const TimePosition& t1, const TimePosition& t2) { return t1.inSeconds() > t2.inSeconds(); }
657inline constexpr bool operator>= (const TimePosition& t1, const TimePosition& t2) { return t1.inSeconds() >= t2.inSeconds(); }
658
659inline constexpr bool operator< (const TimeDuration& t1, const TimeDuration& t2) { return t1.inSeconds() < t2.inSeconds(); }
660inline constexpr bool operator<= (const TimeDuration& t1, const TimeDuration& t2) { return t1.inSeconds() <= t2.inSeconds(); }
661inline constexpr bool operator> (const TimeDuration& t1, const TimeDuration& t2) { return t1.inSeconds() > t2.inSeconds(); }
662inline constexpr bool operator>= (const TimeDuration& t1, const TimeDuration& t2) { return t1.inSeconds() >= t2.inSeconds(); }
663
664//==============================================================================
665template<typename T>
666inline constexpr BeatPosition BeatPosition::fromBeats (T positionInBeats)
667{
668 BeatPosition pos;
669 pos.numBeats = static_cast<double> (positionInBeats);
670 return pos;
671}
672
673inline constexpr double BeatPosition::inBeats() const
674{
675 return numBeats;
676}
677
679{
680 return BeatPosition::fromBeats (std::abs (t.inBeats()));
681}
682
683inline namespace literals
684{
685inline constexpr BeatPosition operator""_bp (long double beats)
686{
687 return BeatPosition::fromBeats (beats);
688}
689
690inline constexpr BeatPosition operator""_bp (unsigned long long beats)
691{
692 return BeatPosition::fromBeats (beats);
693}
694}
695
696
697//==============================================================================
698//==============================================================================
699template<typename T>
700inline constexpr BeatDuration BeatDuration::fromBeats (T durationInBeats)
701{
702 BeatDuration pos;
703 pos.numBeats = static_cast<double> (durationInBeats);
704 return pos;
705}
706
707inline constexpr double BeatDuration::inBeats() const
708{
709 return numBeats;
710}
711
713{
714 return BeatDuration::fromBeats (t.inBeats());
715}
716
721
726
728{
729 return BeatDuration::fromBeats (std::abs (t.inBeats()));
730}
731
732inline namespace literals
733{
734inline constexpr BeatDuration operator""_bd (long double beats)
735{
736 return BeatDuration::fromBeats (beats);
737}
738
739inline constexpr BeatDuration operator""_bd (unsigned long long beats)
740{
741 return BeatDuration::fromBeats (beats);
742}
743}
744
746{
747 return BeatPosition::fromBeats (t.inBeats());
748}
749
750constexpr BeatPosition operator- (BeatPosition t)
751{
752 return BeatPosition::fromBeats (-t.inBeats());
753}
754
755constexpr BeatDuration operator- (BeatDuration t)
756{
757 return BeatDuration::fromBeats (-t.inBeats());
758}
759
760//==============================================================================
761inline constexpr BeatDuration operator+ (const BeatDuration& t1, const BeatDuration& t2)
762{
763 return BeatDuration::fromBeats (t1.inBeats() + t2.inBeats());
764}
765
766inline constexpr BeatPosition operator+ (const BeatPosition& t1, const BeatDuration& t2)
767{
768 return BeatPosition::fromBeats (t1.inBeats() + t2.inBeats());
769}
770
771inline constexpr BeatDuration operator- (const BeatPosition& t1, const BeatPosition& t2)
772{
773 return BeatDuration::fromBeats (t1.inBeats() - t2.inBeats());
774}
775
776inline constexpr BeatDuration operator- (const BeatDuration& t1, const BeatDuration& t2)
777{
778 return BeatDuration::fromBeats (t1.inBeats() - t2.inBeats());
779}
780
781inline constexpr BeatPosition operator- (const BeatPosition& t1, const BeatDuration& t2)
782{
783 return BeatPosition::fromBeats (t1.inBeats() - t2.inBeats());
784}
785
786template<typename Type>
787inline constexpr BeatPosition operator* (const BeatPosition& t, Type ammount)
788{
789 return BeatPosition::fromBeats (t.inBeats() * static_cast<double> (ammount));
790}
791
792inline constexpr BeatPosition operator/ (const BeatPosition& t, double ammount)
793{
794 return BeatPosition::fromBeats (t.inBeats() / ammount);
795}
796
797template<typename Type>
798inline constexpr BeatDuration operator* (const BeatDuration& t, Type ammount)
799{
800 return BeatDuration::fromBeats (t.inBeats() * static_cast<double> (ammount));
801}
802
803inline constexpr BeatDuration operator/ (const BeatDuration& t, double ammount)
804{
805 return BeatDuration::fromBeats (t.inBeats() / ammount);
806}
807
808inline constexpr double operator/ (const BeatPosition& t1, const BeatDuration& t2)
809{
810 return t1.inBeats() / t2.inBeats();
811}
812
813inline constexpr double operator/ (const BeatDuration& t1, const BeatDuration& t2)
814{
815 return t1.inBeats() / t2.inBeats();
816}
817
818inline constexpr bool operator== (const BeatPosition& t1, const BeatPosition& t2) { return t1.inBeats() == t2.inBeats(); }
819inline constexpr bool operator!= (const BeatPosition& t1, const BeatPosition& t2) { return ! (t1 == t2); }
820
821inline constexpr bool operator== (const BeatDuration& t1, const BeatDuration& t2) { return t1.inBeats() == t2.inBeats(); }
822inline constexpr bool operator!= (const BeatDuration& t1, const BeatDuration& t2) { return ! (t1 == t2); }
823
824inline constexpr bool operator< (const BeatPosition& t1, const BeatPosition& t2) { return t1.inBeats() < t2.inBeats(); }
825inline constexpr bool operator<= (const BeatPosition& t1, const BeatPosition& t2) { return t1.inBeats() <= t2.inBeats(); }
826inline constexpr bool operator> (const BeatPosition& t1, const BeatPosition& t2) { return t1.inBeats() > t2.inBeats(); }
827inline constexpr bool operator>= (const BeatPosition& t1, const BeatPosition& t2) { return t1.inBeats() >= t2.inBeats(); }
828
829inline constexpr bool operator< (const BeatDuration& t1, const BeatDuration& t2) { return t1.inBeats() < t2.inBeats(); }
830inline constexpr bool operator<= (const BeatDuration& t1, const BeatDuration& t2) { return t1.inBeats() <= t2.inBeats(); }
831inline constexpr bool operator> (const BeatDuration& t1, const BeatDuration& t2) { return t1.inBeats() > t2.inBeats(); }
832inline constexpr bool operator>= (const BeatDuration& t1, const BeatDuration& t2) { return t1.inBeats() >= t2.inBeats(); }
833
834inline juce::String& operator<< (juce::String& s, TimeDuration d) { return s << juce::String (d.inSeconds()); }
835inline juce::String& operator<< (juce::String& s, TimePosition p) { return s << juce::String (p.inSeconds()); }
836inline juce::String& operator<< (juce::String& s, BeatDuration d) { return s << juce::String (d.inBeats()); }
837inline juce::String& operator<< (juce::String& s, BeatPosition p) { return s << juce::String (p.inBeats()); }
838
839inline std::ostream& operator<< (std::ostream& os, const TimeDuration& v) { os << v.inSeconds(); return os; }
840inline std::ostream& operator<< (std::ostream& os, const TimePosition& v) { os << v.inSeconds(); return os; }
841inline std::ostream& operator<< (std::ostream& os, const BeatDuration& v) { os << v.inBeats(); return os; }
842inline std::ostream& operator<< (std::ostream& os, const BeatPosition& v) { os << v.inBeats(); return os; }
843
844}} // namespace tracktion
845
846
847//==============================================================================
848//==============================================================================
849template<>
850struct std::hash<tracktion::TimePosition>
851{
852 std::size_t operator()(const tracktion::TimePosition t) const noexcept
853 {
854 return std::hash<double>{} (t.inSeconds());
855 }
856};
857
858template<>
859struct std::hash<tracktion::TimeDuration>
860{
861 std::size_t operator()(const tracktion::TimeDuration t) const noexcept
862 {
863 return std::hash<double>{} (t.inSeconds());
864 }
865};
866
867template<>
868struct std::hash<tracktion::BeatPosition>
869{
870 std::size_t operator()(const tracktion::BeatPosition t) const noexcept
871 {
872 return std::hash<double>{} (t.inBeats());
873 }
874};
875
876template<>
877struct std::hash<tracktion::BeatDuration>
878{
879 std::size_t operator()(const tracktion::BeatDuration t) const noexcept
880 {
881 return std::hash<double>{} (t.inBeats());
882 }
883};
abs
typedef double
int roundToInt(const FloatType value) noexcept
BeatPosition roundToNearestBeat(BeatPosition)
Rounds a BeatPosition to the nearest whole beat.
constexpr int64_t toSamples(TimePosition, double sampleRate)
Converts a TimePosition to a number of samples.
constexpr TimePosition toPosition(TimeDuration)
Converts a TimeDuration to a TimePosition.
constexpr TimeDuration toDuration(TimePosition)
Converts a TimePosition to a TimeDuration.
T operator()(T... args)
typedef int64_t
Represents a duration in beats.
constexpr BeatDuration & operator=(const BeatDuration &)=default
Creates a copy of another BeatDuration.
constexpr BeatDuration()=default
Creates a position at a beat of 0.
constexpr double inBeats() const
Returns the position as a number of beats.
static constexpr BeatDuration fromBeats(T durationInBeats)
Create a BeatPosition from a number of beats.
constexpr BeatDuration(const BeatDuration &)=default
Creates a copy of another BeatDuration.
Represents a position in beats.
constexpr double inBeats() const
Returns the position as a number of beats.
constexpr BeatPosition()=default
Creates a position at a beat of 0.
static constexpr BeatPosition fromBeats(T positionInBeats)
Create a BeatPosition from a number of beats.
constexpr BeatPosition(const BeatPosition &)=default
Creates a copy of another BeatPosition.
constexpr BeatPosition & operator=(const BeatPosition &)=default
Creates a copy of another BeatPosition.
Represents a duration in real-life time.
constexpr TimeDuration & operator=(const TimeDuration &)=default
Creates a copy of another TimeDuration.
static constexpr TimeDuration fromSeconds(T positionInSeconds)
Create a TimeDuration from a number of seconds.
static constexpr TimeDuration fromSamples(IntType numSamples, double sampleRate)
Create a TimeDuration from a number of samples and a sample rate.
constexpr TimeDuration(const TimeDuration &)=default
Creates a copy of another TimeDuration.
constexpr TimeDuration()=default
Creates a position at a time of 0.
constexpr double inSeconds() const
Returns the TimeDuration as a number of seconds.
Represents a position in real-life time.
constexpr TimePosition & operator=(const TimePosition &)=default
Creates a copy of another TimePosition.
constexpr TimePosition(const TimePosition &)=default
Creates a copy of another TimePosition.
static constexpr TimePosition fromSeconds(T positionInSeconds)
Create a TimePosition from a number of seconds.
constexpr double inSeconds() const
Returns the TimePosition as a number of seconds.
constexpr TimePosition()=default
Creates a position at a time of 0.
static constexpr TimePosition fromSamples(IntType numSamples, double sampleRate)
Create a TimePosition from a number of samples and a sample rate.