Skip to content

1.5.0

Compare
Choose a tag to compare
@armadsen armadsen released this 14 Nov 23:20
· 297 commits to master since this release

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 of MIKMIDISynthesizer.
  • 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 subclass MIKMIDIChannelEvent 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 MIKMIDIClocks (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 to MIKMIDISynthesizerInstrument. 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 and MIKMIDITrack 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 new MIKMIDICommandScheduler 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 with alloc/init no longer have a NULL eventType. (#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) during MIKMIDISequencer playback. (#100)
  • KVO notifications for MIKMIDIDeviceManager's availableDevices property now include valid NSKeyValueChangeOld/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:]. Use trackNumber @Property on MIKMIDITrack instead.
  • -[MIKMIDISequence getTempo:atTimeStamp:]. Use -tempoAtTimeStamp: instead.
  • -[MIKMIDISequence getTimeSignature:atTimeStamp:]. Use -timeSignatureAtTimeStamp: instead.
  • doesLoop, numberOfLoops, loopDuration, and loopInfo on MIKMIDITrack. These methods affect looping when using MIKMIDIPlayer, but not MIKMIDISequencer. 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: on MIKMIDIClock. See documentation for replacement API.
  • +[MIKMIDICommand supportsMIDICommandType:]. Use +[MIKMIDICommand supportedMIDICommandTypes] instead. This is only relevant when creating custom subclasses of MIKMIDICommand, which most MIKMIDI users do not need to do. (#57)