axelberndt / MPM

Music Performance Markup (MPM)
Other
19 stars 2 forks source link

Arpeggiation #55

Closed pfefferniels closed 2 years ago

pfefferniels commented 3 years ago

Is there already any feature planned allowing to describe arpeggiation? Especially for the earlier performance practises this is a crucial aspect – and the existing concepts don't seem to suit very well here (asynchrony?) ...

As far as I can see, it should be possible to describe: relative position (before the beat by n milliseconds, on the beat etc.) its extent (duration), its direction (upwards, downwards) and its shape (linear, curved in some way – possibly using the same model also used for rubato?). I would be willing to contribute to conception and implementation of such a feature.

axelberndt commented 3 years ago

Very interesting suggestion! I added it to the wish list in the Wiki.

You are right, asynchrony is not suited for this feature as it shifts the whole part instead of just some note onsets.

There is already a rather fiddly way to create arpeggiations via articulation using @absoluteDelay or @absoluteDelayMs. The latter, i.e. the milliseconds modifier @absoluteDelayMs, will shift only the note's onset, not its offset! Hence, no need to adjust the duration. Using it would look like this:

<articulationMap>
  <articulation date="23450.0" noteid="note1" absoluteDelayMs="-80"/>
  <articulation date="23450.0" noteid="note2" absoluteDelayMs="-60"/>
  <articulation date="23450.0" noteid="note3" absoluteDelayMs="-40"/>
  <articulation date="23450.0" noteid="note4" absoluteDelayMs="-20"/>
</articulationMap>

Anyway, there should certainly be a more dedicated way of expressing this kind of feature. Your help with this is very welcome. To start with the conception,

What are your thoughts on this?

pfefferniels commented 3 years ago

To my knowledge there is hardly any theoretical literature – as far as I can tell, the most interesting paper is this: Bruno H. Repp, Some Observations on Pianists' Timing of Arpeggiated Chords (1997).

On a first reading, the central conclusions are probably:

For a historical overview Neal Peres da Costas Off the record might be interesting, especially the chapter "Unwritten Arpeggiation".

Is it thinkable that this feature does not only shift the note onsets but also its offsets, e.g. when the hand "rolls" over the keyboard?

Yes – the beginning of C.P.E. Bachs Württemberg sonata A minor for example is usually performed like that in the right hand (e.g. here). At the moment I don't know about theoretical descriptions of this phenomenon.

I assume that the last note in an arpeggio is not necessarily on-beat. The arpeggio might even start on-beat. Or it starts before and ends after.

Yes, that's exactly what I meant – sorry for being unclear :)

The dynamic effect you mention is documented both historically (Lebert and Faisst 1871: "these arpeggios should be simultaneously begun and ended with both hands and should increase in strength from the lowest to the highest tone in each hand, so that the highest tone only attains the power indicated through the signs sf, mf, (afterwards f)", cf. da Costa) as well as empirically (Repp: "… virtually all arpeggios showed a crescendo in the right hand towards the final melody note which – not surprisingly – was played most forcefully.", p. 145)

Can you think of further playing techniques that follow a similar logic and can be treated by the same mechanism?

Glissando and portamento share the character of stretching out a single event in time, so that it gets a duration, a relative position to the beat and its own dynamic (and temporal) shape …

axelberndt commented 3 years ago

Here are some points we talked about regarding the theorization behind arpeggiations.

pfefferniels commented 3 years ago

Just for clarification: can an arpeggio, that is temporally strongly extended (e.g. with an absoluteDurationMs modifier), delay all the following events? Or do we consider that to be a local tempo change?

axelberndt commented 3 years ago

Some results from literature review

Statements from previous posts wil not be repeated.

Naming

Continuously performed, rhythmically quantised arpeggios (those that we do not model here)

Oneshot arpeggio/unmetered arpeggiation (the one we want to model here)

Broken chords can be executed with basically four characteristics: up, down, in and out. If we use a list of note IDs to indicate which notes are affected by the arpeggio, we can use the sequence or indicate it with a number to specify the characteristic. If the arpeggio is not associated to specific note IDs it is applied to all notes at the time and in the part, but only with characteristics up and down.

What happens with the preceding note? For a monophonic instrument it must be shortened by the amount of negative delay that the arpeggio introduces. Polyphonic instruments do not have this restriction. We leave it up to the editor to decide this and adapt the preceding note via articulation.

The speed of a broken chord can be absolute (in milliseconds) or tempo dependent (in ticks). In the latter case we can use the tempo and rubato models to refine its timing and, for instance, describe a performer "going out of tempo". However, this might not be sufficient enough. We'll have to see if we can find a more integrated timing distortion aproach that interacts friendly with the tempo and rubato models. Do you have sound examples?

axelberndt commented 2 years ago

Here is a bit of target code for the arpeggio integration we want to add to MPM.

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="https://github.com/axelberndt/MPM/releases/latest/download/mpm.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="https://github.com/axelberndt/MPM/releases/latest/download/mpm.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<mpm xmlns="http://www.cemfi.de/mpm/ns/1.0">
    <performance name="a performance" pulsesPerQuarter="720">
        <global>
            <header>
                <ornamentationStyles>
                    <styleDef name="Stylename">
                        <!-- an ornament is a series of transformers -->
                        <ornamentDef name="arpeggio">

                            <!-- the temporalSpread transformer offsets all elements at a given time by a certain amount defined by a power function; the frame attributes are either symbolic or physical but not both (e.g. frame.start OR milliseconds.frame.start) -->
                            <temporalSpread frame.start="-100.0" frame.end="100.0"
                                    milliseconds.frame.start="-200.0" milliseconds.frame.end="200.0"
                                    intensity="1.4"
                                    noteoff.shift="true|false|monophonic"/>

                            <!-- the dynamicsGradient transformer applies relative dynamics deviations to the list of notes affected; the sequence of the list determines the relative position in the linear dynamics function -->
                            <dynamicsGradient transition.from="-1.0" transition.to="1.0"/>
                        </ornamentDef>
                    </styleDef>
                </ornamentationStyles>
            </header>

            <dated>
                <ornamentationMap>
                    <style date="0.0" name.ref="Stylename"/>

                    <!-- apply an arpeggio to all notes (listed lowest to highest pitch) at date 0.0 -->
                    <!-- scale is for the dynamics gradient and might be optional with default value 0.0 -->
                    <!-- Direction sets the sequence of notes ordered by in-/decreasing pitch; default is up. What if there are multiple notes with the same pitch? -->
                    <ornament date="0.0" name.ref="arpeggio" scale="20.0" note.order="ascending pitch|descending pitch"/>

                    <!-- apply an arpeggio to the notes listed and in the sequence of the list -->
                    <!-- direction="up" (default) follows the list in the specified sequence; direction="down" follows the list in reverse sequence -->
                    <ornament date="720.0" name.ref="arpeggio" scale="20.0" noteids="id1 id3 id2 id4"/>

                    <!-- Element ornament should be member of model.ornamentDefContent. Needs further consideration. -->
                    <!-- How about grouping of elements? Maybe with brackets in the noteids list (id1 id2) (id3 id4).  -->
                    <!-- If the ornament does not edit but replace the original notes, can I repeat it for a number of times over the ornament time frame? With this I could make an arpeggio into a tremolo only by repeating it. -->
                </ornamentationMap>
            </dated>
        </global>
    </performance>
</mpm>
axelberndt commented 2 years ago

As of MPM v2.1.3 arpeggios are part of the ornamentation package.

axelberndt commented 1 year ago

This MPM update is by now fully integrated in the API (meico) and MPM Toolbox.