All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- New meta event type
SequencerSpecificEvent. - Implement
Base.empty!(::MIDITrack)andBase.isempty(t::MIDITrack).
- New functions
metric_time. - New functions
duration_metric_time.
- Implement
Note(pitch_name::String; position = 0, velocity = 100, duration = 960, channel = 0) - Implement
Notes(notes_string::String, tpq::Int = 960)
- Implement
Base.empty!(::Notes)andBase.isempty(::Notes).
- New functions
is_octave. - Implement
Base.keys(::Notes)andBase.eachindex(::Notes).
- New functions
pitch_to_hzandhz_to_pitch
- Default value of
MIDIFile.formatchanged from 0 to 1 - Warning introduced to
fileio_savefor format 0 files with multiple tracks
MIDIEventandMetaEventare abstract types and they cannot be used directly.
-
New event types for each midi and meta events.
-
The list of new meta event types:
- SequenceNumberEvent
- TextEvent
- CopyrightNoticeEvent
- TrackNameEvent
- InstrumentNameEvent
- LyricEvent
- MarkerEvent
- CuePointEvent
- MIDIChannelPrefixEvent
- EndOfTrackEvent
- SetTempoEvent
- TimeSignatureEvent
- KeySignatureEvent
-
The list of new midi event types:
- NoteOffEvent
- NoteOnEvent
- AftertouchEvent
- ControlChangeEvent
- ProgramChangeEvent
- ChannelPressureEvent
- PitchBendEvent
- New function
tempochanges
- Added
qpmthat returns the quarter notes per minute tempo of a given MIDI - Added
bpmthat returns the beats per minute of a given MIDI - Deprecated
BPM
- Added
time_signaturethat returns the time signature of a given MIDI.
name_to_pitchnow accepts flat names andpitch_to_nameacceptsflatkeyword argument.
DrumNoteshorthand constructor, keyword constructor forNoteand addedDRUMKEYdictionary in constants.jl (originally in MusicVisualizations).
- Notes constructor allows values of
tpqgreater than960.
- New function
testnotes()that returns a test set of human-played notes.
- Correctly implement
Base.copy(::Notes)to copy every note, instead of copying the high-level vector (which lead to all internal notes being the same object as the non-copied version).
showfor midi now states the contained tracks
- Added convenience function
tracknames(midi)
Improved the printing of TrackEvents. They now state the amount of elements in them, as well as listing how many or of each type. E.g.:
julia> midi.tracks
5-element Array{MIDITrack,1}:
3-event MIDITrack: 0 MIDI, 3 Meta, 0 Sysex
5729-event MIDITrack: 5728 MIDI, 1 Meta, 0 Sysex
8467-event MIDITrack: 8466 MIDI, 1 Meta, 0 Sysex
21487-event MIDITrack: 21486 MIDI, 1 Meta, 0 Sysex
9773-event MIDITrack: 9772 MIDI, 1 Meta, 0 Sysex
Removed deprecations.
See #112
We have changed name_to_pitch so that "C4" corresponds to midi pitch 60.
No change, just stable release.
- Two new super-useful functions:
name_to_pitchandpitch_to_name. - Function
testmidi()that returns the path todoxy.mid.
-
BPM(midi)does not return the value rounded to an integer anymore. It returns the computed division instead. -
ms_per_tickhas now two methods: either one that acceptstpq, bpmor one that accepts amidifile.
BPMis now faster as it iterates over events.- Pretty printing for
MIDIFile. - Added functions
texteventandfindtexteventsthat create and find text related meta events (lyrics, text, markers). - Possible to write a midi file directly from notes.
- Minor documentation Improvements.
- Improvement on
showofNotes, especially the vectorized form.
We now drop support for Julia 0.6 and only support ≥ 0.7.
-
Now there is not only
addevent!to add events to an existing track, but alsoaddevents!which is significantly faster than callingaddevent!many times, because it uses the newaddevent_hintfunction to add the events. Useaddevents!to add multiple events in one go. -
This also made
addnotessignificantly faster. -
Internally we implemented a new adding function
addevent_hint!which is able to skip allTrackEvents that surely lay before the new event to add.