Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

toSoundingPitch() transposes key signatures by the MIDI program's instrument instead of the part's `<transpose>`

Aperta
#2,081 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
Mezza giornata
Idoneità per principianti
62/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
data

Direzione di ricerca

Start by running the reproduction script in the issue: it parses a MusicXML clarinet-in-A part with and without <midi-program> 72 and calls toSoundingPitch(). The note comes out right, but the key signature only goes wrong when the program is 72, so the bug is in how the importer assigns a Clarinet instrument and how its default transposition is applied to the key. Done means the sounding key has 3 sharps in both cases, matching A major, and the <transpose> value is used consistently.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

music21 version

10.5.0

Problem summary

For a clarinet in A written in C, toSoundingPitch() moves the notes down a minor third, following the part's <transpose>, but it moves the key signature down a major second. When the part's <midi-program> is 72 (clarinet), the importer makes the part's instrument a Clarinet, whose default transposition is that of a B♭ clarinet, and the key signature follows that instead. So the sounding notes are in A major, but the sounding key signature is G major.

Steps to reproduce

from music21 import converter, key

def clarinet_in_a(midi_program):
    midi = f'<midi-instrument id="P1-I1"><midi-program>{midi_program}</midi-program></midi-instrument>' if midi_program else ''
    return f'''<score-partwise version="4.0">
  <part-list><score-part id="P1"><part-name>Clarinet in A</part-name>
    <score-instrument id="P1-I1"><instrument-name>Clarinet</instrument-name></score-instrument>{midi}
  </score-part></part-list>
  <part id="P1"><measure number="1">
    <attributes>
      <divisions>1</divisions>
      <key><fifths>0</fifths></key>
      <transpose><diatonic>-2</diatonic><chromatic>-3</chromatic></transpose>
    </attributes>
    <note><pitch><step>C</step><octave>5</octave></pitch><duration>4</duration><type>whole</type></note>
  </measure></part>
</score-partwise>'''

for midi_program in (72, None):
    sounding = converter.parse(clarinet_in_a(midi_program), format='musicxml').toSoundingPitch()
    print(midi_program,
          sounding.flatten().notes[0].nameWithOctave,
          [k.sharps for k in sounding.flatten().getElementsByClass(key.KeySignature)],
          sounding.parts[0].getInstrument().transposition.directedName)

Expected vs. actual behavior

Expected the note A4 and a key signature with 3 sharps both times. Actual:

72 A4 [1] M-2
None A4 [3] m-3

Without the <midi-program>, the part's instrument takes its transposition from <transpose> (minor third down), and the key signature is correct. With program 72, the importer makes a Clarinet with the B♭ clarinet's default transposition (major second down), and that seems to take priority over <transpose> for the key signature, though not for the notes.

Lingua principale
Python
Stelle
2.6k
Fork
459
Merge medio
1g 7h
PR unite (30g)
40

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di cuthbertLab/music21

Tutte le issue di cuthbertLab/music21

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.