Music21's development continues with v.9.3, the first release since Myke Cuthbert's year-long sabbatical and first since June 2023. Thanks to the community for great patience, new developments, new docs, new contributions, and extreme resilience during a summer 2024 spam attack (the first time I took 4 days off out of cell-phone range, they struck!) and doc/homepage problems as the project changed homes.
Music21 v.9.3 is the first release version to officially support both Python 3.12 and Python 3.13. It will probably also be the last to support Python 3.10 and the last to have primary compatibility for numpy v1 and matplotlib v2. The next version will move to the latest major versions of those libraries (if all goes well!) and work to take advantage of their new ecosystems. (However, there are some good PRs waiting to be merged, so there may be one more release before breaking compatibility)
It is designed to be mainly backwards compatible with v9.1 (the first v9 release) but there are a few little things that fix common errors that are not strictly backwards compatible.
This is a minor release with no major new features or changes, mostly bug-fixes, new compatibilities, fixed docs, etc. I want to single out @TimFelixBeyer for contributing a number of optimizations and speed ups, along with many new and long-time contributors (new contributors listed below).
New Home: Old Gratitude
This is the first version of music21
released since I left being a prof at MIT (my wife has been a professor of music at University of Hawai'i since just before the pandemic and the commute to Boston was too long; she supported my career for a decade and I'm proud to be able to do the same for her). I want to thank my colleagues, staff, students, and donors at MIT who helped music21
through its first nine versions. I'm still in the process of "unpacking the boxes" at https://www.music21.org/music21docs/ but things will go well. And thanking my co-founders and fellow music theory nerds at https://www.artusimusic.com/ for knowing the value of music21
as part of our ecosystem there.
What's Changed
- Add W3C Percussion Drum Sample to Music21 corpus by @kir12 in #1610
- Better errors on pitch creation by @mscuthbert in #1616
- Upgrade flake8 to v6 by @mscuthbert in #1617
- Remove useless Pylint disables by @jacobtylerwalls in #1615
- Mini-optimization to updateEndTimes by @TimFelixBeyer in #1619
- Speed up Duration deepcopy by @TimFelixBeyer in #1620
- Mini-optimization to getElementAtOrBefore by @TimFelixBeyer in #1618
- more speed improvements to getElementAtOrBefore by @mscuthbert in #1622
- speed up sortTuple for streams by @TimFelixBeyer in #1624
- Fix OrderedDict tests on Python 3.12 (stringTools.parenthesesMatch) by @mscuthbert in #1625
- Speed up hasElement by 2x by @TimFelixBeyer in #1621
- Work on noteworthy 1 75 binary reader by @nvuaille in #1247
- SoundParser to a separate file by @mscuthbert in #1627
- Fix #1561: Let makeTies iterate over parts by @TimFelixBeyer in #1571
- Feature/figuredbass object by @mxordn in #1614
- Add Policy on args/keywords by @mscuthbert in #1628
- Speed up contains by 2x and deprecate hasElement by @TimFelixBeyer in #1629
- Roman Numerals: Don't substitute
d
for0
inadd10
by @malcolmsailor in #1635 - TSV converter bug fix: don't add 'd' prefix to 2-digit added tones like
[add13]
by @malcolmsailor in #1634 - Python 3.12 Compatibility by @mscuthbert in #1654
- Fix ugly MusicXML durations & offsets by @TimFelixBeyer in #1632
- Improve commonName for enharmonic equivalent to minor seventh chords by @vanderstel in #1656
- check if HOME directory is writeable in getSettingsPath by @Leo1998 in #1657
- Fix argument annotation in
converter.parse()
signature by @jacobtylerwalls in #1665 - Fix #1663 by @TimFelixBeyer in #1664
- fix one incorrect doc by @mscuthbert in #1676
- Add Webern, Dormi Jesu by @mscuthbert in #1675
- Avoid testing truth value of ElementTree.Element by @jacobtylerwalls in #1666
- Simplify code and speed up for loops by @TimFelixBeyer in #1631
- Verticality.makeElement unpitched aware by @mscuthbert in #1678
- Styleguide Change - Union types by @mscuthbert in #1679
- In conversion from musicXML, allow multiple {Fret/String}Indications for chord. by @seffka in #1673
- Unpitched/Percussion export improvements by @mscuthbert in #1682
- Volume constructor to keyword only by @mscuthbert in #1681
- Avoid calling hyphenToCamelCase twice per note by @alexandermorgan in #1683
- Harmony parsing errors with doubled characters by @TimFelixBeyer in #1688
- Fix pylint recommendations by @TimFelixBeyer in #1694
- iterateAllVoiceLeadingQuartets() by @mscuthbert in #1701
- Add 'fa up' notehead type by @TimFelixBeyer in #1699
- Small spelling edits etc. by @mscuthbert in #1704
- A few ChordSymbol fixes by @gregchapman-dev in #1702
- Correct scale caching mechanism. by @TimFelixBeyer in #1692
- Simplify ChordBase duration creation by @TimFelixBeyer in #1691
- Small simplifications and speed-ups by @TimFelixBeyer in #1693
- Make
_dissonanceScore
independent of octaves by @TimFelixBeyer in #1695 - A few leadsheet-related fixes by @gregchapman-dev in #1708
- Cleanup on TSV-DCML Converter by @mscuthbert in #1716
- Respond to Changing Dev systems; Pin Numpy to <2.0 by @mscuthbert in #1723
- Update README.md -- new links by @mscuthbert in #1731
- Export stem styles on notes with implicit stem directions by @jacobtylerwalls in #1725
- Improve typing on Meter.Core by @mscuthbert in #1722
- Some Note/TinyNotation typing by @mscuthbert in #1734
- Fix Stream splitByQuarterLengths by @mscuthbert in #1736
- Add Python 3.13 Compatibility by @mscuthbert in #1737
- Remove tons of ellipses by @mscuthbert in #1738
New Contributors
- @nvuaille made their first contribution in #1247
- @mxordn made their first contribution in #1614
- @vanderstel made their first contribution in #1656
- @Leo1998 made their first contribution in #1657
- @seffka made their first contribution in #1673
Full Changelog: v9.1.0...v9.3.0