MusicXML `<transpose>` with `<octave-change>` but no `<diatonic>` raises TypeError
メンテナーはふだん 1 日以内に返信
関連するプルリクエストがすでにマージされています。
- #2086 @syahra712 による — マージ済み
評価
調査の方向性
クラッシュの原因は musicxml/xmlToM21.py の MeasureParser.xmlTransposeToInterval にあります。オクターブ変更の分岐で、diatonicStep が None の場合でも加算してしまっています。まず issue の再現スニペットを実行して TypeError を確認し、その分岐の後のコードを読んで、欠落した diatonicStep がすでにどのように扱われているかを確認してください。スニペットが正常にパースでき、パートが記譜より1オクターブ低く鳴ること、そしてオクターブのみの移調をカバーする既存または新規のテストがあれば完了です。
索引モデルが issue の本文から書いたものです。
説明
music21 version
10.5.0
Problem summary
<diatonic> is optional in <transpose>, and the importer handles it being missing, except when there's also an <octave-change>. Then it adds the octave to a None diatonic step and raises. An octave-only <transpose> is how guitar and bass parts are written, and some exporters leave out <diatonic> when it's 0.
Steps to reproduce
from music21 import converter
xml = '''<score-partwise version="4.0">
<part-list><score-part id="P1"><part-name>Music</part-name></score-part></part-list>
<part id="P1"><measure number="1">
<attributes>
<divisions>1</divisions>
<transpose><chromatic>0</chromatic><octave-change>-1</octave-change></transpose>
</attributes>
<note><pitch><step>C</step><octave>5</octave></pitch><duration>4</duration><type>whole</type></note>
</measure></part>
</score-partwise>'''
converter.parse(xml, format='musicxml')
Expected vs. actual behavior
Expected a part that sounds an octave lower than written. Actual:
TypeError: unsupported operand type(s) for +=: 'NoneType' and 'int'
More information
In MeasureParser.xmlTransposeToInterval (musicxml/xmlToM21.py):
if mxOctaveChange is not None:
octaveChange = int(mxOctaveChange.text) * 12
diatonicStep += 7 * int(mxOctaveChange.text)
Only adding to diatonicStep when it isn't None should be enough, since the code after this already handles a missing diatonic step.
- 主要言語
- Python
- スター
- 2.6k
- フォーク
- 459
- 平均マージ
- 12時間 54分
- マージ済み PR(30日)
- 45
環境構築
このプロジェクトの開発コンテナを、あなたの 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 · コメント 2 件 ·
メンテナーはふだん 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 が 19 日前に担当しましたが、オープン中のプルリクエストはありません。 オープン
難易度 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
-
The changelog workflow excludes otelbot but not dependabot, so every Dependabot pull request fails the changelog check対応中かも @ocelotl が今日担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
open-telemetry/opentelemetry-python#5825 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
cuga-project/cuga-agent#1020 ·
メンテナーはふだん 2 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 70/100
microsoft/playwright#43640 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
stac-utils/stac-fastapi-elasticsearch-opensearch#965 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信