Discussion/Proposal: Pitches always have accidentals
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ó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
Hướng nghiên cứu
Start by reading the Pitch and Accidental implementation and their tests; the issue does not name specific files or tests. Assess how making every Pitch hold an Accidental affects construction, behavior, and performance, including the stated timing comparisons and the proposed terminology changes. Done would require an agreed proposal and corresponding updates, but this issue is a discussion rather than a scoped implementation task.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Similar in vein to #2009 (octave always exists):
Music21 started out with the goal of being able to represent many different ways of thinking about music, globally and historically. One of the things that I wanted to be able to represent was pitch ambiguity.
In a lot of the world's music, especially what I'm most familiar with, Medieval European music, there's a notion of a neutral pitch, like some B, which might be expressed as B-natural or B-flat, but which one is not specified, and tradition and context will determine which to sing. (Tradition and norms is, for instance, why the default B in England became B-natural, but the default B in Germany became B-flat...)
This is why music21 has the concept of Pitch.accidental is None -- it does not mean "don't show a natural" (that would be Pitch.accidental = Accidental('natural', displayType='never') ). It was intended to means that no accidental (sharp/natural/flat) had been applied to this not at all.
What a laudable goal, representing all this way of thinking about music.
Has anyone ever actually done this with music21 (outside some demos I gave ca. 2008)? No. Probably not. Has everyone who ever worked with music21 ever since had to deal with if p.accidental is None or p.accidental.name = 'natural':... -- yes. And has everyone who works with this just always treated None as meaning natural? Yes, surely.
Proposal
Every Pitch object gets an accidental object attached to it -- natural if not specified -- and .accidental will always refer to an Accidental object.
Is there a cost to this?
You bet. Pitches with naturals will take 50% longer to create than they currently do:
In [42]: %timeit pitch.Pitch('C4')
512 ns ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
In [43]: %timeit pitch.Pitch('C#4')
750 ns ± 1.92 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
this cascades down to Note, as a 17% slowdown:
In [48]: %timeit note.Note('C4')
1.56 μs ± 23.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
In [49]: %timeit note.Note('C#4')
1.83 μs ± 6.06 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
If Accidental had been made immutable like Microtone, then we might be able to get the cost down to near nothing, but instead we can try to make the speed up in other ways.
Like we might stop allowing 'SHARP' instead of 'sharp' or 'FLAT' instead of 'flat' -- save a few ns -- I think that .set() can also be sped up immediately using a one-time created lookup table instead of a bunch of if statements.
Proposal Part 2:
Remove non-standard terminology for half-sharp ~ and half-flat ` -- no one knows what they are and I think better to be explicit ("-half-flat") than obscure.
- 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
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.
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của cuthbertLab/music21
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
cuthbertLab/music21#2084 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
cuthbertLab/music21#2082 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
`TypeError` in `ChordReducer.run()` on multi-part `stream.Score` without instrument `partId`sĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
cuthbertLab/music21#2074 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
cuthbertLab/music21#2055 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Slur bezier-x/y from start element gets overwritten by stop element's valuesCó thể làm lại được @bingliscodes đã nhận 10 ngày trước và không có pull request nào đang mở. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
cuthbertLab/music21#2019 · 3 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của cuthbertLab/music21
Issue tương tự
-
docs: the dev-setup table and AGENTS.md name the reviewed_by guard that CI's Changelog job runsĐang mởarea: tools documentation good first issue ready for a contributor
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 82/100
eyalgolan/statecraft-israel#873 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Add cover art to song rowsĐang mởenhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 5 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
bug good first issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày