TracktionEngine
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | List of all members
engine::MidiList Class Reference

#include <tracktion_MidiList.h>

Public Types

enum class  NoteAutomationType { none , expression }
 
enum class  TimeBase { seconds , beats , beatsRaw }
 Determines MIDI event timing. More...
 

Public Member Functions

 MidiList ()
 
 MidiList (const juce::ValueTree &, juce::UndoManager *)
 
 ~MidiList ()
 
void copyFrom (const MidiList &, juce::UndoManager *)
 Clears the current list and copies the others contents and properties.
 
void addFrom (const MidiList &, juce::UndoManager *)
 Adds copies of the events in another list to this one.
 
const juce::Array< MidiNote * > & getNotes () const
 
const juce::Array< MidiControllerEvent * > & getControllerEvents () const
 
const juce::Array< MidiSysexEvent * > & getSysexEvents () const
 
bool isAttachedToClip () const noexcept
 
void setCompList (bool shouldBeComp) noexcept
 
bool isCompList () const noexcept
 
MidiChannel getMidiChannel () const
 Gets the list's midi channel number.
 
void setMidiChannel (MidiChannel chanNum)
 Gives the list a channel number that it'll use when generating real midi messages.
 
juce::String getImportedMidiTrackName () const noexcept
 If the data was pulled from a midi file then this may have a useful name describing its purpose.
 
juce::String getImportedFileName () const noexcept
 Set the imported file name if you want it to appear on the clip.
 
void setImportedFileName (const juce::String &n)
 
bool isEmpty () const noexcept
 
void clear (juce::UndoManager *)
 
void trimOutside (BeatPosition firstBeat, BeatPosition lastBeat, juce::UndoManager *)
 
void moveAllBeatPositions (BeatDuration deltaBeats, juce::UndoManager *)
 
void rescale (double factor, juce::UndoManager *)
 
int getNumNotes () const
 
MidiNotegetNote (int index) const
 
MidiNotegetNoteFor (const juce::ValueTree &)
 
juce::Range< int > getNoteNumberRange () const
 
BeatPosition getFirstBeatNumber () const
 Beat number of first event in the list.
 
BeatPosition getLastBeatNumber () const
 Beat number of last event in the list.
 
MidiNoteaddNote (const MidiNote &, juce::UndoManager *)
 
MidiNoteaddNote (int pitch, BeatPosition startBeat, BeatDuration lengthInBeats, int velocity, int colourIndex, juce::UndoManager *)
 
void removeNote (MidiNote &, juce::UndoManager *)
 
void removeAllNotes (juce::UndoManager *)
 
int getNumControllerEvents () const
 
MidiControllerEventgetControllerEvent (int index) const
 
MidiControllerEventgetControllerEventAt (BeatPosition, int controllerType) const
 
MidiControllerEventaddControllerEvent (const MidiControllerEvent &, juce::UndoManager *)
 
MidiControllerEventaddControllerEvent (BeatPosition, int controllerType, int controllerValue, juce::UndoManager *)
 
MidiControllerEventaddControllerEvent (BeatPosition, int controllerType, int controllerValue, int metadata, juce::UndoManager *)
 
void removeControllerEvent (MidiControllerEvent &, juce::UndoManager *)
 
void removeAllControllers (juce::UndoManager *)
 
bool containsController (int controllerType) const
 True if there are any controller events of this type.
 
void setControllerValueAt (int controllerType, BeatPosition beatNumber, int newValue, juce::UndoManager *)
 
void removeControllersBetween (int controllerType, BeatPosition beatNumberStart, BeatPosition beatNumberEnd, juce::UndoManager *)
 
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.
 
int getNumSysExEvents () const
 
MidiSysexEventgetSysexEvent (int index) const
 
MidiSysexEventgetSysexEventUnchecked (int index) const
 
MidiSysexEventgetSysexEventFor (const juce::ValueTree &) const
 
MidiSysexEventaddSysExEvent (const juce::MidiMessage &, BeatPosition, juce::UndoManager *)
 
void removeSysExEvent (const MidiSysexEvent &, juce::UndoManager *)
 
void removeAllSysexes (juce::UndoManager *)
 
void importMidiSequence (const juce::MidiMessageSequence &, Edit *, TimePosition editTimeOfListTimeZero, juce::UndoManager *)
 Adds the contents of a MidiMessageSequence to this list.
 
void importFromEditTimeSequenceWithNoteExpression (const juce::MidiMessageSequence &, Edit *, TimePosition editTimeOfListTimeZero, juce::UndoManager *)
 Adds the contents of a MidiSequence to this list assigning MPE expression changes to EXP expression.
 
juce::MidiMessageSequence exportToPlaybackMidiSequence (MidiClip &, TimeBase, bool generateMPE) const
 Creates a juce::MidiMessageSequence from the list in order to be played back The sequence will be in terms of edit time, either in seconds or beats.
 

Static Public Member Functions

static juce::ValueTree createMidiList ()
 
static juce::MidiMessageSequence createDefaultPlaybackMidiSequence (const MidiList &, MidiClip &, TimeBase, bool generateMPE)
 Creates the default MIDI playback sequence.
 
static bool looksLikeMPEData (const juce::File &)
 
static bool fileHasTempoChanges (const juce::File &)
 
static bool readSeparateTracksFromFile (const juce::File &, juce::OwnedArray< MidiList > &lists, juce::Array< BeatPosition > &tempoChangeBeatNumbers, juce::Array< double > &bpms, juce::Array< int > &numerators, juce::Array< int > &denominators, BeatDuration &songLength, bool importAsNoteExpression)
 
template<typename Type >
static void sortMidiEventsByTime (juce::Array< Type > &notes)
 
template<typename Type >
static void sortMidiEventsByNoteNumber (juce::Array< Type > &notes)
 

Public Attributes

juce::ValueTree state
 

Static Public Attributes

static constexpr const double defaultInitialTimbreValue = 0.5
 
static constexpr const double defaultInitialPitchBendValue = 0
 
static constexpr const double defaultInitialPressureValue = 0
 

Member Enumeration Documentation

◆ NoteAutomationType

Enumerator
none 

No automation, add the sequence as plain MIDI with the channel of the clip.

expression 

Add the automation as EXP assuming the source sequence is MPE MIDI.

◆ TimeBase

enum class engine::MidiList::TimeBase
strong

Determines MIDI event timing.

Enumerator
seconds 
beats 

Event times will be in seconds relative to the Edit timeline.

beatsRaw 

Event times will be in beats relative to the Edit timeline.

Event times will be in beats with no quantisation or groove.

Constructor & Destructor Documentation

◆ MidiList() [1/2]

engine::MidiList::MidiList ( )

◆ MidiList() [2/2]

engine::MidiList::MidiList ( const juce::ValueTree &  ,
juce::UndoManager *   
)

◆ ~MidiList()

engine::MidiList::~MidiList ( )

Member Function Documentation

◆ createMidiList()

static juce::ValueTree engine::MidiList::createMidiList ( )
static

◆ copyFrom()

void engine::MidiList::copyFrom ( const MidiList ,
juce::UndoManager *   
)

Clears the current list and copies the others contents and properties.

◆ addFrom()

void engine::MidiList::addFrom ( const MidiList ,
juce::UndoManager *   
)

Adds copies of the events in another list to this one.

◆ getNotes()

const juce::Array< MidiNote * > & engine::MidiList::getNotes ( ) const

◆ getControllerEvents()

const juce::Array< MidiControllerEvent * > & engine::MidiList::getControllerEvents ( ) const

◆ getSysexEvents()

const juce::Array< MidiSysexEvent * > & engine::MidiList::getSysexEvents ( ) const

◆ isAttachedToClip()

bool engine::MidiList::isAttachedToClip ( ) const
noexcept

◆ setCompList()

void engine::MidiList::setCompList ( bool  shouldBeComp)
noexcept

◆ isCompList()

bool engine::MidiList::isCompList ( ) const
noexcept

◆ getMidiChannel()

MidiChannel engine::MidiList::getMidiChannel ( ) const

Gets the list's midi channel number.

Value is 1 to 16.

◆ setMidiChannel()

void engine::MidiList::setMidiChannel ( MidiChannel  chanNum)

Gives the list a channel number that it'll use when generating real midi messages.

Value is 1 to 16.

