Releases: cuthbertLab/music21
music21 v9.9.1
Python 3.14 Compatible
Music21 v9.9.1 brings full Python 3.14 compatibility to v9 -- there was one incompatibility regarding "NotImplemented" in v9.9.0 w/ Python 3.14 -- users who don't use Python 3.14 have no reason to upgrade from 9.9.0 (see #1830)
Also mark the pyproject.toml as Python 3.14 compatible.
No docs being uploaded here since they are unchanged from 9.9.0
pip install -U music21 to get the latest version.
Full Changelog: v9.9.0...v9.9.1
music21 v9.9.0
Update summary
- Support Dorico as MusicXML reader. by @knutnergaard in #1788
music21.text.assembleLyrics: support custom word separator by @oxygen-dioxide in #1797- Add github codespace support by @oxygen-dioxide in #1805
- Modernization of Lilypond generated code (see below)
- Since this will be the last release in the v9 line,
music21v9.9 is the last version to support Python 3.10. It has been tested on Python 3.14rc3 and looks good to go with that system.
What's Changed: Bug Fixes and smaller improvements
- Improve Lilypond opening in Windows by @mscuthbert in #1773
- Also merge spanners when calling stream.Score.partsToVoices by @guang-yng in #1796
- Fix duration exceptions for slight rounding by @mscuthbert in #1802
- Rewrite Docs upload script by @mscuthbert in #1804
- Improve docs for Percussion Chords by @mscuthbert in #1803
- Update of property assignment syntax for Lilypond conversion (issue #1791) by @jeremy9959 in #1800
- Updated the FAQ + Build Docs by @mscuthbert in #1810
- Fix to m21ToXML.py:parseFlatElements() by @gregchapman-dev in #1806
- Consistant use of 1.0 instead of 1 or 1. by @mscuthbert in #1811
- Braille translate - support smart quotes by @mscuthbert in #1814
- Make UserSettings more dict-like by @mscuthbert in #1816
- Support RepeatBrackets for pianos by @mscuthbert in #1818
Stream.template()gets aremoveAllkeyword andexemptFromRemoveAllkeyword in PR1818. This allows for things like removing all spanners except RepeatBrackets (which is what we used it for.- Fixed links to my articles about music21 (I decided to leave academia.edu over their AI use policies)
New Contributors
- @seffka and @OttavioCresos make significant contributions in #1812
- @knutnergaard made their first contribution in #1788
- @guang-yng made their first contribution in #1796
- @jeremy9959 made their first contribution in #1800
Full Changelog: v9.7.1...v9.9.0
music21 v9.7.1
Music21 v9.7.1 is a maintenance release that fixes a bug in the pip version of music21 which would not work with numpy 2.0. Now the dependencies of music21 are the same whether installed from source/requirements.txt or pip/pyproject.toml.
This release also fixes errors (typing and intervals with concrete notes) discovered by mypy 1.16 and incorporates grammar and spelling fixes in documentation discovered by Pratim Vasireddy.
What's Changed
- Fix mypy 1.16 issues by @mscuthbert in #1794
- fixed spelling and other syntax by @pratim-vv in #1789
- Misc StreamIterator improvements by @mscuthbert in #1793
New Contributors
- @pratim-vv made their first contribution in #1789
Full Changelog: v9.7.0...v9.7.1
music21 v9.7
Music21 v9.7 is an incremental, but still substantial release focusing mainly on import and export quality and speed. MIDI Lyrics and improved, PedalMarks are added (with more to come). Substantial new tools for FretBend and other tablature-based work.
numpy 2.0–2.2 is now supported, which makes it possible to run music21 on Windows with Python 3.13 without a compiler -- this was
the main reason for moving up the release by a month!
An update to the CONTRIBUTING guidelines -- all AI contributions must be explicitly mentioned. AI-generated contributions (whether properly declared or suspected) that do not pass tests will be closed without comment -- see Simon Williamson's blog about how AI is shifting the coding burden from programmers to reviewers for context.
Thanks to @gregchapman-dev, @adhooge, @TimFelixBeyer, @jacobtylerwalls and many others for contributions to code. And new, special thanks to Anne G. Hamill who has been helping very much with the music21list through some very difficult Google Groups times!
What's Changed
- MIDI + Lyrics now import #1769 and export #1779 -- thanks to @oxygen-dioxide . Lyrics are encoded in many recent MIDI files used in AI singing synthesis, so this is an important update!
- Updated Linting/etc. by updating Astroid @mscuthbert in #1755
- (Somewhat backwards incompatible: Discussed on list)
midi.__init__functions are now inmidi/base.pyormusic21.midi.base-- matching most other formats. Added a lot of typing for MIDI conversion (by @mscuthbert in #1757 and #1758 and #1778) - Support enclosure == Enclosure.NO_ENCLOSURE which is different from enclosure == None by @gregchapman-dev in #1761
- PedalMark support by @gregchapman-dev in #1762
- FretBend supports alter (interval), prebend, and release by @adhooge in #1580
- Roundtrip inverted chord symbols properly by @mscuthbert in #1775
- Interpret empty tags as rests on Finale documents only (derived from PR #1636, thanks @TimFelixBeyer!) by @gregchapman-dev in #1777
- Allow numpy 2.0+ with music21 by @mscuthbert in #1781
Thanks to two new contributors
- @adhooge made significant improvements to Frets in Tablature in music21 (#1580)
- @oxygen-dioxide made their first contribution in #1769
Full Changelog: v9.5.0...v9.7.0
music21 v9.5.0
Music21 v9.5 is a small bug-fix release that fixes a few hard to find bugs, takes advantage of updated dependencies, and adds a bit more typing in various places.
Fixes Introducing Tiny Incompatibilities
These incompatibilities have been removed from music21 in order to get correct typing. They were never documented nor promised to work, hence considering it okay with Semantic versioning.
interval.getWrittenLowerNoteworks on notes and pitches but both objects must be a Note or must be a Pitch. (This restriction guarantees that the type of object being returned as the lower one will not vary based on attributes, and lets these functions be properly typed). By @mscuthbert in #1749 (started in 1747 by mistake) -- same is true for the parallel methods getWrittenHigherNote, getAbsoluteHigherNote, and getAbsoluteLowerNote. Now your IDE/mypy etc. should know the type of object being returned by these poorly-named functions!- Removed the "ability" to do this:
p = pitch.Pitch(pitch.Pitch('D'))to get a D. Never was documented before: Pitches now cannot take other pitch objects as arguments; this ability was just used in the pre-typed past where we were mixing strings and Pitch objects interchangeably and was only used in music21 in one place (reduceChords.py). The newly created Pitch objects lost a lot of information about harmonics, accidental display, etc. so this was a good catch. Contributed by first-time contributor @float3 in #1746
What's Changed
- Fixed links to generated documentation by @jacobtylerwalls in #1741
- Take advantage of Astroid 1015 bug being fixed by @mscuthbert in #1745 -- many overloaded functions in music21 were very verbose with code that did not actually run in order to pass mypy with Astroid bug no. 1015 (a tough bug!). Major contributions to fixing the bug were given by @jacobtylerwalls. Also better docs about why music21 has its own StrEnum package. Also 'highestTime' will forever be equivalent to OffsetSpecial.AT_END -- if you know about this, it's great. Most will not care.
- Added some typing to graph modules by @mscuthbert in PR1745 above.
- Updated typing on tablature and intervals by @mscuthbert in #1747
- Code of Conduct Clarify by @mscuthbert in #1748
- Update interval Typing overloads by @mscuthbert in #1749
- Fix a case where octave transposing instruments like piccolo or double bass imported from MusicXML could have incorrect octave information and bad enharmonic transposition (C#s becoming Dbs) fixed by @gregchapman-dev in #1752 (this is unrelated to a question recently here and in StackOverflow about the difference between transposing by P8 and by 12 semitones (thanks to @vanderstel for answering).)
- Bug fix: corpora (including the built in core corpus) which were indexed using Python 3.13 could not be read on other systems (like Mac to Linux); a pathlib.Path was being stored in the corpus accidentally. Fixed by @mscuthbert in #1754
New Contributors
Full Changelog: v9.3.0...v9.5.0
music21 v9.3
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
dfor0inadd10by @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
_dissonanceScoreindependent 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
music21 v9
Music21 v9 (June 2023) is the latest release of music21, a toolkit for computational music research.
Version 9 contains about 600 new commits and features from the version 8 release from September 2022. It is the latest and best release in the industry standard toolkit for doing music research and composition ("traditional" computation and AI/ML) with musical scores.
As a new Version X release, music21 gains a lot of its power with a few non-backwards compatible changes that make the system easier to use, faster, and more up to date. People using music21 in existing environments should read the change logs to make sure their systems work with it before upgrading.
A big change in music21 is that v9 is compatible with Python 3.10 and 3.11 only. The version 9 release will be updated to be compatible with at least Python 3.12 when it is released. Users on Python 3.8 and 3.9 should stick with v8 and those on older versions should look at the README to see what version will be installed for their systems.
Two weeks from the release of version 9 (July 1, 2023), Michael Asato Cuthbert, the lead developer of music21 will take a 6-12-month sabbatical from monitoring the mailing list, answering questions/issues, and merging PRs in order to focus on what he does best and what is best for the community: developing core parts of the system and documenting what already exists. Working with the user community has been amazing, but given that he only has about 10-15 hours per week to devote to the project, it often means deviating from efforts that help a large number of people to instead work through PRs and issues that are important to a smaller community. This news will probably not be welcomed by some, but the results should be better for the larger community.
What's Changed
- Music21 v9 is for Python 3.10 and 3.11 only and uses tools and speedups only available to those versions. Music21 drops its prior policy of supporting previous 3 versions and now supports the latest 2 versions only (to improve developer experience).
- Notebook/Jupyter: All pages are now shown on .show(). Compatible with Jupyter 7.0beta and JupyterLab. MIDI improvements (@mscuthbert in #1592)
- Added to corpus: (1) Queen Liliuokalani’s Aloha Oe, (2) J.R. Johnson’s Lift Every Voice And Sing (3) Vincente Lusitano’s madrigal Allor che Ignuda – part of a larger project to make the music21 corpus more representative.
- Lots more typing! Use
music21in a modern IDE to see it. Uses Python 3.10 TypeGuards. Add common.classTools.holdsType([‘a’, ‘b’], str) which asserts that everything in a collection has the same type. (@mscuthbert in #1447). converter and corpus are fully typed. - Docs! Documentation of equality explained better. braille, corpus, converter much improved. (1) Much better aesthetics and utility @mscuthbert in #1455 and #1452). (2) Add “developerReference/startingOver” – mistakes made in designing
music21that are too late to fix, but the next generation of software should not emulate. (3) add docs about abcFormat support (@mscuthbert in #1484). (4) coreInsert (@mscuthbert in #1549). (5) layout (@mscuthbert in #1554). (6) clercqTemperley (RS100 dataset) format (#1558) - RomanText and related formats: (1) Repeats in RT and TSV are improved (@malcolmsailor in #1434, #1435, #1503) (2) anacrusis support (@mscuthbert in #1532) (3) measure numbers on ClercqTemperley (@mscuthbert in #1558)
- harmony: (1) RomanNumerals and ChordSymbols with front accidentals (flat II, sharp IV, etc.) now take their 7ths, 9ths, etc. from the underlying keys (@mscuthbert w/ thanks to @malcolmsailor in #1439), (2) RomanNumeral’s writeAsChord works properly (@mscuthbert in #1445)
and (3) transpose properly (@malcolmsailor in #1414). (4) roman.RomanNumeral(2, ‘C’) will now give d-minor, not d-major (@jacobtylerwalls in #1481), (5) preferSecondaryDominants implements V/x (@MarkGotham in #796). - MusicXML improvements: (1) TempoText is exported (@gregchapman-dev in #1437)
(2) harmony/numeral figures are MusicXML 4.0 compatible (@mscuthbert in #1445) (3) Preserve multiple fingerings on chords in musicxml import (@jacobtylerwalls in #1475) (4) Translate "implicit" attribute of MusicXML measures (@jacobtylerwalls in #1493) (5) Synchronize Measure IDs on Musicxml out (@rigaux in #1490) (6) MusicXML sound tag finds metronome marks (@TimFelixBeyer in #1579) (7) Add MusicXML security warning (@mscuthbert in #1584) - Speed/Performance improvements on (1) deepcopy (@mscuthbert in #1464) (2) ABC (@mscuthbert in #1461) (3) LanguageDetector (@mscuthbert in #1456) (4) quantize() (@TimFelixBeyer in #1594) (5) use deques instead of pop(0) #1466, (6) searching/MetadataBundles cache in tests (@mscuthbert in #1511)
(7) findGaps() on gapless streams (@jacobtylerwalls in #1515) (8) ChordSymbols (@jacobtylerwalls in #1527) - Braille – add segment.BrailleElementGrouping. Good amount of refactoring. (@mscuthbert in #1495)
- Converter/Corpus: converter.toData – like .write or .show but gives the raw data as a string or byte by @mscuthbert in #1451
- Frozen/Immutable objects can be created now; this will allow for creating, for instance, one default 4/4 meter that cannot be changed but used as a default in many places. common.FrozenObject and duration.FrozenDuration (@mscuthbert in #1460)
- New subConverters register above default subConverters, so it is now possible to develop a subConverter like Greg’s converter21 project that handles a format music21 supports but do it differently or better. (@mscuthbert in #1520)
- Ornaments/Expressions (all by @gregchapman-dev) – (1) ornament accidentals have a great new system and are aware of their measure and key context (#1545) (2) Mordents get placement like Turn and Trill (#1516) (3) Support for delayed turns (#1533)
- Spanners: (1) Spanner.fill() – say you’ve set a slur to just include the first and last notes. .fill() will find all the intermediate notes. (@gregchapman-dev in #1486) (2) spanner.SpannerAnchor class allows a spanner to start and stop at a point where there is no other Music21Object at the offset (like a whole note crescendo that begins on beat 2 and ends on beat 3) (@gregchapman-dev in #1479). (3) Guitar: Hammer-on and Pull-off as Spanners (@louisbigo in #1142)
- Streams – (1) new module stream.tools and stream.tools.removeDuplicates (e.g. keys, clefs, by @MarkGotham in #1454) . (2) stream.makeNotation.saveAccidentalDisplayStatus() context manager for restoring pitches’ accidentalDisplayStatus after a manipulation (like transposition by octave) @gregchapman-dev. (3) stream.makeNotation.makeOrnamentalAccidentals (#1545)
- Percussion: (1) Implement useful
PercussionChord.pitchesproperty (@jacobtylerwalls in #1547), (2) Ignore Unpitched objects in key analysis (@jacobtylerwalls in #1543, (3) Search support (@mscuthbert in #1597) - MIDI: (1) Minimize gaps produced by quantization algorithm (@jacobtylerwalls in #1540) (2) fix jupyter/colab MIDI (@mscuthbert in #1565) (3) Increase default MIDI ticksPerQuarter for higher accuracy of tuplets (@TimFelixBeyer in #1577)
- ABC: set version from I:abc-version information (@mscuthbert in #1589)
- pitch module gets: isValidAccidentalName, standardizeAccidentalName.
Bug fixes
- Ottava transposition bugs (in m21 and in musicxml output) (@gregchapman-dev in #1486)
- diminished and half-diminished 11th chord types were incorrect (@jacobtylerwalls in #1497)
- Avoid creating duplicative ChordStepModifications (@jacobtylerwalls in #1509)
- Zero quarterLengths will not be represented as Fraction(0, 1)
- MIDI: (1) Don't set status byte on Meta Message (@TimFelixBeyer in #1575) (2) unknown meta message still parses (@TimFelixBeyer in https://github.com/cuthbe...
music21 v8.3.0
Music21 v8.3 is a maintenance release that fixes a few bugs in romanText/translate (thanks @malcolmsailor) already in v9alpha, but also fixes a change in the Github.io version of music21j that broke .show('midi') inside Jupyter notebooks.
What's Changed
- Fixes bug in repeat tests in romanText/translate.py; handles empty measures by @malcolmsailor in #1434
- Fix mypy with github by @mscuthbert in #1438
- Romantext writer handle repeat bars and measure suffixes like m1a by @malcolmsailor in #1435
- No transpose altered 7,9,11,13 in bII7; chord.tools by @mscuthbert in #1439
- Backport 1565 to m21 v8 by @mscuthbert in #1567
Full Changelog: v8.1.0...v8.3.0
music21 v8
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. As Python 3.11 is due to be released any day now, keeping with the m21 policy of supporting three versions of Python, music21 v9 (work starts tomorrow!) will support Python 3.9 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. (@gregchapman-dev in #1266)
- 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. by @gregchapman-dev in #1337
- Adding DCML v2 parsing to tsvConverter.py by @malcolmsailor in #1267
- Explicit Keywords on all music21 objects by @mscuthbert in #1377
- Continued Major improvements in Typing across music21. by @mscuthbert and @jacobtylerwalls. 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 by @mscuthbert in #1278
- Fix MIDI in Google Colab Notebooks (v8) by @mscuthbert in #1281
- Use more classes in getElementsByClass by @mscuthbert in #1283
- Improve graphing docs and options by @mscuthbert in #1285
- Accidentals never and if-absolutely-necessary by @mscuthbert in #1148
- Add typing to key.py by @mscuthbert in #1289
- makeRests(inPlace=True) returns None for scores by @jacobtylerwalls in #1288
- StreamCore is now a Music21Object; Iterator improvements by @mscuthbert in #1295
- Avoid
<forward>tags from expressions out of measure bounds by @jacobtylerwalls in #1261 - Avoid writing empty
<movement-title />and<creator />tags when title and author have no defaults by @jacobtylerwalls in #1248 - harmonicFunction. maps between RN figures and function labels by @MarkGotham in #1130
- Make cautionaryPitchClass=True work with chords by @jacobtylerwalls in #1299
- Export Unpitched to MIDI by @jacobtylerwalls in #1315
- Fix
getPitches(direction=DESCENDING)returning ascending scales by @jacobtylerwalls in #1311 - Make
Keyinstances compare equal regardless of tonic octave by @jacobtylerwalls in #1316 - optimize opFrac by @mscuthbert in #1322
- Fix midmeasure clef export regression involving voices by @jacobtylerwalls in #1330
- Fix a bug in musicxml/partStaffExporter.py where a clef-octave-change… by @gregchapman-dev in #1334
- [Musicxml export] Preserve whitespace in TextBox by @jacobtylerwalls in #1331
- Fix bug in Capella parsing. by @mscuthbert in #1342
- Patch duration linked bugs by @mscuthbert in #1341
- deprecate gcd in favor of C math by @mscuthbert in #1343
- makeTies within makeNotation; getTimeSignatures recurse by @mscuthbert in #1346
- First docs and improvements to trees by @mscuthbert in #1312
- Fix shiftElements docs by @jacobtylerwalls in #1326
- SixthMinor carries to secondary dominants @mscuthbert in #1354
- Add makeNotation routines for completing or consolidating tuplets by @jacobtylerwalls in #1242
- Demonstrate ties in
splitElementsToCompleteTupletsdoctest by @jacobtylerwalls in #1362 - MusicXML export: Make rests before making notation by @jacobtylerwalls in #1361
- Validate figures provided to
RomanNumeral()by @jacobtylerwalls in #1340 - Clear cache when adding notes w/o sort by @mscuthbert in #1357
- match d43, d65, etc. by @malcolmsailor in #1363
- Use requests lib. for URL getting by @mscuthbert in #1367
- Allow iterables of qualified class names in
Stream.__getitem__searches by @jacobtylerwalls in #1359 - Fix problem with add#7 by @mscuthbert in #1373
- Add
makeNotationargument to test utility by @jacobtylerwalls in #1376 - Prevent too large
<backup>values in PartStaffExporter by @jacobtylerwalls in #1375 - Prevent zero-duration ChordSymbols from matching stripTies algorithm by @jacobtylerwalls in #1381
- fixed up romanText repeats by @malcolmsailor in #1378
- Remove *arguments where not used by @mscuthbert in #1394
- Standardize DatePrimitive -> Date interaction by @mscuthbert in #1395
- Emphasize Pitches in Interval classes by @mscuthbert in #1396
- Fix issue #1335: voice numbers written in MusicXML must be unique… by @gregchapman-dev in #1336
- Parse double flats in RomanText by @malcolmsailor in #1405
- Fix (and test) writing of multi-measure RepeatBrackets to MusicXML. by @gregchapman-dev in #1401
- romanText write to file-like objects by @malcolmsailor in #1416
- Closing too many states should be a TNException by @mscuthbert in #1421
- Fix loss of forward repeat marks when exporting PartStaffs by @jacobtylerwalls in #1420
- Add typing for contextSites, yieldSites by @mscuthbert in #1423
- Get rid of imp / load_source() by @mscuthbert in #1424
- Remove tons of unnecessary imports in doctests by @mscuthbert in #1425
- Clarify copyright entities by @mscuthbert in #1430
- Use hatch for building by @mscuthbert in #1429
Significant Improvements and bugs Fixed from 7.1 to 7.3.3
- Fix improper call to locale library in multiprocess test text output by @jacobtylerwalls
- Fix
stripTies()crash in certain scenario with matchByPitch=False by @jacobtylerwalls - Support multiple figures in single lyric (e.g "64") in
figuredBassFromStream()by @jacobtylerwalls - Add safety and more characters to
figuredBassFromStream()by @jacobtylerwalls - Fix accentSequence for 3/8 by @jacobtylerwalls
- Use matchByPitch=True in MIDI export by @jacobtylerwalls
- Cleanup chord.tables by @mscuthbert
- Prevent some superfluous naturals when updating accidental displayStatus by @jacobtylerwalls
- MusicXML import: Stop duplicating MetronomeMarks in multi-staff parts by @jacobtylerwalls
- Clear previous result of attachIntervalsBetweenStreams() by @jacobtylerwalls
- Documentation and improvements to tree by @mscuthbert
- Export style attributes from chord members by @jacobtylerwalls
- Fix zero-duration chords and coreInsert crash in reduceChordsOld by @jacobtylerwalls
- Braille: export bowing symbols by @jacobtylerwalls
- Import/export unpitched percussion instruments <--> MusicXML by @jacobtylerwalls
- Explict imports in init.py; support 3.10 by @mscuthbert
- Replace bèmol with bemol in Spanish translation of flat by @yaph
- Fix dissonance score for compound intervals by @jacobtylerwalls
- Fix parsing of add, alter, omit, and subtract in chord symbol figures by @jacobtylerwalls
- Respect Accidental.displayType option 'never' by @jacobtylerwalls
- Clean up temporary attributes set by braille translator by @jacobtylerwalls
- allow classes in getSpannerSites by @mscuthbert
- Small style upgrades and beams by @mscuthbert
- Fix accidental status overriding for initial diatonic naturals by @jacobtylerwalls
- Fix accidental display af...
music21 v8.0.0rc2
Music21 v8 Release Candidate
testing a new deploy system.