Skip to content

Releases: melanchall/drywetmidi

DryWetMIDI 8.0.3

16 Dec 20:09
0412ee2

Choose a tag to compare

This small release is the last in this year. And the last one with support of 32-bit processes for Multimedia API on Windows.

Happy New Year! 🎄 🎉

Important

You can help to make the library better! Please take a quick survey.

Small changes

Bug fixes

  • Fixed: Playback.NoteCallback is still applied to already played notes after it has been set to null.
  • Fixed: Result of GetObjects is not sorted when chords and timed events requested, and notes and chords passed.
  • Fixed: GetTempoMap returns wrong tempo map after events were set on EventsCollection by index.

DryWetMIDI 8.0.2

31 Jul 15:20
44298dc

Choose a tag to compare

Another one minor release. It fixes critical bug with the PlaybackPlayback skips some notes (#334). It's highly recommended to switch to the new version of the library.

DryWetMIDI 8.0.1

23 Jun 17:16
eb24a0f

Choose a tag to compare

This minor release addresses issues with the Playback.

First of all, performance of Playback instance creation was degraded in the 8.0.0 version. Now that is fixed. More than that, Playback's constructor is faster and consumes less memory than in the 7.2.0 version. It's highly recommended to switch to the new version of the library.

Also, a couple of bugs were fixed:

  • If you create an instance of the Playback via passing an objects collection, playback can work unexpectedly if input objects are not sorted by their times.
  • If you change the time of a playback (for example, via MoveToTime) and there is a note in the new position, NoteCallback won't be applied.

DryWetMIDI 8.0.0

18 May 16:48
b82d95c

Choose a tag to compare

Major playback improvements

Now it’s possible to change playback’s data on the fly (#78)! It was a big challenge to implement this functionality (do you even use red-black trees?). But now you can add, remove and change objects without needing to recreate an instance of the Playback or even stop it. You’ll find the detailed guide on how to use the feature in the Dynamic changes article of the library docs.

Also a bunch of bugs related to the Playback were fixed:

Data tracking is now on by default. So in case of jumps in time you’ll get correctly applied program, pitch and control values. TrackNotes is now true by default too. Of course you can turn the feature off via corresponding properties if you want.

Several new things were added:

Please note that there are some breaking changes:

  • Play method has been removed. It causes confusion and does nothing but just calling Start and then SpinWait.SpinUntil(() => !IsRunning). You can do these actions by yourself if you for some reason want the blocking playback.
  • PlaybackHint has been removed from PlaybackSettings. There was no noticeable performance gain in using this feature. You can just disable data tracking if you want.
  • Snapping has been reworked. First of all, there is no Snapping property within the Playback anymore. Snapping functionality was moved just right into the Playback. Snapping.IsEnabled is replaced with IsSnappingEnabled. SnapToNotesStarts and SnapToNotesEnds methods are replaced with the much more flexible SnapToEvents one.

New features and improvements

Small changes and bug fixes

Read more

DryWetMIDI 7.2.0

05 Sep 18:12
a19e3bd

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

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

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

Choose a tag to compare

New features and improvements

Small changes and bug fixes

DryWetMIDI 7.0.0

26 Jun 13:48
de3e6d6

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

Choose a tag to compare

Small changes and bug fixes