🎹 Modern multi-platform Swift CoreMIDI wrapper with MIDI 2.0 support.
MIT License
Bot releases are visible (Hide)
MIDIReceiverOptions
: Added .bundleRPNAndNRPNDataEntryLSB
receiver option (#198)MIDIReceiver
: eventsWithMetadata
receiver has been renamed to events
and inherits its events, timeStamp, source
closure parametersMIDIReceiver
: object(_:held:options:)
is now replaced by strong(_:options:)
or weak(_:options:)
and, as such, no longer carries a held
propertyMIDIReceiveHandler
classMIDIReceiveHandlerProtocol
to MIDIReceiverProtocol
and made it publicMIDIEvent.pressure
: Debug description now includes both MIDI 1.0 & MIDI 2.0 value representation, consistent with other event descriptionsMIDIReceiver
boilerplatePublished by orchetect 12 months ago
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)EndpointPickers
example project to use endpoint display name as a fallback endpoint identityMIDIEndpointFilter
Collection methods and resolved ambiguitiesPublished by orchetect 12 months ago
Sendable
conformance to most concrete typesError
types to be LocalizedError
, added missing description stringsMIDIReceiverOptions
option setPublished by orchetect 12 months ago
Published by orchetect about 1 year ago
MIDIEvent
: Fixed description string formatting for noteOn
, noteOff
, noteCC
, notePitchBend
and notePressure
eventsPublished by orchetect about 1 year ago
MIDIManager
: Streamlined addInputConnection
/addOutputConnection
APIMIDIProtocolVersion
: Renamed cases, removing underscore prefixMIDIFile.FrameRate
: Renamed cases, removing underscore prefixMIDIFile.SMPTEOffsetFrameRate
: Renamed cases, removing underscore prefixMIDIFileEvent.DeltaTime
: Renamed cases, removing underscore prefixPublished by orchetect over 1 year ago
MIDIFile
Track
: Added eventsAtBeatPositions()
methodPublished by orchetect over 1 year ago
MIDIEvent
: Added midi1RawStatusByte()
methodMIDIEvent
: Added midi1RawDataBytes()
methodMIDIFile
: Improved memory usage and load times when loading very large MIDI filesPublished by orchetect over 1 year ago
MIDIEvent.NoteCC.PerNoteController
: Added registered(UInt8)
static methodMIDIEvent
Published by orchetect over 1 year ago
MIDIFile
: gained Hashable conformance (#174)PassiveDataReader
to fix a potential crash when parsing MIDIFile
(#175)Published by orchetect over 1 year ago
MIDINote
: Removed init(style:)
MIDIEvent.NoteOn
: midi1ZeroVelocityAsNoteOff
now defaults to false (#176)Published by orchetect over 1 year ago
MIDIKItUI
module with reusable SwiftUI views for endpoint lists and pickers (WIP) - see new MIDIKitUIExample projectMIDIIOObject
: Added image property to return SwiftUI ImageMIDIEndpointIdentity
: locate(in:)
is now public, added new matches(endpoint:)
sister methodCollection
of MIDIEndpoint
: added filter(using: MIDIEndpointFilter)
methodMIDIFile
: Fixed extended characters in text events failing to parse (#171)Published by orchetect over 1 year ago
MIDIInput
/MIDIOutput
: Renamed endpointName
to name
, and is now settable (#168)MIDIFileEvent
: Added delta
convenience propertyMusicalTimeValue
value type for converting between SMF delta times and bars & beatsPublished by orchetect over 1 year ago
MIDIDevice
: Added inputs
and outputs
convenience properties to return endpoint arrays (#129)MIDIDevices
: Added inputs
and outputs
convenience properties to return endpoint dictionaries (#129)MIDIInput
/MIDIInputConnection
: Resolved potential race condition in receiverMIDIPacket
/ MIDIPacketList
is more stableMIDIPacketList
: Fixed bug when sending legacy packet list containing multiple packetsPublished by orchetect over 1 year ago
Published by orchetect over 1 year ago
MIDI thru connections are now available on all supported platforms (#164)
midiManager.addThruConnection()
can be called and will always function as expected, regardless of platform.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.Published by orchetect over 1 year ago
SysEx7
inits that take UInt8
data bytes now throw; Added non-throwing UInt7
overloads.AnyMIDIIOObject.Property
: Added name
propertyMIDIIOObject
: Added propertyStringValue(for:)
MIDIIONotification
: Fixed missing metadata for sequential remove
notifications (#162)MIDIIONotification
: Renamed parameters for added
, removed
, and propertyChanged
MIDIIOObject
: Renamed propertiesAsStrings()
to propertyStringValues()
Published by orchetect over 1 year ago
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
rpn
and nrpn
cases for MIDIEvent
MIDIManager.preferredAPI = .legacyCoreMIDI
now works correctly on macOS 13+ and iOS 16+Published by orchetect almost 2 years ago
hide()
and show()
to virtual endpoints to control visibility to the user in the system endpointsMIDIReceiver.create()
now has public access level (for power-users)Published by orchetect almost 2 years ago
Internal updates for TimecodeKit 1.6.0 API changes.
No functional changes from MIDIKit 0.7.1.