Accidental's .client is never set, so Pitch (and from there Note) is never informed of alter changes
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
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.
索引モデルが issue の本文から書いたものです。
説明
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)
- 主要言語
- Python
- スター
- 2.6k
- フォーク
- 459
- 平均マージ
- 12時間 38分
- マージ済み PR(30日)
- 46
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
cuthbertLab/music21 のほかの issue
-
enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
cuthbertLab/music21#2088 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
cuthbertLab/music21#2084 · コメント 6 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
cuthbertLab/music21#2055 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
Slur bezier-x/y from start element gets overwritten by stop element's values再び着手できるかも @bingliscodes が 21 日前に担当しましたが、オープン中のプルリクエストはありません。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
cuthbertLab/music21#2019 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
cuthbertLab/music21#1714 ·
メンテナーはふだん 1 日以内に返信
cuthbertLab/music21 の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
btclib-org/btclib-wallet#587 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
Judgment-Pack/judgment-pack-spec#275 ·
メンテナーはふだん 1 日以内に返信
-
ai-generated
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
メンテナーはふだん 1 日以内に返信
-
documentation good first issue priority: low size: XS
難易度 1/5 1〜3時間 初心者へのやさしさ 92/100
yeongseon/azure-functions-doctor-python#651 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
Changaco/python-libarchive-c#146 ·