Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Accidental's .client is never set, so Pitch (and from there Note) is never informed of alter changes

Đang mở
#2,063 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
48/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
backend

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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 _client can 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; displayStatus changes should probably not clear anything.
  • Accidental.__deepcopy__ currently copies _client across unchanged; it should set it to None, as Pitch.__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)

Ngôn ngữ chính
Python
Star
2.6k
Fork
459
Merge trung bình
1 ngày 7 giờ
Pull request đã merge (30 ngày)
40

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của cuthbertLab/music21

Tất cả issue của cuthbertLab/music21

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.