1.5.0
MIKMIDI 1.5.0 is a major update to MIKMIDI. It includes a number of new features and APIs, bug fixes, improvements to existing API, etc.
Important Note: This release deprecates a number of existing MIKMIDI APIs. These APIs remain available, and functional, but developers should switch to the use of their replacements as soon as possible.
An overview of the changes in this release can be found below. For a comprehensive look at all changes in this release, see here.
Changes:
ADDED
MIKMIDISynthesizer
for general-purpose MIDI synthesis.MIKMIDIEndpointSynthesizer
is now a subclass ofMIKMIDISynthesizer
.MIKMIDISequencer
now has API for routing tracks to MIDI endpoints, synthesizers,
or other command scheduling objects (-(setC|c)ommandScheduler:forTrack:
)- Nullability and Objective-C generics annotations for much nicer usage from Swift. (#39 & #108)
- API for loading soundfont files using
-[MIKMIDISynthesizer loadSoundfontFromFileAtURL:error:]
. (#47) - Added
MIKMIDIEvent
subclassMIKMIDIChannelEvent
and related children (MIKMIDIPitchBendChangeEvent
,MIKMIDIControlChangeEvent
, etc.). (#63) - Added
MIKMIDIChannelVoiceCommand
subclasses for remaining MIDI channel voice message types (pitch bend, polyphonic key pressure, channel pressure). (#65) - API on
MIKMIDISequence
to control whether channels are split into individual tracks or not. (#66) - Preliminary unit tests (still need a lot more coverage with tests).
- API on
MIKMIDISequencer
to set playback tempo (overrides sequence tempo). (#81) - Ability to explicitly stop
MIKMIDIMappingGenerator
's mapping via-[MIKMIDIMappingGenerator endMapping]
. (#84) - Looping API on
MIKMIDISequencer
(#85) - API for syncing
MIKMIDIClock
s (see-[MIKMIDIClock syncedClock]
). (#86) - Ability to suspend MIDI mapping generation, then later resume right where it left off (
-[MIKMIDIMappingGenerator suspendMapping/resumeMapping]
). (#102) - API for customizing mapping file naming. See
MIKMIDIMappingManagerDelegate
. (#114) MIKMIDIConnectionManager
which implements a generic MIDI device connection manager including support for saving/restoring connection configuration to NSUserDefaults, etc. (#106)- Other minor API additions and improvements. (#87, #89, #90, #93, #94)
CHANGED
MIKMIDIEndpointSynthesizerInstrument
was renamed toMIKMIDISynthesizerInstrument
. This does not break existing code, due to the use of@compatibility_alias
MIKMIDISequencer
creates and uses default synthesizers for each track, allowing a minimum of configuration for simple MIDI playback. (#34)MIKMIDISequence
andMIKMIDITrack
are now KVO compliant for most of their properties. Check documentation for specifics. (#35 & #67)MIKMIDISequencer
can now send MIDI to any object that conforms to the newMIKMIDICommandScheduler
protocol. Removes the need to use virtual endpoints for internal scheduling. (#36)- Significantly improved performance of MIDI responder hierarchy search code, including adding (optional) caching. (#82)
- Improved
MIKMIDIDeviceManager
API to simplify device disconnection, in particular. (#109)
FIXED
MIKMIDIEndpointSynthesizer
had too much reverb by default. (#38)MIKMIDISequencer
's playback would stall or drop notes when the main thread was busy/blocked. Processing is now done in the background. (#48 & #92)MIKMIDIEvent
(or subclass) instances created withalloc/init
no longer have a NULLeventType
. (#59)- Warnings when using MIKMIDI.framework in a Swift project. (#64)
- Bug that could cause
MIKMIDISequencer
to sometimes skip the first events in its sequence upon starting playback. (#95) - Occasional crash (in
MIKMIDIEventIterator
) duringMIKMIDISequencer
playback. (#100) - KVO notifications for
MIKMIDIDeviceManager
'savailableDevices
property now include validNSKeyValueChangeOld/NewKey
entries and associated values. (#112) - Exception is no longer thrown when setting "empty"
MIKMutableMIDIMetaTimeSignatureEvent
's numerator. (#57) - Other minor bug fixes (#71, #83)
DEPRECATED
This release deprecates a number of existing MIKMIDI APIs. These APIs remain available, and functional, but developers should switch to the use of their replacements as soon as possible.
-[MIKMIDITrack getTrackNumber:]
. UsetrackNumber
@Property onMIKMIDITrack
instead.-[MIKMIDISequence getTempo:atTimeStamp:]
. Use-tempoAtTimeStamp:
instead.-[MIKMIDISequence getTimeSignature:atTimeStamp:]
. Use-timeSignatureAtTimeStamp:
instead.doesLoop
,numberOfLoops
,loopDuration
, andloopInfo
onMIKMIDITrack
. These methods affect looping when usingMIKMIDIPlayer
, but notMIKMIDISequencer
. Use-[MIKMIDISequencer setLoopStartTimeStamp:endTimeStamp:]
instead.-insertMIDIEvent:
,-insertMIDIEvents:
,-removeMIDIEvents:
, and-clearAllEvents
on MIKMIDITrack. Use-addEvent:
,-removeEvent:
,-removeAllEvents
instead.-[MIKMIDIDeviceManager disconnectInput:forConnectionToken:]
. Use-disconnectConnectionForToken:
instead.-setMusicTimeStamp:withTempo:atMIDITimeStamp:
,+secondsPerMIDITimeStamp
,+midiTimeStampsPerTimeInterval:
onMIKMIDIClock
. See documentation for replacement API.+[MIKMIDICommand supportsMIDICommandType:]
. Use+[MIKMIDICommand supportedMIDICommandTypes]
instead. This is only relevant when creating custom subclasses ofMIKMIDICommand
, which most MIKMIDI users do not need to do. (#57)