Accidental's .client is never set, so Pitch (and from there Note) is never informed of alter changes
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
Direzione di ricerca
Start with the Accidental and Pitch behavior described in the issue: inspect Accidental.set() and the Pitch.accidental setter, then trace how changes inform Note and Chord caches. Consider the listed sharing, deepcopy, performance, and pickle-version concerns before choosing an approach. Done means in-place accidental changes leave dependent cached results correct without breaking the noted behaviors.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Basically, we created a .client attribute for Accidental, but we never had anything set Accidental.client = parent-Pitch so nothing is ever informed.
It means we have a couple of choices: we can get rid of it (making accidental a bit faster) and saying that Pitch changes should always create new accidentals rather than changing the existing accidental's alter (eh...?) -- or set client and figure out the bugs and speed tradeoffs.
Not commiting to doing this now, but wanted to be aware of it.
Agent drafted text below -- read and makes sense
Changing an Accidental in place (p.accidental.set('natural'), p.accidental.alter = 0) does not tell the Pitch's Note or Chord, so cached answers like chord.commonName stay stale. Assigning a new accidental (p.accidental = 'natural') works. (Entirely AI written)
music21 version
11.0.0b10 (master at 9ad11788e)
Operating System(s) checked
macOS 15
Problem summary
Accidental has a _client slot, and Accidental.set() calls self._client.informClient() when it is set, but nothing in music21 ever sets it: the Pitch.accidental setter stores the Accidental without pointing it back at the Pitch.
Steps to reproduce
from music21 import chord
c = chord.Chord(['C4', 'E-4', 'G4'])
c.commonName # 'minor triad'
c.pitches[1].accidental.set('natural')
c.pitches[1].name # 'E'
c.commonName # 'minor triad' -- stale
c.isMinorTriad() # True -- stale
c = chord.Chord(['C4', 'E-4', 'G4'])
c.commonName
c.pitches[1].accidental = 'natural'
c.commonName # 'major triad' -- correct
Expected vs. actual behavior
Expected: any change to a Pitch's accidental clears its Note's (and Chord's) caches.
Actual: only assigning a new accidental through Pitch.accidental does.
More information
The obvious fix (value._client = self in the Pitch.accidental setter) is probably not the whole job, and other behavior may need to change or be optimized along with it:
- An Accidental can be shared by several Pitches (
p2.accidental = p1.accidental), and one_clientcan only point at one of them. Either the setter copies, or shared Accidentals become unsupported. - Every in-place
set()/.alter =/.name =/.modifier =would start clearing Note and Chord caches. Code that loops over pitches adjusting accidentals (makeAccidentals,updateAccidentalDisplay, transposition, enharmonic simplification) may pay for repeated cache clears;displayStatuschanges should probably not clear anything. Accidental.__deepcopy__currently copies_clientacross unchanged; it should set it toNone, asPitch.__deepcopy__does for its own_client.- Pickled scores would carry the new back-reference, so the cache version would need a bump.
Found while benchmarking Accidental creation for a planned speedup; that work will not change this behavior.
AI-assisted (Claude)
- Lingua principale
- Python
- Stelle
- 2.6k
- Fork
- 459
- Merge medio
- 1g 8h
- PR unite (30g)
- 39
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di cuthbertLab/music21
-
Midi bank number supportApertaenhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
cuthbertLab/music21#2088 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
cuthbertLab/music21#2084 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
cuthbertLab/music21#2055 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Slur bezier-x/y from start element gets overwritten by stop element's valuesForse di nuovo libera @bingliscodes l’ha presa 14 giorni fa e non c’è nessuna pull request aperta. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
cuthbertLab/music21#2019 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
cuthbertLab/music21#1714 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di cuthbertLab/music21
Issue simili
-
changelog investigate
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
ramnes/notion-sdk-py#423 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 1-3 ore Idoneità per principianti 89/100
duckdb/duckdb-web#7514 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
jbacalso24/mimry#525 ·
I maintainer di solito rispondono entro 1 giorno