◆ getImportedMidiTrackName()

juce::String engine::MidiList::getImportedMidiTrackName ( ) const
noexcept

If the data was pulled from a midi file then this may have a useful name describing its purpose.

◆ getImportedFileName()

juce::String engine::MidiList::getImportedFileName ( ) const
noexcept

Set the imported file name if you want it to appear on the clip.

◆ setImportedFileName()

void engine::MidiList::setImportedFileName ( const juce::String &  n)

◆ isEmpty()

bool engine::MidiList::isEmpty ( ) const
noexcept

◆ clear()

void engine::MidiList::clear ( juce::UndoManager *  )

◆ trimOutside()

void engine::MidiList::trimOutside ( BeatPosition  firstBeat,
BeatPosition  lastBeat,
juce::UndoManager *   
)

◆ moveAllBeatPositions()

void engine::MidiList::moveAllBeatPositions ( BeatDuration  deltaBeats,
juce::UndoManager *   
)

◆ rescale()

void engine::MidiList::rescale ( double  factor,
juce::UndoManager *   
)

◆ getNumNotes()

int engine::MidiList::getNumNotes ( ) const

◆ getNote()

MidiNote * engine::MidiList::getNote ( int  index) const

◆ getNoteFor()

MidiNote * engine::MidiList::getNoteFor ( const juce::ValueTree &  )

◆ getNoteNumberRange()

juce::Range< int > engine::MidiList::getNoteNumberRange ( ) const

◆ getFirstBeatNumber()

BeatPosition engine::MidiList::getFirstBeatNumber ( ) const

Beat number of first event in the list.

◆ getLastBeatNumber()

BeatPosition engine::MidiList::getLastBeatNumber ( ) const

Beat number of last event in the list.

◆ addNote() [1/2]

MidiNote * engine::MidiList::addNote ( const MidiNote ,
juce::UndoManager *   
)

◆ addNote() [2/2]

MidiNote * engine::MidiList::addNote ( int  pitch,
BeatPosition  startBeat,
BeatDuration  lengthInBeats,
int  velocity,
int  colourIndex,
juce::UndoManager *   
)

◆ removeNote()

void engine::MidiList::removeNote ( MidiNote ,
juce::UndoManager *   
)

◆ removeAllNotes()

void engine::MidiList::removeAllNotes ( juce::UndoManager *  )

◆ getNumControllerEvents()

int engine::MidiList::getNumControllerEvents ( ) const

◆ getControllerEvent()

MidiControllerEvent * engine::MidiList::getControllerEvent ( int  index) const

◆ getControllerEventAt()

MidiControllerEvent * engine::MidiList::getControllerEventAt ( BeatPosition  ,
int  controllerType 
) const

◆ addControllerEvent() [1/3]

MidiControllerEvent * engine::MidiList::addControllerEvent ( const MidiControllerEvent ,
juce::UndoManager *   
)

◆ addControllerEvent() [2/3]

MidiControllerEvent * engine::MidiList::addControllerEvent ( BeatPosition  ,
int  controllerType,
int  controllerValue,
juce::UndoManager *   
)

◆ addControllerEvent() [3/3]

MidiControllerEvent * engine::MidiList::addControllerEvent ( BeatPosition  ,
int  controllerType,
int  controllerValue,
int  metadata,
juce::UndoManager *   
)

◆ removeControllerEvent()

void engine::MidiList::removeControllerEvent ( MidiControllerEvent ,
juce::UndoManager *   
)

◆ removeAllControllers()

void engine::MidiList::removeAllControllers ( juce::UndoManager *  )

◆ containsController()

bool engine::MidiList::containsController ( int  controllerType) const

True if there are any controller events of this type.

◆ setControllerValueAt()

void engine::MidiList::setControllerValueAt ( int  controllerType,
BeatPosition  beatNumber,
int  newValue,
juce::UndoManager *   
)

◆ removeControllersBetween()

void engine::MidiList::removeControllersBetween ( int  controllerType,
BeatPosition  beatNumberStart,
BeatPosition  beatNumberEnd,
juce::UndoManager *   
)

◆ insertRepeatedControllerValue()

