-
Notifications
You must be signed in to change notification settings - Fork 18
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
Add support for multi-bar rests #284
Comments
I notice that none of these match my proposal for multimeasure rests in #121(comment) and I was wondering why. It was already tuned for our recent changes in #185 except for including all the layouts in a Obviously, I'm advocating for keeping the multi-measure-rest info in the Here's my proposal, based on your example, rather than the one we were using in #121. As an aside: Please note that in all your examples, we will need Option 2A:
Notes on the attributes:
--Christina |
Following our discussion in our co-chairs' meeting today, a few thoughts from me: My preference of these four proposals would be for option 1. Option 2 is a little redundant (there's no particular reason to tie the multi-bar rests to a system specifically, since it seems fine to encode them based on their starting bar number and the number of bars included within, which really has no relevance either to the system or to the page). Options 3 and 4 feel wrong to me because multi-bar rests by their nature have to take into consideration the totality of the instruments/staves that are visible in the layout. Consider the case that you want to show a part layout for, say, violins 1 and 2 together (commonly done in film/commercial music so that the conductor can make balance changes on the fly from the stand). If the multi-bar rests for voilin 1 and 2 are encoded in So this feels wrong to me, since by encoding the information in the This, I think, means that the only practical approach is to encode multi-bar rests in layouts, since only layouts know which parts are going to be included, and can therefore encode the multi-bar rest ranges correctly. I take slight issue with @clnoel's assertion that multi-bar rests are unambiguously at the level of staves. If you have a multi-staff instrument, such as a piano, you would never see a multi-bar rest in the right-hand staff but not in the left-hand staff, for example. And, indeed, as my example above where you have multiple instruments in the same layout demonstrates, they cannot even be correctly encoded at the level of an instrument (or part, in MNX parlance), because you may have multiple instruments in the same layout, and the multi-bar rests must take into account the music belonging to all of the instruments in the layout. So I think it is in fact correct to say that multi-bar rests do live at the layout level, and that they apply to all staves in the layout, regardless of whether they belong to the same or different instruments. I would therefore propose that we follow option 1. |
I will take your word, @dspreadbury , that the only time multibar rests are used are when all instruments visible on a particular system are resting, or at least that that's the only case we want to cover right now. In this case, my option 2A becomes even easier, because you don't have to specify which staff is doing the multi-measure rest because they all are. We should not need a new layout, as in option 1, because we are not changing which parts are on which staves. |
My preferences:
|
Thus far, the It looks like I might be outvoted, but I strongly believe that a multibar rest is a piece of horizontal information that belongs in the @cecilios Parsers with no paging that care about how multiple parts combine on one stave (such as whether they are chorded or split-stem) at different times are still going to have to parse the page/system information in order to extract that information under our current spec, as this will be the most common usage of the |
@clnoel Probably I overlooked the need to parse the page/system information. My main concern is not about parsing but about exporting pages and systems information. In MusicXML it is not mandatory to export that information, you can inform about it ( I would like to avoid that when adding support for MNX in such applications they will be forced to having to export page and systems breaks, perhaps fictitious. Nevertheless, I do not understand why to tie multi-measure-rest to systems. A fifth alternative, in line with your proposal, would be to create a specific block for this information. It is perhaps the simplest approach that satisfies all objectives :
Edited: To fix the |
You know what, I could get behind that. Let's call it option 2B. |
Oooh, I like that last proposal from @cecilios. Create a It also means you can define multi-bar rests without needing to define I just have two suggestions/questions:
So with those two things in mind, I'd amend the @cecilios proposal to look like this: <layouts>
<system-layout id="PartAAlone">
<staff-layout>
<part-layout part="PartA" />
</staff-layout>
</system-layout>
<system-layout id="PartBAlone">
<staff-layout>
<part-layout part="PartB" />
</staff-layout>
</system-layout>
</layouts>
<score name="Full score">
<page>
<system measure="1"></system>
<system measure="5"></system>
</page>
</score>
<score name="Part A" layout="PartAAlone">
<multibar-rests>
<multibar-rest start="3" duration="2" />
</multibar-rests>
</score>
<score name="Part B" layout="PartBAlone">
<multibar-rests>
<multibar-rest start="1" duration="2" />
<multibar-rest start="5" duration="2" />
</multibar-rests>
</score> This includes the |
An update — @mdgood has suggested that we call the element |
@adrianholovaty I agree with your proposed changes. Staff is not needed and I don't see the need to use measures locations as the whole measure is a rest. I copied the |
Do we need a Details/Extra Info: I'm thoroughly behind dropping the staff attribute. I was going to mention it myself, then I forgot. Sorry. We can certainly revisit an optional staff attribute here, but I don't see that being needed for v1. I am pleased about switching to |
@cecilios and @clnoel — thanks for the quick reactions! OK, I will go ahead and put a pull request together with this approach. @clnoel Regarding a |
Here are a few proposals for how MNX can handle multi-bar rests. As you'll see, there are some open questions around where this data should live and how much flexibility MNX should provide.
We'll use the following music in each example. It consists of a full score, plus two individual parts:
Some things to note, before I get into proposals:
<part>
when referring to the contents of the MNX<part>
element (which contains the semantic notation data for a given instrument and is in turn used when generating the full score and parts).Here is the basic MNX document for this notation data, excluding any multi-bar rest information:
Note that there are three
<score>
elements to represent the three different views of the music — "Full score", "Part A" and "Part B".With that preamble out of the way, here are the proposals...
1. Put multi-bar rests in
<part-layout>
Here, we invent a
<multibar-rest>
element, as a child of the existing<part-layout>
element (see here). This puts the multi-bar rest information solely within our existing layouts system.Using the power and flexibility of our layouts system means that you can create any kind of multi-bar rest you want for any
<part>
, and the data is all nicely contained in the<layouts>
section of the document.The downside is the complexity and verbosity. Any multi-bar rest would effectively need its own
<system-layout>
, which would get verbose quickly and would go against the spirit of making layouts reusable.2. Put multi-bar rests in
<system>
With that in mind, could we put the multi-bar rest data within
<score>
in a way that doesn't require us to use a layout?In this second proposal, we invent two elements,
<system-part>
and<multibar-rest>
. The idea is that<system-part>
contains semantic data about a specific<part>
in a specific<system>
; this is distinct from layout data.With this approach, we don't need to create layouts simply for the purpose of encoding multi-bar rests. It also gives us a firm place to attach other part-specific information of this kind (though I can't think of any examples...).
The downside is that the concepts of "part-specific semantic data" and "part-specific layout data" are very conceptually similar, to the point where it feels a bit obtuse to make a distinction. I could envision this being a point of confusion for MNX users: "Why is some of the information in
<system-part>
while other information is in<part-layout>
?"3. Put multi-bar rests in
<measure>
What if we allowed ourselves to add multi-bar rest data directly within
<part>
? At first thought this might seem like it's mixing semantics with presentation, because<part>
is intended to be "pure" semantic notation data — but the locations of multi-bar rests are semantic.Here,
<measure>
elements within<part>
get amultibar-rest
attribute, whose value is the length of the multi-bar rest that begins in that bar. By default, this data is ignored. But a<part-layout>
can opt in to using this data viamultibar-rests="on"
.This has a certain elegance (and I'm partial to it because the Soundslice data format works this way).
The downside is the lack of flexibility. For each
<part>
, there can only be one arrangement of multi-bar rests. So it would be impossible to create multiple<score>
s with each having different locations of multi-bar rests for the same<part>
.Is this a dealbreaker? How common is it for the same underlying notation data to have different configurations of multi-bar rests in different contexts? I have the feeling that's a rare situation, but I'd like to get feedback from people in the trenches.
4. Put multi-bar rests in
<measure>
but make them addressableHere's an attempt to solve idea 3's lack of flexibility. Instead of a boolean "multi-bar rests are either available or not for this particular
<measure>
", a multi-bar rest is given aclass
attribute. Then a layout can "opt into" any multi-bar rests of a certain class.This feels a bit harebrained to me to be honest, but I'm just exploring the problem space. Perhaps there's something here worth salvaging.
Concluding questions
Do any of these ideas resonate with you? Other proposals are also welcome!
And I'm especially interested in people's answers to the question I posed in idea 3. Is it good enough to limit each
<part>
to a specific set of multi-bar rest locations, or do we need to offer more flexibility?Finally, if any developers of music-notation software want to share the details of their data model for multi-bar rests — what's worked and hasn't worked — that would be very valuable.
The text was updated successfully, but these errors were encountered: