Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

note without stem? #375

Closed
craigsapp opened this issue Dec 2, 2016 · 66 comments
Closed

note without stem? #375

craigsapp opened this issue Dec 2, 2016 · 66 comments

Comments

@craigsapp
Copy link
Contributor

craigsapp commented Dec 2, 2016

Is there a way to draw a note without a stem, such as a quarter note?

I don't see how to do this in the MEI guidlines. The only values for @stem.dir are up and down, so maybe the information can be put there. There is also a @stem.len. And verovio does not process that attribute yet anyway.

Another idea is: there is a @head.visible, so a @stem.visible would be a nice parallel to add to the MEI spec to hide stems for note elements.

@donbyrd
Copy link
Contributor

donbyrd commented Dec 2, 2016

I'm curious about why you want to do this.

@craigsapp
Copy link
Contributor Author

Specifically it is for a student doing an independent study project with me where he is loading MIDI data and displaying it as notation. Since MIDI does not always use a quantized score-based organization, he only wants to display the pitches and not the rhythms. So he would like to display as a headless black note, which does not otherwise imply a duration.

A secondary application would be to notate a music examples such as this:

screen shot 2016-12-01 at 19 01 29

This is a Schoenberg piece sample, showing the tonerow underneath. This example is similar to the first case in that the noteheads are black stemless notes, implying that they have no rhythm (From SCORE notation homework for Music 253 at Stanford: http://wiki.ccarh.org/wiki/SCORE_parameter_exercises#Example_9)

Related to this, @lpugin: why are note elements with no @dur displayed as breves in verovio? One thought would be to have them as stemless black noteheads, although I find breves useful when debugging, since they are easy to see.

Also, dropping the @oct puts notes very low, and dropping the @pname sets the pitch to F? The last one is the most dangerous because it implies that the default pitch of a note is "F". Is there an "x" notehead shape in verovio yet? That would be better than displaying the last F in this example as a regular notehead, since it would imply something funny about the @pname in the MEI data.

screen shot 2016-12-01 at 19 10 47

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="http://music-encoding.org/schema/3.0.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="http://music-encoding.org/schema/3.0.0/mei-all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="3.0.0">
    <meiHead>
        <fileDesc>
            <titleStmt>
                <title />
            </titleStmt>
            <pubStmt>
                <date>2016-12-01 19:07:08</date>
            </pubStmt>
        </fileDesc>
        <encodingDesc>
            <projectDesc>
                <p>Transcoded from Humdrum with Verovio version 0.9.13-dev-bf3f7d9</p>
            </projectDesc>
        </encodingDesc>
    </meiHead>
    <music>
        <body>
            <mdiv>
                <score>
                    <scoreDef xml:id="scoredef-0000000741884229">
                        <staffGrp xml:id="m-0000000757845173">
                            <staffDef xml:id="staffdef-0000000541800855" clef.shape="G" clef.line="2" meter.count="3" meter.unit="4" n="1" lines="5" />
                        </staffGrp>
                    </scoreDef>
                    <section xml:id="section-0000001050666048">
                        <measure xml:id="measure-L4" n="1" right="end">
                            <staff xml:id="staff-L4F1" n="1">
                                <layer xml:id="layer-L4F1" n="1">
                                    <note xml:id="note-L5F1" oct="4" pname="c" accid.ges="n" />
                                    <note xml:id="note-L6F1" dur="4" pname="c" accid.ges="n" />
                                    <note xml:id="note-L7F1" dur="4" oct="4" accid.ges="n" />
                                </layer>
                            </staff>
                        </measure>
                    </section>
                </score>
            </mdiv>
        </body>
    </music>
</mei>

@craigsapp
Copy link
Contributor Author

Also, for a real composition exemplar, here is a composition by Don Knuth:

http://www-cs-faculty.stanford.edu/~knuth/fant.html

In Chapter 16, mm 107-108, he writes stemless black notes as a form of glissando (again the black noteheads imply a non-specific duration):

http://www-cs-faculty.stanford.edu/~knuth/ch16%20-%202016-11-19.pdf

screen shot 2016-12-01 at 19 22 40

And in the following two measures with a similar variant:

screen shot 2016-12-01 at 19 23 04

@rettinghaus
Copy link
Contributor

Verovio supports @stem.len="0" for ommitting stems, like in here: 02d630e

@craigsapp
Copy link
Contributor Author

Great! I will have to update my version (I presume this is in the develop branch?).

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

Yes. You can also use @dur.ges with it when the gestural duration is not a quarter note.

@lpugin lpugin closed this as completed Dec 2, 2016
@donbyrd
Copy link
Contributor

donbyrd commented Dec 2, 2016

Nightingale allows specifying a note's logical duration as "unknown", in which case it displays a solid notehead without a stem. Doesn't MEI have something like that? It strikes me that this is what's really needed; saying a note is a quarter note with stem length = 0 doesn't capture Knuth's intent, or the meaning of the tone row.

@rettinghaus
Copy link
Contributor

Yes! I think in a few cases the MEI Guidelines will have to state definitely what to expect to see when rendered. So when a <note> doesn't carry a duration, this is what I expect, I guess: a simple note head that looks like a quater without a stem.

@kepper
Copy link
Contributor

kepper commented Dec 2, 2016

What about encoding it like this? <note head.shape="quarter"/>? If all you want to say that there is a note, and it has a certain head, I believe this is sufficient and appropriate. I definitely prefer it over a default duration of a quarter (and that's a risk I see – when people learn that they get the same result no matter if they add @dur="4" or not, we may end up with pretty weird stuff… If we follow the @head.shape proposal, Verovio will complain when neither duration nor headshape is specified – and I believe this is a good thing… 

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

This means that a note with a @head.shape has no stem?

@kepper
Copy link
Contributor

kepper commented Dec 2, 2016

Well, MEI lacks a way to explicitly state that there is no stem (afaik). My interpretation of this situation always was that if I don't have a duration to decide what I need (which head, a stem, how many flags…), I have to rely on @head.shape and, when applicable, @stem.dir (as the simplest of all stem-related attributes). The absence of @stem.dir (or any other information about the stem) then means that there simply is no stem. Not a very clear siutation, but that's how I explained the world to myself. Maybe @pe-ro can shed more light on this?

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

Yes, this was the problem when I decide to implement this.

@donbyrd : how do you align notes with unknown durations in Nightingale? (e.g., the Schoenberg example)

@pe-ro
Copy link

pe-ro commented Dec 2, 2016

This means that a note with a @head.shape has no stem?

Not exactly.

MEI lacks a way to explicitly state that there is no stem (afaik).

Also, not exactly.

MEI has a way to explicitly state that the stem length is 0, which is nearly the same thing. :-)

But, Jo and Don are right to say that when a note cannot be said to be a "real" quarter note, then marking it as <note dur="4" stem.len="0"/> isn't meaningful. It would be better to say that the note has no duration (as in the Knuth example) using <note head.shape="quarter" stem.len="0"/>. That is, one slips from encoding the "logical" sense of the note into describing its visual qualities. In the case of <note head.shape="quarter"/> (that is, no statement is made about the note's duration or stem), then a zero-length stem seems appropriate. Since the duration is indeterminate/unknown, the renderer must decide what to do based on @dur.ges or its own default behavior. Of course, it this point we're out of the realm in which these things can be enforced by the schema -- they have to be dealt with via Schematron or simply by convention.

