1 /*
2  * beatmap.h
3  *
4  *  Created on: 08/dic/2011
5  *      Author: vittorio
6  */
7 
8 #pragma once
9 
10 #include "proto/beats.pb.h"
11 #include "track/beats.h"
12 
13 #define BEAT_MAP_VERSION "BeatMap-1.0"
14 
15 class Track;
16 
17 typedef QList<mixxx::track::io::Beat> BeatList;
18 
19 namespace mixxx {
20 
21 class BeatMap final : public Beats {
22   public:
23 
24     ~BeatMap() override = default;
25 
26     static BeatsPointer makeBeatMap(
27             audio::SampleRate sampleRate,
28             const QString& subVersion,
29             const QByteArray& byteArray);
30 
31     static BeatsPointer makeBeatMap(
32             audio::SampleRate sampleRate,
33             const QString& subVersion,
34             const QVector<double>& beats);
35 
getCapabilities()36     Beats::CapabilitiesFlags getCapabilities() const override {
37         return BEATSCAP_TRANSLATE | BEATSCAP_SCALE | BEATSCAP_ADDREMOVE |
38                 BEATSCAP_MOVEBEAT;
39     }
40 
41     QByteArray toByteArray() const override;
42     QString getVersion() const override;
43     QString getSubVersion() const override;
44 
45     ////////////////////////////////////////////////////////////////////////////
46     // Beat calculations
47     ////////////////////////////////////////////////////////////////////////////
48 
49     double findNextBeat(double dSamples) const override;
50     double findPrevBeat(double dSamples) const override;
51     bool findPrevNextBeats(double dSamples,
52                            double* dpPrevBeatSamples,
53                            double* dpNextBeatSamples) const override;
54     double findClosestBeat(double dSamples) const override;
55     double findNthBeat(double dSamples, int n) const override;
56     std::unique_ptr<BeatIterator> findBeats(double startSample, double stopSample) const override;
57     bool hasBeatInRange(double startSample, double stopSample) const override;
58 
59     double getBpm() const override;
60     double getBpmAroundPosition(double curSample, int n) const override;
61 
getSampleRate()62     audio::SampleRate getSampleRate() const override {
63         return m_sampleRate;
64     }
65 
66     ////////////////////////////////////////////////////////////////////////////
67     // Beat mutations
68     ////////////////////////////////////////////////////////////////////////////
69 
70     BeatsPointer translate(double dNumSamples) const override;
71     BeatsPointer scale(enum BPMScale scale) const override;
72     BeatsPointer setBpm(double dBpm) override;
73 
74   private:
75     BeatMap(audio::SampleRate sampleRate,
76             const QString& subVersion,
77             BeatList beats,
78             double nominalBpm);
79     // Constructor to update the beat map
80     BeatMap(const BeatMap& other, BeatList beats, double nominalBpm);
81     BeatMap(const BeatMap& other);
82 
83     // For internal use only.
84     bool isValid() const;
85 
86     const QString m_subVersion;
87     const audio::SampleRate m_sampleRate;
88     const double m_nominalBpm;
89     const BeatList m_beats;
90 };
91 
92 } // namespace mixxx
93