So how might it look using "key=value" and still trying to be easy to parse, backward compatible, etc. Again I'm going to write examples +explanation rather than BNF because I feel it helps debate at this stage.
% In file header (ONLY in file header so as to keep BarFly happy) Q:Allegro con moto=130 Q:Allegro = 120 Q:Skipping =105 Q:tres lentement= 40 % je n'ai pas d'accent grave ici, je m'excuse %In tune header or in tune itself M:beat=1/4 Q:Allegro M:beat=3/8 Q:skipping In the definition form of Q: it must occur in the file header and the first thing after Q: is not a number. For backward compatibility the thing defined must not be a single letter (because Q:C=130 already has a meaning. After that everything up to = is the name of the thing to be defined. It can contain any character except linend, % or =. [Open question do we take the escape and allow "\%", "\=", "\n" and "\\" to represent "%", "=", linend and "\" ? It gives complete freedom of what we can write, but it dirties up the parsing for little real gain]. For future discussion I will refer to the parts as Q:<TempoName>=<TempoValue> Note that old software will probably barf because it looks nothing like an old Q: line, but so what? It's meaning is also nothing like an old Q:. TempoName is to be case insensitive (so that QUICK, quick and Quick, or even qUIcK all represent the same name). Any leading or trailing blanks are to be discarded, otherwise no changes are allowed, so "con moto" is *not* the same as "con moto". TempoValue is always to be a single number which is the number of beats per minute. This is apparently a regression towards the older style (like Q:120) as opposed to the newer style (like Q:1/4=120), but now M:beat=3/8 is introduced. This allows 120 to mean "Allegro" whether the piece is in 6/8, 4/4, 2/4, 2/2, or whatever. [Open question - should there be a default if no "beat" is defined or should the program barf and complain that Q:quick is meaningless without a beat?] (I thought of the syntax Q:name="Allegro con moto" value="130" but I rejected it). Actions to be taken by programs [sorry! sorry! "what the notations really mean"]. These are for tune header or tune body only: Q:Allegro Player programs start playing at the previously defined Allegro rate. Printing programs print Allegro. <weasel words here to explain that I really want to describe meanings not actions, but it was easier and shorter that way> Q:display=Quasi allegro Player programs take no action, printing programs print "Quasi allegro" Q:1/4=60 display=Allegro Player programs play at 1/4=60, printers print Allegro <looks like beat =1/8> Q:1/4=60 display= Player programs play at 1/4=60, printers don't do anything. Q:1/4=60 Player programs play at 1/4=60, printers print something sensible e.g. .|=60 Q:Allegretto display=very slowly Yes, it's silly but it's impossible to ban it. That's probably enough to argue about. If it seems to be acceptable then we can cook up some more formal syntax. Laurie To subscribe/unsubscribe, point your browser to: http://www.tullochgorm.com/lists.html
