MusicXML import ignores jumps written as `<sound>` attributes
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 28/100
Direzione di ricerca
Start with SoundTagMixin.setSound in musicxml/xmlSoundParser.py, which handles only tempo and has TODOs for dacapo, dalsegno, tocoda, fine, segno and coda, then check how the <words> repeat expressions are created in the MusicXML importer. Run the reproduction script in the issue and confirm the expanded note list includes the second D E pass. Done means a <sound dalsegno> jump is honoured without matching text, and the design question of how multiple <sound> tags map to one jump expression is settled first.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
music21 version
10.5.0
Problem summary
The MusicXML importer only creates repeat expressions (Segno, Coda, DalSegnoAlCoda, ...) from the text of <words> directions. It ignores the dacapo, dalsegno, tocoda, fine, segno and coda attributes of <sound>, which are how MusicXML encodes jumps for playback. So when the <words> text isn't one of the recognized phrases, or there's no text, expandRepeats() skips the jump even though the <sound> says exactly what it is.
Steps to reproduce
from music21 import converter
def measure(number, step, before="", after=""):
return (f'<measure number="{number}">{before}<note><pitch><step>{step}</step>'
f'<octave>4</octave></pitch><duration>4</duration><type>whole</type></note>{after}</measure>')
xml = f'''<score-partwise version="4.0">
<part-list><score-part id="P1"><part-name>Music</part-name></score-part></part-list>
<part id="P1">
{measure(1, "C", "<attributes><divisions>1</divisions></attributes>")}
{measure(2, "D", '<direction><direction-type><segno/></direction-type><sound segno="segno"/></direction>')}
{measure(3, "E", after='<direction><direction-type><words>To Coda</words></direction-type><sound tocoda="coda"/></direction>')}
{measure(4, "F", after='<direction><direction-type><words>Repeat from sign, then go to the coda</words></direction-type><sound dalsegno="segno"/></direction>')}
{measure(5, "G", '<direction><direction-type><coda/></direction-type><sound coda="coda"/></direction>')}
</part>
</score-partwise>'''
expanded = converter.parse(xml, format='musicxml').expandRepeats()
print([n.name for n in expanded.flatten().notes])
Expected vs. actual behavior
Expected ['C', 'D', 'E', 'F', 'D', 'E', 'G'], from the dalsegno attribute. Actual:
['C', 'D', 'E', 'F', 'G']
With <words>D.S. al Coda</words> the jump is taken, so this only affects jumps whose text isn't a recognized phrase.
More information
SoundTagMixin.setSound in musicxml/xmlSoundParser.py only handles tempo, and has TODOs for coda, dacapo, dalsegno, fine, segno and tocoda.
A suggestion for how the two sources could combine: if only one of <words> and <sound> gives a jump, use it; if both do and they disagree, prefer <sound>, since it's the playback encoding, and maybe warn.
One complication: music21 represents a jump as a single expression, like DalSegnoAlCoda, but MusicXML spreads it over several <sound>s: dalsegno at the jump, tocoda at the "To Coda", and fine at the Fine. So a <sound dalsegno> on its own only says "D.S.", and telling whether it's "al Coda" or "al Fine" means looking for tocoda or fine elsewhere in the part. For the same reason, <words>D.S. al Coda</words> with <sound dalsegno="segno"/> isn't a disagreement, just a more specific description.
- Lingua principale
- Python
- Stelle
- 2.6k
- Fork
- 459
- Merge medio
- 1g 7h
- PR unite (30g)
- 40
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di cuthbertLab/music21
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
cuthbertLab/music21#2084 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
cuthbertLab/music21#2082 ·
I maintainer di solito rispondono entro 1 giorno
-
`TypeError` in `ChordReducer.run()` on multi-part `stream.Score` without instrument `partId`sAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
cuthbertLab/music21#2074 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
cuthbertLab/music21#2055 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Slur bezier-x/y from start element gets overwritten by stop element's valuesForse di nuovo libera @bingliscodes l’ha presa 9 giorni fa e non c’è nessuna pull request aperta. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
cuthbertLab/music21#2019 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di cuthbertLab/music21
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
aws-samples/sample-per-model-bedrock#261 ·
I maintainer di solito rispondono entro 1 giorno
-
[UI/Accessibility] Low contrast text visibility in country selection dropdown on settings pageAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
pwncollege/dojo#1188 ·
I maintainer di solito rispondono entro 1 giorno
-
bug launcher packaging
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
tenstorrent/tt-studio#1426 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
python-attrs/cattrs#796 ·
I maintainer di solito rispondono entro 1 giorno