Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#2,081 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
Medio día
Aptitud para principiantes
62/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
data

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Python
Estrellas
2.6k
Forks
459
Merge medio
1 d 7 h
PR fusionados (30 d)
40

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de cuthbertLab/music21

Todos los issues de cuthbertLab/music21

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.