But it's not completely accurate to say that a note with @head.shape has no stem -- it depends on the presence of "logical" info. In the case <note dur="4" head.shape="+"/> the head.shape attribute carries data that supplements the duration information. The lack of a statement about the stem doesn't mean there's no stem. Here a stem is implied based on the usual behavior of quarter notes.

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

This makes sense. Then I think I would expect @dur.ges to be given if no @dur is provided, which follows the idea that the gestural domain needs to be provided when it is different from the visual one.

@lpugin lpugin reopened this Dec 2, 2016
@kepper
Copy link
Contributor

kepper commented Dec 2, 2016

it depends on the presence of "logical" info.

That's what I failed to say with "if I don't have a duration". Of course, when @dur is present, it should be considered. However, I'm not sure if one can always expect @dur.ges if @dur isn't there. The whole point of the tone row (for instance) is that these notes don't have the quality of a duration – and they don't need one. I see the problem of aligning them, and, if that is requested, I think it's fair to expect @dur.ges in that case. If, however, the sole purpose is to render pitch information using familiar symbols (i.e. notes), I guess these notes could live without a duration, which is meaningless for them. In order to render that, I'd just put them on some kind of raster, no matter "how long they look". If one wanted them to be spaced according to their notehead, he could provide a duration either through @dur or @dur.ges… 

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

However, I'm not sure if one can always expect @dur.ges if @Dur isn't there.

I assume we agree we need a value for aligning them when displaying / playing. And since we do not want to have default values, then we leave this up to the tools. We can do this in Verovio but I think I would prefer it not to be able to render this because something is missing.

@kepper
Copy link
Contributor

kepper commented Dec 2, 2016

I totally agree. I only wanted to point out that there's a difference between a tone row (which has no alignment, but is just a row of tones) and the Knuth examples above… But I'm flexible ;-)

@donbyrd
Copy link
Contributor

donbyrd commented Dec 2, 2016

To answer your question, @lpugin, I don't remember how Nightingale aligns unknown durations, and a quick look at the code didn't help.

@lpugin
Copy link
Contributor

lpugin commented Dec 2, 2016

So mes 107 of Knuth's example would be something like this?

<measure n="107">
    <staff n="1">
        <layer n="1">
            <tuplet numbase="1" num="3" bracket.visible="false" num.visible="false">
                <note dur.ges="4" oct="4" pname="c" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="d" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="e" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="f" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="g" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="a" head.shape="quarter"/>
                <note dur.ges="4" oct="4" pname="b" head.shape="quarter"/>
                <note dur.ges="4" oct="5" pname="c" head.shape="quarter"/>
                <note dur.ges="4" oct="5" pname="d" head.shape="quarter"/>
                <note dur.ges="4" oct="5" pname="e" head.shape="quarter"/>
                <note dur.ges="4" oct="5" pname="f" head.shape="quarter"/>
                <note dur.ges="4" oct="5" pname="g" head.shape="quarter"/>
            </tuplet>
        </layer>
    </staff>
    <staff n="2">
        <layer n="1">
            <rest dur="4"/>
            <chord dur="4" tie="i">
                <note oct="3" pname="c"/>
                <note oct="2" pname="c"/>
            </chord>
            <chord dur="2" tie="t">
                <note oct="3" pname="c"/>
                <note oct="2" pname="c"/>
            </chord>
        </layer>
    </staff>
</measure>

@craigsapp
Copy link
Contributor Author

It might be good for the @dur.ges values to sum up to the duration of the whole measure since the rest of the measures surrounding these are metrical.

This could also be thought of as the visual duration which is distinct from the performance duration since this duration value would be needed to do automatic layout of the notes horizontally on the staff. The guidelines seem to indicate that ".ges" is related to performance. For example "accid.ges" is the performed or sounding accidental, and @dur.get likewise. From the element documentaion for <note>:

@dur.ges (optional) Records performed duration information that differs from the written duration. Its value may be expressed in several forms; that is, ppq (MIDI clicks and MusicXML 'divisions'), Humdrum **recip values, beats, seconds, or mensural duration values. Value conforms to data.DURATION.gestural . att.duration.performed

Perhaps a good idea would be to wrap these notes in something similar to a beam, tuplet, or chord group. The container element would be assigned a @dur indicating the total duration of the non-durational notes inside of it. Then for layout, the default assumption is that they are all equally splitting the @dur of the container unless otherwise spelled out with @dur.ges. The important thing is that the external container is aligned with the other staff, but internally the layout is independent (although the longest independent component would stretch the layout for the shorter components). This would probably be a useful feature for modern repertories.

For example in the Schoenberg example:
screen shot 2016-12-01 at 19 01 29

I set the duration of each tonerow note to "4", except for the E5 at then end of P-0, which was set to "2". This added a half-note space to increase the distance between the prime and retrograde inversion forms. In SCORE, I then applied layout to the bottom staff independently from the top two staves. In a system such as verovio, giving a container for the tone row notes with the duration of "2m" (two measures) would allow similar functionality. The container would have the duration of a breve which would align with the upper staff, then internally in the container, the @dur.ges values of "4" and "2" would allow for the nearly even spacing except for the gap between the two tone rows.


How would @head.shape determine that there is no stem? In other words, supposed that I want a quarter note to have the shape of an "X". I would want the notehead to look like an "X", but keep the stem (attached to one of the corners of the "X").

Would lack of @dur cause the lack of stem?

So this would be stemless:

                <note dur.ges="4" oct="5" pname="g" head.shape="quarter"/>

But this would not:

                <note dur="2" oct="5" pname="g" head.shape="quarter"/>

How should dur="4" dots="1" be represented as @dur.ges, as there is no @dots.ges?

@dur.ges can be expressed in Humdrum **recip values, which represent the fraction of a whole note the duration represents (plus augmentation dots), so dur="4" dots="1" could be expressed as dur.ges="4.r". An alternate extended **recip representation would be dur.ges="8%3r" which means that a dotted quarter notes is equal to 3/8th of a whole note (this is more for cases such as dur.ges="3%2" meaning 2/3rds of a whole note, i.e., a triplet whole-note.

@pe-ro
Copy link

pe-ro commented Dec 2, 2016

<note> is also a member of att.xy, so absolute page-placement values; that is, @x and @y attributes, could be used if @dur.ges is missing. This might not work so well for automated layout, however.

We have yet to add a method of specifying offsets from some other object.

@craigsapp
Copy link
Contributor Author

is also a member of att.xy, so absolute page-placement values; that is, @x and @y attributes, could be used if @dur.ges is missing. This might not work so well for automated layout, however.

That is what I was thinking, although att.xy would be handy for conversions from SCORE to MEI which preserve the original layout spacing.

@lpugin
Copy link
Contributor

lpugin commented Dec 3, 2016

@craigsapp : the Schoenberg example mixes two different issues. That is aligning stem/duration less notes within a measure and aligning measured and un-measured staves. We should look at the later one separately.

Using att.xy whould indeed not be helpful for automatic layout. This idea of a duration container is what a tuplet does. Alternatively, we could have @num and @numbase directly on each note.

I see your point with the problem of using @dur.ges for actually specifying visual layout, so this leaves me unconvinced with the idea that a note without @dur is assumed to be stemless. Using @stem.len="0" is actually in that sense much clearer and unambiguous, but maybe we can have another attribute of directly directly specifying that there is no stem (@stemless?)

Another idea which is maybe a good way to avoid many issues is to use @tstamp. It is available on note and could actually do the trick. What about this? I would still have an unambiguous way to encode the presence or the absence of a stem because we can very well imagine using @tstamp on notes with stems, and having both @dur and @tstamp would create contradictions.

@lpugin
Copy link
Contributor

lpugin commented Dec 5, 2016

Something like this

<measure n="107">
    <staff n="1">
        <layer n="1">
            <note tstamp="1.0" stemless="true" oct="4" pname="c" head.shape="quarter"/>
            <note tstamp="1.33" stemless="true" oct="4" pname="d" head.shape="quarter"/>
            <note tstamp="1.67" stemless="true" oct="4" pname="e" head.shape="quarter"/>
            <note tstamp="2.0" stemless="true" oct="4" pname="f" head.shape="quarter"/>
            <note tstamp="2.33" stemless="true" oct="4" pname="g" head.shape="quarter"/>
            <note tstamp="2.67" stemless="true" oct="4" pname="a" head.shape="quarter"/>
            <note tstamp="3.0" stemless="true" oct="4" pname="b" head.shape="quarter"/>
            <note tstamp="3.33" stemless="true" oct="5" pname="c" head.shape="quarter"/>
            <note tstamp="3.67" stemless="true" oct="5" pname="d" head.shape="quarter"/>
            <note tstamp="4.0" stemless="true" oct="5" pname="e" head.shape="quarter"/>
            <note tstamp="4.33" stemless="true" oct="5" pname="f" head.shape="quarter"/>
            <note tstamp="4.67" stemless="true" oct="5" pname="g" head.shape="quarter"/>
        </layer>
    </staff>
    <staff n="2">
        <layer n="1">
            <rest dur="4"/>
            <chord dur="4" tie="i">
                <note oct="3" pname="c"/>
                <note oct="2" pname="c"/>
            </chord>
            <chord dur="2" tie="t">
                <note oct="3" pname="c"/>
                <note oct="2" pname="c"/>
            </chord>
        </layer>
    </staff>
</measure>

@pe-ro
Copy link

pe-ro commented Dec 5, 2016

@lpugin: Isn't @stemless just a different syntax for @stem.len="0"?

I like the idea of <tuplet> as a "container with a duration". For the Schoenberg example, the lower staff could be encoded as 12 stemless quarter notes in the time of 1 whole note. This skirts around the issue of duration for each of the quarter notes.

@lpugin
Copy link
Contributor

lpugin commented Dec 5, 2016

@lpugin: Isn't @Stemless just a different syntax for @stem.len="0"?

Yes, indeed. I am OK with it, but others seem to think it is not good.

@pe-ro
Copy link

pe-ro commented Dec 5, 2016

Since it has the same meaning, adding @stemless would just add confusion.

@lpugin
Copy link
Contributor

lpugin commented Dec 5, 2016

OK. What about the @tstamp use?

@pe-ro
Copy link

pe-ro commented Dec 6, 2016

@craigsapp: I assume the same process could be applied by Verovio to notes with the @pname.ges, @oct.ges, and @artic="harm" attribute combination.

@donbyrd
Copy link
Contributor

donbyrd commented Dec 6, 2016

Good point, Craig, about the difficulty of getting ledgerlines. And, as I said, some of these have 8va's over them. I think directives are out of the running.

@craigsapp
Copy link
Contributor Author

A-ha, the next measures have an ottava on the realized harmonic note:

screen shot 2016-12-06 at 18 43 08

Typeset in SCORE:

screen shot 2016-12-06 at 19 20 39

Here are thoughts about the semantical aspects of harmonics (at least for stringed instruments):

A harmonic articulation contains two necessary pieces of information:
(1) what pitch position to press firmly
(2) what higher pitch position on the same string to press lightly

These two pieces of information will fully determine the resulting sounding pitch according to the interval between these two notes:

octave == sounding one octave below the bottom note.
fifth == sounding an octave above the top note
fourth == sounding two octaves above the bottom note
major third == sounding two octaves about the top note.
(these are the most common, but higher harmonics are possible with smaller intervals).

screen shot 2016-12-06 at 20 34 31

Note that the lower pitch is a regular shaped note, and the upper one is a diamond shape. Note the special case of the octave harmonic: the diamond-shaped note for the second note is never specified, since that is the default interval for a harmonic. Strictly speaking, the sounding note is not written. Schoenberg writes since he has a lot of them and does not want the violinist to make a mistake (and the violinist would probably write them in if he did not). So there is no definitive way to display them. How he does them is good, since they will decrease readability of the music if they are placed vertically above the other notes of the harmonic. Notice in measure 222 that he does not repeat the sounding note when it is repeated. So the sounding note is functioning as a courtesy accidental does.

Alternatively, you could describe the harmonic by:
(1) the bottom pitch position
(2) the interval to the top position

Or even:
(1) the bottom pitch position
(2) the sounding harmonic

This (quasi-)MEI encoding:

<note pname="c" oct="4" artic="harm">

would mean that the bottom pitch is C4, and the top pitch is C5, with the sounding harmonic being C5. The @artic="harm" attribute would force the display of a circle symbol. The top note would be implied to be C5, and the sounding note would be implied to be C5 (as they are in music notation). This should be rendered as number 1 in the figure below:

screen shot 2016-12-06 at 20 38 14

Cases 2 and 3 would be for displaying the sounding note. Maybe there would be an attribute to vertically align with the fingered note or offset to the right (never offset to the left). The default would probably be offset to the right rather than centered. Case 3 might be encoded as:

<note pname="c" oct="4" artic="harm">
    <harmonic interval="p8">
</note>

And case 2:

<note pname="c" oct="4" artic="harm">
    <harmonic interval="p8" position="centered">
</note>

(these are quasi-MEI encodings, not literal element/attribute name suggestions)

Case 4 shows the position of the second note. This could also be described as an interval above the bottom note, or as the pitch above the the bottom note. Using an interval would simplify changing the pitch of the harmonic as only the outer <note> pitch would need to be changed.

<note pname="c" oct="4" artic="harm">
    <touch interval="p8">
</note>

Case 5 would include the sounding note:

<note pname="c" oct="4" artic="harm">
    <touch interval="p8">
    <harmonic interval="p8">
</note>

Since the interval can be determined by the <touch> interval, it could also be done as:

<note pname="c" oct="4" artic="harm">
    <touch interval="p8">
    <harmonic>
</note>

Since @interval="p8" would be redundant and a bit nonsensical if it were any other value.

Case 6 shows what the harmonic would look like without the circle articulation. Since a diamond note is visible, the ring articulation is redundant, so dropping it could be:

<note pname="c" oct="4">
     <touch interval="p8">
</note>

Case 7:

<note pname="c" oct="4">
    <touch interval="p8">
    <harmonic>
</note>

The above 7 cases would cover most harmonic note syntax.

An addendum for the ottava marking is that it should be an attribute of the <harmonic> element:

<note pname="c" oct="4">
    <touch interval="p8">
    <harmonic ottava="true">
</note>

Again these are not literal suggestions, as you can normalize the names to other pieces of MEI.

Of course in this case that would display a non-sensical sounding note on the same staff line as the bottom note (since it would be sounding an octave higher), but this would mostly be for 2nd, 3rd, 4th harmonics than for octave harmonics. There might be other attributes on the sounding note element such as to display parentheses or not, to change the shape/size of the notehead, etc.

=======================

One special case occurs when playing a harmonic on an open string. These are called natural harmonics. In this case you don't press the lower pitch position with a finger, just lightly on the second pitch position. The case where you have to press the bottom pitch position are called "artificial harmonics".

The first note in measure 221 is an open-string harmonic:

screen shot 2016-12-06 at 19 31 47

This falls outside of the above harmonic syntax, so how to express this would have to be considered.

The violinist would play this on the top open string, partially touching one octave higher. The black parenthesised note is the sounding note which should be heard. In this case it is implied to touch the string lightly an octave higher (not on the E5, but on the E6). Using a diamond shaped note on the bottom note of the octave is implying an open-string harmonic, and since you never notate the touch point for an octave harmonic, the touch symbol was put on the bottom note.

Compare this to the first note on the line in the previous example, which is contextually implied to be an artificial harmonic:

screen shot 2016-12-06 at 19 40 47

In this case, the harmonic requires two fingers: one to hold down the E5 pitch (on the A4 string), and the other the press lightly on the E6 point on the A5 string. This interpretation is implied by the fact that the E5 note is a regular shape, as well as the following F# needing not able to be played on the A4 string. Since there is no diamond notehead, it is also implied that the other finger should touch an octave higher.

I don't understand the notation for the first three notes in measure 223. There are diamond notes on B4 and a sounding note in F#6. So this must mean that the fingered note is B4, and the touching note is F#5. This also happens on the third note of measure 219 and the third beat of measure 220.

@donbyrd
Copy link
Contributor

donbyrd commented Dec 7, 2016

Whew! Harmonics are a complex subject; thanks for the very detailed commentary, Craig. This subject is germane to my own interests at the moment because I'm finishing a violin concerto and trying to decide how to notate artificial harmonics! (Premiere is scheduled for Feb. 12 at 2 PM, here in Bloomington. All are invited.) I wish I had time to comment at length, but a few random observations:

  1. The decision I'm trying to make is whether to leave the artificial harmonics notated as just the sounding pitch with a circle above it, or to spell out the pressed and touched notes. Performers I've talked to recently generally prefer the latter -- for one thing, it makes sight-reading easier -- but the former is acceptable (and a great deal simpler, of course).

  2. I strongly recommend saying artificial harmonic if that's what you mean. Natural harmonics aren't really a special case; they're extremely common.

  3. Schoenberg's notation for natural harmonics is somewhat unusual; standard is to write a regular notehead with a circle above it. (Of course that's identical to the simpler notation of artificial harmonics I mentioned under no. 1, so the performer has to decide which kind of harmonic it is.)

  4. The classic Piston orchestration textbook says notating the sounding pitch of artificial harmonics is pretty common. That sounds right to me, though I still can't think of any other examples.

  5. In scores I've looked at, by far the most common interval between stopped and touched is a fourth. Piston agrees, and says it's the most reliable.

  6. I've seen natural harmonics for flute (in Le Sacre du Printemps, e.g.) and guitar, but not artificial harmonics. But surely harmonics are used on other instruments.

@craigsapp
Copy link
Contributor Author

I strongly recommend saying artificial harmonic if that's what you mean. Natural harmonics aren't really a special case; they're extremely common.

That is true. But I was saying "special case" in that the notation Schoenberg used for the natural harmonic did not quite fit the graphical system I was defining, so more thought would be needed on how to map the semantics to the graphical symbols in the notation.

"natural harmonic" means that the performer only has to press lightly on the top pitch position in order to generate the sounding harmonic.

"artificial harmonic" means that the perform has to press firmly on the bottom note position, and also press lightly on the top note position.

In terms of semantics, there is not a great difference between the two, just that natural harmonics only requires one finger and artificial harmonics require two.

@craigsapp
Copy link
Contributor Author

Schoenberg's notation for natural harmonics is somewhat unusual; standard is to write a regular notehead with a circle above it. (Of course that's identical to the simpler notation of artificial harmonics I mentioned under no. 1, so the performer has to decide which kind of harmonic it is.)

The classic Piston orchestration textbook says notating the sounding pitch of artificial harmonics is pretty common. That sounds right to me, though I still can't think of any other examples.

In scores I've looked at, by far the most common interval between stopped and touched is a fourth. Piston agrees, and says it's the most reliable.

As a pianist, I usually do not have to worry about harmonics (but I have played some John Cage and Henry Cowell pieces which require performing harmonics).

I will have to look at the Piston description. This looks like he is notating the sounding pitch of the harmonic as a regular note, and then putting a circle articulation above it to indicate that it is a harmonic. And the realization of that harmonic is left up to the performer. There are multiple ways to realize the harmonic, and in that case the composer does not care how the performer does it, as long as they produce the correctly notated pitch as a harmonic. Schoenberg is being more explicit and telling the performer how to realize the harmonic.

Here is an illustration of what I am saying (using Schoenberg's system), but regularizing the first case:

screen shot 2016-12-07 at 10 04 48

And here is Piston's system for the same music:

screen shot 2016-12-07 at 10 09 24

All harmonics look the same, since it is up to the performer to decide how to generate the sounding harmonic.

In Schoenberg's system, the circle articulation is redundant since the diamond noteheads indicate the presence of a harmonic.

A good semantic system would allow for conversion between these two graphical systems...

@craigsapp
Copy link
Contributor Author

craigsapp commented Dec 7, 2016

I've seen natural harmonics for flute (in Le Sacre du Printemps, e.g.) and guitar, but not artificial harmonics. But surely harmonics are used on other instruments.

What is a flute harmonic? (meaning what does it look like on paper, and how it is realized?). I presume this means to overblow a note (to excite the pitch an octave higher). This starts to get close to multiphonics, which are related to string harmonics but more a woodwind context. Woodwind registers above the bottom one can be thought of as harmonics: the second register of a flute (C5 to C6) is played on the second harmonic of the bottom register notes by overblowing and adjusting some keys to suppress the fundamental, so technically most notes a flautist plays are harmonics.

Artificial vs Natural harmonic don't make sense in a woodwind context. Technically they are all natural harmonics, and the performer is controlling the length of the "string" by opening and closing holes, as well as massaging the nodes on that string to control which harmonic is being played as well as overblowing to select a particular harmonic.

Guitars would behave similarly to violins. A natural harmonic would be where the open string is used, and the artificial harmonic would be where the string is pressed firmly at one fret, and touched lightly at another fret.

Brass instrument pitches are almost entirely played as harmonics (but written as regular pitches). Is there a case where brass instruments have notated harmonics? Circle articulations in French Horn music does not count as this means "open" rather than "harmonic".

For the Rite of Spring example, is the harmonic notated at the sounding pitch or an octave below the sounding pitch (which is different from my interpretation of the Piston system)? Maybe Stravinsky did not have piccolo players, which are supposed to be used for such situations... He also obviously did not have a piccolo bassoonist :-)

