11namespace tracktion {
inline namespace engine
14ChordClip::ChordClip (
const juce::ValueTree& v, EditItemID
id, ClipOwner& targetParent)
15 : Clip (v, targetParent, id, Type::chord)
17 if (clipName.get().isEmpty())
18 clipName =
TRANS(
"Chord");
20 auto pgen = state.getChildWithName (IDs::PATTERNGENERATOR);
26 if (patternGenerator->getChordProgression().isEmpty())
27 patternGenerator->setChordProgressionFromChordNames ({
"i" });
30 state.addListener (
this);
33ChordClip::~ChordClip()
35 notifyListenersOfDeletion();
37 state.removeListener (
this);
40void ChordClip::initialise()
49 return TRANS(
"Chord Clip");
54 return juce::Colours::red.
withHue (1.0f / 9.0f);
65 if (c.hasType (IDs::PATTERNGENERATOR))
69 if (patternGenerator->getChordProgression().isEmpty())
70 patternGenerator->setChordProgressionFromChordNames ({
"i" });
79 if (p == state && c.hasType (IDs::PATTERNGENERATOR))
81 patternGenerator =
nullptr;
92 Clip::valueTreePropertyChanged (v, i);
98 edit.sendTempoOrPitchSequenceChangedUpdates();
100 Clip::valueTreeParentChanged (v);
105 if (! state.getChildWithName (IDs::PATTERNGENERATOR).
isValid())
106 state.addChild (
juce::ValueTree (IDs::PATTERNGENERATOR), -1, &edit.getUndoManager());
108 jassert (patternGenerator !=
nullptr);
109 return patternGenerator.get();
112void ChordClip::pitchTempoTrackChanged()
114 if (patternGenerator !=
nullptr)
115 patternGenerator->refreshPatternIfNeeded();
122 return Clip::getColour();
125void ChordClip::handleAsyncUpdate()
127 edit.sendTempoOrPitchSequenceChangedUpdates();
Colour withHue(float newHue) const noexcept
bool isValid() const noexcept
Base class for items that can contain clips.
#define TRANS(stringLiteral)
bool isChordTrack(const Track &t)
Returns true if this is a ChordTrack.