Thursday, October 27, 2022

Music21 v8 Released

 (this message should have gone out last month...)

I'm proud to release v8 of music21, the toolkit for computer-aided music analysis, score manipulation, computational musicology, etc. This release (technically 8.1) builds on 12.5 months of work from v7, and like all new big number releases has a few backwards incompatible changes from before, in exchange for cool new features.

Version 8 supports Python 3.8+, if you need Python 3.7 (such as on Google Colab which is now 3+ Python versions behind) stick to music21 v7. V8 is the first to fully support Python 3.10 and will receive patches to support Python 3.11 in the future. There will be a change to music21's Python support policy in v9: music21 v9 will support Python 3.10 and above only.

Big Changes

  • The biggest new improvement in v8 is an all new Dublin-Core / MARC based metadata system that allows for encoding a huge amount of information about a score. Look at the new docs for music21.metadata for more information. Thanks to Greg Chapman for the big amount of work on this.
  • Modern installation system, based on Hatch. If you have problems, please let me know -- I expect some growing pains on this.
  • ArpeggioMark and ArpeggioMarkSpanner classes.
  • Adding DCML v2 parsing to tsvConverter.py
  • Explicit Keywords on all music21 objects
  • Continued Major improvements in Typing across music21. If you are using a modern IDE, you will find the number of music21-related bugs you create will go down hugely.
  • Ever more docs and more relevant (and diverse examples)

Other changes/fixes since v7.3

  • opFrac speedup
  • Fix MIDI in Google Colab Notebooks (backported to 7.3.3)
  • Use more classes in getElementsByClass
  • Improve graphing docs and options
  • Accidentals never and if-absolutely-necessary
  • Add typing to key.py
  • makeRests(inPlace=True) returns None for scores
  • StreamCore is now a Music21Object; Iterator improvements
  • Avoid <forward> tags from expressions out of measure bounds
  • Avoid writing empty <movement-title /> and <creator /> tags when title and author have no defaults
  • harmonicFunction. maps between RN figures and function labels
  • Make cautionaryPitchClass=True work with chords
  • Export Unpitched to MIDI
  • Fix getPitches(direction=DESCENDING) returning ascending scales
  • Make Key instances compare equal regardless of tonic octave
  • Fix midmeasure clef export regression involving voices
  • Fix a bug in musicxml/partStaffExporter.py where a clef-octave-change
  • Musicxml export: Preserve whitespace in TextBox
  • Fix bug in Capella parsing
  • Patch duration linked bugs
  • deprecate gcd in favor of C math
  • makeTies within makeNotation; getTimeSignatures recurse
  • First docs and improvements to trees
  • Fix shiftElements docs
  • SixthMinor carries to secondary dominants
  • Add makeNotation routines for completing or consolidating tuplets
  • Demonstrate ties in splitElementsToCompleteTuplets doctest
  • MusicXML export: Make rests before making notation
  • Validate figures provided to RomanNumeral()
  • Clear cache when adding notes w/o sort
  • match d43, d65, etc.
  • Use requests lib. for URL getting
  • Allow iterables of qualified class names in Stream.__getitem__ searches
  • Fix problem with add#7
  • Add makeNotation argument to test utility
  • Prevent too large <backup> values in PartStaffExporter
  • Prevent zero-duration ChordSymbols from matching stripTies algorithm
  • fixed up romanText repeats
  • Remove *arguments where not used
  • Standardize DatePrimitive -> Date interaction
  • Emphasize Pitches in Interval classes
  • Voice numbers written in MusicXML must be unique
  • Parse double flats in RomanText
  • Fix (and test) writing of multi-measure RepeatBrackets to MusicXML
  • romanText write to file-like objects
  • Closing too many TinyNotation states is now a TNException
  • Fix loss of forward repeat marks when exporting PartStaffs
  • Add typing for contextSites, yieldSites
  • Get rid of imp / load_source()
  • Remove tons of unnecessary imports in doctests
  • Clarify copyright entities
  • Use hatch for building