Accidental's .client is never set, so Pitch (and from there Note) is never informed of alter changes
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 48/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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)
- Lenguaje dominante
- Python
- Estrellas
- 2.6k
- Forks
- 459
- Merge medio
- 1 d 7 h
- PR fusionados (30 d)
- 40
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de cuthbertLab/music21
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
cuthbertLab/music21#2084 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
cuthbertLab/music21#2082 ·
Los mantenedores suelen responder en 1 día
-
`TypeError` in `ChordReducer.run()` on multi-part `stream.Score` without instrument `partId`sAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
cuthbertLab/music21#2074 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
cuthbertLab/music21#2055 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Slur bezier-x/y from start element gets overwritten by stop element's valuesQuizá libre de nuevo @bingliscodes la tomó hace 8 días y no hay ningún pull request abierto. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
cuthbertLab/music21#2019 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de cuthbertLab/music21
Issues similares
-
approved Good First Issue scope: docs
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
hiero-ledger/hiero-sdk-python#2730 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
wemake-services/wemake-django-template#3178 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
md/asciidoc/csv: an explicit `encoding="utf-8"` keeps a leading BOM, the auto-detect path drops itAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
docling-project/docling#4846 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
neurostuff/NiMARE#1181 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
pytest-dev/pytest#15180 ·
Los mantenedores suelen responder en 1 día