- From: James Ingram <j.ingram@netcologne.de>
- Date: Mon, 3 Apr 2017 13:00:01 +0200
- To: public-music-notation-contrib@w3.org
- Message-ID: <7bd61962-2afb-cc98-8786-d304e7b38fe3@netcologne.de>
Hi Glenn, This discussion of application internals may look a bit private, but I think this CG needs need to explore the needs of /all/ its app developers, not just the big commercial ones. I'm currently leaning towards the inclusion of <measure> in MNX (see below). Glenn said: > [...] if [...] no or few known program's internals use measure as a > container, why should MNX? It would only add complication to programs > that don't. I don't think the complication would actually be very great. Its just a case of having another level of looping in the parsing function. On the other hand, including <measure> might considerably simplify the parsing for some applications. Imagine trying to parse my measure-free SVG format to create a list of <measure> objects! I think we'll just have to wait and see how the commercial vendors want to do this. Glenn again: > My internal data structure is time based, rather than graphics > based... all items across a system are grouped if they "sound" > concurrently (of course, rests don't exactly sound). I call these > items "syllables", derived from the "hunk of lyrics" that is > associated with some of them [...]. I'm not sure that I understand you correctly. Is the following correct?: 1. The top level of your internal data structure is a list of *system* objects. 2. Each *system* contains a list of *syllable* objects. 3. Each *syllable* a) occurs at a particular time and b) contains a list of concurrent *item*s. Presumably, the *syllable* happens at a time relative to the *system*, and the *system* happens at a time relative to the performance. The duration of a *system* is the duration of its list of *syllable* objects. So each *syllable* has a duration (including the last one on the list). At this point, your *syllable* is sounding rather like what I call a *<score:midi>* object in https://github.com/notator/Moritz/issues/3 But then you say that a *syllable* can contain a "hunk of lyrics". Is that a recording (something temporal), or do you mean a string of text? If you mean a string of text, then I think your *syllable* has to be extended to contain a graphics component. In other words, it becomes equivalent to an MNX <event> symbol (if such <event>s contain both graphics and temporal info). Is that correct? Did I get something wrong? If I'm right, then you should have no trouble reading MNX <event> symbols into your internal data structure. > Note that performance directives that change the sequence of play > (repeats, D.S., D.C., Coda, etc.) prevent the sequence from being 100% > temporally ordered. The arrow of time is notoriously inexorable! :-) Apropos repeats, D.S., D.C Coda etc.: In my proposal, <event> symbols have a duration that is independent of their absolute temporal position. Global time is just the result of adding such durations. If <event>s are repeated later in a performance, their durations just get added again. Since I'm allowing particular <event> symbols to contain multiple temporal interpretations, its quite conceivable that a repeat of the graphics would use a different interpretation. Real performers never play the same thing twice... All the best, James Am 03.04.2017 um 04:27 schrieb Glenn Linderman: > Given James' and Cecelio's discussion of internals, I'll go ahead and > roughly describe my internals. Of course, it is not necessary that the > XML map directly to anyone's internals, it is expected that everyone's > internals will be different, for different goals and purposes. On the > other hand, if there be no or few known program's internals use > measure as a container, why should MNX? It would only add complication > to programs that don't. > > As you might expect from my lead-in paragraph, my program (not public, > but has been used to create over 30 books of music and lyrics) does > not use measure as a container. > > Neither does it use any graphical structure as containers, such as > James describes regarding pages, systems, lines, and movements. > Rather, pages and lines are scattered about where needed in the > temporal order, in a manner similar to, and sometimes independent of, > the locations of barlines (as James describes, sometimes it might be > that a measure cannot fit on a line, but more often the case is that > in fitting music to book form, that certain measures are broken to > assist in the layout). > > My internal data structure is time based, rather than graphics > based... all items across a system are grouped if they "sound" > concurrently (of course, rests don't exactly sound). I call these > items "syllables", derived from the "hunk of lyrics" that is > associated with some of them, but it probably isn't the best name... I > just never took time to discover or create a better term (suggestion > welcome). > > Into this temporally linear data structure of notes, rests, barlines, > and performance directives, then, additional "syllables" are inserted > for layout purposes (which I call layout syllables), and they contain > sufficient information regarding the page layout, the need for clefs > and signatures, system connectors, and margins in both dimensions. > There is generally at least one layout syllable per line of graphical > music. > > I don't claim this is the best structure for all purposes, but it has > been generally satisfactory for my use for the last 34 years. > Initially a binary structure, I have converted it to compressed JSON > in more recent times, finding paired XML keywords generally more > distracting than helpful, but as an interchange format XML probably > has more mature tools for schema description and validation (although > such tools could be written for JSON, and maybe have been, unknown to > me). > > Note that performance directives that change the sequence of play > (repeats, D.S., D.C., Coda, etc.) prevent the sequence from being 100% > temporally ordered. Playback simply follows the directives, > accumulating key points (begin movement, begin repeat, Segno, Coda) > which may be return points as they are discovered, and treating the > others (end repeats, D.S., etc.) as a go to... just like a human > player would, given the printed notation. > > > > On 4/2/2017 10:29 AM, James Ingram wrote: >> I'd like to add a couple of points: >> >> 1. My measure-free solution for SVG instantiations is not an argument >> for leaving measures out of MNX. >> My authoring software (which would be an MNX /client/) uses measures >> internally, so that its easy to concatenate them for particular system >> layouts. It might be better to make it easy for such apps to construct >> an internal structure consisting of a flat list of measures, so that >> they can then give their users the choice of where the system breaks >> should go. Such a container hierarchy might be: >> page-->system-->measure-->staff-->voice-->event. >> (I still think that MNX containers should be /graphically consistent/ >> containers.) >> It would be possible, using this hierarchy, to write a valid MNX file >> containing a single measure that would not fit on any available page. >> (MNX has no idea how big the page is going to be.) In such a case, the >> MNX client app has to be able to break the measure anywhere its user >> thinks would be a good idea. That's just a problem for the app, its not >> the MNX format's problem. The app can then export SVG (maybe in a format >> like the one I outlined) or a new MNX file. The MNX for this "one >> measure score" would have one measure per system, and all the final >> barlines except the last would be missing (or invisible...). >> >> 2. Note that this is all has /only/ to do with the graphics. (The way >> the score /looks/.) Any temporal information contained by an event >> symbol just moves with its container, and can be concatenated across a >> particular voice to describe a continuous stream. On the graphic level, >> annotations such as time-signatures, tempo markings, tuplet brackets, >> augmentation dots, staccato dots etc can be added ad lib., but a >> complete description of what they all /mean/ will still just be stored >> in the event symbols. >> >> 3. Please excuse my frequent use of "bar" to mean "measure". I actually >> prefer the UK-English terms, since bars are just objects in space (that >> are aids to legibility). Nothing is actually being "measured". Similarly >> for the duration class names: a crotchet was originally a hook-shaped >> object -- its not a quarter of anything... :-) >> >> All the best, >> James >> >> >> Am 02.04.2017 um 16:04 schrieb cecilio: >>> Glen has raised an interesting alternative: allowing barlines to be >>> notated, rather than thinking of measures as containers. >>> >>> In fact, that is exactly the solution I use in my software >>> LenMus/Lomse. It allows a uniform treatment of single metric scores, >>> measure-free scores and, not yet mentioned, *multi-metric music*. But >>> I'm not defending this solution. I would like just to raise the need >>> for careful thinking about the a clean MNX solution not relaying on >>> 'tricks' such as: >>> >>> - non-controlling barlines for CWMN multi-metrics music. >>> - hidden measures / barlines for CWNM measure-free music. >>> >>> Multi-metric music is also related to the issue of notating barlines >>> at <system> level or at <part> level, raised in another post. >>> >>> In my experience it is, perhaps, simpler to deal with a solution based >>> on measure containers (with an special measure container for >>> measure-free scores). But to deal with multi-metrics and measure-free >>> scores I have cosen a solution based on notating barlines as staff >>> objects and not using measure containers gives more flexibility and >>> is, IMO, more 'natural'. Anyway, I'm not defending this solution. I >>> just tried to take into consideration the need for a clean solution in >>> MNX for multi-metric and measure-free scores. >>> >>> Cecilio >>> >>> On Sun, Apr 2, 2017 at 1:31 PM, James Ingram <j.ingram@netcologne.de >>> <mailto:j.ingram@netcologne.de>> wrote: >>> >>> Hi Dennis, Glenn, all, >>> >>> Welcome Dennis! This is getting very interesting! :-) >>> >>> My own version of the container hierarchy was created from first >>> principles, and does exactly as Glenn suggests: It treats barlines >>> simply as notated lines. They are graphical aids to /legibility/ >>> rather than being musically structural. They just chunk areas of >>> the page to make reading easier. >>> >>> For discussion purposes, here's my reasoning: >>> >>> My outermost container is the *page* (an <svg> element in an SVG >>> document). Printable pages have finite width and height. So do >>> computer screens. It is possible to scroll pages on a screen, >>> either horizontally or vertically, but scrolling very wide pages >>> horizontally is strangely disorienting. System breaks are >>> reassuring, and aid to legibility. So my *page* containers always >>> have a /width/ that should fit on a computer screen. The authoring >>> software can decide which screen width the score is written for. >>> >>> (From here on, I'm simplifying a bit, for the sake of getting the >>> principles across.) >>> >>> The next container level down (inside *page*) is the *system*. >>> Systems stack vertically on the page with margins to the left and >>> right. System containers contain *staff* containers and >>> *staffConnector*s. >>> >>> A *staff* has the width of the system. A *staffConnector* is a >>> vertical line between two staff containers. Staff containers stack >>> vertically inside their system, and contain *voice* containers. >>> >>> A *voice* container has the width of its containing staff, and >>> contains a sequence of objects that include *clefs*, *barlines* >>> and *event symbols*. (This arrangement owes a lot to capella's >>> CapXML "noteObject"s. ) >>> My authoring software only draws *barline*s into the first voice >>> in a staff. It might be better to draw barlines a level higher, in >>> the staff container. >>> An advantage of differentiating between barlines and >>> staffConnectors is that they can be styled differently. >>> Stockhausen often wanted to group instrument types differently in >>> this way. For example: In a large score, the staffConnectors >>> between woodwind staves can be the same thickness as the barlines, >>> while the staffConnectors between the woodwinds and the brass can >>> be thinner. >>> >>> XML was invented to be both machine-readable and human-readable. >>> Its a big help, when debugging, to be able to collapse the >>> containers in an XML editor in order to find a particular object. >>> So I think its a good idea to make the XML containers contain >>> everything that belongs graphically inside them. I'd therefore >>> prefer it if <part> elements in MNX ยง5.1.2 were contained in the >>> <system> element. (If I've understood the example correctly.) >>> >>> Note that my version of the container hierarchy is based strictly >>> on /graphical containment/. The old problem of moving notes from >>> bar to bar is still there, but it has become a problem of moving >>> notes from system to system. >>> Note also that the /temporal definition/ of a tied symbol goes in >>> the first event symbol. All the rest (tie, tied symbols) is just >>> graphics. >>> >>> All the best, hope that helps, >>> James >>> >>> >>> >>> Am 02.04.2017 um 01:20 schrieb Glenn Linderman: >>>> Dennis raises a valid point, though... does a measure have to be >>>> a container at all? A measure extends from one bar to the next, >>>> but the sequence of notes and bar lines can be thought of as a >>>> exactly that, a sequence, rather than a containment concept. As >>>> has already been mentioned, sounded notes can escape the >>>> containment by being tied across bar lines. Further, shifting >>>> things from one measure to the next may be far easier by moving >>>> the bar lines in the sequence rather than moving notes from one >>>> container to another. So there are some merit to simply allowing >>>> bar lines to be notated, rather than thinking of measures as >>>> containers (either in the logical or XML sense of containment). >>>> >>>> On 4/1/2017 12:05 PM, Joe Berkovitz wrote: >>>>> Hi Dennis, >>>>> >>>>> Speaking as a composer, "one big measure" is still some >>>>> sort of >>>>> container and >>>>> therefore incorrect. I have not understood in these >>>>> discussions and in >>>>> existing software why the measure must be the basic >>>>> consideration >>>>> in encoding >>>>> information. >>>>> >>>>> >>>>> If we used a <measure> element in this way, it would be just a >>>>> "container of convenience" to hold a series of events and >>>>> would not >>>>> imply a notated measure. We'd want to figure out a way to make >>>>> sure that >>>>> this understanding was part of the encoding. I wish I had not >>>>> used the >>>>> term, "one big measure": I simply meant, one big container. It >>>>> may make >>>>> sense to name the element differently in this case -- that, too, >>>>> is up >>>>> for discussion. >>>>> >>>>> Truly, there's no claim here that measures are a basic >>>>> consideration in >>>>> encoding music. Where measures exist and the composer notated >>>>> them, >>>>> though, I think it's reasonable to include them in the encoding >>>>> as part >>>>> of what the composer chose to express. Where the composer didn't >>>>> do so, >>>>> then the encoding can say that too. >>>>> >>>>> With respect to the other generalities that you talked about, I >>>>> think >>>>> we're envisioning that MNX will *also* include a culturally >>>>> neutral >>>>> encoding approach based entirely on graphics and time, and that >>>>> this >>>>> will provide an escape valve for the many notation systems that >>>>> don't >>>>> fit the 1600-1900 model. The emphasis you see in the CG's work >>>>> right >>>>> now, in no way excludes our taking up a more general approach as >>>>> our >>>>> resources and time allow. >>>>> >>>>> I don't feel there is a "tendency to create a [traditional >>>>> Western] >>>>> system". It's just that there is a large proportion of CG members >>>>> writing applications that work within this system. Our present >>>>> priorities merely reflect the makeup of the group. And they are >>>>> just >>>>> priorities, not decisions about what notation is or is not. I >>>>> look >>>>> forward to having the time to devote to thinking through the more >>>>> general graphical/temporal approach as well. >>>>> >>>>> Best, >>>>> ...Joe >>>>> >>>>> >>>>> Music proceeds. If a measure-based composition is encoded, >>>>> then >>>>> apply the >>>>> markers that determine these aspects (barlines, time >>>>> signatures, etc.). >>>>> Dumping the measure, it seems to me, relieves all the >>>>> struggles with >>>>> time >>>>> signatures (such as 4/3 or 3/7) and, of course, notation >>>>> systems old >>>>> and new >>>>> that don't use measure-like divisions at all. If a >>>>> time-based system is >>>>> encoded, then the container, if you need one, can be the >>>>> second. If an >>>>> instrument-exchange based system is encoded, the container >>>>> (again, >>>>> if you need >>>>> one) is the exchange division. If the answer is 'none of the >>>>> above', >>>>> then the >>>>> encoding system should be required to respect the music -- >>>>> first. >>>>> >>>>> With no measure container, for example, having a continuous >>>>> staff >>>>> that changes >>>>> as needed (containers, no containers, switch to time-based, >>>>> directional, all >>>>> on the fly) also frees the encoded notation from straight, >>>>> horizontal lines >>>>> (meaning no trouble encoding Wolff or Stockhausen). >>>>> >>>>> I'm not a coder anymore, but I see a tendency to create a >>>>> system that is >>>>> driven by Western music 1600-1900. Don't we already have >>>>> plenty of >>>>> systems >>>>> that do that? It seems to me that any new system that >>>>> depends on that is >>>>> either mostly redundant or, with respect to the continuing >>>>> development of >>>>> music, destined to fail. >>>>> >>>>> So can the measure 'container' please be scrapped? >>>>> >>>>> Dennis >>>>> >>>>> >>>>> >>>>> >>>> >>> >>> >> >
Received on Monday, 3 April 2017 11:00:38 UTC