Skip to content

Releases: melanchall/drywetmidi

DryWetMIDI 7.2.0

05 Sep 18:12
a19e3bd
Compare
Choose a tag to compare

Objects managing methods are unified

Now it's possible to process objects of different types simultaneously. Thus now you can call, for example, just midiFile.ProcessObjects(ObjectType.Chord | ObjectType.Note, ...) instead of ProcessChords after ProcessNotes. The same story for objects removal. So in addition to this set of methods

we have

Also objects detection settings were decoupled. So ChordDetectionSettings doesn't contain NoteDetectionSettings from now, as well as NoteDetectionSettings doesn't contain TimedEventDetectionSettings. Methods shown in the first list accept those settings as separate parameters now.

PatternBuilder improvements

Now you can insert simple patterns more quickly – via new PianoRoll method. For example:

var midiFile = new PatternBuilder()
    .SetNoteLength(MusicalTimeSpan.Eighth)
    .PianoRoll(@"
        F#2   ||||||||
        D2    --|---|-
        C2    |---|---")
    .Repeat(9)
    .Build()
    .ToFile(TempoMap.Default, (FourBitNumber)9);
midiFile.Write("pianoroll-simple.mid", true);

Please read the PianoRoll section of the Pattern article to learn more.

Also a couple of new methods have been added to the PatternBuilder: ControlChange and PitchBend.

Small changes

DryWetMIDI 7.1.0

02 May 16:29
19ff130
Compare
Choose a tag to compare

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

DryWetMIDI 7.0.2

22 Dec 18:28
1748f93
Compare
Choose a tag to compare

This a micro-release, which fixes a couple of bugs ✨ 🎄 ✨

Small changes and bug fixes

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

DryWetMIDI 7.0.1

30 Aug 18:48
ac32c4a
Compare
Choose a tag to compare

New features and improvements

Small changes and bug fixes

DryWetMIDI 7.0.0

26 Jun 13:48
de3e6d6
Compare
Choose a tag to compare

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.

DryWetMIDI 6.1.4

14 Jan 11:34
6a2ea49
Compare
Choose a tag to compare

Small changes and bug fixes

DryWetMIDI 6.1.3

23 Oct 11:58
c468caf
Compare
Choose a tag to compare

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

DryWetMIDI 6.1.2

01 Aug 16:29
8bed6f7
Compare
Choose a tag to compare

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

DryWetMIDI 6.1.1

08 Jun 20:24
a1a388a
Compare
Choose a tag to compare

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.

DryWetMIDI 6.1.0

16 May 11:08
ab84ef6
Compare
Choose a tag to compare

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

Read more