44 bool isAttachedToClip() const noexcept {
return ! state.
getParent().
hasType (IDs::NA); }
46 void setCompList (
bool shouldBeComp)
noexcept { isComp = shouldBeComp; }
47 bool isCompList() const noexcept {
return isComp; }
61 void setImportedFileName (
const juce::String& n) { importedFileName = n; }
64 bool isEmpty() const noexcept {
return state.
getNumChildren() == 0; }
67 void trimOutside (BeatPosition firstBeat, BeatPosition lastBeat,
juce::UndoManager*);
72 int getNumNotes()
const {
return getNotes().size(); }
73 MidiNote* getNote (
int index)
const {
return getNotes()[index]; }
85 MidiNote* addNote (
int pitch, BeatPosition startBeat, BeatDuration lengthInBeats,
int velocity,
int colourIndex,
juce::UndoManager*);
90 int getNumControllerEvents()
const {
return getControllerEvents().size(); }
92 MidiControllerEvent* getControllerEvent (
int index)
const {
return getControllerEvents()[index]; }
93 MidiControllerEvent* getControllerEventAt (BeatPosition,
int controllerType)
const;
95 MidiControllerEvent* addControllerEvent (
const MidiControllerEvent&,
juce::UndoManager*);
96 MidiControllerEvent* addControllerEvent (BeatPosition,
int controllerType,
int controllerValue,
juce::UndoManager*);
97 MidiControllerEvent* addControllerEvent (BeatPosition,
int controllerType,
int controllerValue,
int metadata,
juce::UndoManager*);
105 void setControllerValueAt (
int controllerType, BeatPosition beatNumber,
int newValue,
juce::UndoManager*);
106 void removeControllersBetween (
int controllerType, BeatPosition beatNumberStart, BeatPosition beatNumberEnd,
juce::UndoManager*);
110 BeatRange rangeBeats,
114 int getNumSysExEvents()
const {
return getSysexEvents().size(); }
116 MidiSysexEvent* getSysexEvent (
int index)
const {
return getSysexEvents()[index]; }
117 MidiSysexEvent* getSysexEventUnchecked (
int index)
const {
return getSysexEvents().getUnchecked (index); }
156 static bool looksLikeMPEData (
const juce::File&);
158 static constexpr const double defaultInitialTimbreValue = 0.5;
159 static constexpr const double defaultInitialPitchBendValue = 0;
160 static constexpr const double defaultInitialPressureValue = 0;
162 static bool fileHasTempoChanges (
const juce::File&);
164 static bool readSeparateTracksFromFile (
const juce::File&,
171 bool importAsNoteExpression);
174 template <
typename Type>
178 [] (
const Type& a,
const Type& b) { return a->getBeatPosition() < b->getBeatPosition(); });
181 template <
typename Type>
185 [] (
const Type& a,
const Type& b) { return a->getNoteNumber() < b->getNoteNumber(); });
201 template<
typename EventType>
207 static void removeFromSelection (EventType*);
210 template<
typename EventType>
219 ~EventList()
override
233 bool isSuitableType (
const juce::ValueTree& v)
const override {
return EventDelegate<EventType>::isSuitableType (v); }
234 EventType* createNewObject (
const juce::ValueTree& v)
override {
return new EventType (v); }
235 void deleteObject (EventType* m)
override {
delete m; }
236 void newObjectAdded (EventType*)
override { triggerSort(); }
237 void objectRemoved (EventType* m)
override { EventDelegate<EventType>::removeFromSelection (m); triggerSort(); }
238 void objectOrderChanged()
override { triggerSort(); }
242 if (
auto e = getEventFor (v))
243 if (EventDelegate<EventType>::updateObject (*e, i))
255 TRACKTION_ASSERT_MESSAGE_THREAD
261 needsSorting =
false;
263 sortMidiEventsByTime (sortedEvents);
269 bool needsSorting =
true;
void insertRepeatedControllerValue(int type, int startVal, int endVal, BeatRange rangeBeats, BeatDuration intervalBeats, juce::UndoManager *)
Adds controller values over a specified time, at an even interval.