https://jasontaurins.files.wordpress.com/2015/05/irlpiccassoon.png

@pe-ro
Copy link

pe-ro commented Dec 7, 2016

Summarizing --

There are 2 kinds of stemless notes:

  1. single notes, usually indicating an ambiguous performed duration and
  2. sounding harmonics.

There are also 2 kinds of harmonics:

  1. natural, produced by lightly touching an open string at a harmonic node (usually at the 8va or 12 half-steps above), and
  2. artificial, produced by fingering a pitch, then touching the string at a harmonic node (often a 4th above the stopped note).

The first kind of stemless note can be indicated using --

<note pname="c" oct="4" dur="4" stem.len="0"/>

although I'm leaning toward adding @stem.visible in order to separate the length of the stem from whether it is displayed. Doing so may complicate matters in the short term, but it's a more expressive option. For example,

<note pname="c" oct="4" dur="4" stem.len="7" stem.visible="false"/>

allows for the positioning of beams even when the stem is invisible. We should also consider adding a Schematron rule that requires @stem.len > 0 when @stem.len and @stem.visible are both present and @stem.visible is false. In other words, there has to be a stem (its length either explicitly stated or implied) for it to be invisible.

For visual alignment purposes, it's possible to place stemless notes inside a so-called "duration container". For example, in the illustration of Schoenberg's tone-row usage the headless notes can be wrapped with a <tuplet>, which I believe fits the definition of "duration container" --

<tuplet dur="1" num.visible="false" bracket.visible="false">
  <note head.shape="quarter" stem.len="0"/>
  <note head.shape="quarter" stem.len="0"/>
   <!-- plus 10 more -->
</tuplet>

I don't think that this use of <tuplet> implies spacing different from any other use, but I'm willing to be convinced otherwise.

Turning to harmonics, following the so-called Piston system (although he was certainly describing an already-existing practice), all harmonics can be indicated by --

<note pname="c" oct="5" dur="2" artic="harm"/>

that is, the sounding pitch (which is also the notated pitch) is encoded and the articulation indication added. It's left up to the performer to figure out exactly how to achieve the notated result.

Using the so-called Schoenberg system (again, he was probably describing existing practice), a distinction is (sometimes) made between natural and artificial harmonics. Natural harmonics are similar to the Piston system --

<note pname="c" oct="4" dur="2" artic="harm"/>

the difference being that what's encoded is the written pitch, not the sounded one. So, in order to capture the sounding pitch we can add an attribute or two --

<note pname="c" oct="4" dur="2" artic="harm" oct.ges="5"/> (since the pitch name is the same)

or

<note pname="c" oct="4" dur="2" artic="harm" pname.ges="c" oct.ges="5"/> (to be absolutely clear)

The Schoenberg approach treats artificial harmonics differently. In this case the stopped pitch is notated with an oval notehead, while the harmonic node is written with a diamond-shaped notehead. In MEI this is captured as a chord --

<chord>
  <note pname="c" oct="4" dur="2" pname.ges="c" oct.ges="5"/>
  <note pname="f" oct="4" dur="2" head.shape="diamond"/>
</chord>

Note the use of @pname.ges and @oct.ges to indicate the sounding pitch (as usual) and the lack of @artic. What's also lacking is any indication that the F4 isn't supposed to be sounded/rendered (in MIDI, for example). But, rather than add more attributes or more values for existing attributes, it makes more sense to me to provide "as written" and "as sounded" options --

<choice>
  <orig>
    <chord>
      <note pname="c" oct="4" dur="2"/>
      <note pname="f" oct="4" dur="2" head.shape="diamond"/>
    </chord>
  </orig>
  <reg>
    <note pname="c" oct="5" dur="2"/>
  </reg>
</choice>

We haven't addressed this before, but such examples suggest that adding <written> and <sounded> as options within <choice> might be a good idea. Here's the same example with these elements --

<choice>
  <written>
    <chord>
      <note pname="c" oct="4" dur="2"/>
      <note pname="f" oct="4" dur="2" head.shape="diamond"/>
    </chord>
  </written>
  <sounded>
    <note pname="c" oct="5" dur="2"/>
  </sounded>
</choice>

These elements can be thought of as syntactic sugar for <orig type="written"> and <reg type="sounded">, but with the value of @type tightly constrained and, therefore, more exchangeable/interoperable.

@donbyrd
Copy link
Contributor

donbyrd commented Dec 8, 2016

It happens I'm an ex-flutist. What @craigsapp says about flute harmonics is pretty much correct, though I'm not sure the adjusting of keys while overblowing for normal (non-harmonic) notes is solely or even primarily to suppress the fundamental. Anyway, to produce harmonics, you simply don't adjust the keys! The difference in timbre is quite minor, IMHO, and they're very rarely used; in fact offhand I can't think of any examples other than in The Rite of Spring. The notation there is the same as the standard notation for natural harmonics on strings, viz., the sounding pitch is notated with a little circle over it.

Of course @craigsapp is right about guitar harmonics, my oversight; and Gould, in Behind Bars, discusses guitar harmonics at length. She also discusses harmonics for strings (of course), harp, and piano -- but no other instruments, including flute (more evidence of how unimportant flute harmonics are).

@craigsapp
Copy link
Contributor Author

An interesting note from Behind Bars, page 413-414:

The recommended approach is to write harmonics as the player will finger them.

Another approach is to notate all harmonics at sounding pitch with a small circle over each note but without distinguishing between natural and artificial harmonics, leaving the player to find the most convenient or most secure place to sound each note (This approach is not always appropriate in orchestral music, where, with limited rehearsal, there may not be time to work out how best to finger a passage of harmonics.) . A statement should be added if this approach is used, since usually this notation suggests that all harmonics are available as natural harmonics.

So Elaine advocates the Schoenberg system rather than the Piston system.

But she says what I was thinking about the circle articulating being redundant in the Schoenberg system, Page 419:

A diamond-shaped note does not take a circle above it: circles should be used exclusively for the notation of harmonics at sounding pitch.

And she also recommends the notation of the sounding pitch in the Schoenberg system (ibid.):

Since the fingered note is not the resultant sounding pitch, to avoid confusion it is often advisable to indicate the sounding pitch as well (see Indicating sounding pitches, p. 421).

Discussion about sounding pitch notation in harmonics on p. 421:

Indicate a sounding pitch as a small notehead in brackets directly above or after the fingered pitches. Do not join a small note to the stem of the harmonic, as it might look as if it is an additional note (a). A harmonic circle over the sounding pitch may be indicated by is not necessary. Where convenient, normal stem direction of the beamed groups may be reversed to allow sounding pitches to be placed directly above the harmonics (b):

screen shot 2016-12-07 at 16 57 18

And a discussion about ottava lines on page 422:

Sounding pitches that require octave signs should be placed after the fingered pitches, so that it is clear that the ottava does not affect the fingerings:

screen shot 2016-12-07 at 17 30 25

@lpugin
Copy link
Contributor

lpugin commented Dec 8, 2016

@pe-ro, just to make sure we are on the same line

the headless notes can be wrapped with a , which I believe fits the definition of "duration container"

add below

I don't think that this use of implies spacing different from any other use, but I'm willing to be convinced otherwise.

I agree with this, but I don't think this fulfil the what is required with the Schoenberg. That is not aligned notes but instead just evenly spaced notes. For me a tuplet with @dur is the same as a tuplet with @num and @num.base except that with the first one, the calculation of the proportion is left to the processing, whereas in the second case it is the covered duration that is left to the processing. Now in both cases I expect the content to be aligned with other layers. I am not sure this is exactly what is happening in the Schoenberg example where again the notes look just evenly spaced. Do we agree?

@craigsapp
Copy link
Contributor Author

Here is an ossia example which is probably related to the Schoenberg example:

screen shot 2016-12-08 at 08 33 28

In MEI this could be encoded as a reading, and it seems that it is up to the renderer to identify that the durations of the ossia do not match the primary reading. When this happens, the renderer calculates the ossia layout indepent of the rhythms in the the primary layout, but with a constraint placed on its width (or if needed to be typeset wider, it would be able to control the width of the primary reading's layout in those two measures).

For the Schoenberg example, the tonerow line could be encoded as a reading, and an ossia renderer should be able to handle the placement of the notes by noting that they have no rhythm, and therefore cannot be aligned rhythmically with the primary reading.

@craigsapp
Copy link
Contributor Author

By the way, my student has given up on us, and he will use jQuery to remove the unwanted stems in the SVG output from verovio :-)

@lpugin
Copy link
Contributor

lpugin commented Dec 8, 2016 via email

@pe-ro
Copy link

pe-ro commented Dec 8, 2016

@lpugin: The equal spacing of the stemless notes is an "accident" (in the same way line breaks are an "accident" of typesetting). In other words, it's not very important. It seems to me that they can be spaced the way notes of a tuplet would normally be handled. If some other spacing is desired, then @ho can be used to nudge each note to a different location.

@craigsapp
Copy link
Contributor Author

Was that added in the last few weeks? I saw @rettinghaus message above, but I wasn't sure that it was going all of the way to the SVG. I'll update my version of verovio.

@pe-ro
Copy link

pe-ro commented Dec 8, 2016

On the topic of horizontal spacing -- MEI currently has a couple of attributes (@spacing.packexp and @spacing.packfact) -- borrowed from Mup, but similar to MuseScore's "spacing" and "minimum note distance" parameters -- that are intended to record information about note/event spacing. They're available in the att.spacing class. (BTW, "packexp" and "packfact" aren't set in stone; they can be changed if someone suggests better names.)

Right now, only <scoreDef> allows these attributes, but <scoreDef> can occur within <staff> so resetting the spacing for a particular staff is possible. Major questions arise, though -- Are these attributes adequate for describing note spacing? Are additional attributes or values necessary? Is there another set of attributes that would work better? Does changing the value of these attributes affect the entire score from that point forward or only the staff in which the change occurs? Would it be better to make <staffDef> (and perhaps <measure> too) a member of att.spacing?

I'm aware that there are various algorithms for computing "optimal" note spacing. But, is there a generic way of describing note spacing, say with an attribute with a list of values (closed or semi-open), such as "linear", "logarithmic", "proportional", etc. that could replace @spacing.packexp and @spacing.packfact?

@pe-ro
Copy link

pe-ro commented Dec 8, 2016

Someone want to create an MEI issue for adding @stem.visible? I'm looking at you, @craigsapp!

@pe-ro
Copy link

pe-ro commented Dec 8, 2016

Looking at Craig's latest examples of harmonics, another encoding possibility comes to mind --

The sounded pitches could be encoded in a separate <layer> --

<measure>
  <staff n="1">
    <layer>
      <note pname="g" oct="6" accid="s" dur="4" size="cue" stem.len="0" enclose="paren"/>
    </layer>
    <layer>
      <chord dur="2" tie="i">
        <note pname="c" oct="5" accid="s" head.shape="diamond"/>
        <note pname="g" oct="4" accid="s" head.shape="half"/>
      </chord>
      <chord dur="8" tie="t">
        <note pname="c" oct="5" accid="s" head.shape="diamond"/>
        <note pname="g" oct="4" accid="s" head.shape="quarter"/>
      </chord>
    </layer>
  </staff>
</measure>

The second example is the same as the first with an additional @ho on the sounded note.

In the third example, the basic idea is the same, but the parentheses and the position indicators have to be treated as <dir> elements.

What's gained is the independent treatment of written vs sounded notes. What's lost is the connection between them. This approach requires some kind of indication on the "touch" note not to include it in a MIDI rendering. Luckily, we have such a mechanism, two in fact -- @pname.ges="none" or @vel="0".

@pe-ro
Copy link

pe-ro commented Dec 8, 2016

@craigsapp: You seem to draw on them frequently -- have you scanned/re-set all the examples from Gould?

@craigsapp
Copy link
Contributor Author

@pe-ro: of course :-). Actually I just typeset them in SCORE which looks prettier than scanning (and less effort finding a scanner :-)

@craigsapp
Copy link
Contributor Author

I updated to the most recent develop version:

With stems:

screen shot 2016-12-08 at 20 08 01

With @stem.len="0":

screen shot 2016-12-08 at 20 08 39

Interestingly the beams stay where they were, but the triplet signs collapse to the notes. (but I won't need anything except stemless quarter notes, so it doesn't matter to me).

MEI test data:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="http://music-encoding.org/schema/3.0.0/mei-all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="http://music-encoding.org/schema/3.0.0/mei-all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="3.0.0">
    <meiHead>
        <fileDesc>
            <titleStmt>
                <title>Prelude in E Minor, Op. 28, No. 4</title>
                <respStmt>
                    <persName role="Composer">Chopin, Frederic</persName>
                </respStmt>
            </titleStmt>
            <pubStmt>
                <date>2016-12-08 20:08:37</date>
            </pubStmt>
        </fileDesc>
        <encodingDesc>
            <projectDesc>
                <p>Transcoded from Humdrum with Verovio version 0.9.13-dev-1745ac2-dirty</p>
                <p>Encoded by: Craig Stuart Sapp</p>
            </projectDesc>
        </encodingDesc>
    </meiHead>
    <music>
        <body>
            <mdiv>
                <score>
                    <scoreDef xml:id="scoredef-000000013010827" midi.bpm="72">
                        <staffGrp xml:id="m-000000015065475">
                            <staffDef xml:id="staffdef-000000120732808" clef.shape="G" clef.line="2" key.sig="1s" meter.count="2" meter.unit="2" meter.sym="cut" n="1" lines="5" />
                        </staffGrp>
                    </scoreDef>
                    <section xml:id="section-000000005029267">
                        <measure xml:id="measure-L14" n="0">
                            <staff xml:id="staff-000000096945086" n="1">
                                <layer xml:id="layer-L14F1" n="1">
                                    <beam xml:id="beam-000000039743411">
                                        <note xml:id="note-L23F1" dots="1" dur="8" oct="3" pname="b" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L24F1" dur="16" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                            <tempo xml:id="tempo-000000147537131" staff="1" tstamp="1.000000">Largo</tempo>
                        </measure>
                        <measure xml:id="measure-L25" n="1">
                            <staff xml:id="staff-L25F1" n="1">
                                <layer xml:id="layer-L25F1" n="1">
                                    <note xml:id="note-L26F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L27F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L28" n="2">
                            <staff xml:id="staff-L28F1" n="1">
                                <layer xml:id="layer-L28F1" n="1">
                                    <note xml:id="note-L29F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L30F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L31" n="3">
                            <staff xml:id="staff-L31F1" n="1">
                                <layer xml:id="layer-L31F1" n="1">
                                    <note xml:id="note-L32F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L33F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L34" n="4">
                            <staff xml:id="staff-L34F1" n="1">
                                <layer xml:id="layer-L34F1" n="1">
                                    <note xml:id="note-L35F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L36F1" dur="4" accid="f" oct="4" pname="b" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L37" n="5">
                            <staff xml:id="staff-L37F1" n="1">
                                <layer xml:id="layer-L37F1" n="1">
                                    <note xml:id="note-L38F1" dots="1" dur="2" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L39F1" dur="4" oct="4" pname="b" accid.ges="n" stem.len="0">
                                        <accid xml:id="accid-000000199502089" accid="n" func="caution" />
                                    </note>
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L40" n="6">
                            <staff xml:id="staff-L40F1" n="1">
                                <layer xml:id="layer-L40F1" n="1">
                                    <note xml:id="note-L41F1" dots="1" dur="2" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L42F1" dur="4" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L43" n="7">
                            <staff xml:id="staff-L43F1" n="1">
                                <layer xml:id="layer-L43F1" n="1">
                                    <note xml:id="note-L44F1" dots="1" dur="2" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    <beam xml:id="beam-000000188707782">
                                        <note xml:id="note-L45F1" dots="1" dur="8" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L46F1" dur="16" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L47" n="8">
                            <staff xml:id="staff-L47F1" n="1">
                                <layer xml:id="layer-L47F1" n="1">
                                    <note xml:id="note-L48F1" dots="1" dur="2" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L49F1" dur="4" accid="s" oct="4" pname="g" stem.len="0" />
                                </layer>
                            </staff>
                            <tie xml:id="tie-000000050301625" startid="#note-L49F1" endid="#note-L51F1" />
                        </measure>
                        <measure xml:id="measure-L50" n="9">
                            <staff xml:id="staff-L50F1" n="1">
                                <layer xml:id="layer-L50F1" n="1">
                                    <note xml:id="note-L51F1" dur="4" oct="4" pname="g" accid.ges="s" stem.len="0" />
                                    <beam xml:id="beam-000000189381201">
                                        <note xml:id="note-L52F1" dur="8" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L53F1" dur="8" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    </beam>
                                    <beam xml:id="beam-000000006066219">
                                        <note xml:id="note-L54F1" dur="8" oct="5" pname="d" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L55F1" dur="8" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L56F1" dur="8" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L57F1" dur="8" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L58" n="10">
                            <staff xml:id="staff-L58F1" n="1">
                                <layer xml:id="layer-L58F1" n="1">
                                    <note xml:id="note-L59F1" dots="1" dur="2" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    <note xml:id="note-L60F1" dur="4" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L61" n="11">
                            <staff xml:id="staff-L61F1" n="1">
                                <layer xml:id="layer-L61F1" n="1">
                                    <note xml:id="note-L62F1" dots="1" dur="2" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    <note xml:id="note-L63F1" dur="8" oct="4" pname="b" accid.ges="n" grace="acc" stem.len="0" />
                                    <note xml:id="note-L64F1" dur="4" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L65" n="12">
                            <staff xml:id="staff-L65F1" n="1">
                                <layer xml:id="layer-L65F1" n="1">
                                    <beam xml:id="beam-000000000676275">
                                        <note xml:id="note-L66F1" dur="8" oct="4" pname="g" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L67F1" dur="8" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                        <note xml:id="note-L68F1" dur="8" oct="4" pname="c" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L69F1" dur="8" oct="3" pname="b" accid.ges="n" stem.len="0" />
                                    </beam>
                                    <beam xml:id="beam-000000110483176">
                                        <note xml:id="note-L70F1" dur="8" accid="s" oct="4" pname="d" stem.len="0" />
                                        <note xml:id="note-L71F1" dur="8" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    </beam>
                                    <beam xml:id="beam-000000131149402">
                                        <tuplet xml:id="tuplet-000000176757316" num="3" numbase="2" bracket.visible="false" num.format="count">
                                            <note xml:id="note-L72F1" dur="8" oct="5" pname="d" accid.ges="n" stem.len="0">
                                                <accid xml:id="accid-000000049013266" accid="n" func="caution" />
                                            </note>
                                            <note xml:id="note-L73F1" dur="8" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                            <note xml:id="note-L74F1" dur="8" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                        </tuplet>
                                    </beam>
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L75" n="13">
                            <staff xml:id="staff-L75F1" n="1">
                                <layer xml:id="layer-L75F1" n="1">
                                    <note xml:id="note-L76F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L77F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L78" n="14">
                            <staff xml:id="staff-L78F1" n="1">
                                <layer xml:id="layer-L78F1" n="1">
                                    <note xml:id="note-L79F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L80F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L81" n="15">
                            <staff xml:id="staff-L81F1" n="1">
                                <layer xml:id="layer-L81F1" n="1">
                                    <note xml:id="note-L82F1" dots="1" dur="2" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L83F1" dur="4" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L84" n="16">
                            <staff xml:id="staff-L84F1" n="1">
                                <layer xml:id="layer-L84F1" n="1">
                                    <beam xml:id="beam-000000177274093">
                                        <note xml:id="note-L85F1" dots="1" dur="8" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L86F1" dur="16" accid="s" oct="4" pname="a" stem.len="0" />
                                    </beam>
                                    <note xml:id="note-L87F1" dur="4" oct="4" pname="a" accid.ges="s" stem.len="0" />
                                    <note xml:id="note-L88F1" dur="4" oct="5" pname="g" accid.ges="n" stem.len="0" />
                                    <beam xml:id="beam-000000041388906">
                                        <note xml:id="note-L89F1" dots="1" dur="8" oct="5" pname="f" accid.ges="s" stem.len="0" />
                                        <note xml:id="note-L90F1" dur="16" oct="5" pname="e" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                            <dir xml:id="dir-000000077422276" place="above" staff="1" tstamp="1.500000">*</dir>
                        </measure>
                        <measure xml:id="measure-L91" n="17">
                            <staff xml:id="staff-L91F1" n="1">
                                <layer xml:id="layer-L91F1" n="1">
                                    <beam xml:id="beam-000000187398835">
                                        <note xml:id="note-L92F1" dur="8" oct="5" pname="e" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L93F1" dur="8" accid="s" oct="5" pname="d" stem.len="0" />
                                        <note xml:id="note-L94F1" dur="8" oct="6" pname="c" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L95F1" dur="8" oct="5" pname="d" accid.ges="s" stem.len="0" />
                                    </beam>
                                    <beam xml:id="beam-000000191043905">
                                        <note xml:id="note-L96F1" dur="8" oct="5" pname="d" accid.ges="s" stem.len="0" />
                                        <note xml:id="note-L97F1" dur="8" oct="5" pname="e" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L98F1" dur="8" oct="5" pname="g" accid.ges="n" stem.len="0" />
                                        <note xml:id="note-L99F1" dur="8" oct="4" pname="b" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L100" n="18">
                            <staff xml:id="staff-L100F1" n="1">
                                <layer xml:id="layer-L100F1" n="1">
                                    <beam xml:id="beam-000000211813288">
                                        <note xml:id="note-L101F1" dur="8" oct="5" pname="d" accid.ges="n" stem.len="0">
                                            <accid xml:id="accid-000000206098750" accid="n" func="caution" />
                                        </note>
                                        <note xml:id="note-L102F1" dur="8" oct="5" pname="c" accid.ges="n" stem.len="0" />
                                    </beam>
                                    <beam xml:id="beam-000000009842162">
                                        <tuplet xml:id="tuplet-000000161523331" num="3" numbase="2" bracket.visible="false" num.format="count">
                                            <note xml:id="note-L103F1" dur="8" oct="5" pname="e" accid.ges="n" stem.len="0" />
                                            <note xml:id="note-L104F1" dur="8" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                            <note xml:id="note-L105F1" dur="8" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                        </tuplet>
                                    </beam>
                                    <note xml:id="note-L106F1" dots="1" dur="4" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    <note xml:id="note-L107F1" dur="8" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L108" n="19">
                            <staff xml:id="staff-L108F1" n="1">
                                <layer xml:id="layer-L108F1" n="1">
                                    <note xml:id="note-L109F1" dots="1" dur="2" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    <note xml:id="note-L110F1" dur="8" oct="4" pname="b" accid.ges="n" grace="acc" stem.len="0" />
                                    <note xml:id="note-L111F1" dur="4" oct="4" pname="a" accid.ges="n" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L112" n="20">
                            <staff xml:id="staff-L112F1" n="1">
                                <layer xml:id="layer-L112F1" n="1">
                                    <note xml:id="note-L113F1" dots="1" dur="2" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                    <beam xml:id="beam-000000154598754">
                                        <note xml:id="note-L114F1" dots="1" dur="8" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                        <note xml:id="note-L115F1" dur="16" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                    </beam>
                                </layer>
                            </staff>
                            <tie xml:id="tie-000000123776037" startid="#note-L113F1" endid="#note-L114F1" />
                        </measure>
                        <measure xml:id="measure-L116" n="21">
                            <staff xml:id="staff-L116F1" n="1">
                                <layer xml:id="layer-L116F1" n="1">
                                    <note xml:id="note-L117F1" dots="1" dur="2" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L118F1" dur="4" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L119" n="22">
                            <staff xml:id="staff-L119F1" n="1">
                                <layer xml:id="layer-L119F1" n="1">
                                    <note xml:id="note-L120F1" dots="1" dur="2" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L121F1" dur="4" oct="4" pname="f" accid.ges="s" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L122" n="23">
                            <staff xml:id="staff-L122F1" n="1">
                                <layer xml:id="layer-L122F1" n="1">
                                    <note xml:id="note-L123F1" dur="2" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                    <rest xml:id="rest-L124F1" dur="2" fermata="above" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L125" n="24">
                            <staff xml:id="staff-L125F1" n="1">
                                <layer xml:id="layer-L125F1" n="1">
                                    <note xml:id="note-L126F1" dur="2" oct="4" pname="e" accid.ges="n" stem.len="0" />
                                    <note xml:id="note-L127F1" dur="2" accid="s" oct="4" pname="d" stem.len="0" />
                                </layer>
                            </staff>
                        </measure>
                        <measure xml:id="measure-L128" n="25" right="end">
                            <staff xml:id="staff-L128F1" n="1">
                                <layer xml:id="layer-L128F1" n="1">
                                    <note xml:id="note-L129F1" dur="1" oct="4" pname="e" accid.ges="n" />
                                </layer>
                            </staff>
                        </measure>
                    </section>
                </score>
            </mdiv>
        </body>
    </music>
</mei>

How I did it in Humdrum:

!!!COM: Chopin, Frederic
!!!CDT: 1810///-1849///
!!!OTL: Prelude in E Minor, Op. 28, No. 4
!!!OPS: Op. 28
!!!ONM: No. 4
!!!OMD: Largo
!!!ODT: 1836///-1839///
!!!PDT: 1839///
!!!ENC: Craig Stuart Sapp
!!!AIN: piano
!!!EEV: 4 March 2001
!!!YEC: Copyright 2001 by Craig Stuart Sapp
!!!YEN: United States of America
**kern
*Ipiano
*rh
*clefG2
*k[f#]
*e:
*met(C|)
*M2/2
*MM72
8.iBL
16ibJ
=1
2.ib
4icc
=2
2.ib
4icc
=3
2.ib
4icc
=4
2.ib
4ib-
=5
2.ia
4ibn
=6
2.ia
4ib
=7
2.ia
8.ibL
16iaJ
=8
2.ia
[4ig#
=9
4ig#]
8iaL
8ibJ
8iddL
8icc
8ie
8iaJ
=10
2.if#
4ia
=11
2.if#
8ibq
4ia
=12i
8igL
8if#
8ic
8iBJ
8id#L
8if#J
12iddnL
12icc
12ibJ
=13
2.ib
4icc
=14
2.ib
4icc
=15
2.ib
4icc
=16
8.ibL
16ia#J
4ia#O
4igg
8.iff#L
16ieeJ
=17
8ieeL
8idd#
8iccc
8idd#J
8idd#L
8iee
8igg
8ibJ
=18
8iddnL
8iccJ
12ieeL
12ie
12iaJ
4.if#
8ia
=19
2.if#
8ibq
4ia
=20
[2.if#
8.if#]L
16ieJ
=21
2.ie
4if#
=22
2.ie
4if#
=23
2ie
2r;
=24
2ie
2id#
=25
1e
==
*-
!!!RDF**kern: i = no stem

@donbyrd
Copy link
Contributor

donbyrd commented Dec 9, 2016

OK, so this issue is closed at last (gasp!), but Perry's question about horizontal spacing hasn't been answered, and it's an important question. I have zero time to respond at the moment, but does somebody (Perry?) want to open a new issue with it?

@lpugin
Copy link
Contributor

lpugin commented Dec 9, 2016

It should be open on music-encoding

@pe-ro
Copy link

pe-ro commented Dec 9, 2016

Just created new issue regarding clarification of horizontal spacing at music-encoding: music-encoding/music-encoding#363.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants