Skip to content

Releases: cuthbertLab/music21

Music21 v6.5 released

01 Jan 03:16
Compare
Choose a tag to compare

Happy New Year! I am pleased to announce that the newest Version of music21, version 6.5 has been released. It is nearly completely backwards compatible with other v6 releases and runs on Python 3.6–3.8. Music21 is an open-source toolkit for computational music theory and musicology, and also used in composition and music production. Download it via pip with:

pip install --upgrade music21

Version 6.5 adds several important new features since the bug-fix version 6.3 (from mid-November 2020) while squashing many bugs and speeding up a number of parts of the system. Many of the contributions were made by members of the open source community, including major contributions by Jacob Tyler Walls (JTW), Mark Gotham (MG), Néstor Nápoles López (NNL), and Paula Muñoz Lago.

Highlights include:

  • PartStaff objects such as a staff of a piano part now export properly back to MusicXML as one part with <staff> tags. Huge work by JTW!
  • RomanText is now a valid output format in addition to input! Save your analyses for later! Thanks Mark Gotham!
  • search/lyrics now finds second and subsequent lyrics (thanks to Paula ML and DIDONE project)
  • Improvements to VI and VII roman numerals in minor (JTW)
  • MIDI tries to import part names from instruments (JTW)
  • MIDI properly reads and writes conductor tracks (JTW)
  • Doc improvements for many places including RomanNumerals, insertIntoNoteOrChord, chordify with GraceNote (MSC)
  • Major speedups for many chord actions including getLeadingTone, isTriad, isMajorTriad, etc. (NNL + MSC w/ JTW)
  • music21 loads or starts up in 1/3 the time as before. (MSC)
  • Opus.write() improvements -- now all filenames of an Opus write call have similar names and only the last filename is returned (JTW)
  • All properties in music21 are readable without raising an exception. This will help inspection/debugging software. (MSC)
  • Staff-type is imported and exported properly to/from musicxml as the .staffType attribute on layout.StaffLayout objects. .staffLines is now settable on all Stream types (not just Parts) as a shortcut to manipulating layout.StaffLayout().staffLines at the start of the Stream. (MSC)
  • roman.RomanNumeral.isNeapolitan() (MG)

Smaller features and bug fixes:

  • midi.realtime.StreamPlayer now allows for non-blocking playing and for stopping at various points. (antran22)
  • If scratch/temp directory is not writable or does not exist, use backup directories (JTW + Tanchihpin0517 )
  • Use subprocess.run() for launching external tools (JTW)
  • Deprecated method Environment.launch() is removed. (JTW)
  • MusicXML reader selection improved, especially on Windows (MSC)
  • Refactor of the musicxml subpackage for smaller files and more expandability (MSC)
  • Default readers set for Unix (Thomas Wilson).
  • RomanNumeral parsing improvements, esp. for chords like V7b5. (MSC)
  • testing is moved to Github Actions for faster responses. Thanks to Travis-CI for years of support (MSC)
  • works on Python 3.9 -- v6 is likely the last version to support py 3.6. (MSC)
  • Instruments outside of voices are retained when making measures (JTW)
  • all tests pass on Windows for windows developers. (JTW)
  • better installation on conda-forge w/ a webcolors change (JTW)
  • unmeasured scores export to MusicXML better (JTW)
  • MIDI instruments no longer get incorrect durations (JTW)
  • MIDI pitch bends are easier to understand (JTW)
  • Improved tuplet brackets when number is not shown (JTW)
  • Coverage improved (MSC + JTW)
  • Better commonName for 0, 1, 2 note chords, and microtonal chords (MSC)
  • .show('scala') works on more scales. (JTW)
  • More XML Chord symbols import (JTW)
  • Fixes for aadd6 and other chord symbols where the name of the note ("A") is also present in the modifier ("Add") (JTW)
  • Chord.quality returns "other" for C C# E G (MG)
  • An empty degree-alter now matches MusicXML spec (JTW)
  • ABC and MIDI parsing cleanups to make it easier for developers to extend (MSC)
  • Very old musicxml files with empty "tie" elements parse better. (JTW)
  • Improved handling of omitted pitches in RomanNumerals (JTW)
  • instrument.deduplicate() removes duplicate instruments at the same offset in a stream (JTW)
  • Repeat endings with no number displayed now export to musicxml properly (JTW)
  • Several routines such as findGaps were leaving Streams in corrupt states -- fixed (MSC)
  • partitionByInstrument() no longer leaves instruments with non-zero durations (MSC)
  • MuseData reading works properly on zip files created on an OS with different line breaks (MSC)

Thanks always to the Seaver Institute, the NEH, and MIT for support on creating music21.

I'm not sure if the next release will be v7 (with some backwards incompatible changes) or another v6 release (6.7). I do know that better piano support and percussion support are high on my lists. However, I'll be taking a bit of a break from music21 over January at least in order to get other publications out and work with my other projects. Happily, the community engagement with music21 has never been stronger and I'll still be here reviewing Pull Requests and thinking about the next steps!

-- Myke Cuthbert

Music21 v6.3 released

18 Nov 06:31
39251c0
Compare
Choose a tag to compare

Music21 version 6.3 has been released. Biggest new feature is compatibility with macOS 11.0 Big Sur, whose numbering system change broke music21. Major bug of corpus.search() on Windows not working should be fixed also. Chordify users get a nice upgrade also.

Update with

pip install --upgrade music21

This is primarily a bug fix release, so let's list the major bugs squashed first:

Bug fixes

  • Music21 gets the proper mac version and runs in Big Sur (thanks Daniel Fürst)
  • corpus.search() should work on PC now. Sharing music21 scores that have been frozen and thawed should also work across Mac and PC.
  • ChordSymbols preserve root and bass (thanks to Jacob Tayler Walls = JTW for this and so much else in this release!)
  • Instrument names that cannot be decoded from MIDI do not crash MIDI parsing (JTW)
  • Audio searches and other searches on empty streams are improved. (JTW)
  • Non existent user scratch directory does not raise major bugs any more (David Garfinkle and JTW)
  • New location for System/Preview on macOS since Catalina and musescore on Windows (MSC + JTW)
  • remove() now searches endElements as well.
  • Corrected octaves on pitches derived in IntervalNetwork.nextPitch() (JTW) -- should fix some weird scale pitch octaves.
  • TextExpressions now have correct offsets when derived from a tempo indication or coda (JTW)
  • MIDI files parsed multiple times with different quantization settings work properly (JTW)
  • MIDI files with zero-length notes now create zero-length GraceNotes and not 1.0 length notes in music21 (JTW)
  • All tests pass in Python 3.8 (now on to 3.9!)
  • Beethoven Opus 59 no 3 mvmt 4 contained all 4 movements in it. Now it only contains movement 4.
  • MIDI's matchedNoteOff was not working properly. Works now (Thanks SunWoong KIM)
  • If two keys had the same likelihood in probe-tone analysis then only one appeared in .alterateInterpretations. Now there will always be a 23-element list. (ZM-J + JTW)
  • C-version of Python Levenshtein was sometimes not being called even if installed. This will greatly speed up similarity searching.
  • Harmony.addChordStepModification gets an updatePitches=True attribute that will immediately apply the chordStepModification to the computed pitches. The default of False remains for now, but will become True in music21 v.7.

Improvements:

  • Chordify and Verticality.makeChords gets a new keyword attribute "copyPitches=False" which makes it so that the original pitches (and not deepcopies) from the score appear in the chordified score. This can make it MUCH easier to see which pitches in a chordified score relate to the pitches in the original. However, they are identical objects, so changing one later will change the other. Default behavior is unchanged.
  • Repeats play back properly in MIDI (JTW)
  • Improved Docs (configuration instructions, typos, examples) (many people but especially JTW)
  • Much better typing all around for developers
  • math.log2 used instead of math.log(x, 2) for no more floating point confusion in many quarterLengths (JTW)
  • Braille keeps its debugging information in Note.editorial instead of custom attributes (backwards incompatible change, but okay)
  • Braille/runAllBrailleTests improved for non-sighted developers.
  • Incomplete 7th/9th/11th chords find roots better (JTW)
  • Legacy code for Python 3.5 removed (JTW)
  • Augmented sixth RomanNumerals work w/o needing a key. Also work with secondary numerals (JTW)
  • Bach chorales sort by BWV as a number rather than a string (JTW)
  • Beethoven quartets from Project Gutenberg had hidden voices w/ incorrect durations to show playback of trills, etc. Those voices have been removed. Speeds up the parsing of those pieces greatly, and gives better feature extractions. Affected pieces are opus 59.1.3, 59.1.4, 59.2.1, 59.2.2, 59.3.2, 59.3.3, 59.3.4, and opus 133.
  • Improvements to instrument name lookups (Thanks Mark Gotham)
  • Unnecessary list comprehensions are removed.
  • For running tests, missing optional modules and Lilypond. will cause import errors.
  • ABC module has been partially cleaned up, and made easier for developers to hack new ABC extensions to.

