-
Notifications
You must be signed in to change notification settings - Fork 19
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
Should global (system) notations be interspersed within regular parts? #2
Comments
Chair discussion: this question also relates to part groups, which could share notations across their member parts. Would we encode this sharing also even though it's not score-wide? (e.g. Don Giovanni minuet). |
Why not have both? |
I don't understand what the system element is. I have searched the document at https://w3c.github.io/mnx/specification/ and there is no system element described |
I have no problem with sparse usage especially if the encoding is optional. I think for musical analysis purposes it is much better to have everything that affects a measure of one part (whether it affects that measure alone or the whole system) to be either in the data for the part/measure itself or some other special purpose element and not in another part’s data hidden among information that only pertains to the other part. |
Note that we changed the name of |
I second what @cschardt and @mscuthbert have proposed above, I don't see any other alternative at the moment. It is definitively convenient to have system notation references in separate parts. Unless we create a separate, "master" file which includes just system notation to which parts can always reference to. |
The trouble with global as described in the spec. is that this would not be easily readable by eye. You would need to count all those empty measure elements to ascertain whether the key change is (say) in bar 232. It would be better just to include non-empty measure elements and give them a number. |
Apropos cschardt 'why not have both' . I am very much against including redundant copies of the same information in a file. What does the client program do if the copies of the information are not in agreement? Is it forced to check this and handle it and make a decision? Do we have to define which is correct? An acceptable alternative would be to include the copied information in a comment. |
To answer this question, we need to clarify and agree on the purpose of the global element.
|
(Note: I'll switch from saying "system" to "global" to avoid further confusion over the name change.) @cecilios: The intended purpose, which we could change, was for Note that I'm excluding cases like multi-metric scores, or scores with non-corresponding key signatures in different parts. (As you pointed out in #68, the very presence of @cschardt @fablau: So, while it is undoubtedly convenient for some purposes to have global notations within parts, at the same time it's inconvenient in at least two ways that seem important:
In order to answer these objections, I think there needs to be a compelling case showing that embedding global notations in parts is more than just a convenience for a subset of applications. @jsutdolph: I think you offer a good argument in favor of numbering. |
I'll inject a new point here to consider, and I'm not sure yet how I feel about it. It relates to #55 as well as this issue. It's been pointed out that Since this would hugely expand the universe of possibilities that an application needed to deal with, I would expect it to be excluded from the standard profile. The question of the standard profile's definition is not resolved and is reflected in #68, by the way. |
Does the concept of |
I fully support this. This implies that it is not mandatory to include the common content. Therefore, including empty measure elements is optional. In this case, It should be considered not to allow to include empty measure elements as they do not add anything but noise. In this case, all measure elements included in global must be referenced by number or other.
My first impression is that this is a very interesting idea for dealing with polymetric and polytonal scores, that should be explored. Need to define a simple way for defining the subsets of parts. Perhaps overlapped sets should be allowed, for defining the content common to all parts, but this could create inconsistencies between them. Probably it would be much better to allow only disjoined sets at the expense of having to repeat the all parts common content in each global set.
Not sure what are you referring to. An app. will first have to read the global element to get the common content and then use it for filling the gaps when reading each part. The only difference between having a global element or a few (probably not more than two or three) is splitting the global content in several tables indexed by part id. Not complex neither expensive. |
@joeberkovitz I understand that, and of course that could be a problem. I am wondering then if there is a way to have something like a "global" or "master" file which can be used as reference for those global signs. |
I think this is a very important discussion. Please allow me for a suggestion to think about for a couple of minutes. It's probably going to raise a new issue with a lot more questions, but... it might provide a solution for all of next issues:
How does a musician/conductor read his music? He won't start to read part 1, finish it completely, then "backup" (~cf. musicXML) to the beginning of the piece to start to read part 2 to start over again for the next, and the next part... Then again, I believe a (human) musician isn't reading in a strict "time-wise" sequence either, but rather in small chuncks: part-wise, yes, but rearly any further than a couple of beats. So I'm questioning if the "part-wise" format is the most ideal solution! A more "human-approach" could work as well. I would like to introduce the concept of a "sub-measure". Other element-naming suggestions could be "chunk" / "fraction" / "division" / please help me out here. Here is a (very brief!) example-implementation: <score>
<cwmnx profile="standard">
<measure-fraction number="1">
<directions>... global directions ...</directions> (cf. issue #2)
<part pid="1">
<directions>... part directions ....</directions> (cf. issue #32)
<sequence staff="1">...</sequence>
<barline> (a polymetric barline cf. issue #55)
</part>
<part pid="2">
<directions>... part directions ...</directions> (cf. issue #32)
<sequence staff="1">...</sequence>
<sequence staff="2">
<directions>... staff/voice/sequence directions ...</directions>
</sequence>
</part>
</measure-fraction>
<measure-fraction number="1.x">
<part pid="1">
<sequence staff="1">...</sequence>
</part>
<part pid="2">
<directions>...</directions> (cf. issue #32)
<sequence staff="1">...</sequence>
<sequence staff="2">...</sequence>
</part>
<barline> (a full-measure barline cf. issue #55)
</measure-fraction>
<measure-fraction number="2" system="new"> (cf. issue #57)
<directions>... some new global directions ...</directions> (cf. issue #2)
<part pid="1"> ... </part>
<part pid="2"> ... </part>
<part pid="x"> (cf. issue #43)
<sequence staff="3">...</sequence> (cf. issue #43)
</part>
</measure-fraction>
</cwmnx>
</score> While I was writing this down, I think we simply can keep the element-naming for a "sub-measure" to simply be: "measure". Because in 99.x% of all cases, there won't be polymetry. But I want to keep the example above as is to point out a "measure" does not need to be a "full" measure. This approach won't need a two-pass scan, but "mimics" the way we "as humans" read a paper piece of sheet music. |
@fablau: Please help me understand why the @bhamblok: For what it's worth, I have given a lot of thought to abandoning the partwise format (and this is not to dismiss any fresh thinking like yours). When all measures are in step (i.e. no polymetric music), this yields a reasonable structure with no need for fractions. In fact, MEI uses just such an approach. But with polymeter, it all falls apart. The use of measure fractions strikes me as giving up something very big in the name of a "human-like" principle that doesn't yield big benefits. The thing we give up is a direct and simple mapping between measures in the score and measures in the schema. In its place, developers would face a lot of complexity in fragmenting measures when writing CWMNX, and reassembling them when reading it, and music-reading humans are not the people who will be looking at an MNX file! My feeling to date has been that musical scores are a two-dimensional structure, of a kind that hierarchies are ill suited to represent. Neither the partwise nor timewise approaches are perfect, and we have to pick the least worst one :-) |
@joeberkovitz : As you mention, when all measures are in step (i.e. no polymetric music), a timewise format yields a reasonable structure. Which could solve many more issues than we are creating while maintaining a partwise format. So I would still like to discuss the topic of a timewise format a bit further.
|
After thinking about this a while longer, I began to ask myself whether there were other ways to look at this problem besides MusicXML's timewise or partwise options, or @bhamblok's suggestion of breaking measures up into little pieces. I think I have found at least one such alternative. While I'm not convinced it's the best solution yet, it's worth including in the discussion. It certainly has a different set of pros and cons, and perhaps has some appeal compared to the other avenues. The basic approach is to identify subsets of parts that share an identical measure structure, and bundle these beneath a single element whose structure is somewhat "timewise". (For a non-polymetric score, there is only one such element, so the typical case is not complicated by this approach.) Within this element, the information we have been calling "global" is encoded once, and shared by all parts in the subset. It's easiest to begin with an example of how this works for a non-polymetric score. Here, the new element <cwmnx profile="standard">
<!-- set of measures for some parts that share a measure structure -->
<measures>
<!-- define all the parts that share this structure -->
<part id="p1" style="y: above;">
<part-name>Voice</part-name>
<instrument-sound>voice.aa</instrument-sound>
</part>
<part id="p2" style="measure-numbering: none;">
<part-name>Piano</part-name>
<instrument-sound>keyboard.piano</instrument-sound>
</part>
<!-- Measure 1 in all parts -->
<measure>
<!-- first, directions common to this measure in all parts -->
<directions>
<tempo bpm="60" value="/4"/>
<time signature="3/4"/>
<key fifths="-3" mode="major"/>
<instruction class="tempo-indication">Andantino</instruction>
</directions>
<!-- next, <part-measure> elements for each part with content in this measure -->
<part-measure part="p1">
<!-- directions for this measure applying only to the vocal part -->
<directions>
<staves number="1"/>
<clef line="2" sign="G"/>
</directions>
<!-- content of this measure for the vocal part -->
<sequence>
<event measure="yes">
<rest/>
</event>
</sequence>
</part-measure>
<part-measure part="p2">
<!-- again, piano part-specific directions for this measure -->
<directions>
<staves number="2"/>
<clef line="2" sign="G" staff="1"/>
<clef line="4" sign="F" staff="2"/>
</directions>
<sequence staff="1">...</sequence>
<sequence staff="2">...</sequence>
</part-measure>
</measure>
<!-- Measure 2 in all parts -->
<measure>
<!-- (If there were directions common to both parts, they'd occur here) -->
<part-measure part="p1">
<directions>...</directions>
<sequence>...</sequence>
</part-measure>
<part-measure part="p2">
<directions>...</directions>
<sequence staff="1">...</sequence>
<sequence staff="2">...</sequence>
</part-measure>
</measure>
</measures>
</cwmnx> The approach to encoding a polymetric score is very straightforward: such a score includes multiple Pros:
Cons:
|
@joeberkovitz: nice thinking, I like it :-) However, in polymetry, unfortunately there is another "con" in your proposal: where/how would we indicate system-brakes / page-flows? |
@joeberkovitz and @bhamblok : I like very musch your proposals. The latest proposal from joeberkovitz does not solve the problem of encoding common directions for all parts (i.e. page breaks or system breaks) for polymetric music. The approach suggested by bhamblok of using measure-fractions is much better to find a unified solution for all score types: normal scores (single time), polymetric and no-metric scores. The bias to preserving the measure element without any supporting use cases may be the root of current problems. By using measure-fractions:
The measure-fraction elements provide feasible break points, so this simplifies line breaking algorithms for music not based on measures and could be and advantage for free flow layouts. Current algorithms must first identify suitable places for breaks an classify them by 'goodness' (i.e. for polymetric, better choose places with barline in all parts). |
The co-chairs discussed this issue today at length. We recommend that the discussion focus on comparing the two alternatives that we feel are most viable:
In both of the above cases, directions that are shared by all staves of the music can be flagged as such via a specific attributes. This is only an issue for polymetric content, and we are not sure what sorts of directions would even be shared in such scores given the differences in measure layout, but it feels like more of an edge case than a central concern driving the design of the encoding. We do not feel the following approaches are viable:
|
Wonderful. Can I suggest that when numbering elements MNX distinguishes consistently between something like <measure sequence="12"> which means the 12th (or 13th if we decide to do 0-indexed sequence) and something like <measure number="12"> which means the measure that a musician would consider measure 12 (pickup measures, 1st/2nd endings, a score fragment beginning in media res etc. may interfere with this). It's possible that we might often see things like |
In MusicXML 3.1 we use |
@mscuthbert Yes, that's an excellent improvement (since this would be indeed a sequence number and not a musically-oriented number). |
Just to clarify -- is the "number attribute which must sequentially number all measures" to be called "sequence" not number, which would be reserved for the numbering as musicians use? |
@mscuthbert my bad; I've edited the comment above to reflect the use of |
Note comments in #81: changed |
In the course of putting together PR #81 it became apparent that sparse encoding of measures could increase the effort for a consumer implementation to determine the actual makeup and length of the score. All parts must be decoded in full to discover the actual location of the last measure, since any part could always include Given this, do people have any second thoughts about sparse encoding? Placing back into Active Review to make sure. |
If this is truly a concern, I say we specify an optional(?) "max-measure-index" attribute as a courtesy to consuming implementations. For our current attempt to pin down the "standard" profile, we only need this attribute at the global level, since all parts are guaranteed to have the same number of measures, but eventually we'll need it at the part level to override for when we are allowing un-aligned measures. I think that the advantage in reading and writing of being able to skip measures where nothing is happening overrides the concern about the max measure number. |
I think the idea of providing a maximum is a very useful direction. I'd just prefer to see it required, rather than optional. This particular spec editor has a strong bias against courtesies -- having learned from experience that it leads straight back to the unpredictability that we're all trying to purge. It could go right into |
OK, then required number. But, now that I'm thinking more, it should be measure count, not max index number (unless we are restricting the index numbers so that they start at 1 and never skip, so that some part has to reference each index number). And we should be specific as to whether "pick-up measures" count as a measure. |
Good points. To clarify:
Pick-up measures absolutely do count in this sequence, because we're being clear that this has nothing to do with the user-visible numbering of measures (see PR #81 for the detailed language). |
Measures:
I never had to do with such compositions but I think, that this is the only resonable way of counting. |
Another possible way of counting could be
or even:
in either case, giving unique indexes for each measure item that has individual properties. |
@mscuthbert These alternatives are feasible, but seem overcomplicated. The "namespace" for counting measures is only the set of global and part elements that share the same structure. Starting at 1 and counting up is easy and it works, since there cannot be collisions between measures in disjoint structures. |
@joeberkovitz gotcha -- does this mean that if there's one case of non-aligned measures in a part that the part must have its own separate set of |
@mscuthbert I think so... but an example would be good to make sure. There might be a case for allowing a part to elide some measures from its layout without changing the overall structure. If so then I would suggest it's a different issue. |
Here's another alternative to throw out about the guess-the-score-length problem: require a |
I could be mistaken, @joeberkovitz , but I believe that your newest suggestion might be harder to validate, and otherwise be functionally equivalent to adding a measure-count attribute. |
You could call me tenacious, but ... :-) |
Chairs: today we decided to remove the sparse-encoding feature from this issue as this facet of the change was generating too much controversy and needs further thought, so fixing it here was overstepping. Note that #52 already tracks that issue. |
Instead of placing within
<measure>
elements within<global>
, should system notations be placed in individual parts and tagged in some way, perhaps via ascope="global"
attribute or something similar?This would avoid the problem of the
<global>
or similar element being very sparse with most measures containing nothing.However, this approach could scatter system notations throughout the score in a happenstance way, since there is no particular part that makes sense for them to belong to.
While they could be forced to be placed in the first part, this leads to ambiguities as sometimes the first part is not visible on all systems. In MusicXML, the result is that system notations tend to appear in the topmost visible part, which varies unpredictably from score to score.
The text was updated successfully, but these errors were encountered: