LCOV - code coverage report
Current view: top level - src/importexport/guitarpro/internal/gtp - gpnote.h Coverage Total Hit
Test: filtered_coverage.info Lines: 93.8 % 65 61
Test Date: 2026-11-05 04:07:02

            Line data    Source code
       1              : #ifndef MU_IMPORTEXPORT_GPNOTE_H
       2              : #define MU_IMPORTEXPORT_GPNOTE_H
       3              : 
       4              : #include <unordered_set>
       5              : #include <memory>
       6              : #include <bitset>
       7              : 
       8              : #include <global/types/string.h>
       9              : 
      10              : #include "inoteproperty.h"
      11              : 
      12              : namespace mu::iex::guitarpro {
      13              : class GPNote
      14              : {
      15              : public:
      16              :     enum class TieType {
      17              :         None, Start, Mediate, End
      18              :     };
      19              :     enum class VibratoType {
      20              :         None, Slight, Wide
      21              :     };
      22              :     enum class Ornament {
      23              :         None, LowerMordent, UpperMordent, InvertedTurn, Turn
      24              :     };
      25              :     enum class HammerOn {
      26              :         None, Start, End
      27              :     };
      28              : 
      29              :     enum class PickScrape {
      30              :         None, Down, Up
      31              :     };
      32              : 
      33              :     struct Harmonic {
      34              :         enum class Type {
      35              :             None, Natural, Artificial, Pinch, Tap, Semi, FeedBack, Types
      36              :         };
      37              :         float fret{ 0 };
      38              :         Type type{ Type::None };
      39              : 
      40           49 :         static bool isArtificial(Type type)
      41              :         {
      42              :             return type == Type::Artificial
      43           23 :                    || type == Type::Pinch
      44           21 :                    || type == Type::Tap
      45           18 :                    || type == Type::Semi
      46           72 :                    || type == Type::FeedBack;
      47              :         }
      48              :     };
      49              :     struct MidiPitch {
      50              :         int midi{ -1 };
      51              :         int string{ -1 };
      52              :         int fret{ -1 };
      53              :         int octave{ -1 };
      54              :         int tone{ 0 };
      55              :         int element{ 0 };
      56              :         int variation{ -1 };
      57              :     };
      58              :     struct Bend {
      59              :         float destinationOffset{ -1 };
      60              :         float destinationValue{ -1 };
      61              :         float middleOffset1{ -1 };
      62              :         float middleOffset2{ -1 };
      63              :         float middleValue{ -1 };
      64              :         float originOffset{ -1 };
      65              :         float originValue{ -1 };
      66         2214 :         bool isEmpty() const
      67              :         {
      68         2214 :             return destinationValue == -1
      69         2022 :                    && destinationOffset == -1
      70         2022 :                    && middleValue == -1
      71         2022 :                    && middleOffset1 == -1
      72         2022 :                    && middleOffset2 == -1
      73         2022 :                    && originOffset == -1
      74         4236 :                    && originValue == -1;
      75              :         }
      76              :     };
      77              :     struct Trill {
      78              :         int auxillaryFret{ -1 };
      79              :         int speed{ -1 };
      80              :     };
      81              : 
      82         1340 :     void addProperties(std::unordered_set<std::unique_ptr<INoteProperty> >&& pr) { _properties.swap(pr); }
      83          131 :     void setTieType(GPNote::TieType t) { _tie = t; }
      84              : 
      85          995 :     void setMidi(int m) { _midiPitch.midi = m; }
      86              :     int midi() const { return _midiPitch.midi; }
      87         1329 :     void setString(int s) { _midiPitch.string = s; }
      88              :     int string() const { return _midiPitch.string; }
      89         1329 :     void setFret(int f) { _midiPitch.fret = f; }
      90              :     int fret() const { return _midiPitch.fret; }
      91           11 :     void setOctave(int o) { _midiPitch.octave = o; }
      92           11 :     void setTone(int t) { _midiPitch.tone = t; }
      93            0 :     void setVariation(int t) { _midiPitch.variation = t; }
      94            0 :     void setElement(int t) { _midiPitch.element = t; }
      95              : 
      96         1038 :     void setAccidental(int acc) { _accidental = acc; }
      97         2030 :     int accidental() const { return _accidental; }
      98              : 
      99           41 :     void setHarmonicFret(float f) { _harmonic.fret = f; }
     100           41 :     void setHarmonicType(Harmonic::Type t) { _harmonic.type = t; }
     101         2321 :     const Harmonic& harmonic() const { return _harmonic; }
     102              : 
     103            8 :     void setLetRing(bool lr) { _letRing = lr; }
     104         2030 :     bool letRing() const { return _letRing; }
     105              : 
     106            3 :     void setPalmMute(bool pm) { _palmMuted = pm; }
     107         2030 :     bool palmMute() const { return _palmMuted; }
     108              : 
     109         4478 :     const MidiPitch& midiPitch() const { return _midiPitch; }
     110         2411 :     TieType tieType() const { return _tie; }
     111              : 
     112           94 :     void setBend(std::unique_ptr<Bend>&& b) { _bend.swap(b); }
     113         2232 :     const Bend* bend() const { return _bend.get(); }
     114              : 
     115            2 :     void setGhostNote(bool b) { _ghostNote = b; }
     116         2030 :     bool ghostNote() const { return _ghostNote; }
     117              : 
     118            9 :     void setMute(bool m) { _muted = m; }
     119              :     //! muted = dead note
     120         2030 :     bool muted() const { return _muted; }
     121              : 
     122            2 :     void setRightHandTapping(bool t) { _rightHandTapping = t; }
     123         2030 :     bool rightHandTapping() const { return _rightHandTapping; }
     124              : 
     125            0 :     void setLeftHandTapped(bool v) { _leftHandTapped = v; }
     126         2030 :     bool leftHandTapped() const { return _leftHandTapped; }
     127              : 
     128            6 :     void setAccent(const std::bitset<4>& b) { _accent = b; }
     129         2084 :     const std::bitset<4>& accents() const { return _accent; }
     130              : 
     131           44 :     void setSlides(const std::bitset<6>& s) { _slides = s; }
     132         2514 :     const std::bitset<6>& slides() const { return _slides; }
     133              : 
     134           12 :     void setLeftFingering(const muse::String& ch) { _leftFingering = ch; }
     135         2064 :     const muse::String& leftFingering() const { return _leftFingering; }
     136              : 
     137           10 :     void setRightFingering(const muse::String& ch) { _rightFingering = ch; }
     138         2050 :     const muse::String& rightFingering() const { return _rightFingering; }
     139              : 
     140            0 :     void setShowStringNumber(bool show) { m_showStringNumber = show; }
     141         2030 :     bool showStringNumber() const { return m_showStringNumber; }
     142              : 
     143            9 :     void setVibratoType(VibratoType v) { _vibrato = v; }
     144         2039 :     VibratoType vibratoType() const { return _vibrato; }
     145              : 
     146            2 :     void setTrillFret(int fr) { _trill.auxillaryFret = fr; }
     147            2 :     void setTrillSpeed(int tr) { _trill.speed = tr; }
     148         2030 :     Trill trill() const { return _trill; }
     149              : 
     150            8 :     void setOrnament(Ornament o) { _ornament = o; }
     151         2038 :     Ornament ornament() const { return _ornament; }
     152              : 
     153           35 :     void setHammerOn(HammerOn h) { _hammer = h; }
     154         2030 :     HammerOn hammerOn() const { return _hammer; }
     155              : 
     156            1 :     void setPickScrape(PickScrape p) { _pickScrape = p; }
     157         2030 :     PickScrape pickScrape() const { return _pickScrape; }
     158              : 
     159         1340 :     void setId(int id) { _id = id; }
     160              :     int id() const { return _id; }
     161              : 
     162              :     const std::unordered_set<std::unique_ptr<INoteProperty> >& properties() const { return _properties; }
     163              :     static constexpr int invalidAccidental = -10;
     164              : 
     165              : private:
     166              :     int _id{ -1 };
     167              :     TieType _tie{ TieType::None };
     168              :     std::unordered_set<std::unique_ptr<INoteProperty> > _properties;
     169              :     MidiPitch _midiPitch;
     170              : 
     171              :     int _accidental = invalidAccidental;
     172              :     Harmonic _harmonic;
     173              :     std::unique_ptr<Bend> _bend;
     174              :     bool _letRing{ false };
     175              :     bool _palmMuted{ false };
     176              :     bool _ghostNote{ false };
     177              :     bool _muted{ false };
     178              :     //[0] - staccato, [1] - unknown, [2] - heavily accidental, [3] - accidental
     179              :     std::bitset<4> _accent{ 0 };
     180              :     //[0] shifSlide, [1] - legatoSlide, [2] - slideDownWard, [3] - slidewUpWard, [4] - slideInFormBelow, [5] - slideInFormAbove,
     181              :     std::bitset<6> _slides{ 0 };
     182              :     muse::String _leftFingering;
     183              :     muse::String _rightFingering;
     184              :     VibratoType _vibrato{ VibratoType::None };
     185              :     Trill _trill;
     186              :     Ornament _ornament{ Ornament::None };
     187              :     bool _rightHandTapping = false;
     188              :     bool _leftHandTapped = false;
     189              :     HammerOn _hammer{ HammerOn::None };
     190              :     PickScrape _pickScrape{ PickScrape::None };
     191              :     bool m_showStringNumber = false;
     192              : };
     193              : } // namespace mu::iex::guitarpro
     194              : 
     195              : #endif // MU_IMPORTEXPORT_GPNOTE_H
        

Generated by: LCOV version 2.0-1