MidiPlayerTK.MidiFileLoader

@Warning - will be soon deprecated, please rather use MidiFilePlayer prefab which have the same features + eventually MIDI sequencer and MIDI synth! Exemple for just loading a MIDI with MidiFilePlayer:
More...

Inherits MonoBehaviour, and MonoBehaviour.

Public Member Functions

bool MPTK_Load (byte[] midiBytesToLoad=null)
 
bool MPTK_Load (string filePath)
 
void MPTK_Next ()
 
MPTKEvent.EnumLength MPTK_NoteLength (MPTKEvent note)
 
void MPTK_Previous ()
 
List< MPTKEventMPTK_ReadMidiEvents (long fromTicks=0, long toTicks=long.MaxValue)
 
bool MPTK_SearchMidiToPlay (string name)
 

Public Attributes

int MPTK_DeltaTicksPerQuarterNote
 
TimeSpan MPTK_Duration
 
double MPTK_InitialTempo
 
bool MPTK_KeepEndTrack
 
bool MPTK_KeepNoteOff
 
int MPTK_KeySigMajorMinor
 
int MPTK_KeySigSharpsFlats
 
bool MPTK_LogLoadEvents
 
int MPTK_MicrosecondsPerQuarterNote
 
int MPTK_No32ndNotesInQuarterNote
 
int MPTK_NumberBeatsMeasure
 
int MPTK_NumberQuarterBeat
 
long MPTK_TickLast
 
int MPTK_TicksInMetronomeClick
 
int MPTK_TimeSigDenominator
 
int MPTK_TimeSigNumerator
 
int MPTK_TrackCount
 

Properties

float MPTK_DurationMS [get]
 
List< MPTKEventMPTK_MidiEvents [get]
 
int MPTK_MidiIndex [get, set]
 
MidiLoad MPTK_MidiLoaded [get]
 
string MPTK_MidiName [get, set]
 

Detailed Description

@Warning - will be soon deprecated, please rather use MidiFilePlayer prefab which have the same features + eventually MIDI sequencer and MIDI synth! Exemple for just loading a MIDI with MidiFilePlayer:

private void TheMostSimpleDemoForMidiLoader()
{
// A MidiFileLoader prefab must be added to the hierarchy with the editor (see menu MPTK)
MidiFilePlayer mfp = FindObjectOfType<MidiFilePlayer>();
if (mfp == null)
{
Debug.LogWarning("Can't find a MidiFilePlayer Prefab in the current Scene Hierarchy. Add it with the Maestro menu.");
return;
}
// Index of the midi in the MidiDB (find it with 'Midi File Setup' from the menu MPTK)
mfp.MPTK_MidiIndex = MidiIndex;
// Open and load the Midi
mfp.MPTK_Load();
// Loop on each MIDI events
foreach (MPTKEvent mptkEvent in mfp.MPTK_MidiEvents)
{
// Log if event is a note on
if (mptkEvent.Command == MPTKCommand.NoteOn)
Debug.Log($"Note On at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Note:{mptkEvent.Value} Duration:{mptkEvent.Duration} millisecond Velocity:{mptkEvent.Velocity}");
else if (mptkEvent.Command == MPTKCommand.PatchChange)
Debug.Log($"Preset Change at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Preset:{mptkEvent.Value}");
else if (mptkEvent.Command == MPTKCommand.ControlChange)
{
if (mptkEvent.Controller == MPTKController.BankSelectMsb)
Debug.Log($"Bank Change at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Bank:{mptkEvent.Value}");
}
// Uncomment to display all MIDI events
//Debug.Log(mptkEvent.ToString());
}
}
Description of a MIDI Event. It's the heart of MPTK! Essential to handling MIDI by script from all ot...
Definition: MPTKEvent.cs:45
MPTKCommand Command
Definition: MPTKEvent.cs:99
MPTKController Controller
Definition: MPTKEvent.cs:105
Play a MIDI file from the MidiDB. This class must be used with the prefab MidiFilePlayer....
Definition: MidiFilePlayer.cs:69
List< MPTKEvent > MPTK_MidiEvents
Definition: MidiFilePlayer.cs:900
MidiLoad MPTK_Load()
Definition: MidiFilePlayer.cs:1332
MPTKController
Definition: MPTKEnum.cs:131
MPTKCommand
Definition: MPTKEnum.cs:12

Member Function Documentation

◆ MPTK_Load() [1/2]

bool MidiPlayerTK.MidiFileLoader.MPTK_Load ( byte[]  midiBytesToLoad = null)

Load the midi file defined with MPTK_MidiName or MPTK_MidiIndex or from a array of bytes.
Look at MPTK_MidiLoaded for detailed information about the MIDI loaded. MPTK_MidiEvents will contains all MIDI events loaded.

Parameters
midiBytesToLoadbyte arry from a midi stream
Returns
true if loading succeed/returns>

◆ MPTK_Load() [2/2]

bool MidiPlayerTK.MidiFileLoader.MPTK_Load ( string  filePath)

Load a MIDI file from a local desktop file. Look at MPTK_MidiLoaded for detailed information about the MIDI loaded.
Example of path for Mac "/Users/xxx/Desktop/WellTempered.mid"
Example of path for Windows "C:\Users\xxx\Desktop\BIM\Sound\Midi\DreamOn.mid"

Version
Maestro Pro
Parameters
filePathExample for Windows: filePath= "C:\Users\xxx\Desktop\BIM\Sound\Midi\DreamOn.mid"
Returns
true if loading succeed

◆ MPTK_Next()

void MidiPlayerTK.MidiFileLoader.MPTK_Next ( )

Read next Midi from the list of midi defined in MPTK (see Unity menu Midi)

◆ MPTK_NoteLength()

MPTKEvent.EnumLength MidiPlayerTK.MidiFileLoader.MPTK_NoteLength ( MPTKEvent  note)

Return note length as https://en.wikipedia.org/wiki/Note_value

Parameters
note
Returns
MPTKEvent.EnumLength

◆ MPTK_Previous()

void MidiPlayerTK.MidiFileLoader.MPTK_Previous ( )

Read previous Midi from the list of midi defined in MPTK (see Unity menu Midi)

◆ MPTK_ReadMidiEvents()

List< MPTKEvent > MidiPlayerTK.MidiFileLoader.MPTK_ReadMidiEvents ( long  fromTicks = 0,
long  toTicks = long.MaxValue 
)

Read the list of midi events available in the Midi file from a ticks position to an end position into a List of MPTKEvent

private void TheMostSimpleDemoForMidiLoader()
{
// A MidiFileLoader prefab must be added to the hierarchy with the editor (see menu MPTK)
MidiFilePlayer mfp = FindObjectOfType<MidiFilePlayer>();
if (mfp == null)
{
Debug.LogWarning("Can't find a MidiFilePlayer Prefab in the current Scene Hierarchy. Add it with the Maestro menu.");
return;
}
// Index of the midi in the MidiDB (find it with 'Midi File Setup' from the menu MPTK)
mfp.MPTK_MidiIndex = MidiIndex;
// Open and load the Midi
mfp.MPTK_Load();
// Loop on each MIDI events
foreach (MPTKEvent mptkEvent in mfp.MPTK_MidiEvents)
{
// Log if event is a note on
if (mptkEvent.Command == MPTKCommand.NoteOn)
Debug.Log($"Note On at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Note:{mptkEvent.Value} Duration:{mptkEvent.Duration} millisecond Velocity:{mptkEvent.Velocity}");
else if (mptkEvent.Command == MPTKCommand.PatchChange)
Debug.Log($"Preset Change at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Preset:{mptkEvent.Value}");
else if (mptkEvent.Command == MPTKCommand.ControlChange)
{
if (mptkEvent.Controller == MPTKController.BankSelectMsb)
Debug.Log($"Bank Change at {mptkEvent.RealTime} millisecond Channel:{mptkEvent.Channel} Bank:{mptkEvent.Value}");
}
// Uncomment to display all MIDI events
//Debug.Log(mptkEvent.ToString());
}
}

See full example in TestMidiFileLoad.cs

Parameters
fromTicksticks start, default from start
toTicksticks end, default to the end
Returns

◆ MPTK_SearchMidiToPlay()

bool MidiPlayerTK.MidiFileLoader.MPTK_SearchMidiToPlay ( string  name)

Find a Midi in the Unity resources folder MidiDB which contains the name (case sensitive)
Beware: name of this method is not appropriate because class MidiFileLoader is not able to play MIDI. Rather use MidiFilePlayer class.
We keep it only for compatibility, could be removed with a major version.

Version
Maestro Pro
Note
  • Add MIDI files to your project with the Unity menu MPTK or add it directly in the ressource folder and open MIDI File Setup to automatically integrate MIDI in MPTK. @ par
    // Find the first MIDI file name in MidiDB which contains "Adagio"
    midiLoadPlayer.MPTK_SearchMidiToPlay("Adagio");
Parameters
namecase sensitive part of a MIDI file name
Returns
true if found else false

Member Data Documentation

◆ MPTK_DeltaTicksPerQuarterNote

int MidiPlayerTK.MidiFileLoader.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/

◆ MPTK_Duration

TimeSpan MidiPlayerTK.MidiFileLoader.MPTK_Duration

