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

MusicXML import drops piano-family MIDI programs when the instrument name isn't recognized

Abierto Apto para principiantes
#2,084 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
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
data

Línea de trabajo

El error está en el manejo de score-part de MeasureParser en musicxml/xmlToM21.py, donde el reemplazo de la familia de piano descarta midiProgram cuando el nombre del instrumento no se reconoce. Ejecuta el script de reproducción del issue para ver que el Instrument tiene midiProgram None en los programas 1 y 2. Se considera terminado cuando los programas 1 y 2 conservan un midiProgram de 0 y 1, y el programa 41 sigue devolviendo Violin con 40. Elige una solución: o reemplazar solo cuando el nombre se reconoce, o copiar i.midiProgram en el reemplazo, y añade una prueba de regresión junto a las pruebas existentes de parsing de MusicXML.

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

Descripción

music21 version

10.5.0

Problem summary

When a part's <midi-program> is one music21 maps to Piano (MusicXML programs 1–6), the importer replaces that instrument with the one made from <instrument-name>. That makes sense when the name is recognized, since exporters often write piano as a default program. But when the name isn't recognized, the replacement is a plain Instrument with no midiProgram, so the program is lost. Other programs are kept.

Steps to reproduce

from music21 import converter, instrument

def score(midi_program):
    return f'''<score-partwise version="4.0">
  <part-list><score-part id="P1"><part-name>Music</part-name>
    <score-instrument id="P1-I1"><instrument-name>Doubler</instrument-name></score-instrument>
    <midi-instrument id="P1-I1"><midi-program>{midi_program}</midi-program></midi-instrument>
  </score-part></part-list>
  <part id="P1"><measure number="1">
    <attributes><divisions>1</divisions></attributes>
    <note><pitch><step>C</step><octave>4</octave></pitch><duration>4</duration><type>whole</type></note>
  </measure></part>
</score-partwise>'''

for midi_program in (41, 1, 2):
    parsed = converter.parse(score(midi_program), format='musicxml')
    print(midi_program, [(type(i).__name__, i.midiProgram)
                         for i in parsed.recurse().getElementsByClass(instrument.Instrument)])

Expected vs. actual behavior

Expected a midiProgram of 40, 0 and 1. Actual:

41 [('Violin', 40)]
1 [('Instrument', None)]
2 [('Instrument', None)]

More information

The replacement is in MeasureParser's score-part handling (musicxml/xmlToM21.py):

# 2. midiProgram is Piano (often this is encoded only as piano for convenience)
if inst_from_name.midiProgram == i.midiProgram or isinstance(i, instrument.Piano):
    i = inst_from_name

This isn't asking to remove the piano rule, only to not lose the program when the name doesn't give an instrument, for example by only replacing when the name was recognized, or by keeping i.midiProgram on the replacement.

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.