MIDIKit

🎹 Modern multi-platform Swift CoreMIDI wrapper with MIDI 2.0 support.

MIT License

Stars
189
Committers
2

Bot releases are visible (Hide)

MIDIKit - 0.9.5 Latest Release

Published by orchetect 10 months ago

New

  • MIDIReceiverOptions: Added .bundleRPNAndNRPNDataEntryLSB receiver option (#198)

Changed

  • MIDIReceiver: eventsWithMetadata receiver has been renamed to events and inherits its events, timeStamp, source closure parameters
  • MIDIReceiver: object(_:held:options:) is now replaced by strong(_:options:) or weak(_:options:) and, as such, no longer carries a held property
  • Removed redundant MIDIReceiveHandler class
  • Renamed MIDIReceiveHandlerProtocol to MIDIReceiverProtocol and made it public

Fixed

  • MIDIEvent.pressure: Debug description now includes both MIDI 1.0 & MIDI 2.0 value representation, consistent with other event descriptions

Maintenance

  • Internal refactors to reduce MIDIReceiver boilerplate
  • Updated docs
  • Minor example project updates
MIDIKit - 0.9.4

Published by orchetect 12 months ago

New

  • Added new ObservableMIDIManager subclass of MIDIManager that provides two new @Published properties: observableDevices and observableEndpoints
  • MIDIKitUI SwiftUI components are now fully functional (see the MIDIKitUI example project)
  • Significant updates to the EndpointPickers example project to use endpoint display name as a fallback endpoint identity

Improvements

  • Refactored MIDIEndpointFilter Collection methods and resolved ambiguities

Fixed

  • Fixed potential crash in rare cases when Core MIDI property getter produces an error

Maintenance

  • All example projects have been further cleaned up and various issues resolved
  • Unit tests updated
  • Docs updated
MIDIKit - 0.9.3

Published by orchetect 12 months ago

  • Added Sendable conformance to most concrete types
  • Refactored Error types to be LocalizedError, added missing description strings
  • Refactored MIDIReceiver to use new MIDIReceiverOptions option set
MIDIKit - 0.9.2

Published by orchetect 12 months ago

  • Maintenance update to clean up Example projects
MIDIKit - 0.9.1

Published by orchetect about 1 year ago

  • MIDIEvent: Fixed description string formatting for noteOn, noteOff, noteCC, notePitchBend and notePressure events
  • Resolved an issue that could prevent app archival
MIDIKit - 0.9.0

Published by orchetect about 1 year ago

Improvements

  • MIDIManager: Streamlined addInputConnection/addOutputConnection API
  • Fixed proactive Swift 6 warning about shadowed associated type
  • Updated to TimecodeKit 2.0.1
  • Updated docs

API Changes

  • MIDIProtocolVersion: Renamed cases, removing underscore prefix
  • MIDIFile.FrameRate: Renamed cases, removing underscore prefix
  • MIDIFile.SMPTEOffsetFrameRate: Renamed cases, removing underscore prefix
  • MIDIFileEvent.DeltaTime: Renamed cases, removing underscore prefix
MIDIKit - 0.8.11

Published by orchetect over 1 year ago

  • MIDIFile Track: Added eventsAtBeatPositions() method
MIDIKit - 0.8.10

Published by orchetect over 1 year ago

New

  • MIDIEvent: Added midi1RawStatusByte() method
  • MIDIEvent: Added midi1RawDataBytes() method

Improvements

  • MIDIFile: Improved memory usage and load times when loading very large MIDI files

Docs

  • Added iOS background send/receive guide (#187)
  • Minor updates
MIDIKit - 0.8.9

Published by orchetect over 1 year ago

Changes

  • Bumped to Swift 5.7 minimum requirement
  • MIDIEvent.NoteCC.PerNoteController: Added registered(UInt8) static method

Docs

MIDIKit - 0.8.8

Published by orchetect over 1 year ago

  • MIDIFile: gained Hashable conformance (#174)
  • Updated PassiveDataReader to fix a potential crash when parsing MIDIFile (#175)
MIDIKit - 0.8.7

Published by orchetect over 1 year ago

  • MIDINote: Removed init(style:)
  • MIDIEvent.NoteOn: midi1ZeroVelocityAsNoteOff now defaults to false (#176)
MIDIKit - 0.8.6

Published by orchetect over 1 year ago

New

  • New MIDIKItUI module with reusable SwiftUI views for endpoint lists and pickers (WIP) - see new MIDIKitUIExample project
  • MIDIIOObject: Added image property to return SwiftUI Image

Improvements

  • MIDIEndpointIdentity: locate(in:) is now public, added new matches(endpoint:) sister method
  • Collection of MIDIEndpoint: added filter(using: MIDIEndpointFilter) method

Fixes

  • MIDIFile: Fixed extended characters in text events failing to parse (#171)
MIDIKit - 0.8.5

Published by orchetect over 1 year ago

  • MIDIInput/MIDIOutput: Renamed endpointName to name, and is now settable (#168)
  • MIDIFileEvent: Added delta convenience property
  • Added new MusicalTimeValue value type for converting between SMF delta times and bars & beats
MIDIKit - 0.8.4

Published by orchetect over 1 year ago

New

  • MIDIKit now requires Xcode 14 to build. It still supports macOS 10.12+ and iOS 10+ once compiled.
  • MIDIDevice: Added inputs and outputs convenience properties to return endpoint arrays (#129)
  • MIDIDevices: Added inputs and outputs convenience properties to return endpoint dictionaries (#129)

Improvements

  • MIDIInput/MIDIInputConnection: Resolved potential race condition in receiver
  • Memory access for legacy MIDIPacket / MIDIPacketList is more stable
  • MIDIPacketList: Fixed bug when sending legacy packet list containing multiple packets
  • Minor documentation & unit test updates
MIDIKit - 0.8.3

Published by orchetect over 1 year ago

  • Updated for TimecodeKit 1.6.9
MIDIKit - 0.8.2

Published by orchetect over 1 year ago

Fixes

  • MIDI thru connections are now available on all supported platforms (#164)

    Background

    • A Core MIDI bug where all MIDI thru connections were non-functional affected all Apple platforms for two generations:
      • macOS 11.x through 12.x and iOS 14.x through 15.x were affected
      • The issue was resolved in macOS 13.0 and iOS 16.0

    Resolution

    • For non-persistent thru connections on affected platforms, MIDIKit now transparently implements an internal event pipe that replicates the functionality of Core MIDI. This means midiManager.addThruConnection() can be called and will always function as expected, regardless of platform.
    • For persistent thru connections on affected platforms, no internal/automatic workaround is possible, and calling midiManager.addThruConnection() will result in an error being thrown. For this reason it is recommended to not utilize or rely on these persistent connections, and to defer to non-persistent ones instead.
MIDIKit - 0.8.1

Published by orchetect over 1 year ago

New

  • SysEx7 inits that take UInt8 data bytes now throw; Added non-throwing UInt7 overloads.
  • AnyMIDIIOObject.Property: Added name property
  • MIDIIOObject: Added propertyStringValue(for:)

Fixes

  • MIDIIONotification: Fixed missing metadata for sequential remove notifications (#162)

Changes

  • MIDIIONotification: Renamed parameters for added, removed, and propertyChanged
  • MIDIIOObject: Renamed propertiesAsStrings() to propertyStringValues()

Examples

  • Example projects have been consolidated and reorganized. SwiftUI examples are now multiplatform projects that can build for iOS or macOS destinations.
  • Added new SystemNotifications SwiftUI example project
  • MIDISystemInfo example project has been improved

Docs

  • Added MIDI Show Control guide
MIDIKit - 0.8.0

Published by orchetect over 1 year ago

New

  • RPN/NRPN messages are now fully implemented for I/O and MIDI file read/write (#158)

Improvements

  • MIDIEvent: description now outputs both MIDI 1.0 and MIDI 2.0 values for events to avoid confusion for those unfamiliar with MIDI 2.0 (also used when logging using the eventsLogging() receiver)
  • UInt7Pair: Added pretty output description
  • Updated example projects to reflect new rpn and nrpn cases for MIDIEvent
  • Docs updated
  • Unit tests updated

Fixes

  • RPN/NRPN UMP packets may have failed to parse before
  • Setting MIDIManager.preferredAPI = .legacyCoreMIDI now works correctly on macOS 13+ and iOS 16+
MIDIKit - 0.7.3

Published by orchetect almost 2 years ago

  • Added hide() and show() to virtual endpoints to control visibility to the user in the system endpoints
  • MIDIReceiver.create() now has public access level (for power-users)
  • Moved various Core MIDI utilities to MIDIKitInternals with public access level (for power-users)
  • Minor formatting and housekeeping
MIDIKit - 0.7.2

Published by orchetect almost 2 years ago

Internal updates for TimecodeKit 1.6.0 API changes.

No functional changes from MIDIKit 0.7.1.

Package Rankings
Top 17.85% on Swiftpackageindex.com
Badges
Extracted from project README
Xcode 14-16 License: MIT