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_CalculateTiming () |
void | MPTK_Clear () |
void | MPTK_ComputeDuration () |
double | MPTK_ConvertTickToTime (long tick) |
long | MPTK_ConvertTimeToTick (double time) |
void | MPTK_DisplayMidiAttributes () |
MPTKEvent | MPTK_FindLastNote () |
bool | MPTK_Load (byte[] datamidi, bool strict=false) |
bool | MPTK_Load (int index, bool strict=false, bool extendedText=false) |
bool | MPTK_Load (MPTKWriter mfw2) |
bool | MPTK_Load (string midiname, bool strict=false) |
bool | MPTK_LoadFile (string filename, bool strict=false) |
List< MPTKEvent > | MPTK_ReadMidiEvents (long fromTicks=0, long toTicks=long.MaxValue) |
MPTKEvent | MPTK_SearchEventFromTime (double time) |
long | MPTK_SearchTickFromTime (double time) |
MPTKEvent.EnumLength | NoteLength (MPTKEvent mptkEvent) |
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) |
static List< MPTKEvent > | MPTK_SortEvents (List< MPTKEvent > midiEvents, bool logPerf=false) |
Properties | |
double | MPTK_CurrentTempo [get, set] |
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).
|
static |
void MidiPlayerTK.MidiLoad.MPTK_CalculateTiming | ( | ) |
Calculate all timing in the MIDI file:
void MidiPlayerTK.MidiLoad.MPTK_Clear | ( | ) |
Removes all information about the MIDI loaded
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.
double MidiPlayerTK.MidiLoad.MPTK_ConvertTickToTime | ( | long | tick | ) |
tick | duration in ticks |
long MidiPlayerTK.MidiLoad.MPTK_ConvertTimeToTick | ( | double | time | ) |
time | duration in milliseconds |
void MidiPlayerTK.MidiLoad.MPTK_DisplayMidiAttributes | ( | ) |
Display in console the attributes of the MIDI loaded - v2.9.0
tmEvents |
MPTKEvent MidiPlayerTK.MidiLoad.MPTK_FindLastNote | ( | ) |
Find the last MIDI event note-on.
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 | ( | 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 | ( | MPTKWriter | mfw2 | ) |
Load Midi from a MidiFileWriter2 object
mfw2 | MidiFileWriter2 object |
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 |
bool MidiPlayerTK.MidiLoad.MPTK_LoadFile | ( | string | filename, |
bool | strict = false |
||
) |
Load MIDI file from a local file (Moved to PRO since version 2.89.5)
filename | Midi path and filename to load (OS dependant) |
strict | if true the MIDI must strictely respect the midi norm |
|
static |
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 |
|
static |
Search for a MIDI event from a tick position. v2.9.0
tickSearched | tick position |
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 |
Sort MIDI event list based on tick value, but for the same tick value, 'preset change' and 'meta' events are placed before other events such as 'noteon'.
midiEvents | |
logPerf |
MPTKEvent.EnumLength MidiPlayerTK.MidiLoad.NoteLength | ( | MPTKEvent | mptkEvent | ) |
bool MidiPlayerTK.MidiLoad.KeepNoteOff |
int MidiPlayerTK.MidiLoad.MPTK_CurrentBeat |
Current beat of the current event played [Pro].
int MidiPlayerTK.MidiLoad.MPTK_CurrentIndexSignMap |
Current index of the Signature segment.
int MidiPlayerTK.MidiLoad.MPTK_CurrentIndexTempoMap |
Current index of the Tempo segment.
int MidiPlayerTK.MidiLoad.MPTK_CurrentMeasure |
Current measure of the current event played [Pro].
MPTKSignature MidiPlayerTK.MidiLoad.MPTK_CurrentSignMap |
Current Signature segment.
MPTKTempo MidiPlayerTK.MidiLoad.MPTK_CurrentTempoMap |
Current Tempo Map.
int MidiPlayerTK.MidiLoad.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/
TimeSpan MidiPlayerTK.MidiLoad.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 MidiPlayerTK.MidiLoad.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 MidiPlayerTK.MidiLoad.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.
MPTKEvent MidiPlayerTK.MidiLoad.MPTK_EventLastNote |
Last MIDI event note-on found in the MIDI.
There is often other MIDI events after the last note-on: for example event track-end.
Use this attribute to known the tick position time when all sound will be stop.
See also the MPTK_PositionLastNote which provides the last tich of the MIDI.
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 ;-)
double MidiPlayerTK.MidiLoad.MPTK_InitialTempo |
Initial tempo found in the MIDI. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal.
bool MidiPlayerTK.MidiLoad.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.
bool MidiPlayerTK.MidiLoad.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.
int MidiPlayerTK.MidiLoad.MPTK_KeySigMajorMinor |
Updated from KeySignature event when playing MIDI: specifies the scale of the MIDI file.
int MidiPlayerTK.MidiLoad.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
MPTKEvent MidiPlayerTK.MidiLoad.MPTK_LastEventPlayed |
Current MIDI event read when the MIDI sequencer is playing the MIDI. See MPTK_TickCurrent.
float MidiPlayerTK.MidiLoad.MPTK_LoadTime |
Processing time in millisecond for loading the MIDI file.
bool MidiPlayerTK.MidiLoad.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.
long MidiPlayerTK.MidiLoad.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.
int MidiPlayerTK.MidiLoad.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/
List<MPTKEvent> MidiPlayerTK.MidiLoad.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 MidiPlayerTK.MidiLoad.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 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/
double MidiPlayerTK.MidiLoad.MPTK_PositionFirstNote |
Real time position in millisecond for the first note-on found.
Most MIDI don't start playing a note immediately. There is often a delay.
Use this attribute to known the real time wich it will start.
See also MPTK_TickFirstNote
double MidiPlayerTK.MidiLoad.MPTK_PositionLastNote |
Real time position in millisecond for the last note-on found in the MIDI.
There is often other MIDI events after the last note-on: for example event track-end.
Use this attribute to known the real time when all sound will be stop.
See also the MPTK_DurationMS which provides the full time of all MIDI events including track-end, control at the beginning and at the end, ....
See also MPTK_TickLastNote
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.
bool MidiPlayerTK.MidiLoad.MPTK_RawSeek |
This parameter is used when changing the playback position in a MIDI.
By default (false), all events other than note-on are replayed 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 produce undesired effects (or funny!) on some MIDIs, but it also makes it possible to change position much more quickly.
It's a choice to be made according to your needs.
List<MPTKSignature> MidiPlayerTK.MidiLoad.MPTK_SignMap |
List of all signature changes found in the MIDI.
List<MPTKTempo> MidiPlayerTK.MidiLoad.MPTK_TempoMap |
List of all tempo changes found in the MIDI.
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 updated continuously, this properties is updated only when a MIDI event is read from the sequencer.
Midi tick is an easy way to identify a position in a song independently of the time which could vary with tempo change event.
The count of ticks by quarter is constant all along a MIDI, it's a properties of the whole MIDI. see MPTK_DeltaTicksPerQuarterNote.
With a time signature of 4/4 the ticks length of a bar is 4 * MPTK_DeltaTicksPerQuarterNote.
More info here https://paxstellar.fr/2020/09/11/midi-timing/ @notes
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_TickFirstNote |
Tick position for the first note-on found.
Most MIDI don't start playing a note immediately. There is often a delay.
Use this attribute to known the tick position where the player will start to play a sound.
See also MPTK_PositionFirstNote
long MidiPlayerTK.MidiLoad.MPTK_TickLast |
Tick value of the last MIDI event found in the MIDI loaded.
long MidiPlayerTK.MidiLoad.MPTK_TickLastNote |
Tick position for the last note-on found.
There is often other MIDI events after the last note-on: for example event track-end.
Use this attribute to known the tick position time when all sound will be stop.
See also the MPTK_PositionLastNote which provides the last tich of the MIDI.
long MidiPlayerTK.MidiLoad.MPTK_TickPlayer |
Get the real-time tick value of the MIDI Player.
Unlike MPTK_TickCurrent which is updated only when a MIDI event is read, this properties is continusously updated when the MIDI thread is playing.
More info about tick here here https://paxstellar.fr/2020/09/11/midi-timing/ @notes
int MidiPlayerTK.MidiLoad.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/
long MidiPlayerTK.MidiLoad.MPTK_TickStart |
Tick to start playing the MIDI.
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_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 MidiPlayerTK.MidiLoad.MPTK_TrackCount |
Count of track in the MIDI file
|
getset |
Get or change the current tempo played by the internal MIDI sequencer. Available from MPTK_MidiLoaded attribut from MidiFilePLayer or MidiExternal.