Duration of the midi.

◆ MPTK_InitialTempo

double MidiPlayerTK.MidiFileLoader.MPTK_InitialTempo

Initial tempo read in the Midi.

◆ MPTK_KeepEndTrack

bool MidiPlayerTK.MidiFileLoader.MPTK_KeepEndTrack

When set to true, meta MIDI event End Track are keep. Default is false.
If set to true, the duration of the MIDI taken into account the End Track Event.

◆ MPTK_KeepNoteOff

bool MidiPlayerTK.MidiFileLoader.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.

◆ MPTK_KeySigMajorMinor

int MidiPlayerTK.MidiFileLoader.MPTK_KeySigMajorMinor

From KeySignature event: Specifies the scale of the MIDI file.

◆ MPTK_KeySigSharpsFlats

int MidiPlayerTK.MidiFileLoader.MPTK_KeySigSharpsFlats

From KeySignature event: 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

◆ MPTK_LogLoadEvents

bool MidiPlayerTK.MidiFileLoader.MPTK_LogLoadEvents

If true display in console all midi events loaded. v2.9.0
Set to true could increase greatly the load time. To be used only for debug.

◆ MPTK_MicrosecondsPerQuarterNote

int MidiPlayerTK.MidiFileLoader.MPTK_MicrosecondsPerQuarterNote

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/

◆ MPTK_No32ndNotesInQuarterNote

int MidiPlayerTK.MidiFileLoader.MPTK_No32ndNotesInQuarterNote

From TimeSignature event: 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/

◆ MPTK_NumberBeatsMeasure

int MidiPlayerTK.MidiFileLoader.MPTK_NumberBeatsMeasure

From TimeSignature event: 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.
https://paxstellar.fr/2020/09/11/midi-timing/

◆ MPTK_NumberQuarterBeat

int MidiPlayerTK.MidiFileLoader.MPTK_NumberQuarterBeat

From TimeSignature event: number of quarter notes in a beat.
Equal 2 Power TimeSigDenominator.
https://paxstellar.fr/2020/09/11/midi-timing/

◆ MPTK_TickLast

long MidiPlayerTK.MidiFileLoader.MPTK_TickLast

Last tick position in Midi: Time of the last midi event in sequence expressed in number of "ticks".
MPTK_TickLast / MPTK_DeltaTicksPerQuarterNote equal the duration time of a quarter-note regardless the defined tempo.

◆ MPTK_TicksInMetronomeClick

int MidiPlayerTK.MidiFileLoader.MPTK_TicksInMetronomeClick

From TimeSignature event: 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/

◆ MPTK_TimeSigDenominator

int MidiPlayerTK.MidiFileLoader.MPTK_TimeSigDenominator

From TimeSignature event: The denominator specifies the number of quarter notes in a beat.
2 represents a quarter-note,
3 represents an eighth-note, etc.
https://paxstellar.fr/2020/09/11/midi-timing/

◆ MPTK_TimeSigNumerator

int MidiPlayerTK.MidiFileLoader.MPTK_TimeSigNumerator

From TimeSignature event: 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/

◆ MPTK_TrackCount

int MidiPlayerTK.MidiFileLoader.MPTK_TrackCount

Count of track read in the Midi file.
Not to be confused with channel. A track can contains midi events for different channel.

Property Documentation

◆ MPTK_DurationMS

float MidiPlayerTK.MidiFileLoader.MPTK_DurationMS
get

Duration (milliseconds) of the midi.

◆ MPTK_MidiEvents

List<MPTKEvent> MidiPlayerTK.MidiFileLoader.MPTK_MidiEvents
get

Get all the MPTK MIDI events available in the midi file. New v2.9.0

◆ MPTK_MidiIndex

int MidiPlayerTK.MidiFileLoader.MPTK_MidiIndex
getset

Index Midi. Find the Index of Midi file from the popup in MidiFileLoader inspector.
Tips: Add Midi files to your project with the Unity menu MPTK or add it directly in the ressource folder and open Midi File Setup to automatically integrate Midi in MPTK.
return -1 if not found

midiFilePlayer.MPTK_MidiIndex = 1;
Parameters
index

◆ MPTK_MidiLoaded

MidiLoad MidiPlayerTK.MidiFileLoader.MPTK_MidiLoaded
get

Get detailed information about the midi loaded.

◆ MPTK_MidiName

string MidiPlayerTK.MidiFileLoader.MPTK_MidiName
getset

Midi name to load. Use the exact name defined in Unity resources folder MidiDB without any path or extension. Tips: Add Midi files to your project with the Unity menu MPTK or add it directly in the ressource folder and open Midi File Setup to automatically integrate Midi in MPTK.