Releases: melanchall/drywetmidi
DryWetMIDI 6.1.3
Lazy reading/writing API
DryWetMIDI now provides ways to read/write data from/to a MIDI file sequentially token by token which allows to keep low memory consumption. Here the new methods and classes aimed for this task:
Small changes and bug fixes
- Added
EnumerateObjectsmethod to theGetObjectsUtilities. - Fixed:
MidiFile.Equalsdon't respectTimeDivision. - Fixed:
Mergerskips objects sometimes (#225).
DryWetMIDI 6.1.2
Apple Silicon support
DryWetMIDI multimedia API now supports Apple Silicon chips when used on macOS (#204). Thanks to @ThaddeusChristopher for testing!
Nativeless version
The library has now nativeless version where all native-dependent API is cut out. More info in the Nativeless package article.
New features and improvements
- Added BytesFormat property to BytesToMidiEventConverter.
- Added BytesFormat property to MidiEventToBytesConverter.
- Removed
FfStatusBytePolicyproperty from BytesToMidiEventConverter. - IInputDevice/IOutputDevice are now derived from
IDisposable(#205).
DryWetMIDI 6.1.1
This release continues unifying API to work with different MIDI objects finishing the work done in the previous release.
New features and improvements
- Added Resizer tool which can resize groups of objects of different types or entire MIDI files.
- Added Merger tool to merge nearby objects of different types.
- Added SplitByObjects method to the Splitter class.
- Added TimeSpanUtilities.Round method.
- Added TimeSpanUtilities.IsZeroTimeSpan method.
- Added Count property to the TimedObjectsCollection class.
- Added SplitFileByChunksSettings.PreserveTempoMap property.
- Added ILengthedObject.EndTime property.
- Added GetDuration methods for TrackChunk.
Small changes and bug fixes
- All exception classes are now serializable.
- Fixed: ReplaceTempoMap throws an exception for empty track chunks collections / MIDI file.
DryWetMIDI 6.1.0
This release focuses on unifying API to work with different MIDI objects.
Tools
First of all, new tool added – Repeater. It allows repeat MIDI data specified number of times with different options applied.
Also, some old tools were unified into single ones:
TimedEventsQuantizer,NotesQuantizerandChordsQuantizerhave been replaced by newQuantizertool which can quantize objects of different types simultaneously. More than that, it can now quantize start and end times at the same time, applying randomization if specified (and thusRandomizertool is now obsolete). More info in the Quantizer article.NotesSplitterandChordsSplitterhave been replaced by newSplittertool which can split objects of different types simultaneously. Also all methods fromMidiFileSplitterclass have been moved to theSplitterone. More info in the Splitter articles.
Objects managers
Also the work has been done on unifying separate manager classes for each object type. So now TimedEventsManager, NotesManager and ChordsManager classes are now obsolete. You should use TimedObjectsManager class now which can manage objects of different types simultaneously. More info in the Objects managers article.
New features and improvements
Clonemethod has been moved from separate classes (likeNoteorTimedEvent) toITimedObjectinterface.Splitmethod has been moved from separate classes (likeNoteorChord) toILengthedObject.- Added
SetTimemethod toTimedObjectUtilities(SetTimewithinTimedEventsManagingUtilitiesis obsolete now). - Added
SetLengthmethod toLengthedObjectUtilities(SetTimeAndLengthmethods withinNotesManagingUtilitiesandChordsManagingUtilitiesare obsolete now). - Added
MoveToStartmethod toPatternBuilderclass. - Added parameter of
RepeatSettingstype toPatternBuilder'sRepeatmethods. - Added
Notemethods by a note string toPatternBuilder. - Added
Chordmethods by a chord string toPatternBuilder. - Changed default value of the
Playback.InterruptNotesOnStopproperty totrue. - Parsing of
MusicTheory.Noteignores case now. - Parsing of
Chord.GetNamesmethod supports7b9,add11,7#11,7+11,7(#11)and7aug11chords now (see complete list of supported chords here). - Added
TimeTypeproperty to thePlaybackCurrentTimeWatcher. - Constructor of the
PlaybackCurrentTimeWatcheris now public so you can create different watchers. - Added
WatchOnlyRunningPlaybacksproperty to thePlaybackCurrentTimeWatcherSettings. - Added
SetPlaybackTimeTypemethod to thePlaybackCurrentTimeWatcher. - Added
Note's constructor by pair of timed events. - Added parameter of the
TimedEventDetectionSettingstype to timed events managing methods. - Added
ConstructorandTimedEventDetectionSettingsproperties toNoteDetectionSettings. - Added
Constructorproperty toChordDetectionSettings.
Small changes and bug fixes
- Added new total properties for
MetricTimeSpan(#144). - Handled big internal values within time spans conversions.
- Fixed:
NotEnoughBytesPolicyis ignored on reading some events. - Fixed: [
TrackChunk](https://melanchall.github.io/drywetmidi/a...
DryWetMIDI 6.0.1
This is a minor release containing following changes:
HighPrecisionTickGeneratorimplementation for macOS uses less CPU now and comsume less power.GetAllstatic method for InputDevice and for OutputDevice returnsICollectionnow.- Fixed:
VirtualDevice.IsEnableddoesn't work. - Fixed:
EndOfTrackEventwritten incorrectly in some cases if it present in a MIDI file withReadingSettings.EndOfTrackStoringPolicyset toEndOfTrackStoringPolicy.Storeon reading the file. - Fixed: Events don't preserve order on transfer to next part on MIDI file splitting.
DryWetMIDI 6.0.0
Devices API available for macOS now
DryWetMIDI allows now work with MIDI devices on macOS! More than that, a couple of new classes are available for macOS only:
Also HighPrecisionTickGenerator implemented for macOS too so you can now use Playback with default settings on that platform. Its implementation for macOS is not good (in terms of performance) for now but will be optimized for the next release of the library.
Breaking changes
This version of the library has following breaking changes:
Melanchall.DryWetMidi.Devicesnamespace renamed to Melanchall.DryWetMidi.Multimedia to reflect its content more precisely since not only devices are there.DriverManufacturer,ProductIdentifierandDriverVersionproperties were removed from the MidiDevice class and replaced byGetPropertymethod for InputDevice and for OutputDevice.Channels,DeviceType,NotesNumber,SupportsLeftRightVolumeControl,SupportsPatchCaching,SupportsVolumeControl,VoicesNumberandVolumeproperties were removed from OutputDevice and replaced by GetProperty method.- Removed
InvalidSysExEventReceivedandInvalidShortEventReceivedevents from InputDevice and replaced them with ErrorOccurred one. - All obsolete APIs were removed from the library.
New features
- Added VirtualDevice class which allows create virtual MIDI devices on macOS.
- Added
GetPropertymethod for InputDevice and for OutputDevice. - Added
GetSupportedPropertiesmethod for InputDevice and for OutputDevice. - Added DevicesWatcher class which allows watch adding or removing a MIDI device.
- Added
ConvertMultiplemethods to BytesToMidiEventConverter (#134). - Added FfStatusBytesPolicy property to BytesToMidiEventConverter.
- Implemented delta-times support in BytesToMidiEventConverter and MidiEventToBytesConverter (#134).
- Exploded
WritingSettingsproperty of MidiEventToBytesConverter into separate properties. - Exploded
ReadingSettingsproperty of BytesToMidiEventConverter into separate properties. - Added UnknownChannelEventPolicy property for BytesToMidiEventConverter.
- Added
GetByIndexmethod for InputDevice and for OutputDevice.
Small changes and bug fixes
- MidiException class has been moved to Melanchall.DryWetMidi.Common namespace.
- MidiDeviceException is subclassed from MidiException now.
- Fixed:
GetObjectsmethods of the GetObjectsUtilities sometimes return wrong chords when notes are gathered across different track chunks.
DryWetMIDI 5.2.1
New features and improvements
- Added
EventCallbackproperty toDevicesConnector. - Added
CutPartmethod toMidiFileSplitter. - Improved performance of
GetNotes,ProcessNotesandRemoveNotesmethods ofNotesManagingUtilities. - Improved
GetChords,ProcessChordsandRemoveChordsmethods ofChordsManagingUtilities. - Improved performance of ticks to metric timespan conversion (#129).
- Added
DeviceErrorOccurredevent toPlayback(#121). - Replaced
MidiClockSettingsparameter byPlaybackSettingsin all playback creation methods and putMidiClockSettingsinsidePlaybackSettings. - Removed
Playbackconstructors byMidiEvents, addedGetPlaybackutility methods forMidiEvents to (with output device parameter and without it). - Tracked data will be now sent by
Playbackwhen value ofTrackControlValue,TrackPitchValueorTrackProgramchanged totrue. - Added
IMetadatainterface. - Added
TryPlayEventandGetTimedEventsprotected virtualmethod toPlayback(please see Custom playback article). - Added
EndOfTrackStoringPolicytoReadingSettings(#17). - Added
Metadataproperty toMidiEventPlayedEventArgs(please see Custom playback article).
Small changes and bug fixes
- Made
TickGenerator.TickGeneratedeventpublic. - Made
EndOfTrackEventclasspublic(#17). - Removed
sealedmodifier fromPlayback. - Removed
sealedmodifier fromTimedEvent,NoteandChordclasses, made theirClonemethodsvirtual. - Fixed: Concurrent access to
OctaveandNotecaches is failed (#116). - Fixed:
NoteSearchContextandChordSearchContextare not respected inGetObjectsmethods for track chunks collection and for MIDI file. - Fixed: Tracked data is sent by
Playbackwhen we jump to data change event.
DryWetMIDI 5.2.0
Performance
Methods to get, process and remove timed events and notes now work faster and consume less memory. Full tables with benchmarks results can be found here:
New features and improvements
- Added
GetObjectsUtilitiesclass containing methods that allow get objects of different types from the input ones (or MIDI file, for example). ProcessTimedEventsandRemoveTimedEventsmethods return now count of processed/removed timed events.ProcessNotesandRemoveNotesmethods return now count of processed/removed notes.ProcessChordsandRemoveChordsmethods return now count of processed/removed chords.- Added
IsEnabledproperty toMidiDevice. - Added methods to
Playbackto move to snap points by data. - All move-to-by-snap-points methods of
Playbackreturnboolnow to indicate whether time changed or not. - Added
PlaybackStartandPlaybackEndproperties toPlayback. - Added
IsEnabledtoPlaybackSnapping. - Added
PlaybackSnapping.Clearmethod. - Added
TrackProgram,TrackPitchValueandTrackControlValuetoPlayback. - Removed reading handlers API.
- Added
<,>,<=,>=operators forTempoandTimeSignature. BeatsPerMinuteproperty ofTempois now ofdoubletype.- Added
settingsparameter toSplitByChannelmethod. - Added
settingsparameter toSplitByNotesmethod. - Return type of
GetTimedEvents,GetNotesandGetChordschanged fromIEnumerable<T>toICollection<T>. - Added
NoteDetectionSettingstoGetNotes,ProcessNotesandRemoveNotes. - Added
ChordDetectionSettingstoGetChords,ProcessChordsandRemoveChords. - Added
ChordDetectionSettingstoChordsQuantizingSettingsandChordsRandomizingSettings. - Added
NoteDetectionSettingstoNotesQuantizingSettingsandNotesRandomizingSettings. - Added
SilentNoteOnPolicyproperty toInputDevice. - Added
SplitByChunksmethod toMidiFileSplitter.
Small changes and bug fixes
- Some methods are now obsolete:
GetTimedEventsAndNotesUtilities(OBS5);GetNotesAndRestsUtilities(OBS6);TimedEventsManagingUtilities.ToTrackChunk,NotesManagingUtilities.ToTrackChunk,ChordsManagingUtilities.ToTrackChunk(OBS7);TimedEventsManagingUtilities.ToFile,NotesManagingUtilities.ToFile,ChordsManagingUtilities.ToFile(OBS8);TimedEventsManagingUtilities.AddTimedEvents,NotesManagingUtilities.AddNotes,ChordsManagingUtilities.AddChords([OBS9](https://melanchall.github.io/drywetmidi/obsolet...
DryWetMIDI 5.1.2
Obsolete API
New section has been added to documentation site: Obsolete. This section contains the list of methods and classes that are obsolete and thus will be removed by a next release.
The current list of obsolete API:
- OBS1: WritingSettings.CompressionPolicy
- OBS2: ReaderSettings.ReadFromMemory
- OBS3: TempoMap.TimeSignature
- OBS4: TempoMap.Tempo
New features and improvements
- Added ReaderSettings.BufferingPolicy property.
- Increased speed of MidiFile.Read method.
- Increased speed of MidiFile.Write method.
- Implemented buffered MIDI file writing (see WriterSettings.UseBuffering).
- Decreased memory usage of MidiWriter.Write3ByteDword and MidiWriter.WriteVlqNumber.
- Reduced memory usage for ChannelEvent.
- Added ReadingSettings.ZeroLengthDataPolicy property.
- Added RPN classes (see RegisteredParameter).
- Added TempoMap.GetTimeSignatureChanges and TempoMap.GetTimeSignatureAtTime methods.
- Added WritingSettings.WriteHeaderChunk property (#94).
- Added GS standard percussion API (#93).
- Added SliceMidiFileSettings.Markers property (#99).
- Non-SMF events will be filtered out on saving to MIDI file or track chunk (#103).
Small changes and bug fixes
- Added value validation in setters of some MIDI events classes properties.
- Edge Note Off events will always be put to current part on MIDI file splitting (#99).
- Fixed: Events transferred incorrectly between parts on MIDI file splitting (#99).
- Fixed: SmpteOffsetEvent writes in wrong way.
- Fixed: SmpteOffsetEvent equality check is wrong.
- Fixed: Failed to use devices API in UWP app (#95).
DryWetMIDI 5.1.1
New features
- Removed
intervalparameter fromMidiClockSettings.CreateTickGeneratorCallback. - Turned
ITickGeneratortoTickGeneratorabstract class. - Added
RepeatStartedevent toPlayback. - Made constructors of
MidiEventReceivedEventArgsandMidiEventSentEventArgspublic to have ability to fire corresponding events in custom input/output devices. DevicesConnectornow usesIInputDeviceinstead ofInputDevice.- Removed
IDisposablefromDevicesConnector. - Added
AreDevicesConnectedproperty toDevicesConnector. - Added
Parse/TryParsetoOctave. - Added
INotifyTimeChangedinterface onTimedEvent,NoteandChord. - Added
INotifyLengthChangedinterface onNoteandChord.
Small changes and bug fixes
- Chords parsing uses CNT now.
- Fixed: Multi-thread access to active notes metadata inside
Playbackcan cause exceptions. - Fixed:
Playback.EventPlayednot fired for meta events (#82). - Fixed: Slash chord name contains Sharp instead of # for sharped notes as result of
GetNames.