Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #ifndef MU_ENGRAVING_DURATION_H
24 : #define MU_ENGRAVING_DURATION_H
25 :
26 : #include "engravingitem.h"
27 : #include "durationtype.h"
28 :
29 : namespace mu::engraving {
30 : class Beam;
31 : class Tuplet;
32 :
33 : //---------------------------------------------------------
34 : // @@ DurationElement
35 : /// Virtual base class for Chord, Rest and Tuplet.
36 : //
37 : // @P duration Fraction duration (as written)
38 : // @P globalDuration Fraction played duration
39 : //---------------------------------------------------------
40 :
41 : class DurationElement : public EngravingItem
42 : {
43 0 : OBJECT_ALLOCATOR(engraving, DurationElement)
44 : public:
45 : ~DurationElement();
46 :
47 0 : virtual Measure* measure() const { return (Measure*)(ownershipParent()); }
48 :
49 : void readAddTuplet(Tuplet* t);
50 :
51 : void setTuplet(Tuplet* t);
52 2385380 : Tuplet* tuplet() const { return m_tuplet; }
53 : Tuplet* topTuplet() const;
54 0 : virtual Beam* beam() const { return nullptr; }
55 :
56 : Fraction actualTicksAt(const Fraction& tick) const;
57 : Fraction actualTicks() const;
58 :
59 124341 : Fraction endTick() const { return tick() + actualTicks(); }
60 :
61 : // Length expressed as a fraction of a whole note
62 345478 : virtual Fraction ticks() const { return m_duration; }
63 : Fraction globalTicks() const;
64 : float timeStretchFactor() const;
65 70071 : void setTicks(const Fraction& f) { m_duration = f; }
66 :
67 : PropertyValue getProperty(Pid propertyId) const override;
68 : bool setProperty(Pid propertyId, const PropertyValue&) override;
69 :
70 : protected:
71 : DurationElement(const ElementType& type, EngravingObject* parent = nullptr,
72 : ElementFlags = ElementFlag::MOVABLE | ElementFlag::ON_STAFF);
73 : DurationElement(const DurationElement& e, bool link = false);
74 :
75 : private:
76 : Fraction m_duration;
77 : Tuplet* m_tuplet = nullptr;
78 : };
79 : } // namespace mu::engraving
80 :
81 : #endif
|