The markdown parsing is broken/disabled for release notes. Sorry about that, I'm chasing the source of a crash that's been bringing this website down for the last couple of days.
## 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
## 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
- 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
- Maintenance update to clean up Example projects
- `MIDIEvent`: Fixed description string formatting for `noteOn`, `noteOff`, `noteCC`, `notePitchBend` and `notePressure` events
- Resolved an issue that could prevent app archival
## 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
- `MIDIFile` `Track`: Added `eventsAtBeatPositions()` method
## 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
## Changes
- Bumped to Swift 5.7 minimum requirement
- `MIDIEvent.NoteCC.PerNoteController`: Added `registered(UInt8)` static method
## Docs
- Cleaned up example projects
- Added [documentation for `MIDIEvent`](https://orchetect.github.io/MIDIKit/documentation/midikit/midievent)
- `MIDIFile`: gained Hashable conformance (#174)
- Updated `PassiveDataReader` to fix a potential crash when parsing `MIDIFile` (#175)