Skip to content

Releases: mixedinkey-opensource/MIKMIDI

MIKMIDI 1.7.2

19 Jun 21:54
Compare
Choose a tag to compare

What's Changed

ADDED

  • Add macOS SwiftUI Testbed example by @jranson in #302
  • Issue #319: Added general NotificationCenter notifications for MIDI Device and Entity changes by @adamjansch in #320
  • Issue #319: Pass modified entity object to change notification by @leamerluck in #321

FIXED

  • Issue #329: Split 14-bit commands into MSB and LSB when sending via virtual endpoint by @armadsen in #331
  • Issue #316: MIDI To Audio example fails after choosing Midi file by @jupdike in #334

New Contributors

Full Changelog: 1.7.1...1.7.2

MIKMIDI 1.7.1

14 Aug 05:16
Compare
Choose a tag to compare

Version 1.7.1 is a minor update to MIKMIDI. It includes the following changes:

ADDED

  • Support for recording control change (CC) events in MIKMIDISequencer (#262)
  • MIKMIDI can now be built as a xcframework with support for iOS (device and simulator), macOS, and Mac Catalyst. Run the build_xcframework.sh script in Framework/ or build the MIKMIDI.xcframework target in Xcode.

FIXED

  • Bug where -[MIKMIDIInputPort sourceEndpointForConnectionToken:] always returned nil, causing duplicate event handler calls upon re-establishing a previous connection (#263)
  • Failure to copy lastSyncedMusicTimeStamp to historical clock in MIKMIDIClock (#268)
  • Race condition in MIKMIDISynthesizer
  • Greatly improved performance of -[MIKMIDITrack eventsOfClass:fromTimeStamp:toTimeStamp:] (and dependent methods) (#275)
  • Incorrect behavior of -[MIKMIDITrack eventsOfClass:fromTimeStamp:toTimeStamp:] when passed a Nil eventClass
  • Build warning in Xcode 12 beta

Thanks to all who contributed bug reports and pull requests to this release!

MIKMIDI 1.7.0

04 Nov 05:23
Compare
Choose a tag to compare

Version 1.7 is a semi-major update to MIKMIDI. It includes the following changes:

ADDED

  • An outputPort property on MIKMIDIDeviceManager (#251)
  • Support for saving/loading MIDI mappings on iOS (#131)
  • Support for sending 14-bit control change messages (#230/#235)
  • Sysex message coalescing (#122, #198, #200)
  • Custom initializers for various MIKMIDIMetaEvent subclasses (#150)

CHANGES

  • MIKMIDISynthesizer (and subclass) creation methods now take an NSError parameter. Non-error-returning versions are deprecated. (#217)

FIXED

  • Several sharp edges when bridging into Swift (#207, #216, #238)
  • Exception thrown when converting channel pressure and polyphonic key pressure events to commands (#249)
  • Failure to parse sysex messages in certain circumstances (#233)
  • Bug that caused setting MIKMIDISystemExclusiveCommand.sysexChannel to sometimes delete or corrupt sysexData (#239)
  • Crash caused by race condition in MIKMIDIInputPort (#223)
  • Failure to notice new virtual endpoints created in other processes (#120)
  • Duplicate virtual devices in connection manager
  • Crash when MIDI events are received after an MIKMIDIConnectionManager has been deallocated (#215)

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. Deprecated APIs will be removed in a future release of MIKMIDI (likely 2.0).

MIKMIDI 1.6.2

10 Nov 00:09
Compare
Choose a tag to compare

Version 1.6.2 is a minor release of MIKMIDI. It includes the following changes:

ADDED

  • System Exclusive multi-packet coalescing (#200)
  • MIKMIDISystemKeepAliveCommand for keep alive messages
  • MIKMIDIPacketCreateFromCommands()
  • Convenience method for creating control change commands

FIXED

  • -[MIKMIDIDeviceManager connectedDevices] is no longer always nil (#162)
  • Incorrect MIKMIDIClock timing on iOS devices (#180 and #199)
  • Incorrect metaDataType on instances of MIKMIDIMetaEvent subclasses (#151)
  • Minor GCD queue creation bug (#204)
  • Parsing multiple MIDI messages of different types in a single incoming packet (#201)
  • Buffer overflow in -[MIKMIDISystemExclusiveCommand manufacturerID] (#197)
  • Memory leak in MIKStringPropertyFromMIDIObject() (#206)
  • Retain cycle between MIKMIDISequence and MIKMIDISequencer (#205)
  • Bug that caused note offs to be scheduled early by MIKMIDISequencer
  • Frequent hash collisions between instances of MIKMIDIObject (#181)
  • Minor Swift incompatibilities

MIKMIDI 1.6.1

08 Nov 20:59
Compare
Choose a tag to compare

Version 1.6.1 is a minor bug fix release of MIKMIDI. It includes the following changes:

ADDED

  • MIDI To Audio example project showing how to use MIKMIDI to do offline rendering of MIDI to an audio file. (#164)

Fixed

  • Incorrect nullability annotations for MIKMIDINoteEvent convenience methods.
  • Minor documentation mistakes.
  • Updated example projects for Xcode 8.

Changed

  • Moved macOS example projects into a "macOS" subfolder of Examples.
  • Email address for maintainer (Andrew Madsen).

1.6.0

01 Jun 22:28
Compare
Choose a tag to compare

MIKMIDI 1.6.0 is a semi-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 an MIKMIDI API. This API remains available, and functional, but developers should switch to the use of their replacements as soon as possible. See the Deprecations section below for details.

An overview of the changes in this release can be found below. For a comprehensive look at all changes in this release, see here.

ADDED

  • MIKMIDISequencer now respects the offset, muted, and solo properties of MIKMIDITrack. (#99)
  • Error-returning variant of -[MIKMIDISequence addTrack:], -addTrackWithError:. -addTrack: is now deprecated. (#134)
  • Added maximumLookAheadInterval property to MIKMIDISequencer (ac8142b)
  • Fixed issue where click track events would be added to the beginning of a loop when the status was EnabledOnlyInPreRoll. (2535c5b)
  • Convenience initializers for MIKMIDINoteOn/OffCommand that take MIDITimeStamps instead of NSDates. (0bf4a00)
  • Custom initializers for several MIKMIDIMetaEvent subclasses, greatly simplifing their creation. (#150)
  • MIKMIDIPacketCreate() function to ease creating MIDIPacket structs in Swift. (a12f121)

CHANGED

  • Improved support for subclassing MIKMIDISynthesizer and customizing MIDI event scheduling (87b38ea)

FIXED

  • Issue where MIKMIDISequencer would almost immediately stop recording if its sequence was empty. (#45)
  • MIKMIDIMetronome allows loading soundfonts. (a50ccdf)
  • Issue with stuck notes in MIKMIDISequencer's pre-roll. (07a9304)
  • MIKMIDISequencer now ignores incoming MIDI in recording mode during the pre-roll. (2312e4d)
  • Potentional crash in MIKMIDISequencer. (4c0ce02)
  • MIKMIDIGetCurrentTimeStamp() is now available in Swift (658cb63)
  • Scheduling issues in MIKMIDISynthesizer (6698fad)
  • Updated MIDI Files Testbed to fix deprecation warnings.
  • Improved MIDI Soundboard example for iOS (#119, d0ada0a, a35ee94)
  • Incorrect length for some MIKMIDICommand subclass instances when created with alloc/init. (#125)
  • Incorrect MSB calculation for pitch bend commands. (#147, thanks to akmidd)
  • Bug in logic for detecting and exposing available virtual sources and destinations (#144, #145, thanks to jrmaxdev)

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.

  • -[MIKMIDISequence addTrack:]. Use -addTrackWithError: instead. (#134)

1.5.0

14 Nov 23:20
Compare
Choose a tag to compare

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)

1.0.1

20 Apr 22:28
Compare
Choose a tag to compare

Version 1.0.1 is a minor bug fix release of MIKMIDI. It includes the following fixes:

  • Fixed MIKMIDIMetronome on iOS 8. Caveat: MIKMIDIMetronome is unavailable on iOS 6 and 7. See #77.
  • Improved documentation.
  • Support for Xcode 6.3.
  • Added error handling to MIKMIDIClientSource/DestinationEndpoint, including warning about UIBackgroundModes on iOS.
  • Added error parameter to MIKMIDISequence initialization methods.
  • Fix for MIKMIDICommand's default channel not defaulting to 0.
  • Carthage support
  • Other minor bug fixes and improvements.

Do note that there are a small number of methods that have been deprecated in this release, in favor of improved versions. The older, deprecated methods continue to work fine, but you should switch your code to the new methods as soon as possible.