Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
507 commits
Select commit Hold shift + click to select a range
26fac46
Pitch.transpose(inPlace=True) takes the transposed microtone, even none
mscuthbert Oct 10, 2026
9a9aeca
Merge pull request #2072 from cuthbertLab/copy-speedups
mscuthbert Oct 10, 2026
5eb2b52
Merge remote-tracking branch 'origin/master' into fix-transpose-inpla…
mscuthbert Oct 10, 2026
918c297
Merge pull request #2057 from float3/next-pitch-on-cycles
mscuthbert Oct 10, 2026
eaccb2c
Merge pull request #2075 from cuthbertLab/fix-transpose-inplace-micro…
mscuthbert Oct 10, 2026
460eaf6
Fix caching problem / remove ref to defaultOctave
mscuthbert Oct 10, 2026
522fb70
Merge pull request #2076 from cuthbertLab/hotfix-cache-octaves
mscuthbert Oct 10, 2026
757539b
Merge remote-tracking branch 'origin/master' into name-cache
mscuthbert Oct 10, 2026
ebc27ea
Name cache: parse into the cache, then set once; early return for style
mscuthbert Oct 10, 2026
c2f16ce
Merge pull request #2077 from cuthbertLab/name-cache
mscuthbert Oct 10, 2026
56384bd
preferSecondaryDominants: skip chords diatonic to the key
christopherlwerner Oct 12, 2026
b293d92
Speed up _isDiatonicToKey and test both preferSecondaryDominants sett…
christopherlwerner Oct 13, 2026
fd9a14d
Merge pull request #2078 from christopherlwerner/secdom-diatonic-check
mscuthbert Oct 13, 2026
d99e226
Read MusicXML octave-change in <transpose> without <diatonic>
syahra712 Oct 17, 2026
1e68f5f
Merge pull request #2086 from syahra712/fix-2082-transpose-octave-change
mscuthbert Oct 18, 2026
36d9144
(AI) Braille: read a lone key signature in a keyboard segment heading
wolfgang-aura Oct 18, 2026
151b743
Order TimespanTree.allParts() by the source score
syahra712 Oct 19, 2026
ad34dd4
Merge pull request #2087 from wolfgang-aura/fix-1986-braille-keysig
mscuthbert Oct 19, 2026
5836f38
tsvConverter: skip blank rows and strip cell whitespace on import
sankalpsthakur Oct 19, 2026
1b094a1
Merge pull request #2089 from syahra712/fix-2074-allparts-order
mscuthbert Oct 19, 2026
05f7f76
Remove uv.lock from repo
mscuthbert Oct 20, 2026
a5734e2
Update and pin ruff, mypy, pylint; fix new warnings
mscuthbert Oct 20, 2026
c693938
Merge pull request #2091 from cuthbertLab/no-uv-lock
mscuthbert Oct 20, 2026
0e69c91
Support Python 3.15: CI matrix and classifiers
mscuthbert Oct 20, 2026
d57554a
Python 3.15 doctest messages; update CI actions; one uv cache saver
mscuthbert Oct 21, 2026
7b5ca4b
Merge pull request #2092 from cuthbertLab/py315-CI
mscuthbert Oct 21, 2026
da064f3
Run CI coverage on Python 3.14
mscuthbert Oct 21, 2026
7d12e5d
Merge pull request #2093 from cuthbertLab/coverage-314
mscuthbert Oct 21, 2026
54bea69
Read segno and coda inside a MusicXML barline (fixes #2083)
raisingchris2026 Oct 21, 2026
4a91c60
Merge pull request #2094 from raisingchris2026/fix-2083-barline-segno
mscuthbert Oct 21, 2026
2ad9dc9
Add AI contribution policy to AGENTS.md
mscuthbert Oct 21, 2026
f086d8c
Allow amend + force-with-lease when asked to fold in a fix
mscuthbert Oct 21, 2026
7a3b55e
Merge pull request #2095 from cuthbertLab/agents-ai-policy
mscuthbert Oct 21, 2026
6091782
Keep dotfiles out of wheel and sdist
mscuthbert Oct 22, 2026
cbd514e
Merge pull request #2097 from cuthbertLab/exclude-dotfiles
mscuthbert Oct 22, 2026
026c352
myke edits
mscuthbert Oct 22, 2026
70135c5
Developer docs use uv; no-corpus build works on any OS
mscuthbert Oct 22, 2026
ec63311
Mac install page for beginners; MuseScore 4 default paths
mscuthbert Oct 22, 2026
f4bc59e
Always give notebooks a MuseScore to render with
mscuthbert Oct 22, 2026
bf24215
Remove unused documentation images
mscuthbert Oct 22, 2026
196eb4c
update windows instructions too.
mscuthbert Oct 22, 2026
b0f58d1
update linux
mscuthbert Oct 22, 2026
8c7864b
consulting removed
mscuthbert Oct 22, 2026
c441c0b
update links to GH, remove old MIT-donation words
mscuthbert Oct 22, 2026
d475e1c
fix docs
mscuthbert Oct 22, 2026
d9cea79
update installAdditional
mscuthbert Oct 22, 2026
87a1025
modernize chapter 1
mscuthbert Oct 22, 2026
eafe7df
remove chapter 1 end image
mscuthbert Oct 22, 2026
832210f
other uv updates
mscuthbert Oct 22, 2026
7a1ffe6
make Direction no longer a problem for Sphinx
mscuthbert Oct 22, 2026
897a26e
make Enums look better in docs (give members)
mscuthbert Oct 22, 2026
895e072
Build notebooks in parallel
mscuthbert Oct 22, 2026
cf2c6bd
short chapter titles, better TOC
mscuthbert Oct 23, 2026
1b8851a
Merge pull request #2100 from cuthbertLab/uv-no-pip
mscuthbert Oct 23, 2026
bf3de2e
Rename getMuseScorePath to getOrFindMuseScoreDirectPNGPath
mscuthbert Oct 23, 2026
8335214
Merge remote-tracking branch 'origin/master' into musescore-png-detect
mscuthbert Oct 23, 2026
ba4331a
Update MuseScore PNG-path memory for this branch's behavior
mscuthbert Oct 23, 2026
587fad4
Merge remote-tracking branch 'origin/master' into new-dist
mscuthbert Oct 23, 2026
d3487bd
add README to scripts directory.
mscuthbert Oct 23, 2026
9732863
cross-links to new RELEASING.md
mscuthbert Oct 23, 2026
3267551
Merge pull request #2099 from cuthbertLab/musescore-png-detect
mscuthbert Oct 23, 2026
95be640
Merge branch 'master' into new-dist
mscuthbert Oct 23, 2026
b2d824c
Merge pull request #2101 from cuthbertLab/new-dist
mscuthbert Oct 23, 2026
ca5eee6
Document that an empty Chord is False
mscuthbert Oct 23, 2026
024e4d7
Merge pull request #2102 from cuthbertLab/chord-empty-bool
mscuthbert Oct 23, 2026
d3853fc
Make testRagMarwaB flake ~140x less often
mscuthbert Oct 23, 2026
5b21642
Make testRagMarwaC flake less often
mscuthbert Oct 23, 2026
6173ea8
Merge pull request #2103 from cuthbertLab/ragmarwab
mscuthbert Oct 23, 2026
e583f75
MusicXML export: move out-of-range octaves into 0-9
mscuthbert Oct 25, 2026
982daa7
_octaveInRange: octave is always int in v11
mscuthbert Oct 25, 2026
dc16622
moveOctaveIntoMusicxmlRange public; warnings skill
mscuthbert Oct 25, 2026
a65baee
Merge pull request #2105 from cuthbertLab/out-of-range-xml
mscuthbert Oct 25, 2026
eadad4b
Silence configure performAction tests
mscuthbert Oct 25, 2026
43f8e69
Merge pull request #2106 from cuthbertLab/clean-output
mscuthbert Oct 25, 2026
c9b6561
Keep MIDI number for unmapped percussion on import (#1659)
mscuthbert Oct 26, 2026
c017ebb
MidiPercussionMapMixin for instruments in the GM percussion map
mscuthbert Oct 26, 2026
bbdeec1
Rename RideCymbals, SplashCymbals to singular
mscuthbert Oct 26, 2026
2cb8d7f
GM percussion modifiers: ride, splash, agogo, whistle, GM2 bells
mscuthbert Oct 26, 2026
b773618
UnpitchedDrum; Cabasa, Claves, Guiro, Cuica, Surdo, ChineseCymbal
mscuthbert Oct 26, 2026
f2ffbf0
Bump to 11.0.0b14: MIDI and MusicXML percussion import changed
mscuthbert Oct 26, 2026
b763471
Shaker, Caxixi, BellTree; drop RideCymbals/SplashCymbals names
mscuthbert Oct 26, 2026
78f4d3f
Review cleanup: pick test cases, simpler mapper, docstrings
mscuthbert Oct 26, 2026
b116b8f
refinements
mscuthbert Oct 26, 2026
8609b53
better names.
mscuthbert Oct 26, 2026
92b84df
HiHatCymbal -> HiHat; typos etc.
mscuthbert Oct 26, 2026
5006bf4
Merge pull request #2108 from cuthbertLab/percMapPitch
mscuthbert Oct 26, 2026
d0a0042
Don't read a file from parse() data whose '..' segments cancel out
mscuthbert Oct 28, 2026
7ff911d
cleanpath: spell out finding the last '..'
mscuthbert Oct 28, 2026
4f158f2
Merge pull request #2109 from cuthbertLab/fix-parse-reads-file-bug
mscuthbert Oct 28, 2026
846ad53
environment: don't use temp or settings files other users can change
mscuthbert Oct 28, 2026
240c42b
lily: keep score text inside strings; run LilyPond without a shell
mscuthbert Oct 28, 2026
b30248a
Clercq-Temperley: don't open data strings as files
mscuthbert Oct 28, 2026
db86eb4
Merge commit from fork
mscuthbert Oct 28, 2026
00230b8
Docs: replace user-specific screenshot details; ignore all notebook c…
mscuthbert Oct 29, 2026
2acd2d4
Separate Tenor and Percussion in noteworthy ClefNames
float3 Oct 10, 2026
1a605c6
Write an arpeggio mark on a single note to MusicXML
float3 Oct 10, 2026
55ee6cf
Yield no verticalities from an empty TimespanTree
float3 Oct 10, 2026
d470587
Merge pull request #2110 from float3/pr/noteworthy-clef-names
mscuthbert Oct 30, 2026
4ea0e56
Merge pull request #2111 from float3/pr/musicxml-arpeggio-single-note
mscuthbert Oct 30, 2026
829d1fe
Include native extractors in extractorsById(library='all')
float3 Oct 10, 2026
35140b4
Find frequencies from sixteen-bit samples without scipy
float3 Oct 11, 2026
84699c6
Snap the end of a one-offset search as its start is snapped
float3 Oct 11, 2026
fd0ddcd
Merge pull request #2115 from float3/pr/autocorrelation-int16-overflow
mscuthbert Oct 30, 2026
fb4a7db
Merge pull request #2112 from float3/pr/empty-tree-verticalities
mscuthbert Oct 30, 2026
282a13c
Merge pull request #2113 from float3/pr/extractors-by-id-all
mscuthbert Oct 30, 2026
1e931f0
Merge pull request #2114 from float3/pr/offset-filter-snapped-end
mscuthbert Oct 30, 2026
31f17ec
Leave a stage-1 MuseData part without a name
float3 Oct 10, 2026
57318e7
Search metadata for a query that will not compile as a pattern
float3 Oct 12, 2026
6cce624
Take the complement of an empty residual class
float3 Oct 10, 2026
7b989a4
Read MuseData files with Windows line endings
float3 Oct 30, 2026
b42bdcf
Run path doctests on Windows
float3 Oct 30, 2026
d330ef8
Merge pull request #2116 from float3/pr/metadata-search-uncompilable
mscuthbert Oct 30, 2026
4dedba3
Merge pull request #2117 from float3/pr/sieve-complement-empty
mscuthbert Oct 30, 2026
1ab469a
Merge pull request #2118 from float3/pr/musedata-stage1-part-name
mscuthbert Oct 30, 2026
235b5c1
Wrap a lone Part in a Score in ScoreReduction.score
float3 Oct 10, 2026
b4d58f0
Insert nested Humdrum sub-spines bottom-up
float3 Oct 10, 2026
bf49a7f
Merge pull request #2120 from float3/pr/windows-path-doctests
mscuthbert Oct 30, 2026
6b3e4e7
Merge pull request #2121 from float3/pr/score-reduction-lone-part
mscuthbert Oct 30, 2026
537d143
Merge pull request #2119 from float3/pr/musedata-crlf
mscuthbert Oct 30, 2026
b4ffbd1
Read Capella single barlines and prolonged tuplets
float3 Oct 10, 2026
50c5c53
Skip NoChord in ChordBassMotionFeature
float3 Oct 10, 2026
c7b79e3
Keep ABC overflow when no meter fits it
float3 Oct 10, 2026
f913c28
Merge pull request #2123 from float3/pr/capella-barline-tuplet
mscuthbert Oct 30, 2026
c234fb4
Merge pull request #2124 from float3/pr/chord-bass-motion-no-chord
mscuthbert Oct 30, 2026
d47e4d1
Take a chord's highest note when a ReductiveNote names no pitch
float3 Oct 10, 2026
37b58b4
Sort a chord in place before exporting it to MusicXML
float3 Oct 30, 2026
1d82f8c
Leave the score's dynamics unchanged in PartReduction
float3 Oct 10, 2026
f92523a
Close TinyNotation brackets past ties and meters
float3 Oct 10, 2026
bdc3a43
Keep tuplets set on a duration that has not worked out its own
float3 Oct 11, 2026
438c5e5
Count a split measure's second half in the meter its first half opens…
float3 Oct 11, 2026
3d58459
Keep a split measure's right barline at the end of its second half
float3 Oct 11, 2026
14d04c0
Decide a trill's undecided ornamental accidental
float3 Oct 10, 2026
0f3409a
Allow chords and unpitched notes in mostCommonMeasureRhythms
float3 Oct 10, 2026
89bcf3c
Close an octave-repeating scale without a zero-width step
float3 Oct 10, 2026
60014d0
Fix Sieve crash on unbracketed intersection with a complemented residual
DuncanBentley Oct 30, 2026
21492e7
Merge pull request #2134 from float3/pr/split-keeps-right-barline
mscuthbert Oct 30, 2026
80caf84
Merge branch 'master' into pr/beat-partial-measure-meter
mscuthbert Oct 30, 2026
390257d
Merge pull request #2135 from DuncanBentley/fix-sieve-complement-inte…
mscuthbert Oct 30, 2026
dcde7e2
Count each part of a split measure's first half in its own meter
float3 Oct 30, 2026
b285108
Merge remote-tracking branch 'fork/pr/beat-partial-measure-meter' int…
float3 Oct 30, 2026
96019da
Merge pull request #2133 from float3/pr/beat-partial-measure-meter
mscuthbert Oct 30, 2026
618d47e
Merge pull request #2132 from float3/pr/trill-accidental-display
mscuthbert Oct 30, 2026
1b0a9dd
Merge pull request #2130 from float3/pr/tinynotation-close-states
mscuthbert Oct 30, 2026
13c6206
Merge pull request #2129 from float3/pr/part-reduction-leave-dynamics
mscuthbert Oct 30, 2026
480a7d5
Merge pull request #2128 from float3/pr/augment-lazy-tuplets
mscuthbert Oct 30, 2026
0fbcead
Merge pull request #2127 from float3/pr/reductive-note-chord-highest
mscuthbert Oct 30, 2026
972769b
Merge pull request #2125 from float3/pr/abc-rebar-overflow
mscuthbert Oct 30, 2026
ceae70e
Give figured-bass realizations their own pitches
float3 Oct 10, 2026
dfad026
Make numberVoices public and test the voices of double and simultaneo…
float3 Oct 30, 2026
490195f
Shorten a test line
float3 Oct 30, 2026
b790cd1
Merge pull request #2122 from float3/pr/humdrum-nested-split
mscuthbert Oct 30, 2026
e757f1c
Leave a chord's fingerings in place when sorting it for export
float3 Oct 30, 2026
de29b62
Merge pull request #2137 from float3/pr/octave-repeating-full-octave
mscuthbert Oct 30, 2026
6b6bb33
Merge pull request #2136 from float3/pr/most-common-rhythms-chord
mscuthbert Oct 30, 2026
c3626c0
Merge pull request #2138 from float3/pr/fb-realizer-own-pitches-2
mscuthbert Oct 30, 2026
2254367
Build harmonic minor from its own intervals
float3 Oct 10, 2026
d15ffcc
Put volpiano breaks and neumes in the measure being read
float3 Oct 10, 2026
7220b2e
Add a measure made by makeTies to the stream once
float3 Oct 31, 2026
6d3be82
Keep each voice tied into a measure without voices
float3 Oct 31, 2026
9951a25
Check the platform with sys.platform where os.getuid is called
float3 Oct 31, 2026
d800621
Show getUnalteredPitch reversing an altered degree
float3 Oct 31, 2026
51f4b17
Convert forbiddenChords in ChordReducer.run
float3 Oct 31, 2026
77c522c
Detect hidden tuplet numbers in braille noteToBraille
float3 Oct 31, 2026
8db305a
Fix the binary_dots entry for braille dots 1-2-3-5-6
float3 Oct 31, 2026
2ed7529
Read the left-hand key in a keyboard segment heading
float3 Oct 31, 2026
5a92256
lily: quote note colours with quoteString
float3 Oct 31, 2026
1e87a91
Transcribe a note after an empty TextExpression in braille
float3 Oct 31, 2026
74db133
Make BrailleText.showHand store the hand and set only its symbol
float3 Oct 31, 2026
249c37a
Merge pull request #2145 from float3/pr/getuid-platform-checks
mscuthbert Nov 1, 2026
52c3b5e
Merge pull request #2126 from float3/pr/chord-to-xml-sort-in-place
mscuthbert Nov 1, 2026
93053dd
Merge pull request #2141 from float3/pr/volpiano-current-measure-2
mscuthbert Nov 1, 2026
9cf44b1
Merge pull request #2142 from float3/pr/make-ties-new-measure-once
mscuthbert Nov 1, 2026
6b15830
Note the harmonic minor interval change
float3 Nov 1, 2026
5b91ce9
Rerun CI
float3 Nov 1, 2026
1e047a1
Merge pull request #2140 from float3/pr/harmonic-minor-no-altered-deg…
mscuthbert Nov 1, 2026
ee10875
Merge remote-tracking branch 'origin/master' into pr/make-ties-new-vo…
float3 Nov 1, 2026
e7f215a
Allow adjacentAverage windowed analysis with windows above size one
float3 Nov 1, 2026
26a3d5a
Merge pull request #2147 from float3/pr/braille-binary-dots
mscuthbert Nov 1, 2026
af3d2a9
Merge pull request #2152 from float3/pr/chord-reducer-forbidden-chords
mscuthbert Nov 1, 2026
6f63d56
Merge pull request #2151 from float3/pr/braille-grand-heading-no-righ…
mscuthbert Nov 1, 2026
f94e333
Merge pull request #2153 from float3/pr/lily-quote-note-color
mscuthbert Nov 1, 2026
0d10c59
Merge pull request #2150 from float3/pr/braille-empty-text-expression
mscuthbert Nov 1, 2026
ebe7bb8
Merge pull request #2149 from float3/pr/braille-tuplet-hidden-number
mscuthbert Nov 1, 2026
89e280d
Change a collected object's priority in Stream.measures only when needed
float3 Nov 1, 2026
8276edd
Rerun CI
float3 Nov 1, 2026
414bad7
Key ChordReducer weights by sorted pitch classes
float3 Nov 1, 2026
30f1170
Find nextPitch neighbors on cycles wider than an octave
float3 Nov 1, 2026
d825994
Join PartStaffs after a measure missing from the first staff
float3 Nov 1, 2026
7ab10e3
Deduplicate instruments offset by offset
float3 Nov 1, 2026
51ca198
Analyze modal keys in QualityFeature
float3 Nov 1, 2026
f7bb165
Keep findConsecutiveNotes(skipUnisons=True) continuous over unisons
float3 Nov 1, 2026
ccf803f
Insert each part's timespans at once in toPartwiseTimespanTrees
float3 Nov 1, 2026
0a7e7b3
Merge pull request #2154 from float3/pr/windowed-adjacent-average-2
mscuthbert Nov 1, 2026
00815d2
Pad split measures with zero-length rests in braille splitMeasure
float3 Nov 1, 2026
85e37ec
Realize figured-bass lines holding tuplets
float3 Nov 1, 2026
346aab3
Merge pull request #2155 from float3/pr/next-pitch-wide-cycles-2
mscuthbert Nov 1, 2026
dfa0bb2
Merge pull request #2144 from float3/pr/make-ties-new-voices-kept
mscuthbert Nov 1, 2026
4c8aa0d
Keep the stretch before a span's first dynamic in PartReduction
float3 Nov 1, 2026
dbf1b1e
Count ChordBassMotionFeature motion upward
float3 Nov 1, 2026
c559cb9
Merge pull request #2159 from float3/pr/quality-feature-modal-key-2
mscuthbert Nov 1, 2026
9ad9f34
Merge pull request #2160 from float3/pr/find-consecutive-unisons-2
mscuthbert Nov 1, 2026
2e94bca
Merge pull request #2162 from float3/pr/fb-tuplet-offsets-2
mscuthbert Nov 1, 2026
1ac7468
Merge pull request #2163 from float3/pr/part-reduction-span-start-2
mscuthbert Nov 1, 2026
6214e90
Merge pull request #2148 from float3/pr/braille-show-hand-setter
mscuthbert Nov 1, 2026
abc28c8
Merge pull request #2165 from float3/pr/chord-bass-motion-direction-2
mscuthbert Nov 1, 2026
13bc527
Place melodicIntervals at offsets in the stream analysed
float3 Nov 1, 2026
fd5153c
Smooth floating key analysis with each neighbour's own interpretations
float3 Nov 1, 2026
515e1ec
Merge pull request #2168 from float3/pr/floating-key-interpretation-c…
mscuthbert Nov 1, 2026
230acc2
Merge pull request #2166 from float3/pr/melodic-intervals-offsets-2
mscuthbert Nov 1, 2026
197ad11
Merge pull request #2172 from float3/pr/measures-collect-priority
mscuthbert Nov 1, 2026
f67105e
Merge pull request #2173 from float3/pr/partwise-trees-bulk-insert
mscuthbert Nov 1, 2026
cd3158e
Merge pull request #2174 from float3/pr/chord-reducer-pitch-class-key
mscuthbert Nov 1, 2026
4f65314
Fix lowestLine on octave clefs and low diatonicNoteNum setter
mscuthbert Nov 1, 2026
633b0d3
Make all octave clefs subclass GClef or FClef
mscuthbert Nov 1, 2026
c1d2cbc
Merge remote-tracking branch 'upstream/master' into fix/1541-tsv-blan…
sankalpsthakur Nov 1, 2026
02c265c
Generator expressions AGENTS
mscuthbert Nov 1, 2026
14f1a97
Review: drop the header-only exception, avoid nested generators
sankalpsthakur Nov 1, 2026
3241ed2
Merge remote-tracking branch 'upstream/master' into fix/1541-tsv-blan…
sankalpsthakur Nov 1, 2026
117c474
Merge pull request #2175 from cuthbertLab/buggy-lowestline
mscuthbert Nov 1, 2026
5d8990f
Merge pull request #2176 from sankalpsthakur/fix/1541-tsv-blank-rows
mscuthbert Nov 1, 2026
bbd93cd
Use Viola and Violin in the instrument deduplication tests
float3 Nov 1, 2026
e323f4c
Test joining PartStaffs after a measure missing from the second staff
float3 Nov 1, 2026
3276f85
Keep an explicit zero quarterLength in GeneralNote
float3 Nov 1, 2026
d33d135
Reject roman numerals past VII
float3 Oct 10, 2026
67ae3a1
Merge pull request #2158 from float3/pr/midi-deduplicate-instruments-2
mscuthbert Nov 1, 2026
584db34
Merge pull request #2178 from float3/pr/romantext-high-numerals-2
mscuthbert Nov 1, 2026
a56ae8b
Merge remote-tracking branch 'origin/master' into pr/braille-split-me…
float3 Nov 1, 2026
cd8adfb
Check staff numbers per measure in the second-staff PartStaff test
float3 Nov 1, 2026
57a6b77
Stop making more than 100,000 measures from malformed input
float3 Nov 1, 2026
0dbfb4f
Merge pull request #2156 from float3/pr/partstaff-measure-gap-2
mscuthbert Nov 2, 2026
46eb803
Merge pull request #2183 from float3/pr/make-measures-limit
mscuthbert Nov 2, 2026
94cd472
Merge pull request #2161 from float3/pr/braille-split-measure-padding-2
mscuthbert Nov 2, 2026
ee531b3
Misc clef cleanup
mscuthbert Nov 2, 2026
76643aa
Merge pull request #2196 from cuthbertLab/misc-clef-cleanup
mscuthbert Nov 2, 2026
cba9b0c
Merge origin/master into meter-speed-2026
float3 Nov 2, 2026
0179485
Bump to 11.0.0b16: cached pickles hold the old MeterSequence
float3 Nov 2, 2026
536fa6e
meter/core.py docs
float3 Nov 2, 2026
5d816f3
meter/base.py docs
float3 Nov 2, 2026
11a91d0
duration.py docs
float3 Nov 2, 2026
13b8366
base.py docs
float3 Nov 2, 2026
2e04121
Test comments for meter and FrozenDuration
float3 Nov 2, 2026
c55b6c2
Remove MeterCore._reprInternal
float3 Nov 2, 2026
37fcfb5
Set summedNumerator with MeterSequence.modify
float3 Nov 2, 2026
4b24c67
Weight the default accents in one rebuild
float3 Nov 2, 2026
8b15577
Walk frames directly in FrozenObject._check_init
float3 Nov 2, 2026
e45a6bb
Rebuild the tree once per level in subdivideNestedHierarchy
float3 Nov 2, 2026
9e233f7
Rename MeterSequence methods that return a new sequence; old names raise
float3 Nov 2, 2026
a84ea15
User's Guide 55: use the immutable MeterSequence API
float3 Nov 2, 2026
051a470
Bound the MeterTerminal, MeterSequence, and TimeSignature default caches
float3 Nov 2, 2026
df43ce4
Cache the hash of MeterTerminal, MeterSequence, and FrozenDuration
float3 Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .agents/memory/MEMORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,9 @@ Project-shared agent memory for music21. One file per fact; see frontmatter for
- [sortedcontainers for streams](sortedcontainers-for-streams.md) — tried twice to make streams always-sorted via SortedList; abandoned, too slow for tiny streams
- [Stream subclass generic defaults](stream-subclass-generic-defaults.md) — how `inherit-generics` should work once PEP 696 default type params land; maybe add typing_extensions
- [BFS-flatten-iterator](bfs-flatten-iterator.md) — lazy breadth-first flatten is writable (maybe for tree first), but must not reuse the flat/flatten name tied to offsetInHierarchy
- [Docs: audience separation](docs-audience-separation.md) — maintenance notes and private-method references go in code comments, never public docstrings
- [Docs: no untaken paths](docs-no-untaken-paths.md) — docstrings state what the code does, never contrast with rejected designs
- [Issue #1349 romanNumeral direction](issue-1349-romanNumeral-direction.md) — raised-^6/^7 fix landed; CAUTIONARY default kept; items 2+4 open with pablopupo/Malcolm
- [Meter immutability re-apply](meter-immutability-reapply.md) — meter-speed is too stale to merge; re-apply FrozenDuration + immutable MeterTerminal + tuple NumDenom fresh on master
- [Helpers public by default](helpers-public-by-default.md) — reusable theory helpers go public + documented (search first); inline one-caller helpers that would cost runtime
- [MuseScore PNG path](musescore-png-path.md) — MuseScore renders notebook/.png/.pdf notation for everyone; users pick their own app for show(); music21 finds MuseScore itself
20 changes: 20 additions & 0 deletions .agents/memory/docs-audience-separation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
name: docs-audience-separation
description: Public docstrings are for library users; maintenance notes and private-symbol references go in code comments
metadata:
type: feedback
---

Never put maintenance notes ("change one and check the others", refactoring
caveats, cross-references between internal implementations) in music21 public
docstrings, and never reference private (underscore) methods from public
docstrings. Put that material in `#` code comments instead.

**Why:** docstrings render into the published docs and serve library *users*;
comments serve *maintainers*. Myke: "there are different users with different
roles." A user reading the API docs should never see internal plumbing they
cannot call.

**How to apply:** before finishing a doc pass, scan new docstring text for
underscore-prefixed names and maintainer-facing advice; relocate to a comment
just below the docstring. Related style rule: [[docs-no-untaken-paths]].
21 changes: 21 additions & 0 deletions .agents/memory/docs-no-untaken-paths.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
name: docs-no-untaken-paths
description: Docstrings and doctests describe what the code does, never the designs it avoided
metadata:
type: feedback
---

When writing docstrings and doctests for music21, do not spend words (or
doctest lines) explaining what the code *doesn't* do or contrasting with
rejected alternatives — e.g. cut "not literally 'mod 7', which would make it
0" from a description that already states the value is always 1-7. Myke: "we
don't spend doctest time reinforcing paths we didn't take."

**Why:** every sentence in a docstring is maintained forever and read by users
who never saw the alternative; contrast-with-the-wrong-design is
reviewer-facing noise, like comments justifying a change.

**How to apply:** state the positive contract with examples of real values. If
a name is misleading (like `GenericInterval.mod7`, which actually returns
simple-interval values 1-7), document the actual behavior — don't argue with
the name in prose. Related style rule: [[docs-audience-separation]].
25 changes: 25 additions & 0 deletions .agents/memory/helpers-public-by-default.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
name: helpers-public-by-default
description: Reusable music-theory helpers go public with docs and examples; but a one-caller helper that would cost runtime gets inlined
metadata:
type: feedback
---

When a new helper computes something a user could reuse, make it a public, documented
function with doctest examples, not `_private`. Before writing it, search the codebase
(scale, key, chord, interval, pitch, roman) for something that already does it or
nearly does, and build on that.

But be smart about runtime: never rebuild an expensive object per item. A
`scale.MajorScale` costs ~80 us to build and ~110 us per degree lookup. If a helper has
one caller and standing alone would force per-call setup or awkward context parameters,
inline it and hoist the setup out of the loop.

**Why:** the point of music21 is giving people helpful tools for music theory, but a
slow public helper in a hot path is worse than none. (Myke, 2026-09-29: a public
`chordDegreeFromPitch` that built a MajorScale per pitch and took a `chordDegrees`
collection was inlined into `chordSymbolFigureFromChord` with the scale built once.)

**How to apply:** default to public for genuinely reusable theory tools; inline when
there is one caller and the standalone signature would be slow or contrived.
Related: [[docs-audience-separation]].
40 changes: 40 additions & 0 deletions .agents/memory/issue-1349-romanNumeral-direction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
name: issue-1349-romanNumeral-direction
description: Status and direction for RomanNumeral.romanNumeral vs romanNumeralFromChord (GitHub issues #1349 and #1249)
metadata:
type: project
---

As of 2026-07-06 (branch `fix-1349-raised-67`): the core raised-^6/^7 bug in
GitHub issue #1349 is FIXED — `correctRNAlterationForMinor` gained a
keyword-only `chordHasMajorThird` argument so major-quality chords on raised
^6/^7 in minor keep their sharp (figure `#VI`, `.romanNumeral` `'#VI'`), and
the tsvConverter `localKeyAsRn` workaround was removed. (Naming settled after
two rounds: name the parameter for the chord-level fact it carries, not for
its consequence like "uppercaseNumeral" — the numeral doesn't exist yet when
the function runs.) Myke decided NOT to
flip the `romanNumeralFromChord` default from CAUTIONARY to QUALITY (the 2022
idea in the issue) for now. Still open, to discuss with contributor pablopupo
and Malcolm Sailor on the issue: (2) adding `sixthMinor`/`seventhMinor`
parameters to `romanNumeralFromChord` and possibly flipping its default, and
(4) issue #1249 (secondary-numeral `#vii` prefixing).

**Why:** `.romanNumeral` is the *semantic* root-degree token (alteration
relative to the key's natural scale, read from `frontAlterationAccidental`),
while `.figure` is notational. `harmonicFunction.romanToFunction` and the
tsvConverter DCML export depend on the semantic reading, so the property
should never be deprecated. Known remaining wart: seventh chords on raised
^6/^7 in minor still don't round-trip their figures (e.g. `#VIb753` reparses
with G-flat) — the CAUTIONARY generation convention computes inversion figures
against an "altered key" while parsing measures against the original scale,
and the mismatch differs per degree.

**How to apply:** when returning to items 2+4, the minor-^6/^7 accidental
convention lives in three places that must stay in sync (see the maintenance
comment in `correctRNAlterationForMinor`). The same session renamed
`FigureTuple.aboveBass` to `degFromRefPitch` and `ChordFigureTuple` to
`PitchFigureTuple`, and replaced `figureTupleSolo` with the classmethod
constructor `FigureTuple.fromPitchAndReference(pitchObj, keyObj, refPitch)`
(old name kept as a deprecated v11→v12 alias). Myke is not all-in on
classmethod constructors in general, but preferred one here over a
module-level function whose name read as the verb "figure".
34 changes: 34 additions & 0 deletions .agents/memory/meter-immutability-reapply.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
name: meter-immutability-reapply
description: Plan to re-apply the meter-speed immutability rewrite fresh on master instead of merging the stale branch
metadata:
type: project
---

The `origin/meter-speed` branch (16 commits, Oct 2022) is a two-part meter rewrite:

1. **Representation change** — meter's internal form goes from strings (`'1/4'`,
`f'1/{d}'`) to tuples: `NumDenom = tuple[int, int]` (i.e. `(1, 4)`), with
`NumDenomTuple` / `MeterOptions` aliases in `meter/tools.py`.
2. **Immutability** — `MeterTerminal` / `MeterSequence` become slotted and
immutable (`SlottedObjectMixin` / `common.FrozenObject`, `FrozenDuration`,
`_durationFromNumeratorDenominator` cached with `lru_cache`). Immutable meter
terminals can be shared/cached with no defensive copies.

**Why not just merge master in (decided 2026-06-30):** the branch is 879 commits
behind. Merging `master` produced deep *semantic* conflicts — 31 hunks in
`meter/core.py`, 8 in `meter/tools.py` — because master independently evolved the
*string-based, mutable* code for a year+ (added typing like `-> None`, a `weight`
property, parse fast-paths, and a public→private rename `addTerminal` →
`_addTerminal`). Almost every hunk is two different implementations of the same
method, and the str→tuple change ripples into callers. Resolving that merge would
mean finishing+rebasing the rewrite through hundreds of collisions — not worth it.

**How to apply:** treat `origin/meter-speed` as a *reference*, not a mergeable
branch. Start a clean branch off current `master` and re-apply only the wanted
pieces as a fresh, reviewable change: `FrozenDuration`, slotted/immutable
`MeterTerminal` & `MeterSequence`, and the tuple `NumDenom` internal
representation. Note `common.FrozenObject` is **already in master** (typed for
3.12+), so only the meter-specific immutability needs porting. Validate against the
full `music21/meter` test suite and fix downstream callers. Keep `origin/meter-speed`
until the re-apply lands; delete it afterward.
38 changes: 38 additions & 0 deletions .agents/memory/musescore-png-path.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
name: musescore-png-path
description: MuseScore is needed even by Dorico/Sibelius users -- musescoreDirectPNGPath renders notation in notebooks and .png/.pdf; musicxmlPath stays the user's own app
metadata:
type: project
---

Two separate settings:

- `musicxmlPath`: the app `.show()` opens outside a notebook. Docs encourage users to
pick their regular notation program (Dorico, Sibelius, MuseScore, Finale).
- `musescoreDirectPNGPath`: the MuseScore program music21 runs in the background
(`converter/museScore.py: runThroughMuseScore`) to turn MusicXML into images. Used by
`.show()` in Jupyter (default format `ipython.musicxml.png`) and by
`write('musicxml.png')` / `write('musicxml.pdf')`. A value starting with `/skip` turns
rendering off (documentation tests show a 1-pixel image instead).

**Why MuseScore is special:** it is the only notation program music21 can run from the
command line to render images, so anyone who wants notation in a notebook needs it
installed, even if they never open it.

**How the path gets set (v11, #1980 and #2099; none of this is in 10.x):**

- `converter.museScore.findMuseScore()` finds MuseScore 3 or newer in the usual places:
Applications on Mac, Program Files on Windows, the PATH on Linux.
- The Configuration Assistant sets `musescoreDirectPNGPath` to the chosen reader if it is
MuseScore (the program inside a Mac `.app`), otherwise to any MuseScore it finds,
unless the current setting already exists.
- When rendering, `getOrFindMuseScoreDirectPNGPath()` looks for MuseScore if the setting
is missing or points nowhere, saves what it finds, or raises with the musescore.org link.
- Defaults in `environment.py`: MuseScore 4's install location on Mac and Windows;
`/usr/bin/mscore3` on Linux, where MuseScore 4 has no standard location.

Myke renders with MuseScore 3 because it is much faster than 4 -- an advanced tip not
yet in the docs.

**How to apply:** install docs tell users to install MuseScore for notation in the
browser, then choose their favorite program in the assistant.
41 changes: 26 additions & 15 deletions .agents/skills/bump-version/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,36 +35,47 @@ uv run pytest --doctest-modules music21/base.py music21/_version.py

## When to bump

- **Parsing-format / parser changes (most common reason).** Any change to how a
format is read or written — musicxml, abc, MIDI, noteworthy/NWC, humdrum,
etc. — should bump the version, even a refactor, because the version is baked
into the **pickled-stream cache** (cached parsed files). Bumping invalidates
stale pickles so users don't get results from the old parser. This is the rule
in AGENTS.md ("Changes to parsing formats … need to update the patch version").
- **New feature** → bump (see digit rules below); mark it in docstrings with
`* New in vX: …`.
- **Bug fix** → bump the patch; if it changes public behavior, mark
`* Changed in vX: …`.
- **Pure internal refactor with no behavioral/pickle impact** → usually no bump.
One thing depends on the number changing: the **pickled-stream cache**. The
version is part of the cache key, so a bump invalidates stale pickles
everywhere. If nobody is holding a wrong cached parse, don't bump — the commit
is the record.

- **Parser or parsing-format change → always bump**, even a pure refactor:
someone is holding a pickle parsed by the old code. musicxml, abc, MIDI,
noteworthy/NWC, humdrum, and the rest.
- **Anything else → no bump**: a new feature, a fix that makes code do what it
already claimed, an internal refactor, a test-only or docs-only change.

"It's a bug fix" is not by itself a reason. A musicxml importer that now reads a
tag it used to drop bumps, because cached parses are wrong. A scale analysis
method that changed its return format does not.

A `New in` / `Changed in` marker is **not** a reason to bump. Those markers name
a major version, at most a minor one — never a patch, never a `bN` beta — and
moving those digits is a release decision only a human makes. Write the marker
for the version the change will land in and leave `_version.py` alone.

## Which part to change

music21 follows semver-ish rules (see the `_version.py` docstring for the full
rationale):

- **MAJOR (X)** — breaks old features. Rare.
- **MAJOR (X)** — breaks old features. Rare. A human decides this.
- **MINOR (Y)** — new features. **Even Y = alpha/beta, odd Y = release.**
`X.0` (e.g. `11.0`) are development releases that can still change until `X.1`.
- **PATCH (Z)** — bug fixes and parsing/pickle-invalidating changes.
A human decides this too; an agent changes only the patch or the beta suffix.
- **PATCH (Z)** — parsing/pickle-invalidating changes and other fixes that
meet the bar above.
- **beta suffix (`bN`)** — successive pre-release builds of the same
`MAJOR.MINOR.PATCH`. To cut another beta without otherwise changing the
number, increment it: `11.0.0b1` → `11.0.0b2`. (This is what a
parser change during a `…b1` cycle does.)

## `Changed in` / `New in` docstring markers

When a bump accompanies a public-interface change, annotate the affected
method/class docstring:
Annotate a changed public interface in the affected method/class docstring.
This is independent of bumping — a marker is documentation, not a version
change:
- `* Changed in vX: one-line explanation.`
- `* New in vX: one-line explanation.`

Expand Down
Loading
Loading