Changes:

as this is a 6.X release, we have tried to keep backwards incompatible changes to a bare minimum, but a few obscure cases are changed:

  • .seconds, .beat, .beatStrength on notes without a TimeSignature or MetronomeMark context now return nan instead of raising an exception. .beatStr returns the string "nan". Python 3.8's mock methods iterate through all properties before setting up the mocked object and properties that might raise exceptions cause problems. This seems like a good direction to go in, so please expect that all property getters will switch to never raising an exception but giving nan or another failure indicator in the future.
  • KrumhanslSchmucker and KrumhanslKessler probe tone analysis are now identical. The difference before was probably a typo. They are now synonyms for each other.

Thanks always to the Seaver Institute, the National Endowment for the Humanities, and the School of Humanities, Arts, and Social Sciences and the Music and Theater Arts Section of MIT for their support in making music21 possible. And can we all give applause to Jacob Tayler Walls for all the great work done on this release!!!

music21 v6.1.0

01 Sep 04:42
Compare
Choose a tag to compare

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)
    *...
Read more

music21 v5.7.2

28 Dec 15:35
1fb6cc4
Compare
Choose a tag to compare

v.5.7.2 is a maintenance release on the v5 trunk that adds basic support for Python 3.8 by upgrading the version of joblib packaged with music21. Work on v.6 which will fully support Python 3.8 is underway.

music21 v5.7.1

17 Nov 18:21
Compare
Choose a tag to compare

A maintenance release for music21 v5 that fixes two substantial errors:

(1) corpus.search works on Windows as well as Macs

(2) .mxl files created by latest version of Finale or any other system that places .musicxml (not .xml) files within .mxl will be read.

This is just a bug-fix version. More major work is underway on music21 v.6, available on the Github site.

Documentation for this version is identical to v5.7.0

music21 v5.7.0

09 Jun 01:37
Compare
Choose a tag to compare

Music21 v5.7 is the fourth and final release in the v5 series. It brings under the hood fixes -- lots of bug fixes and speed ups and some new features -- from 126 commits since last October.

Download by running from command line:

pip install --upgrade music21

This is the last release of the v5 series so that work on v6 which may bring some backwards incompatible changes -- all deprecated features will be removed, as will support for Python 3.5 (by the time v6 is released, Py3.8 will be out and this keeps w/ music21 policy of supporting the last three Python releases). The release of v5.7 also marks the End-of-Life for music21 v4 (the last release to support Python 2.7); if someone wants to continue supporting v4/Python 2.7 in music21, please let me know, but I'm so happy with how quickly almost all of us have moved to Python 3. Looking forward to major tablature improvements, SMuFL support, and much faster development thanks to "f-strings" in v6.

The music21 user community continues to be active and robust as attested by the number of contributed features below. Thanks for keeping me sustained during my non-music Admin time! Among the most notable improvements are (in reverse chronological order):

  • Type hints on major objects and functions in the library and the promise of more (once Py3.5 is dropped) soon. Those who use fancy IDEs like PyCharm will reap major bug checks!

  • The most extensive typo-checking / spell-checking / linting ever done to music21 -- the code now has that new car smell.

  • Stream.measures(4, "5a") -- measure suffixes work in many more places in the code.

  • Pizzicato notes export properly in MusicXML

  • Chorale metadata improved (thanks to @doctor-schmidt!)

  • Improvements to MEI accidental handling (kudos @raffazizzi)

  • KeySignatures work better in multi-voice contexts (thanks @pconerly)

  • Bugs that made .getContextByClass() sometimes inconsistent (especially with forward searches) fixed.

  • Harmony objects (ChordSymbols, etc.) sort before Notes so that the harmony of a note at the offset can be found easier. And proper musicxml offset support (thanks @a-papadopoulos)

  • Chord.notes gives direct access to the underlying Note objects that make up a Chord. Chords also get a good __eq__ test.

  • MuseScore 3 support (thanks @YoWenqin)

  • Accidental fixes for ABC (thanks @dvdrndlph)

  • Added Neo-Riemannian analysis features (thanks @MarkGotham) and triads can now know which hexatonic system they belong to.

  • Fixes to MusicXML chord input.

  • Barlines now use "type=double" instead of "style=double", since in v6 they will get full style.Style behavior.

  • User's Guide gets the long awaited Chapter 58 on Sites and Contexts for advanced users.

  • Clefs get a .name property so that the class does not need to be parsed.

  • Grace notes no longer cause obscure bugs in Stream.makeNotation().

  • A bug in Interval.direction for some perfect intervals is fixed (thanks @ryaanahmed and www.artusi.xyz team for identifying the bug)

As always, I want to acknowledge MIT Music and Theater Arts and the School of Humanities, Arts, and Social Sciences for encouraging the development of music21. Founding contributions to music21 were made by the Seaver Institute and the National Endowment for the Humanities.

music21 v5.5 update

29 Oct 15:03
Compare
Choose a tag to compare

Version 5.5 brings some small but important improvements to music21 and is a maintenance release. V5.5 is the first release to no longer support Python 3.4, so please use Python 3.5 or higher to upgrade.

Important changes and bugfixes.

  1. Chord.commonName gets many improvements, detecting for instance, the differences between dominant-seventh chords and augmented sixths.
  2. much better metadata on Bach Chorals (thanks Norman!)
  3. Stream.voiceToParts() is much improved and gets an optional separateById keyword argument which will only merge voices whose .id matches. -- this is very exciting to me from an analytical perspective and one reason I decided to release now.
  4. Volpiano is upgraded to a full conversion method. Most people will go, "buh??" people who work with Gregorian chant will rejoice.
  5. obj.activeSite is set more reliably.
  6. better error messages if a stream cannot be chordified.
  7. ABC parses all major and minor keys properly -- there were a few bugs especially on sharp keys in minor before. (Thanks @a-papadopoulos )
  8. "Cad64" is now an acceptable RomanNumeral alternative for "I64" for all you theorists out there who cringed when writing it. Resolves to I64 in major context (or as a secondary dominant) and i64 in minor contexts.
  9. bug fixes on rounding approximate durations (such as in MIDI parsing)
  10. converter.parse('tinyNotation: ...', raiseExceptions=True) allows tinyNotation to bubble up anything that prevents reading a token. off by default, but useful for debugging. Expect this keyword to start appearing (w/ default False) for other conversion methods.
  11. Changed: as promised years ago, the default on Stream.recurse() is now NOT to include the caller itself in recursion. Use keyword argument "includeSelf=True" to do so. Recurse keywords are keyword only.
  12. Changed: arguments to Music21Object.contextSites are keyword only. This fixes a few little bugs. Same with Stream.elementsChanged()
  13. MusicXML stores Fingerings properly (thanks @hofst !)
  14. Fixes for extreme pitchbends (very close to wheel minimum) on MIDI.
  15. Dropped bug-fixes for very old versions of Sibelius and MuseScore < 2.0
  16. Added bug catching for MusicXML that gives the shape of the clef ('G', 'F') but no line -- uses sensible defaults. And many other cases in MusicXML where an attribute is empty (as one musicxml writer is now producing)

As always thanks to MIT, the Seaver Institute, and the NEH for funding early development of music21.

music21 v5.3.0

12 Aug 23:00
Compare
Choose a tag to compare

music21 v5.3 is the latest release for music21 and the first since the v5 (v5.1) release in March 2018. The biggest feature is a major improvement to the quality of the Bach Chorales in the corpus, thanks to the amazing work of Doctor Norman Schmidt to check the files and add lyrics for all chorales. The upgrade also adds missing repeat signs (and collapses several sections that were expanded repeats).

