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_hz
andhz_to_pitch
- Default value of
MIDIFile.format
changed from 0 to 1 - Warning introduced to
fileio_save
for format 0 files with multiple tracks
MIDIEvent
andMetaEvent
are 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
qpm
that returns the quarter notes per minute tempo of a given MIDI - Added
bpm
that returns the beats per minute of a given MIDI - Deprecated
BPM
- Added
time_signature
that returns the time signature of a given MIDI.
name_to_pitch
now accepts flat names andpitch_to_name
acceptsflat
keyword argument.
DrumNote
shorthand constructor, keyword constructor forNote
and addedDRUMKEY
dictionary in constants.jl (originally in MusicVisualizations).
- Notes constructor allows values of
tpq
greater 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).
show
for midi now states the contained tracks
- Added convenience function
tracknames(midi)
Improved the printing of TrackEvent
s. 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_pitch
andpitch_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_tick
has now two methods: either one that acceptstpq, bpm
or one that accepts amidi
file.
BPM
is now faster as it iterates over events.- Pretty printing for
MIDIFile
. - Added functions
textevent
andfindtextevents
that create and find text related meta events (lyrics, text, markers). - Possible to write a midi file directly from notes.
- Minor documentation Improvements.
- Improvement on
show
ofNotes
, 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_hint
function to add the events. Useaddevents!
to add multiple events in one go. -
This also made
addnotes
significantly faster. -
Internally we implemented a new adding function
addevent_hint!
which is able to skip allTrackEvent
s that surely lay before the new event to add.