Melanchall Drywetmidi Versions Save

.NET library to read, write, process MIDI files and to work with MIDI devices

v7.1.0

3 weeks ago

Rests redesigned

Now you can get rests between different types of objects and by any logic you will describe. Please read updated Rests section of the docs. This entails a breaking change – there is no ObjectType.Rest option anymore. So to get, for example, notes and rests between them you need to write following code:

var notesAndRests = midiFile
    .GetNotes()
    .WithRests(RestDetectionSettings.NoNotesByChannel);

To feel the power of the new approach, just take a look to the snippet:

var notesAndChordsAndRests = midiFile
    .GetObjects(ObjectType.Note | ObjectType.Chord)
    .WithRests(new RestDetectionSettings
    {
        KeySelector = obj => obj is Note note && note.NoteNumber > 100
            ? (object)note.NoteNumber
            : null
    });

Here we get notes, chords and rests between notes with note number > 100 separately for each note number. Rests won't be built for chords and notes with note number <= 100.

CSV serialization redesigned

CSV serialization and deserialization have been completely reworked with the new CsvSerializer class. Please read CSV serializer article to learn more.

Small changes

v7.0.2

5 months ago

This a micro-release, which fixes a couple of bugs :sparkles: :christmas_tree: :sparkles:

Small changes and bug fixes

  • Improved chord name detection (#260).
  • Fixed: SMPTE time divisions not being read/written correctly (#275).

v7.0.1

8 months ago

New features and improvements

Small changes and bug fixes

v7.0.0

10 months ago

Breaking changes

This version of the library has following breaking changes:

New features and improvements

Small changes and bug fixes

  • Improved Quantizer performance.
  • Set default pitch value for PitchBendEvent to 8192.
  • Fixed: GetTimedEvents methods for multiple track chunks returns original events if a single track chunk is in the collection.
  • Fixed: Exception on Chord's length setting below the distance between chord's start and its last note's time.

v6.1.4

1 year ago

Small changes and bug fixes

v6.1.3

1 year ago

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

v6.1.2

1 year ago

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

v6.1.1

1 year ago

This release continues unifying API to work with different MIDI objects finishing the work done in the previous release.

New features and improvements

Small changes and bug fixes

  • All exception classes are now serializable.
  • Fixed: ReplaceTempoMap throws an exception for empty track chunks collections / MIDI file.

v6.1.0

2 years ago

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, NotesQuantizer and ChordsQuantizer have been replaced by new Quantizer tool 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 thus Randomizer tool is now obsolete). More info in the Quantizer article.
  • NotesSplitter and ChordsSplitter have been replaced by new Splitter tool which can split objects of different types simultaneously. Also all methods from MidiFileSplitter class have been moved to the Splitter one. 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

Small changes and bug fixes

  • Added new total properties for MetricTimeSpan (#144).
  • Handled big internal values within time spans conversions.
  • Fixed: NotEnoughBytesPolicy is ignored on reading some events.
  • Fixed: TrackChunk is written on saving to SingleTrack format even if there are no track chunks in a file.
  • Fixed: PInvokeStackImbalance exception on native calls in 32-bit app (#142).
  • Fixed: Native binaries are visible in IDE solution explorer (#158).
  • Fixed: Playback position jumps on speed changing.
  • Fixed: GetObjects methods sometimes return not all objects if uncompleted chord encountered.

v6.0.1

2 years ago

This is a minor release containing following changes: