Path to this page:
Subject: CVS commit: pkgsrc/audio/py-music21
From: David H. Gutteridge
Date: 2020-09-04 03:11:31
Message id: 20200904011131.C9FEDFB28@cvs.NetBSD.org
Log Message:
py-music21: update to 6.1.0
Change log:
Music21 v6 is OUT as v6.1.0! This represents over 500 commits over the past 14 \
months since v5.7 was released.
Many thanks to Jacob Tyler Walls (JTW below) who made so many contributions to \
the v6 branch, both big and small. Mad props and round of applause!
v6 fully supports Python 3.8 and removes support for Python 3.5. v6 will be the \
last major release to support Python 3.6 and we will work on Python 3.9 support \
immediately.
As with all new v.X releases of music21 there are improvements and some \
backwards incompatible changes (not too many)
In no particular order, here are the things to look for in the new music21 v6:
Type hints throughout music21 -- when you program with a sophisticated IDE \
you will be able to see what is returned and required as attributes in much of \
music21.
music21 is no longer packaged with external modules; these will be installed \
when installing music21 via pip (otherwise run pip install -r requirements.txt). \
Speed and security improvements come with this.
converter.parse('file.mid', quantizePost=False) will let you load in a MIDI \
file without any quantizing. (Thanks JTW)
Lots more values cached = faster music21; RomanNumerals in particular are \
over an order of magnitude faster, and Chords are faster too. If you ever have a \
problem, all Music21Objects have a .clearCache() function. Just add @cacheMethod \
as a decorator to a method and it will use the caching routine.
Intervals have been rewritten to use properties entirely. So whatever \
happens to an Interval, its semiSimpleNiceName (to take one of dozens of \
examples) will always be up to date. Intervals use Specifiers that are enums \
like interval. Specifier.PERFECT instead of inscrutable numbers. (those \
inscrutable numbers still work though) Specifiers are more than just standard \
enums -- they can invert themselves, do semitonesAboveMajor() etc. Interval \
geeks rejoice.
Intervals given a noteStart and a name will generate noteEnd automagically. \
They also get transposePitch() improvements along the way.
KeySignature gets transposePitchFromC() which takes a pitch in C major and \
returns the pitch in the same scale degree in this key..
Voices with gaps in them work way better in MusicXML. Repeat endings with \
multiple numbers like 1,2 r/t with musicxml (JTW)
TSV files which encode harmonic analysis can now be parsed (Thanks Mark Gotham)
Humdrum harm spines parse now, giving another way of encoding harmonic \
analysis. (Thanks Néstor Nápoles López)
MIDI refactor: easier to subclass and extend and with many docs -- keeps a \
clear distinction between strings and bytes. MIDI values are all Enum classes \
(but IntEnums so they compare well with pure numbers)
StripTies works much better thanks to JTW -- and does not filter out \
non-Notes anymore (technically an incompatibility, but really a bug fix). \
Voices, etc. don't faze .stripTies() any more. Stream.voicesToParts() also \
preserves more elements. Chords with some notes tied and some don't no longer \
get merged. Note that stripTies retainContainers defaults to True now, because \
getting the opposite behavior is as easy as a .flat
Internal but important: lots of parts of music21 code that used \
abbreviations now spell out the whole word. This is important for our friends \
using screen readers. While music21 will (for historical/compatibility reasons) \
still use camelCase for all method names, attribute names, etc., internal \
variables may now use underscore_case which helps with screen readers.
Stream().write('mxl') will write compressed musicxml (JTW). Or write('...', \
format='musicxml', compress=True)
Improvements to VoiceLeadingQuartets (thanks Ryaan Ahmed), including finding \
parallel intervals with octave displacement. voiceCrossing and voiceOverlap \
detection.
Substantial improvements to RomanText: see \
https://dmitri.mycpanel.princeton.edu/romantext.pdf
RomanNumerals can specify how they represent ^6 and ^7 in minor with \
sixthMinor and seventhMinor keywords)
OMR fixers can recognize Turns and other ornaments. More merging here to \
come. Thanks Janelle Sands!
Substantial improvements to beaming routines and tests (thanks Almog Cohen!)
Keys now have .deriveByDegree() like Scales, so "What minor key has \
scale degree 3 as B-flat?" can easily be answered.
Improvements to dotted tuplets (Almog Cohen)
Chord.name/fullName now gives better names for common chords like \
Major/Minor triads -- no longer relies entirely on chord.tables. But even there \
many improvements and spelling corrections.
Chords expose .notes to get at the notes that make up a chord, in a \
different way than Chord[0] or for n in Chord -- I'm still an old Perl guy, \
sometimes There's More Than One Way to Do It, and this way makes some things \
conceptually much easier and faster.
More Bach Chorale fixes from Doctor Schmidt (thanks!)
Stream.replace(recurse=True) finally works!
StringIndication, FretIndication work in musicxml (thanks Peter Mitrano)
For those who are adventurous -- intervalNetworks are now exposed on scales.
prebase.ProtoM21Object -- an idea ported back from music21j: nearly every \
object in music21, including all Music21Objects, inherits from this \
super-lightweight base class which allows for querying classes and giving \
consistent representations. It makes working in music21 a lot more fun.
Incompatible Changes
Stream filters now return a new StreamIterator. So old code like:
s = stream.Stream()
sIter = s.iter
sIter.getElementsByClass('Chord')
list(sIter)
should now be written as:
s = stream.Stream()
sIter = s.iter
sIter2 = sIter.getElementsByClass('Chord')
list(sIter2)
For most people using filters within a for-loop, nothing will appear to have changed.
if element in stream now only returns True if the element is actually in the \
Stream, not if element is equal to something in the Stream. This is not normal \
Python behavior for __contains__ but it is something music21 users have counted \
on for a decade, and now it is assured.
MIDI has been completely refactored, so if you are mucking with MIDI \
internals, it's going to be completely different. If you're just using \
converter.parse and .write('midi') it won't have changed much.
Also
Setting a pitch's accidental to a number is deprecated and to be removed \
soon. use b = pitch.Pitch('B4'); b.accidental = pitch.Accidental(-1).
some long deprecated functions removed, such as Stream.restoreActiveSites, \
Stream. _yieldReverseUpwardsSearch, common.standardDeviation (use \
statistics.stdev instead).
Chord sort methods no longer return the chord itself if inPlace=True
interval.convertSemitoneToSpecifierGenericMicrotone, \
convertSemitoneToSpecifierGeneric now return a Specifier Enum as their first \
value
Spelling corrections that are technically incompatible: Interval.perfectable \
replaces typo Interval.prefectable. Appoggiatura is spelled correctly with \
two-gs everywhere it's used (JTW)
stripTies(retainContainers=True) is now the default.
Half-diminished chords have ø7 etc. as their default representation.
MIDI.intsToHexString has become MIDI.intsToHexBytes which does what is says \
it does.
Small Changes/Bugs squashed:
A malformed spanner in musicxml will no longer crash parsing.
Tuplets are equal if their durations are equal. Better docs for duration \
equality.
contextSites, next, previous, and getContextByClass have a \
priorityTargetOnly or activeSiteOnly keyword for searching activeSite only. \
Speed!
From music21.X import * works much more reliably.
Bugs fixed in feature extraction of keys.
serial allows "P" or "T" to be used for transpositions
Tone-Rows give their row in the repr.
Historical tone-rows no longer have Row in their name. For instance: \
serial.getHistoricalRowByName('SchoenbergOp37').matrix() -- the old form still \
works though.
Feature extraction on empty streams (or ones that don't have instruments or \
something else) works properly (JTW)
Feature output formats can set .ext directly, in case you need a different \
extension.
viio7 can be specified as vii07
Interval: reverse=True works properly
subprocess.run is used instead of os.system for PNG generation. Thanks Uğur \
Güney. Fixes using musescore with music21 in Jupyter when spaces appear in \
filenames. (also thanks to Frank Zalkow)
Better representation for many objects
Error handling for incorrect chord abbreviation is improved. Thanks Vikram \
Natarajan
Librettists and lyricists can be searched in metadata. .age() works properly \
for living composers.
MIDI plays back properly in Jupyter again BUT also does not add a delay when \
writing out a file.
Voice numbers in generated musicxml are now low numbers
pitch.Accidental gets . setAttributeIndependently() in case you want \
something to look like a flat but only alter 0.8 semitones. (This appeared in \
v.5 at some point but was never announced)
Note gets a pitchChanged() method which is called by its attached pitch \
anytime it changes so that caches can be used. Pitch gets an informClient() \
method which is called anytime the pitch itself changes. There is something \
similar in Chords too. This squashes a lot of bugs where pitches were changing \
but notes/chords/scales/etc. did not act like they had changed.
makeAccidentals works properly in Voices (JTW)
MIDI parsing gets more instrument objects from more places (JTW)
zero-length objects at the end of streams were being ignored by makeNotation \
(JTW)
Show formats: MuseScore 3.5 compatibility. (JTW). Preview is found by \
default on macOS Catalina/Big Sur -- still works for older OSes. No more 'is \
your doc > 999 pages?' bugs!
Some Neo-Riemannian docs weren't showing (thanks Adam Spiers)
Tone profiles for key analysis have been corrected. (thanks Micah Walter)
scaleDegreeWithAlteration on Augmented 6th chords works.
.musicxml is fully recognized as a suffix.
Improvements to analysis.windowed (thanks Sandro Luck)
RepeatExpander now does nothing on a score with no repeats. Before, it crashed.
Sousa example couldn't show before (thanks David H. Gutteridge)
Verticality.removeVerticalDissonances now works (also thanks to Gutteridge)
Z-relation for 5Z37 (5Z17) was incorrect (thanks Rodrigo Balthar Furman for \
spotting this)
Power-users who subclass Stream to be standard storage variants: \
Stream().coreSelfActiveSite(el) allows for subclassing what happens when an \
element should normally have its activeSite set to the stream.
Lilypond output with UTF-8 works. Grace notes no longer crash Lilypond. Now \
that there is a 64-bit binary Mac version of Lilypond, it will not be removed \
from music21.
RomanNumerals compare with each other. __eq__ logically defined.
Modest performance improvements in sorting (Thanks Alexander Morgan)
Documentation and test improvements and a few bugs squashed in ABC parsing.
f-strings used throughout music21 allowing for more detailed error messages \
and many bugs to be detected and removed.
Deprecations
interval.Interval.convertSpecifier() deprecated. use parseSpecifier instead.
Humdrum parseData() and parseFile() are deprecated. use the general \
converter.parse() instead.
.editorial.misc is deprecated, just stick whatever you want on the \
.editorial object itself.
Gratitude
As always, I want to thank MIT, the NEH, and the Seaver Institute for supporting \
music21 over the years along with the community of developers who use and give \
back to music21.
Files: