MusicXML import drops piano-family MIDI programs when the instrument name isn't recognized
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
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
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de cuthbertLab/music21
-
MusicXML `<transpose>` with `<octave-change>` but no `<diatonic>` raises TypeErrorPosiblemente ocupada @syahra712 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
cuthbertLab/music21#2082 ·
Los mantenedores suelen responder en 1 día
-
`TypeError` in `ChordReducer.run()` on multi-part `stream.Score` without instrument `partId`sAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
cuthbertLab/music21#2074 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
cuthbertLab/music21#2055 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Slur bezier-x/y from start element gets overwritten by stop element's valuesQuizá libre de nuevo @bingliscodes la tomó hace 11 días y no hay ningún pull request abierto. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
cuthbertLab/music21#2019 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
cuthbertLab/music21#1986 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de cuthbertLab/music21
Issues similares
-
bug needs-triage priority:medium
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
yeongseon/azure-functions-logging-python#583 ·
Los mantenedores suelen responder en 1 día
-
documentation needs-triage priority:medium
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
yeongseon/azure-functions-validation-python#546 ·
Los mantenedores suelen responder en 1 día
-
PHP workflow streaming requests buffer the full SSE responsePosiblemente ocupada @Winoren la tomó hoy. Abiertoreview: medium
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
langgenius/dify#44270 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
P4: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
jeffknupp/association#523 ·
-
bug help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
DarkStarSystems/pcons#229 ·
Los mantenedores suelen responder en 1 día