And it's not just Dr. Schmidt we have to thank: music21 v5.3 represents an important milestone in community involvement, where for the first time, the community's pull requests have contributed much more to the development than the MIT dev. team. As I (Cuthbert) move to a new role in Digital Humanities at MIT and have less time for active music21 development, I hope that this activity continues and music21's development accelerates!

Some changes, big and small:

  • ABC parsing improvements, especially Chord Symbols (Thanks to Alex Papadopoulos and Vincent Degroote) and ties and grace notes.
  • Stream.containerInHierarchy(note) -- given a Score object, will retain the container (Measure or Voice) that the note or other element is in. Long-requested method.
  • ChordSymbol subclass NoChord for absence of chords (thanks Alex!)
  • Significant speedup in MIDI parsing (Thanks HalfVoxel)
  • New module in analysis.segmentByRests (thanks to Mark Gotham)
  • Chord.isSeventhOfType([0, 4, 7, 10]) lets you search for more obscure seventh chords.
  • improvements to braille output (thanks ajirving)
  • Setting the root or bass of a chord directly, will attempt to use the actual pitch from the chord as the root.
  • compatibility w/ newer versions of Sphinx
  • ABC supports C# major (thanks David Randolph)
  • Improvements to docs, including ability to cut and paste code (click the >>> button on the top right)
  • bug fixes for Python 3.7.
  • repr bug fixes (thanks Adrian Borucki).
  • ChordSymbols with Fretboards in the tablature package now export to MusicXML (import coming soon). Thanks Luke Poeppel.
  • Musescore output works even if there are spaces in the filepath (thanks Philip Kirlin)
  • Move to Keyword-only status: musicxml.archiveTools.*, deleteOriginal, Stream.iterators.Iterator parameters,
  • Deprecations: several unused and seldom-used Stream methods: _yieldReverseUpwardsSearch, restoreActiveSites, Chord.findRoot() (call Chord.root() instead).
  • Some obscure beaming routines moved from TimeSignature to Beams.
  • Lots of obscure bugs fixed through linting.

In keeping with the release of Py 3.7, and our policy of supporting the last three versions of Python, music21 v5.3 will be the last version to support Python 3.4. Please upgrade to at least Python 3.6 to stay current. A reminder that Python 2 users should use music21 v.4 or upgrade Python.

Thanks always to MIT, the NEH, and the Seaver Institute for their support of music21.

Music21 v.5 Release

17 Mar 21:03
Compare
Choose a tag to compare

music21 v.5 is PYTHON 3 ONLY

Do not upgrade to this version if you are using Python 2.7 (or better still, upgrade yourself to Python 3.6 instead). It runs on Python 3.4-3.6 only. music21 v.4 is the last version to support Python 2.

music21 v.5 brings with it seven months of determined work by an open-source team to streamline music analysis. The move to Python 3 allowed us to greatly simplify the codebase and to speed up many commonly used features in music21. If you are apprehensive about switching to Python 3, I hope you'll be convinced that it is worth it the first time you run chordify() on a large score v.5. and see that what might have taken an hour can now be done in few seconds. A great number of bugs involving working with non-English text have been fixed.

As a new major release, music21 breaks backwards compatibility where necessary and deprecates underused functions and things that can be done better in other ways. We're always trying to balance bringing new features with keeping the software as simple to use as possible.

Major changes:

  • Python 3 only. Yes, I said that but I'm saying it again. This change has made developing much faster and a lot more fun. Also it's made music21 more powerful and faster.

  • Chordify moves from O(n^2) to O(n) time -- Chordify on large scores works great now.

  • MusicXML roundtrip now preserves much about appearance, style, metadata, etc. -- you can now load a musicxml file into music21 and back into your software and 90% of the time you'll get visually the same result as the original software. Finale roundtrip is especially good!

  • Corpora searching is much better and much faster. Metadata is stored in pickle format.

  • Feature Extraction runs multicore by default. Together with the average of 10x faster chordify, feature extraction on large datasets on multicore systems is now very strong. Parallel processing is easier and much better documented.

  • Features with JSymbolic equivalents much more closely match the spec and new features have been added (thanks Micah Walter!)

  • Many routines that used to return string filepaths now return pathlib.Path objects. Especially useful for people running on Python 3.6

  • Almost all functions deprecated in v. 4 have been removed.

  • Many keyword functions now require the keyword, so instead of makeNotation(True), call makeNotation(inPlace=True), since explicit is better than implicit, this is a good way of being sure that only the right arguments are being changed.

  • parsing of Volpiano (Gregorian chant notation) added.

  • RehearsalMarks are now supported internally and in MusicXML reading/writing.

  • Other musicXML improvements: Volume of individual notes is now imported and exported. Glissandi and barlines and transposition work better. More elements can be hidden. Empty spaces in MusicXML measures are converted to hidden rests, to avoid gapped streams. Pitches in chords on musicxml import are always sorted from lowest to highest. Fretboard diagrams are supported and Instrument objects have the MusicXML v. 3 sound tags attached. (thanks to Luke Poeppel for these last two)

  • Corpora improvments: works by Amy Beach, Schubert (Lindebaum), better Bach Chorales (thanks Dr. Norman Schmidt), and Scott Joplin. Errors in various pieces fixed.

  • Scales and IntervalNetworks run much faster and are better documented.

  • voiceLeading.VoiceLeadingQuartet improved. compatibility change: improperResolution renamed to isProperResolution and improved. Former title implied that False meant it was proper; now the title reflects the output. Many other fixes and improvements thanks to Ryaan Ahmed.

  • analysis.transposition -- searches pitch lists for number of distinct transpositions; neoriemannian analysis improvements (thanks to Mark Gotham for both) Stream alignment tools in alpha.analysis (thanks to Emily Zhang)

  • Copyright and other metadata is preserved in many formats on import. This is just being a good neighbor.

  • Demos and most alpha code has been moved to a new separate repository: https://github.com/cuthbertLab/music21-demos -- they will be updated much less frequently. This will also make code development faster. Thanks to all who have contributed to music21's development. We'll be able to get more demos into the codebase by not needing to update them at every moment.

  • Bugs fixed: chords not in voices in measures with voices were not found in some routines. Instrument objects without midiProgram explicitly set get a program on MIDI output. MIDI no longer inserts a rest at the beginning (thanks KKONZ). Chord.normalOrder fixed (thanks luiselroquero), bugs in Capella parsing. Bugs related to Apple File System High Sierra not sorting files by default. Accented braille characters are exported properly.

  • Docs can be downloaded as a separate zip file.

I have no major backward-incompatable plans for the near future, so I expect v.5 to have a longer life than the last few releases (at least 18 months, and possibly 2-3 years), but work will continue on smaller subreleases to come. Thanks again to MIT, School of Humanities, Arts, and Social Sciences, and the Music and Theater Arts section for their support of music21 and the Seaver Institute and the National Endowment for the Humanities for financial support.

Music21 v. 5 beta 1

10 Mar 20:53
Compare
Choose a tag to compare
Music21 v. 5 beta 1 Pre-release
Pre-release

Music21 v. 5 beta 1 (5.0.6b1) is also a release candidate -- except for bug fixes, I do not expect to make any changes to music21 v.5 between here and the final release.

Note again: music21 v.5 is Python 3 only. Use v.4 for Python 2.7.

Changes since Alpha 2:

  • braille -- accented characters translate to braille
  • features -- many jSymbolic Feature Extractors match the spec more closely (thanks to Micah W. for the patches). Expect more of these improvements throughout the v.5 lifecycle.
  • Bach chorales -- improvements to naming and texts. Expect more of these improvements throughout v.5. Thank you to Dr. Norman Schmidt for these.
  • Improvements and fixes in voiceleading.py -- thanks to Ryaan Ahmed
  • More objects can be hidden with "hideObjectOnPrint"
  • Joplin, Maple Leaf Rag added to corpus
  • Guitar and other fretboards supported. Thanks to Luke Poeppel
  • Improvements to IPython/music21j MIDI
  • Added stream alignment tools in alpha.analysis. Thanks to Emily Zhang
  • docs for Stream.insertAndShift improved greatly.
  • separate zip file for docs.