Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

MusicXML import ignores `<sound tempo>` when the direction also has a `<metronome>`

オープン
#2,080 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
半日
初心者へのやさしさ
52/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
data

調査の方向性

Start in MeasureParser.xmlDirection, where a direction's sound is only passed to setSound when no metronome was already created. Run the reproduction script and check what numberSounding holds for the sound tempo="90" case. Done when that case yields (60, 90) and matching tempos don't add a redundant numberSounding. Comparing against getQuarterBPM() is the approach the issue suggests.

索引モデルが issue の本文から書いたものです。

説明

music21 version

10.5.0

Problem summary

When a <direction> has both a <metronome> and a <sound tempo>, the importer creates the MetronomeMark from the <metronome> and skips the <sound>. Usually the two agree, but they can differ: the metronome mark is what's printed, and <sound tempo> is the tempo for playback, for example a printed "♩ = 60" played at 90.

Steps to reproduce

from music21 import converter, tempo

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></attributes>
    <direction>
      <direction-type>
        <metronome><beat-unit>quarter</beat-unit><per-minute>60</per-minute></metronome>
      </direction-type>
      <sound tempo="90"/>
    </direction>
    <note><pitch><step>C</step><octave>4</octave></pitch><duration>4</duration><type>whole</type></note>
  </measure></part>
</score-partwise>'''

marks = converter.parse(xml, format='musicxml').flatten().getElementsByClass(tempo.MetronomeMark)
print([(mark.number, mark.numberSounding) for mark in marks])

Expected vs. actual behavior

Expected [(60, 90)], with the printed tempo as number and the playback tempo as numberSounding. Actual:

[(60, None)]

The 90 is lost.

More information

MeasureParser.xmlDirection only passes a direction's <sound> on to setSound if the direction didn't already have a <metronome>, to avoid making two MetronomeMarks.

<sound tempo> is always in quarter notes per minute, while <metronome> uses its own beat unit, so a dotted quarter = 60 with <sound tempo="90"/> agrees. A comparison would need to go through getQuarterBPM(), and numberSounding only needs setting when they really differ.

This matters most when <per-minute> isn't a plain number. It holds text, and scores often write "c. 60" or "60-72". Then the MetronomeMark has no number, even when exporters write the tempo in <sound tempo="60"/> right next to it:

<per-minute>c. 60</per-minute> with <sound tempo="60"/>  →  number None, getQuarterBPM() None

Reading <sound tempo> would give these marks a usable tempo.

主要言語
Python
スター
2.6k
フォーク
459
平均マージ
1日 7時間
マージ済み PR(30日)
40

環境構築

Codespaces で開く

このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

cuthbertLab/music21 のほかの issue

cuthbertLab/music21 の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。