Spatializer Midi Player | |
| enum | ModeSpatializer { Channel , Track } |
| ModeSpatializer | MPTK_ModeSpatializer |
| int | MPTK_MaxSpatialSynth |
| bool | MPTK_SpatialSynthEnabled |
| int | MPTK_InstrumentNum |
| int | MPTK_SpatialSynthIndex [get] |
| bool | MPTK_IsSpatialSynthMaster [get] |
| string | MPTK_InstrumentPlayed [get] |
| string | MPTK_TrackName [get] |
| static List< MidiFilePlayer > | SpatialSynths |
| string | instrumentPlayed |
SoundFont | |
| MPTKSoundFont | MPTK_SoundFont = null |
Synthesizer Settings | |
| bool | MPTK_EnablePresetDrum |
| bool | MPTK_ReleaseSameNote = true |
| bool | MPTK_KillByExclusiveClass = true |
| float | MPTK_ReleaseTimeMod = 1f |
| float | MPTK_CutOffVolume = 0.0001f |
| float | MPTK_LeanSynthStarting = 0.05f |
| bool | MPTK_ApplyRealTimeModulator |
| bool | MPTK_ApplyModLfo |
| bool | MPTK_ApplyVibLfo |
| bool | MPTK_DirectSendToPlayer |
| bool | MPTK_EnableChangeTempo |
| bool | MPTK_EnablePanChange |
| bool | MPTK_WeakDevice |
| uint | MPTK_ReleaseTimeMin = 500000 |
| bool | MPTK_KeepPlayingNonLooped [get, set] |
| float | MPTK_VelocityAttenuation [get, set] |
| float | MPTK_Volume [get, set] |
| int | MPTK_Transpose [get, set] |
| int | MPTK_TransExcludedChannel [get, set] |
| bool | MPTK_Dsp64 [get, set] |
| void | MPTK_InitSynth (int channelCount=16, bool preserveChannelInfo=false, bool preserveActivVoice=true) |
| void | MPTK_InitModulators () |
| void | MPTK_ClearAllSound (bool destroyAudioSource=false, int _idSession=-1) |
Spatialization | |
| float | MPTK_OrientationToListener |
| bool | MPTK_PauseOnMaxDistance = true |
| bool | MPTK_Orientation [get, set] |
| bool | MPTK_DistanceAttenuation [get, set] |
| float | MPTK_MinDistance [get, set] |
| float | MPTK_MaxDistance [get, set] |
| float | MPTK_MinSoundAttenuation [get, set] |
Synthesizer Performance | |
| int | MPTK_ThreadMidiWait = 10 |
| bool | MPTK_AutoBuffer = true |
| int | MPTK_AutoCleanVoiceLimit |
| float | MPTK_AutoCleanVoiceTime |
| int | MPTK_ThreadMidiPriority [get, set] |
Effects | |
| MPTKEffectSoundFont | MPTK_EffectSoundFont |
| MPTKEffectUnity | MPTK_EffectUnity |
| Unlike SoundFont effects, they are applied to the whole player. On the other hand, Unity effect parameters are richer and are obviously based on Unity algorithms! https://docs.unity3d.com/Manual/class-AudioEffectMixer.html Only the most important effects are integrated in Maestro: Reverb and Chorus. If needed, other effects could be added. More... | |
Audio Settings | |
| bool | MPTK_AudioSettingFromUnity |
| bool | MPTK_EnableFreeSynthRate = false |
| bool | MPTK_CorePlayer [get, set] |
| int | MPTK_SynthRate [get, set] |
| int | MPTK_IndexSynthRate [get, set] |
| int | MPTK_IndexSynthBuffSize [get, set] |
Log & Debug | |
| bool | MPTK_LogEvents |
| bool | MPTK_LogWave |
| void | MPTK_DebugActiveVoice () |
| void | MPTK_DebugFreeVoice () |
Voice Statistics | |
| int | MPTK_StatVoiceCountPlaying |
| int | MPTK_StatVoiceCountActive |
| int | MPTK_StatVoiceCountReused |
| int | MPTK_StatVoiceCountFree |
| int | MPTK_StatVoiceRatioReused |
| int | MPTK_StatVoicePlayed |
| int | MPTK_StatVoiceCountSustained [get] |
| void | MPTK_ResetStat () |
Synthesizer Events | |
| EventSynthClass | OnEventSynthAwake |
| EventSynthClass | OnEventSynthStarted |
| Func< MPTKEvent, bool > | OnMidiEvent |
| Action< int, long, int, int > | OnBeatEvent |
| OnAudioFrameStartHandler | OnAudioFrameStart |
| delegate void | OnAudioFrameStartHandler (double synthTime) |
Start Stop and Wait | |
| void | MPTK_StartSequencerMidi () |
| void | MPTK_StartSynth () |
| void | MPTK_StopSynth () |
| IEnumerator | MPTK_WaitAllNotesOff (int _idSession=-1) |
MIDI Direct Play | |
| void | MPTK_PlayDirectEvent (MPTKEvent midiEvent, bool playNoteOff=true) |
| void | MPTK_StopDirectEvent (MPTKEvent midiEvent) |
Pause and resume Voices | |
| void | MPTK_PauseVoices (float transitionDuration=30f) |
| void | MPTK_ResumeVoices (float transitionDuration=30f) |
Base class which contains all the stuff to build a Wave Table Synth.
Core WaveTable MIDI synthesizer (base class).
Loads a SoundFont and its samples, processes incoming MIDI events, and renders voices (controllers, generators, etc.). This class is the common base used by the MPTK prefabs: MidiStreamPlayer, MidiFilePlayer, and MidiInReader.
Do not instantiate MidiSynth directly. Instead, add one of the MPTK prefabs to your scene and access its properties and methods from your scripts.
Examples:
Loads SoundFont and samples, process midi event, play voices, controllers, generators ...
This class is inherited by others class to build these prefabs: MidiStreamPlayer, MidiFilePlayer, MidiInReader.
It is not recommended to instanciate directly this class, rather add prefabs to the hierarchy of your scene. and use attributes and methods from an instance of them in your script. Example:
Maestro MPTK Pro extension for MidiSynth.
Spatializer mode for the MidiSpatializer prefab.
| Enumerator | |
|---|---|
| Channel | Spatial synths are enabled to dispatch note-on messages by channel. |
| Track | Spatial synths are enabled to dispatch note-on messages by tracks defined in the MIDI. |
| void MidiPlayerTK.MidiSynth.MPTK_ClearAllSound | ( | bool | destroyAudioSource = false, |
| int | _idSession = -1 |
||
| ) |
Clear all sound by sending note off. That could take some seconds because release time for sample need to be played.
| destroyAudioSource | useful only in non core mode |
| _idSession | clear only for sample playing with this session, -1 for all (default) |
| void MidiPlayerTK.MidiSynth.MPTK_DebugActiveVoice | ( | ) |
Log information about active voices
| void MidiPlayerTK.MidiSynth.MPTK_DebugFreeVoice | ( | ) |
Log information about free voices
| void MidiPlayerTK.MidiSynth.MPTK_InitModulators | ( | ) |
Accept preset changes for Drum Channel 9 (drum). If set, this may sometimes produce unexpected results with MIDI files that are not compliant with the MIDI standard. If not set, preset change on channel 9 will be disabled (preset 0 still used).
| void MidiPlayerTK.MidiSynth.MPTK_InitSynth | ( | int | channelCount = 16, |
| bool | preserveChannelInfo = false, |
||
| bool | preserveActivVoice = true |
||
| ) |
Initialize the synthesizer:
| channelCount | Number of channel to create. Default is 16. Any other values are experimental! |
| preserveChannelInfo | if true, the channel information will not be reset, Default is false: reinit also channel information |
| void MidiPlayerTK.MidiSynth.MPTK_PauseVoices | ( | float | transitionDuration = 30f | ) |
Pauses all active voices using the specified transition duration.
| void MidiPlayerTK.MidiSynth.MPTK_PlayDirectEvent | ( | MPTKEvent | midiEvent, |
| bool | playNoteOff = true |
||
| ) |
Plays immediately one MIDI event. It's a synchrone processing: method return after the MIDI has been treated by the MIDI synth.
| midiEvent |
| void MidiPlayerTK.MidiSynth.MPTK_ResetStat | ( | ) |
Reset voices statistics
| void MidiPlayerTK.MidiSynth.MPTK_ResumeVoices | ( | float | transitionDuration = 30f | ) |
Resumes all active voices using the specified transition duration.
| void MidiPlayerTK.MidiSynth.MPTK_StartSequencerMidi | ( | ) |
Start the MIDI sequencer: each MIDI event is read and played in a dedicated thread. This thread is automatically started by prefabs MidiFilePlayer, MidiListPlayer, MidiExternalPlayer.
| void MidiPlayerTK.MidiSynth.MPTK_StartSynth | ( | ) |
Start processing samples by the synth and the MIDI sequencer. Useful only if MPTK_StopSynth has been called and MidiStreamPlayer.
| void MidiPlayerTK.MidiSynth.MPTK_StopDirectEvent | ( | MPTKEvent | midiEvent | ) |
Stops immediately the MIDI event play with @MPTK_PlayDirectEvent. It's a synchrone processing: method return after all voices of the notes has been processed by the MIDI synth.
| midiEvent |
| void MidiPlayerTK.MidiSynth.MPTK_StopSynth | ( | ) |
Stops processing samples by the synth and the MIDI sequencer. See also MPTK_StartSynth.
| IEnumerator MidiPlayerTK.MidiSynth.MPTK_WaitAllNotesOff | ( | int | _idSession = -1 | ) |
Wait until all notes are off. That could take some seconds due to the samples release time. Therefore, the method exit after a timeout of 3 seconds. *** Use this method only as a coroutine ***
| _idSession | clear only for samples playing with this session, -1 for all |
| delegate void MidiPlayerTK.MidiSynth.OnAudioFrameStartHandler | ( | double | synthTime | ) |
Delegate for the OnAudioFrameStart event.
|
protected |
Spatializer mode for the MidiSpatializer prefab.
| bool MidiPlayerTK.MidiSynth.MPTK_ApplyModLfo |
Apply LFO effect defined in the SoundFont
| bool MidiPlayerTK.MidiSynth.MPTK_ApplyRealTimeModulator |
Apply real time modulator effects defined in the SoundFont: pitch bend, control change, envelope modulation
| bool MidiPlayerTK.MidiSynth.MPTK_ApplyVibLfo |
Apply vibrato effect defined in the SoundFont
| bool MidiPlayerTK.MidiSynth.MPTK_AudioSettingFromUnity |
Allow direct setting of the Synth Rate
| bool MidiPlayerTK.MidiSynth.MPTK_AutoBuffer = true |
Enable voice buffering to improve runtime performance.
When enabled:
OFF are moved from the Active list to the Free list. When disabled, voices whose state becomes OFF are removed directly from the Active list.
| int MidiPlayerTK.MidiSynth.MPTK_AutoCleanVoiceLimit |
Free voices older than MPTK_AutoCleanVoiceLimit are removed when count is over than MPTK_AutoCleanVoiceTime
| float MidiPlayerTK.MidiSynth.MPTK_AutoCleanVoiceTime |
Delay (in milliseconds) that the MIDI sequencing thread waits between processing MIDI event batches.
| float MidiPlayerTK.MidiSynth.MPTK_CutOffVolume = 0.0001f |
When amplitude of a sample is below this value the playing of sample is stopped. Can be increase for better performance (when a lot of samples are played concurrently) but with degraded quality because sample could be stopped too early. Remember: Amplitude can varying between 0 and 1.
| bool MidiPlayerTK.MidiSynth.MPTK_DirectSendToPlayer |
If true (default) then MIDI events are sent automatically to the MIDI player. Sets to false if you want to process events without playing sound. OnEventNotesMidi Unity Event can be used to process each note.
| MPTKEffectSoundFont MidiPlayerTK.MidiSynth.MPTK_EffectSoundFont |
A SoundFont contains parameters to apply three kinds of effects: low-pass filter, reverb, chorus. These parameters can be specifics for each instruments and even each voices. Maestro MPTK effects are based on FluidSynth algo effects modules. Furthermore, to get more liberty from SoundFont, Maestro Pro can increase or decrease the impact of effects (from the inspector or by script). To summarize:
| MPTKEffectUnity MidiPlayerTK.MidiSynth.MPTK_EffectUnity |
Unlike SoundFont effects, they are applied to the whole player. On the other hand, Unity effect parameters are richer and are obviously based on Unity algorithms!
https://docs.unity3d.com/Manual/class-AudioEffectMixer.html
Only the most important effects are integrated in Maestro: Reverb and Chorus. If needed, other effects could be added.
| bool MidiPlayerTK.MidiSynth.MPTK_EnableChangeTempo |
Enable MIDI events tempo change from the MIDI file when playing. If disabled, only the first tempo change found in the MIDI will be applied (or 120 if not tempo change). Disable it when you want to change tempo by your script.
| bool MidiPlayerTK.MidiSynth.MPTK_EnableFreeSynthRate = false |
Allow direct setting of the Synth Rate
| bool MidiPlayerTK.MidiSynth.MPTK_EnablePanChange |
Change pan from MIDI Events in the SoundFont. Pan is disabled when Spatialization is activated.
| bool MidiPlayerTK.MidiSynth.MPTK_EnablePresetDrum |
Accept preset changes for Drum Channel 9 (drum). If set, this may sometimes produce unexpected results with MIDI files that are not compliant with the MIDI standard. If not set, preset change on channel 9 will be disabled (preset 0 still used).
| int MidiPlayerTK.MidiSynth.MPTK_InstrumentNum |
When spatialization is track mode, contains the last instrument (preset) played.
| bool MidiPlayerTK.MidiSynth.MPTK_KillByExclusiveClass = true |
Find the exclusive class of this voice. If set, kill all voices that match the exclusive class and are younger than the first voice process created by this note-on event.
| float MidiPlayerTK.MidiSynth.MPTK_LeanSynthStarting = 0.05f |
A lean startup of the volume of the synth is useful to avoid weird sound at the beginning of the application (in some cases). This parameter sets the speed of the increase of the volume of the audio source. Sets to 1 for an immediate full volume at start.
| bool MidiPlayerTK.MidiSynth.MPTK_LogEvents |
Log MIDI events (v2.9.0 moved from MidiFilePlayer)
| bool MidiPlayerTK.MidiSynth.MPTK_LogWave |
Log for each sample to be played
| int MidiPlayerTK.MidiSynth.MPTK_MaxSpatialSynth |
Gets or sets the maximum number of spatial synthesizers that can be used.
| ModeSpatializer MidiPlayerTK.MidiSynth.MPTK_ModeSpatializer |
Spatializer mode for the MidiSpatializer prefab.
| float MidiPlayerTK.MidiSynth.MPTK_OrientationToListener |
Return the angle in degree between the sound source and the listener. 0� = in front +90� = right -90� = left �180� = behind
| bool MidiPlayerTK.MidiSynth.MPTK_PauseOnMaxDistance = true |
If true, the MIDI player will be automatically paused when the distance from the listener exceeds MPTK_MaxDistance.
| bool MidiPlayerTK.MidiSynth.MPTK_ReleaseSameNote = true |
If the same note is hit twice on the same channel, then the older voice process is advanced to the release stage. It's the default Midi processing.
| uint MidiPlayerTK.MidiSynth.MPTK_ReleaseTimeMin = 500000 |
[Only when CorePlayer=False] Define a minimum release time at note-off in 100 nanosecond units. Default 50 ms is a good tradeoff. Below some unpleasant sound could be heard. Useless when MPTK_CorePlayer is true.
| float MidiPlayerTK.MidiSynth.MPTK_ReleaseTimeMod = 1f |
When a note is stopped with a note-off or when the duration is over, note continue to play for a short time depending the instrument. This parameter is a multiplier to increase or decrease the default release time defined in the SoundFont for each instrument. Recommended values between 0.1 and 10. Default is 1 (no modification of the release time). Performance issue: the longer it lasts the more CPU is used after the note-on. With a long release time, a lot of samples will be played simultaneously.
| MPTKSoundFont MidiPlayerTK.MidiSynth.MPTK_SoundFont = null |
When your application is running, SoundFonts can be dynamically loaded either from a local file system or directly from the web. This means you don't need to include a SoundFont in your build, making it ideal for scenarios like in-app purchases or downloadable content. For compatibility, the legacy mode still allows loading SoundFonts from the internal MPTK database. Additionally, Maestro MPTK supports assigning different SoundFonts to different MIDI players (MidiFilePlayer, MidiStreamPlayer, ...), enabling flexible and customized audio rendering across multiple instruments or scenes.
| bool MidiPlayerTK.MidiSynth.MPTK_SpatialSynthEnabled |
In spatialization mode, not all MidiSynths are enabled.
| int MidiPlayerTK.MidiSynth.MPTK_StatVoiceCountActive |
Count of the active voices (playing and releasing) - Readonly
| int MidiPlayerTK.MidiSynth.MPTK_StatVoiceCountFree |
Count of the free voices for reusing on need. Voice older than AutoCleanVoiceTime are removed but only when count is over than AutoCleanVoiceLimit - Readonly
| int MidiPlayerTK.MidiSynth.MPTK_StatVoiceCountPlaying |
Count of the active voices (playing excluding voices in release step). Also, sound could be ear even if count = 0 from voices in release phase - Readonly
| int MidiPlayerTK.MidiSynth.MPTK_StatVoiceCountReused |
Count of the voices reused - Readonly
| int MidiPlayerTK.MidiSynth.MPTK_StatVoicePlayed |
Count of voice played since the start of the synth
| int MidiPlayerTK.MidiSynth.MPTK_StatVoiceRatioReused |
Percentage of voice reused during the synth life. 0: any reuse, 100:all voice reused (unattainable, of course!)
| int MidiPlayerTK.MidiSynth.MPTK_ThreadMidiWait = 10 |
Delay (in milliseconds) that the MIDI sequencing thread waits between processing MIDI event batches.
| bool MidiPlayerTK.MidiSynth.MPTK_WeakDevice |
Should play on a weak device (cheaper smartphone) ? Apply only with AudioSource mode (MPTK_CorePlayer=False). Playing MIDI files with WeakDevice activated could cause some bad interpretation of MIDI Event, consequently bad sound.
| Action<int, long, int, int> MidiPlayerTK.MidiSynth.OnBeatEvent |
Invoked on each beat with the following parameters:
| EventSynthClass MidiPlayerTK.MidiSynth.OnEventSynthAwake |
Unity event fired at awake of the synthesizer. Name of the gameobject component is passed as a parameter. Setting this callback function by script (AddListener) is not recommended. It's better to set callback function from the inspector.
Example of script (but it's recommended to set callback function from the inspector).
| EventSynthClass MidiPlayerTK.MidiSynth.OnEventSynthStarted |
Unity event fired at start of the synthesizer. Name of the gameobject component is passed as a parameter. Setting this callback function by script (AddListener) is not recommended. It's better to set callback function from the inspector.
Example of script (it's recommended to set callback function from the inspector).
| Func<MPTKEvent, bool> MidiPlayerTK.MidiSynth.OnMidiEvent |
This function is called by the MIDI sequencer before sending the MIDI message to the MIDI synthesizer.
From version 2.10.0, the callback must return a boolean (see example): true to keep the event, false to skip it.
It can be used as a MIDI event preprocessor: it is possible to change the values of MIDI events and therefore change song playback.
The callback function receives an MPTKEvent object by reference (which is normal because it is a C# class).
See https://mptkapi.paxstellar.com/d9/d50/class_midi_player_t_k_1_1_m_p_t_k_event.html
Many changes are possible on the MIDI event: change note, velocity, channel, skip ..., even changing the MIDI type of the message!!!
See below for some examples of run-time changes.
|
static |
Contains each Midi Synth for each channel or track when the prefab MidiSpatializer is used and IsMidiChannelSpace=true. Warning: only one MidiSpatializer can be used in a hierarchy.
|
getset |
If true then rate synth and buffer size will be automatically defined by Unity in accordance of the capacity of the hardware. - V2.89.0 - Look at Unity menu "Edit / Project Settings..." and select between best latency and best performance. If false, then rate and buffer size can be defined manually ... but with the risk of bad audio quality. It's more an experimental capacities!
If true then MIDI events are read and playededed from a dedicated thread. If false, MidiSynth will use AudioSource gameobjects to play sound. This properties must be defined before running the application from the inspector. The default is true. Warning: The non core mode player (MPTK_CorePlayer=false) will be removed with the next major version (V3)
|
getset |
Should the Unity attenuation on distance effect must be enabled?
See here how to setup attenuation with Unity https://paxstellar.fr/midi-file-player-detailed-view-2/#Foldout-Spatialization-Parameters if MPTK_DistanceAttenuation is true:
AudioSource.minDistance = MPTK_MinDistance; AudioSource.maxDistance = MPTK_MaxDistance
AudioSource.spatialBlend = 1
AudioSource.spatialize = true
AudioSource.spatializePostEffects = true
AudioSource.rolloffMode = AudioRolloffMode.Custom; AudioSource.SetCustomCurve(AudioSourceCurveType.CustomRolloff, customCurveAudioSource); AudioSource.loop = true; AudioSource.volume = 1f;
MPTK_Spatilize has been renamed to MPTK_DistanceAttenuation in v2.18.0.
|
getset |
Accept preset changes for Drum Channel 9 (drum). If set, this may sometimes produce unexpected results with MIDI files that are not compliant with the MIDI standard. If not set, preset change on channel 9 will be disabled (preset 0 still used).
|
getset |
Sets or Get synth buffer size -1:default, 0:64, 1;128, 2:256, 3:512, 4:1024, 5:2048. The change is global for all prefab. It's better to stop playing for all prefab before changing on fly to avoid bad noise or crash.
|
getset |
Sets or Get sample rate output of the synth. -1:default, 0:24000, 1:36000, 2:48000, 3:60000, 4:72000, 5:84000, 6:96000. It's better to stop playing before changing on fly to avoid bad noise.
|
get |
If spatialization is track mode, contains the last instrument played on this track.
|
get |
True if this MidiSynth is the master synth responsible for reading MIDI events and dispatching them to other MidiSynths.
|
getset |
When the value is true, NoteOff and Duration for non-looped samples are ignored and the samples play through to the end.
|
getset |
When MPTK_DistanceAttenuation is enabled, the volume of the audio source depends on the distance between the audio source and the listener. Distance at which attenuation reaches its minimum level. Beyond this distance, the volume remains constant and does not decrease further
|
getset |
When MPTK_DistanceAttenuation is enabled, the volume of the audio source depends on the distance between the audio source and the listener. Distance at which attenuation begins. When the listener is closer than this value, the audio plays at full volume(1.0).
|
getset |
If MPTK_DistanceAttenuation is enabled, the volume of the audio source depends on the distance between the audio source and the listener. Minimum volume applied at Max Distance
|
getset |
Should the Unity orientation effect (pan + front/back + filtering) based on the relative orientation between the sound source and the listener must be enabled?
|
get |
Index of the MidiSynth for the dedicated Channel or Track when the prefab MidiSpatializer is used. If MPTK_ModeSpatializer = Channel then represent the playing channel. If MPTK_ModeSpatializer = Track then represent the playing track. The value is -1 for the Midi reader because no voice is played.
|
get |
Gets the number of active voices currently in the sustained state.
A sustained voice typically indicates that a note is being held, such as when a sustain pedal is engaged or a note-on event has not yet been released. This property can be used to monitor sustained notes for performance analysis or MIDI event handling.
|
getset |
Gets the the current synth rate or set free value (only if MPTK_EnableFreeSynthRate is true).
|
getset |
The MIDI thread�s priority shows how frequently a thread gains the access to CPU. The default value is 0 (normal), you can increase the priority to 1 and 2 (higher). This is useful when the hardware is weak, to get a more stable reading of the MIDI.
|
get |
If spatialization is track mode, contains the last track name.
|
getset |
Transpose will apply to all channels except this one. Set to -1 to apply to all channel. V2.89.0 Default is 9 because generally we don't want to transpose drum channel.
|
getset |
Transpose note from -24 to 24
|
getset |
Experimental feature: modify the Fluidsynth constant FLUID_PEAK_ATTENUATION to change how velocity affects the voice attenuation. The default value is 960 (96 Db) Other values may produce unwanted results, use with care!
|
getset |
Sets the global volume between 0 and 1 for the current MPTK Synth.
| OnAudioFrameStartHandler MidiPlayerTK.MidiSynth.OnAudioFrameStart |
Raised at the start of each audio frame by the audio engine.
The callback parameter is the current synth time, in milliseconds.
The callback does not run on the Unity main thread, so you must not call Unity APIs (except Debug.Log).