void engine::MidiList::insertRepeatedControllerValue ( int  type,
int  startVal,
int  endVal,
BeatRange  rangeBeats,
BeatDuration  intervalBeats,
juce::UndoManager *   
)

Adds controller values over a specified time, at an even interval.

◆ getNumSysExEvents()

int engine::MidiList::getNumSysExEvents ( ) const

◆ getSysexEvent()

MidiSysexEvent * engine::MidiList::getSysexEvent ( int  index) const

◆ getSysexEventUnchecked()

MidiSysexEvent * engine::MidiList::getSysexEventUnchecked ( int  index) const

◆ getSysexEventFor()

MidiSysexEvent * engine::MidiList::getSysexEventFor ( const juce::ValueTree &  ) const

◆ addSysExEvent()

MidiSysexEvent & engine::MidiList::addSysExEvent ( const juce::MidiMessage &  ,
BeatPosition  ,
juce::UndoManager *   
)

◆ removeSysExEvent()

void engine::MidiList::removeSysExEvent ( const MidiSysexEvent ,
juce::UndoManager *   
)

◆ removeAllSysexes()

void engine::MidiList::removeAllSysexes ( juce::UndoManager *  )

◆ importMidiSequence()

void engine::MidiList::importMidiSequence ( const juce::MidiMessageSequence &  ,
Edit ,
TimePosition  editTimeOfListTimeZero,
juce::UndoManager *   
)

Adds the contents of a MidiMessageSequence to this list.

If an Edit is provided, it'll be used to convert the timestamps from possible seconds to beats

◆ importFromEditTimeSequenceWithNoteExpression()

void engine::MidiList::importFromEditTimeSequenceWithNoteExpression ( const juce::MidiMessageSequence &  ,
Edit ,
TimePosition  editTimeOfListTimeZero,
juce::UndoManager *   
)

Adds the contents of a MidiSequence to this list assigning MPE expression changes to EXP expression.

◆ exportToPlaybackMidiSequence()

juce::MidiMessageSequence engine::MidiList::exportToPlaybackMidiSequence ( MidiClip ,
TimeBase  ,
bool  generateMPE 
) const

Creates a juce::MidiMessageSequence from the list in order to be played back The sequence will be in terms of edit time, either in seconds or beats.

Parameters
MidiClipThe clip boundries to use and the groove template if the clip contains one
TimeBaseThe format the exported MIDI event times will be in
generateMPEWhether the sequence should create MPE or standard MIDI

◆ createDefaultPlaybackMidiSequence()

static juce::MidiMessageSequence engine::MidiList::createDefaultPlaybackMidiSequence ( const MidiList ,
MidiClip ,
TimeBase  ,
bool  generateMPE 
)
static

Creates the default MIDI playback sequence.

◆ looksLikeMPEData()

static bool engine::MidiList::looksLikeMPEData ( const juce::File &  )
static

◆ fileHasTempoChanges()

static bool engine::MidiList::fileHasTempoChanges ( const juce::File &  )
static

◆ readSeparateTracksFromFile()

static bool engine::MidiList::readSeparateTracksFromFile ( const juce::File &  ,
juce::OwnedArray< MidiList > &  lists,
juce::Array< BeatPosition > &  tempoChangeBeatNumbers,
juce::Array< double > &  bpms,
juce::Array< int > &  numerators,
juce::Array< int > &  denominators,
BeatDuration &  songLength,
bool  importAsNoteExpression 
)
static

◆ sortMidiEventsByTime()

template<typename Type >
static void engine::MidiList::sortMidiEventsByTime ( juce::Array< Type > &  notes)
static

◆ sortMidiEventsByNoteNumber()

template<typename Type >
static void engine::MidiList::sortMidiEventsByNoteNumber ( juce::Array< Type > &  notes)
static

Member Data Documentation

◆ defaultInitialTimbreValue

constexpr const double engine::MidiList::defaultInitialTimbreValue = 0.5
staticconstexpr

◆ defaultInitialPitchBendValue

constexpr const double engine::MidiList::defaultInitialPitchBendValue = 0
staticconstexpr

◆ defaultInitialPressureValue

constexpr const double engine::MidiList::defaultInitialPressureValue = 0
staticconstexpr

◆ state

juce::ValueTree engine::MidiList::state

The documentation for this class was generated from the following file: