(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