![]() |
Maestro - Midi Player Tool Kit for Unity Version 2.19.0
|
Base class for loading a MIDI file and reading MIDI event in a MIDI sequencer. It's not possible to instanciate directly this class.
Rather, use MidiFilePlayer to load a MIDI This class is used by MidiFilePlayer, MidiListPlayer, MidiFileWrite2, MidiFileLoader (see members MPTK_MidiLoaded of these classes).
.
More...
Public Member Functions | |
| void | MPTK_Clear () |
| Removes all information about the MIDI loaded. | |
| bool | MPTK_Load (int index, bool strict=false, bool extendedText=false) |
| Load Midi from midi MPTK referential (Unity resource). The index of the Midi file can be found in the windo "Midi File Setup". Display with menu MPTK / Midi File Setup If result is true, MPTK_MidiEvents contains list of MIDI events. | |
| bool | MPTK_Load (byte[] datamidi, bool strict=false) |
| Load Midi from an array of bytes. If result is true, MPTK_MidiEvents contains list of MIDI events. | |
| bool | MPTK_Load (string midiname, bool strict=false) |
| Load Midi from a Midi file from Unity resources. The Midi file must be present in Unity MidiDB ressource folder. | |
| List< MPTKEvent > | MPTK_ReadMidiEvents (long fromTicks=0, long toTicks=long.MaxValue) |
| Read the list of midi events available in the Midi from a ticks position to an end position. | |
| double | MPTK_ConvertTickToTime (long tick) |
| long | MPTK_ConvertTimeToTick (double time) |
| MPTKEvent | MPTK_SearchEventFromTime (double time) |
| Search for a Midi event from a time position expressed in millisecond. So time=19.3 and time=19.9 will find the same event. . | |
| long | MPTK_SearchTickFromTime (double time) |
| Search a tick position in the current midi from a position in millisecond. Warning: this method loop on the whole midi to find the position. Could be CPU costly but this method take care of the tempo change in the Midi. Use MPTK_ConvertTimeToTick if there is no tempo change in the midi. | |
| MPTKEvent.EnumLength | NoteLength (MPTKEvent mptkEvent) |
| https://en.wikipedia.org/wiki/Note_value | |
| void | MPTK_DisplayMidiAttributes () |
| Display in console the attributes of the MIDI loaded - v2.9.0. | |
| void | MPTK_CalculateTiming () |
| Calculate all timing in the MIDI file: | |
| MPTKEvent | MPTK_FindLastNote () |
| Find the last MIDI event note-on. | |
| void | MPTK_ComputeDuration () |
| Calculate MPTK_Duration, MPTK_DurationMS, MPTK_TickLast from the MIDI events list MPTK_MidiEvents. | |
| bool | MPTK_LoadFile (string filename, bool strict=false) |
| Load MIDI file from a local file (Moved to PRO since version 2.89.5). | |
| bool | MPTK_Load (MPTKWriter mfw2) |
| Load Midi from a MidiFileWriter2 object. | |
Static Public Member Functions | |
| static int | MPTK_BPM2MPQN (int bpm) |
| static int | MPTK_MPQN2BPM (int microsecondsPerQuaterNote) |
| static int | MPTK_SearchEventFromTick (List< MPTKEvent > midiEvents, long tickSearched) |
| Search for a MIDI event from a tick position. v2.9.0 . | |
| static List< MPTKEvent > | MPTK_SortEvents (List< MPTKEvent > midiEvents, bool logPerf=false) |
| Sort MIDI event list based on tick value, but for the same tick value, priority for 'bank change' then 'preset change'. | |
Public Attributes | |
| List< MPTKEvent > | MPTK_MidiEvents |
| List of MIDI events loaded and played by the MIDI sequencer. It's possible to modify directly the content but with unpredictable results! | |
| int | MPTK_MicrosecondsPerQuarterNote |
| Read from the SetTempo event: The tempo is given in micro seconds per quarter beat. To convert this to BPM we needs to use the following equation:BPM = 60,000,000/[tt tt tt] Warning: this value can change during the playing when a change tempo event is find. https://paxstellar.fr/2020/09/11/midi-timing/. | |
| int | MPTK_DeltaTicksPerQuarterNote |
| Delta Ticks Per Beat Note (or DTPQN) represent the duration time in "ticks" which make up a quarter-note. For example, with 96 a duration of an eighth-note in the file would be 48. From a MIDI file, this value is found in the MIDI Header and remains constant for all the MIDI file. More info here https://paxstellar.fr/2020/09/11/midi-timing/ . | |
| double | MPTK_Pulse |
| Real-time duration in millisecond of a MIDI tick. This value is updated when a tempo change is found. The pulse length is the minimum time in millisecond between two MIDI events. . | |
| double | MPTK_InitialTempo |
| Initial tempo found in the MIDI. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal. | |
| TimeSpan | MPTK_Duration |
| Real duration expressed in TimeSpan of the full midi from the first event (tick=0) to the last event. If MPTK_KeepEndTrack is false, the MIDI events End Track are not considered to calculate this time. The tempo changes are taken into account if MPTK_EnableChangeTempo is set to true before loading the MIDI. | |
| float | MPTK_DurationMS |
| Real duration expressed in milliseconds of the full midi from the first event (tick=0) to the last event. If MPTK_KeepEndTrack is false, the MIDI events End Track are not considered to calculate this time. The tempo changes are taken into account if MPTK_EnableChangeTempo is set to true before loading the MIDI. | |
| bool | MPTK_EnableChangeTempo |
| Should enable or disable change tempo from MIDI Events ? If disabled, the first tempo defined (or default to 120 BPM) will be used for all the MIDI played. | |
| long | MPTK_TickStart |
| Tick to start playing the MIDI. | |
| long | MPTK_TickEnd |
| Tick to end playing the MIDI. All MIDI events with MIDI tick higher or equal are not played. | |
| long | MPTK_TickLast |
| Tick value of the last MIDI event found in the MIDI loaded. | |
| long | MPTK_TickCurrent |
| Get the tick value of the last MIDI event played. Set the tick value of the next MIDI event to played. Unlike MPTK_TickPlayer, which is continuously updated, this property is only updated when a MIDI event is read from the sequencer. | |
| bool | MPTK_RawSeek |
| This parameter is used when changing the playback position in a MIDI. By default (false), all events except note-on are played from the beginning of the MIDI to the new position, to put the synthesizer back in the right context (tempo, selected instruments, controller, ...). If set to true, the current playback position is set, but the previous context is retained. This can have undesirable (or funny!) effects on some MIDI, but it also makes it possible to change position much more quickly. It's a choice to be made according to your needs. . | |
| long | MPTK_TickPlayer |
| Get the real-time tick value of the MIDI player. Unlike MPTK_TickCurrent which is only updated when a MIDI event is read, this property is updated continuously while the MIDI thread is playing. | |
| long | MPTK_TickFirstNote |
| Tick position for the first note-on found. Most MIDI doesn't start playing a note immediately. There is often a delay. Use this attribute to know the tick position where the player will start playing a sound. See also MPTK_PositionFirstNote. | |
| long | MPTK_TickLastNote |
| Tick position for the last note-on found. There are often other MIDI events after the last note-on: for example, the track-end event. Use this attribute to know the tick position at which all sound will stop. See also MPTK_PositionLastNote which returns the last MIDI tick. | |
| MPTKEvent | MPTK_EventLastNote |
| Last MIDI event note-on found in MIDI. There are often other MIDI events after the last note-on: for example, the track-end event. Use this attribute to know the tick position time when all sound will stop. See also MPTK_PositionLastNote which returns the last MIDI tick. | |
| double | MPTK_PositionFirstNote |
| Real-time position in milliseconds for the first note-on found. Most MIDI doesn't start playing a note immediately. There is often a delay. Use this attribute to know the real time at which it will start. See also MPTK_TickFirstNote. | |
| double | MPTK_PositionLastNote |
| Real-time position in milliseconds for the last note-on found in the MIDI. There are often other MIDI events after the last note-on: for example, the track-end event. Use this attribute to know the real time when all sound will stop. See also MPTK_DurationMS which gives the full duration of all MIDI events including track end, start and end control, .... See also MPTK_TickLastNote. | |
| long | MPTK_MeasureLastNote |
| Measure position for the last note-on found. There is often other MIDI events after the last note-on: for example event track-end. | |
| MPTKEvent | MPTK_LastEventPlayed |
| Current MIDI event read when the MIDI sequencer is playing the MIDI. See MPTK_TickCurrent. | |
| List< MPTKTempo > | MPTK_TempoMap |
| List of all tempo changes found in the MIDI. | |
| List< MPTKSignature > | MPTK_SignMap |
| List of all signature changes found in the MIDI. | |
| int | MPTK_CurrentIndexTempoMap |
| Current index of the Tempo segment. | |
| MPTKTempo | MPTK_CurrentTempoMap |
| Current Tempo Map. | |
| int | MPTK_CurrentIndexSignMap |
| Current index of the Signature segment. | |
| MPTKSignature | MPTK_CurrentSignMap |
| Current Signature segment. | |
| int | MPTK_TimeSigNumerator |
| Updated from TimeSignature event when playing MIDI: The numerator counts the number of beats in a measure. For example a numerator of 4 means that each bar contains four beats. This is important to know because usually the first beat of each bar has extra emphasis. In MIDI the denominator value is stored in a special format. i.e. the real denominator = 2 ^ MPTK_TimeSigNumerator https://paxstellar.fr/2020/09/11/midi-timing/. | |
| int | MPTK_TimeSigDenominator |
| Updated from TimeSignature event when playing MIDI: The denominator specifies the number of quarter notes in a beat. | |
| int | MPTK_NumberBeatsMeasure |
| Updated from TimeSignature event when playing MIDI: the numerator counts the number of beats in a measure. For example a numerator of 4 means that each bar contains four beats. . | |
| int | MPTK_NumberQuarterBeat |
| Updated from TimeSignature event when playing MIDI: describe of what note value a beat is (ie, how many quarter notes there are in a beat). | |
| int | MPTK_TicksInMetronomeClick |
| Updated from TimeSignature event when playing MIDI: The standard MIDI clock ticks every 24 times every quarter note (crotchet) So a MPTK_TicksInMetronomeClick value of 24 would mean that the metronome clicks once every quarter note. A MPTK_TicksInMetronomeClick value of 6 would mean that the metronome clicks once every 1/8th of a note (quaver). https://paxstellar.fr/2020/09/11/midi-timing/. | |
| int | MPTK_No32ndNotesInQuarterNote |
| Updated from TimeSignature event when playing MIDI: This value specifies the number of 1/32nds of a note happen every MIDI quarter note. It is usually 8 which means that a quarter note happens every quarter note. https://paxstellar.fr/2020/09/11/midi-timing/. | |
| int | MPTK_KeySigSharpsFlats |
| Updated from KeySignature event when playing MIDI: values between -7 and 7 and specifies the key signature in terms of number of flats (if negative) or sharps (if positive) https://www.recordingblogs.com/wiki/midi-key-signature-meta-message. | |
| int | MPTK_KeySigMajorMinor |
| Updated from KeySignature event when playing MIDI: specifies the scale of the MIDI file. | |
| int | MPTK_TrackCount |
| Count of track in the MIDI file. | |
| float | MPTK_LoadTime |
| Processing time in millisecond for loading the MIDI file. | |
| bool | MPTK_LogLoadEvents |
| If true display in console all midi events when a MIDI file is loaded. v2.9.0 Set to true could increase greatly the load time. To be used only for debug. | |
| bool | MPTK_ExtendedText |
| bool | MPTK_KeepNoteOff |
| A MIDI file is a kind of keyboard simulation: in general, a key pressed generates a 'note-on' and a key release generates a 'note-off'. But there is an other possibility in a MIDI file: create a 'note-on' with a velocity=0 wich must act as a 'midi-off' By default, MPTK create only one MPTK event with the command NoteOn and a duration. But in some cases, you could want to keep the note-off events if they exist in the MIDI file. Set to false if there is no need (could greatly increases the MIDI list events). Set to true to keep 'note-off' events. | |
| bool | KeepNoteOff |
| bool | MPTK_KeepEndTrack |
| If set to true, the meta MIDI events 'End Track' are kept and the MIDI duration includes the 'End Track' events. Default value is false. | |
| int | MPTK_CurrentMeasure |
| Current measure of the current event played [Pro]. | |
| int | MPTK_CurrentBeat |
| Current beat of the current event played [Pro]. | |
Properties | |
| double | MPTK_CurrentTempo [get, set] |
| Get or change the current tempo played by the internal MIDI sequencer. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal. | |
Base class for loading a MIDI file and reading MIDI event in a MIDI sequencer. It's not possible to instanciate directly this class.
Rather, use MidiFilePlayer to load a MIDI This class is used by MidiFilePlayer, MidiListPlayer, MidiFileWrite2, MidiFileLoader (see members MPTK_MidiLoaded of these classes).
.
| bool MidiPlayerTK.MidiLoad.MPTK_Load | ( | int | index, |
| bool | strict = false, | ||
| bool | extendedText = false ) |
Load Midi from midi MPTK referential (Unity resource).
The index of the Midi file can be found in the windo "Midi File Setup". Display with menu MPTK / Midi File Setup
If result is true, MPTK_MidiEvents contains list of MIDI events.
| index | |
| strict | If true will error on non-paired note events, default:false |
| bool MidiPlayerTK.MidiLoad.MPTK_Load | ( | byte[] | datamidi, |
| bool | strict = false ) |
Load Midi from an array of bytes. If result is true, MPTK_MidiEvents contains list of MIDI events.
| datamidi | byte arry midi |
| strict | If true will error on non-paired note events, default:false |
| bool MidiPlayerTK.MidiLoad.MPTK_Load | ( | string | midiname, |
| bool | strict = false ) |
Load Midi from a Midi file from Unity resources. The Midi file must be present in Unity MidiDB ressource folder.
| midiname | Midi file name without path and extension |
| strict | if true, check strict compliance with the Midi norm |
| List< MPTKEvent > MidiPlayerTK.MidiLoad.MPTK_ReadMidiEvents | ( | long | fromTicks = 0, |
| long | toTicks = long::MaxValue ) |
Read the list of midi events available in the Midi from a ticks position to an end position.
| fromTicks | ticks start, default 0 |
| toTicks | ticks end, default end of Midi file |
| double MidiPlayerTK.MidiLoad.MPTK_ConvertTickToTime | ( | long | tick | ) |
| tick | duration in ticks |
| long MidiPlayerTK.MidiLoad.MPTK_ConvertTimeToTick | ( | double | time | ) |
| time | duration in milliseconds |
| MPTKEvent MidiPlayerTK.MidiLoad.MPTK_SearchEventFromTime | ( | double | time | ) |
Search for a Midi event from a time position expressed in millisecond.
So time=19.3 and time=19.9 will find the same event.
.
| time | position in milliseconds |
| long MidiPlayerTK.MidiLoad.MPTK_SearchTickFromTime | ( | double | time | ) |
Search a tick position in the current midi from a position in millisecond.
Warning: this method loop on the whole midi to find the position.
Could be CPU costly but this method take care of the tempo change in the Midi.
Use MPTK_ConvertTimeToTick if there is no tempo change in the midi.
| time | position in milliseconds |
|
static |
|
static |
| MPTKEvent.EnumLength MidiPlayerTK.MidiLoad.NoteLength | ( | MPTKEvent | mptkEvent | ) |
| void MidiPlayerTK.MidiLoad.MPTK_DisplayMidiAttributes | ( | ) |
Display in console the attributes of the MIDI loaded - v2.9.0.
| tmEvents |
| void MidiPlayerTK.MidiLoad.MPTK_ComputeDuration | ( | ) |
Calculate MPTK_Duration, MPTK_DurationMS, MPTK_TickLast from the MIDI events list MPTK_MidiEvents.
This is done automatically when loading a MIDI file but not when MIDI events are added by script. In this case you will have to call this method.
| bool MidiPlayerTK.MidiLoad.MPTK_Load | ( | MPTKWriter | mfw2 | ) |
Load Midi from a MidiFileWriter2 object.
| mfw2 | MidiFileWriter2 object |
|
static |
Sort MIDI event list based on tick value, but for the same tick value, priority for 'bank change' then 'preset change'.
| midiEvents | |
| logPerf |
| double MidiPlayerTK.MidiLoad.MPTK_Pulse |
Real-time duration in millisecond of a MIDI tick. This value is updated when a tempo change is found.
The pulse length is the minimum time in millisecond between two MIDI events.
.
| double MidiPlayerTK.MidiLoad.MPTK_InitialTempo |
Initial tempo found in the MIDI. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal.
| long MidiPlayerTK.MidiLoad.MPTK_TickStart |
Tick to start playing the MIDI.
| long MidiPlayerTK.MidiLoad.MPTK_TickEnd |
Tick to end playing the MIDI. All MIDI events with MIDI tick higher or equal are not played.
| long MidiPlayerTK.MidiLoad.MPTK_TickCurrent |
Get the tick value of the last MIDI event played.
Set the tick value of the next MIDI event to played.
Unlike MPTK_TickPlayer, which is continuously updated, this property is only updated when a MIDI event is read from the sequencer.
A MIDI tick is an easy way to identify a position in a song, independent of time, which can vary with tempo change events.
The number of ticks per quarter note is constant throughout a MIDI, it's a property of the whole MIDI. see MPTK_DeltaTicksPerQuarterNote.
With a 4/4 time signature, the length of a bar is 4 * MPTK_DeltaTicksPerQuarterNote.
More info here https://paxstellar.fr/2020/09/11/midi-timing/ @notes
| bool MidiPlayerTK.MidiLoad.MPTK_RawSeek |
This parameter is used when changing the playback position in a MIDI.
By default (false), all events except note-on are played from the beginning of the MIDI to the new position, to put the synthesizer back in the right context (tempo, selected instruments, controller, ...).
If set to true, the current playback position is set, but the previous context is retained. This can have undesirable (or funny!) effects on some MIDI, but it also makes it possible to change position much more quickly.
It's a choice to be made according to your needs.
.
| long MidiPlayerTK.MidiLoad.MPTK_TickPlayer |
Get the real-time tick value of the MIDI player.
Unlike MPTK_TickCurrent which is only updated when a MIDI event is read, this property is updated continuously while the MIDI thread is playing.
More info about tick here https://paxstellar.fr/2020/09/11/midi-timing/ @notes
| MPTKEvent MidiPlayerTK.MidiLoad.MPTK_EventLastNote |
Last MIDI event note-on found in MIDI.
There are often other MIDI events after the last note-on: for example, the track-end event.
Use this attribute to know the tick position time when all sound will stop.
See also MPTK_PositionLastNote which returns the last MIDI tick.
| int MidiPlayerTK.MidiLoad.MPTK_TimeSigDenominator |
Updated from TimeSignature event when playing MIDI: The denominator specifies the number of quarter notes in a beat.
| int MidiPlayerTK.MidiLoad.MPTK_NumberBeatsMeasure |
Updated from TimeSignature event when playing MIDI: the numerator counts the number of beats in a measure.
For example a numerator of 4 means that each bar contains four beats.
.
| int MidiPlayerTK.MidiLoad.MPTK_NumberQuarterBeat |
Updated from TimeSignature event when playing MIDI: describe of what note value a beat is (ie, how many quarter notes there are in a beat).
Equal 2 Power TimeSigDenominator.
https://paxstellar.fr/2020/09/11/midi-timing/
| int MidiPlayerTK.MidiLoad.MPTK_KeySigMajorMinor |
Updated from KeySignature event when playing MIDI: specifies the scale of the MIDI file.
| bool MidiPlayerTK.MidiLoad.MPTK_ExtendedText |
If the value is true, text read from Text META (e.g. lyrics) will be read with UTF8 encoding. The default is false.
The MIDI standard only allows ASCII characters for this META, but with this extension you will be able to read and display
characters like Korean, Chinese, Japanese and even French accented letters ;-)
| bool MidiPlayerTK.MidiLoad.KeepNoteOff |
|
getset |
Get or change the current tempo played by the internal MIDI sequencer. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal.