texlive[46169] Build/source/utils: autosp-2017-12-26

commits+kakuto at tug.org commits+kakuto at tug.org
Sat Dec 30 23:19:20 CET 2017


Revision: 46169
          http://tug.org/svn/texlive?view=revision&revision=46169
Author:   kakuto
Date:     2017-12-30 23:19:20 +0100 (Sat, 30 Dec 2017)
Log Message:
-----------
autosp-2017-12-26

Modified Paths:
--------------
    trunk/Build/source/utils/README
    trunk/Build/source/utils/autosp/ChangeLog
    trunk/Build/source/utils/autosp/autosp-src/ChangeLog
    trunk/Build/source/utils/autosp/autosp-src/Makefile.am
    trunk/Build/source/utils/autosp/autosp-src/Makefile.in
    trunk/Build/source/utils/autosp/autosp-src/README
    trunk/Build/source/utils/autosp/autosp-src/autosp.1
    trunk/Build/source/utils/autosp/autosp-src/autosp.c
    trunk/Build/source/utils/autosp/autosp-src/autosp.test
    trunk/Build/source/utils/autosp/autosp-src/compile
    trunk/Build/source/utils/autosp/autosp-src/configure
    trunk/Build/source/utils/autosp/autosp-src/configure.ac
    trunk/Build/source/utils/autosp/autosp-src/depcomp
    trunk/Build/source/utils/autosp/autosp-src/install-sh
    trunk/Build/source/utils/autosp/autosp-src/rebar.test
    trunk/Build/source/utils/autosp/autosp-src/tests/quod2.tex
    trunk/Build/source/utils/autosp/configure
    trunk/Build/source/utils/autosp/configure.ac

Added Paths:
-----------
    trunk/Build/source/utils/autosp/autosp-src/tests/quod4.aspc
    trunk/Build/source/utils/autosp/autosp-src/tex2aspc.1
    trunk/Build/source/utils/autosp/autosp-src/tex2aspc.c
    trunk/Build/source/utils/autosp/autosp-src/tex2aspc.test

Modified: trunk/Build/source/utils/README
===================================================================
--- trunk/Build/source/utils/README	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/README	2017-12-30 22:19:20 UTC (rev 46169)
@@ -10,7 +10,7 @@
   see http://tug.org/texlive/build.html#asymptote
   and tlpkg/bin/tl-update-asy
 
-autosp 2017-07-14 - checked 26jul17
+autosp 2017-12-26 - checked 29dec17
   http://ctan.org/pkg/autosp
 
 devnag - from devanagari package installed in texmf-dist.

Modified: trunk/Build/source/utils/autosp/ChangeLog
===================================================================
--- trunk/Build/source/utils/autosp/ChangeLog	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/ChangeLog	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,3 +1,8 @@
+2017-12-30  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	* Import autosp-2017-12-26
+	configure.ac: Adapted.
+
 2017-07-26  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	* Import autosp-2017-07-14

Modified: trunk/Build/source/utils/autosp/autosp-src/ChangeLog
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/ChangeLog	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/ChangeLog	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,8 +1,22 @@
 AUTOSP
 
-  Determination of automatic spacing for accidentals simplified
-  Many comments corrected and expanded
+2017-12-21
 
+  Allow for new commands \nqq, \nqqq, \hap and \happ.
+  Allow for single-note xtuplet.
+  Handle restbars > 1 in process_xtuplet or process_appogg
+
+2017-10-10
+
+  Corrected nastaffs setting for \startpiece and \startextract.
+  Introduced vspacings_active[i] to suppress unnecesary added spacing for 
+    accidentals.
+  Applying TransformNotes to bar_rest output.
+
+2017-07-14
+
+  Automatic added spacing for all collective-coding accidentals.
+
 2017-06-21
 
   Support for global skips within collective-coding

Modified: trunk/Build/source/utils/autosp/autosp-src/Makefile.am
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/Makefile.am	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/Makefile.am	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,16 +1,17 @@
-bin_PROGRAMS = autosp rebar 
+bin_PROGRAMS = autosp rebar tex2aspc
 autosp_SOURCES = utils.h utils.c autosp.c 
 rebar_SOURCES = utils.h utils.c rebar.c
+tex2aspc_SOURCES = utils.h utils.c tex2aspc.c
 AM_CFLAGS = -O4 -ansi -Wall -Wextra -pedantic-errors
-dist_man_MANS = autosp.1 rebar.1 
+dist_man_MANS = autosp.1 rebar.1 tex2aspc.1
 ## Tests
 ##
-TESTS =  autosp.test rebar.test 
+TESTS =  autosp.test rebar.test tex2aspc.test
 
 EXTRA_DIST =
 EXTRA_DIST += $(TESTS)
 DISTCLEANFILES =
 
-EXTRA_DIST += tests/quod2.aspc tests/quod2.tex  tests/quod3.aspc 
-DISTCLEANFILES += quod2.* quod3.*
+EXTRA_DIST += tests/quod2.aspc tests/quod2.tex  tests/quod3.aspc tests/quod4.aspc 
+DISTCLEANFILES += quod2.* quod3.* quod4.*
 

Modified: trunk/Build/source/utils/autosp/autosp-src/Makefile.in
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/README
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/README	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/README	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,5 +1,5 @@
 This is the README for the autosp package, 
-version 2017-06-21.
+version 2017-07-14.
 
 autosp is a preprocessor that generates note-spacing
 commands for MusiXTeX scores. It simplifies the creation

Modified: trunk/Build/source/utils/autosp/autosp-src/autosp.1
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/autosp.1	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/autosp.1	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,5 +1,5 @@
 .\" This manpage is licensed under the GNU Public License
-.TH AUTOSP 1 2017-07-140  "" ""
+.TH AUTOSP 1 2017-12-19  "" ""
 
 .SH NAME
 autosp \- preprocessor to generate note-spacing commands for MusiXTeX scores
@@ -136,9 +136,10 @@
 the non-standard command \\Cpause in a note segment also generates a
 bar-centered rest.
 
-Spacing commands \\sk and \\hsk in the source are discarded
-(but not \\qsk, \\tqsk, \\hqsk or \\qqsk);
-however,
+Spacing commands \\sk and \\bsk in the source are discarded,
+but not "small" skips \\hsk, \\qsk, \\tqsk, \\hqsk or \\qqsk,
+or the small "backward" skips \\hbsk, \\bqsk, \\btsk, or \\bhsk.
+Moreover,
 non-standard commands
 \\QQsk, \\HQsk \\TQsk and \\Qsk in the source generate "global" skips; i.e., the effect of \\qqsk, \\hqsk, \\tqsk or \\qsk, respectively,  in 
 .I every 
@@ -146,17 +147,21 @@
 
 Global skips may also be obtained within collective-coding sequences by using
 up to four successive commas 
-to get the effects of \\qqsk, \\hqsk, \\tqsk or \\qsk, respectively,
-as global skips.
-Global skips are 
-automatically inserted before accidentals ('^', '_', '=', '<', '>') on collective-coding notes. 
-If the automatic spacing is insufficient, the spacing may be increased by adding sufficient commas or 
-using a conventional notes command instead of \\anotes.  Automatic skips are 
+to get the effects of \\QQsk, \\HQsk, \\TQsk or \\Qsk, respectively.
+Global skips \\tqsk (or, for double-flats, \\qsk) are 
+automatically inserted before accidentals ('^', '_', '=', '<', '>') on collective-coding notes
+(except when the preceding note is "virtual"; i.e., a skip).
+If this automatic additional spacing is 
 .I not 
-inserted
-for any of the 
+wanted in some context, it may be avoided by
+replacing 
+the accidental in the collective-coding sequence
+by 
+any of the 
 .I explicit 
 accidental commands: \\sh, \\fl, \\na, \\smallsh, \\bigsh, etc.
+If the automatic spacing is insufficient, the spacing may be increased by adding sufficient commas or 
+using a conventional notes command instead of \\anotes.  
 
 
 A note segment can be completely empty, but if a note segment should start
@@ -164,11 +169,14 @@
 of that space must be made explicit with a command of the
 form \\ha{*}, \\qa{.*}, \\qa{*}, \\ca{*}, etc. 
 
-From version 2017-06-14, the effects of \\TransformNotes calls are implemented by the pre-processor. This
+From version 2017-06-14, the effects of \\TransformNotes calls are implemented by the 
+.B autosp
+pre-processor. This
 enables use of 
+musixlyr in
 .B autosp 
-scores
-with musixlyr.tex, which is incompatible with the
+scores; musixlyr.tex 
+is incompatible with the
 musixtnt.tex 
 implementation of \\TransformNotes.
 
@@ -215,6 +223,7 @@
 supports 
 .I x-tuplets 
 introduced using \\xtuplet{\fIx\fP}
+or \\xxtuplet{\fIx:y\fP}
 and 
 .I triplets 
 introduced
@@ -228,11 +237,6 @@
   \\downtuplet
 
 .fi
-However,
-MusiXTeX notation does not 
-specify the 
-.I intended 
-duration of an x-tuplet.
 .B autosp 
 assumes that an x-tuplet is to be played in 
 (\fIx\fP\-1)/\fIx\fP 
@@ -240,23 +244,58 @@
 So, for example, a triplet in eighths is assumed to be played in the time of one quarter note.
 If this assumption
 isn't valid, the x-tuplet must
-be coded explicitly using a \\vnotes command; see the first
+be coded explicitly using a suitable \\vnotes command; see the first
 measure of barsant2.aspc for an example of a non-standard x-tuplet: a 5-tuple 
 of 64th notes with an intended duration
 of 
 .I six 
 64ths.
+
+In some polyrhythmic scores, the \\txt numeral may be displaced, even if the notes
+themselves are correctly spaced. In these cases, it is possible to suppress 
+the normal output of \\txt by using the non-standard commands \\Triolet (no arguments)
+or \\Xtuplet{k}\\
+and placing a numeral at the correct location using \\zcn (i.e., \\zcharnote).
+
 .B autosp
-cannot deal with simultaneous x-tuplets in multiple staffs unless the x values and
-note durations are identical. 
+can deal with simultaneous x-tuplets in multiple staffs provided the x values and
+total note durations are identical.  
 
-User-defined macros are generally not processed or expanded; however, definitions of the form
+In some baroque scores, particularly by J.S. Bach, a beamed sixteenth note is vertically aligned
+with
+the third note of a triplet of eighth notes in another staff (implying that they should
+be sounded simultaneously); e.g.,
 .nf
 
+    \\ibl0L0\\qb0{.L}\\tqql0L
+
+.fi
+would be played as if notated 
+.nf
+
+    \\uptrio{b}10\\ql L\\hroff{\\cl L}
+
+.fi
+The following coding will align the beamed sixteenth note 
+with the third note of a triplet in another staff:
+.nf
+
+    \\ibl0L0\\qb0{.L}\\hbsk\\tqql0L
+
+.fi
+and, similarly, for triplets of sixteenth notes:
+.nf
+
+    \\ibbu0J0\\qb0{.J}\\hbsk\\nqqqu0J\\qb0{.J}\\hbsk\\tqqqu0J
+
+.fi
+Generally, user-defined macros are not processed or expanded; however, definitions of the form
+.nf
+
     \\def\\atnextbar{\\znotes ... \\en}
 
 .fi
-generate definitions that take account of \\TransformNotes.
+generate definitions that do take account of \\TransformNotes.
 
 All staffs are assumed to have the same meter; see kinder2.aspc for
 an example of how to work around this.
@@ -270,9 +309,13 @@
 .SH EXAMPLES
 See files quod2.aspc, kinder2.aspc, geminiani.aspc and barsant2.aspc for scores suitable for input to  
 .BR autosp .
+The program
+.B tex2aspc
+can be used to convert "legacy" MusiXTeX scores to .aspc format.
 
 .SH SEE ALSO
 .BR msxlint (1)
+.BR tex2aspc (1)
 .PP 
 musixdoc.pdf
 

Modified: trunk/Build/source/utils/autosp/autosp-src/autosp.c
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/autosp.c	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/autosp.c	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,4 +1,4 @@
-char version[12] = "2017-07-14";
+char version[12] = "2017-12-22";
 
 /*  Copyright (C) 2014-17 R. D. Tennent School of Computing,
  *  Queen's University, rdt at cs.queensu.ca
@@ -105,7 +105,6 @@
 
 # define PRIVATE static
 
-# define LINE_LEN 1024
 # define SHORT_LEN 256
 # define MAX_STAFFS 9
 
@@ -149,6 +148,9 @@
 PRIVATE int old_spacing = MAX_SPACING;
 
 PRIVATE int vspacing[MAX_STAFFS];       /* virtual-note (skip) spacing        */
+PRIVATE bool vspacing_active[MAX_STAFFS]; /* virtual-note spacing active?       */
+                      /* used to preclude unnecessary pre-accidental skips    */
+
 PRIVATE bool nonvirtual_notes;          
                            /* used to preclude output of *only* virtual notes */
 
@@ -273,6 +275,8 @@
     if (active[i]) status (i);
   status_spacing ();
   fprintf (logfile, "nastaffs=%d\n", nastaffs);
+  if (dottedbeamnotes) 
+    fprintf (logfile, "dottedbeamnotes == true\n");
 }
 
 PRIVATE void
@@ -352,6 +356,7 @@
     { n_outstrings[i] = outstrings[i];
       *n_outstrings[i] = '\0';
       vspacing[i] = 0;  
+      vspacing_active[i] = false;  
       collective[i][0] = '\0'; 
       cspacing[i] = MAX_SPACING; 
       first_collective[i] = false;
@@ -384,7 +389,7 @@
 
 PRIVATE
 void filter_output (int i)
-{ /* discard , \sk \hsk \Qsk \TQsk \HQsk \QQsk and \Cpause */
+{ /* discard \sk \bsk \Qsk \TQsk \HQsk \QQsk and \Cpause */
   char *s = notes[i];
   while (s < current[i])
   { char *t;
@@ -391,12 +396,14 @@
     t = strpbrk (s+1, "\\&|$");
     if (t == NULL || t > current[i]) t = current[i];
     if (!prefix ("\\sk", s)
-     && !prefix ("\\hsk", s)
+     && !prefix ("\\bsk", s)
      && !prefix ("\\Cpause", s) 
      && !prefix ("\\Qsk", s) 
      && !prefix ("\\HQsk", s) 
      && !prefix ("\\TQsk", s) 
-     && !prefix ("\\QQsk", s) )
+     && !prefix ("\\QQsk", s) 
+     && !prefix ("\\Triolet", s)
+     && !prefix ("\\Xtuplet", s) )
     {
       while (s < t) 
       { while (*s == ',') s++; /* global skips */
@@ -442,6 +449,7 @@
     append (outstrings[i], &(n_outstrings[i]), "}", LINE_LEN);
     if (*notes[i] == '}')
     { collective[i][0] = '\0';
+      cspacing[i] = 0;
       notes[i]++;
     }
     if (*notes[i] == '}')  /* close of {\tinynotesize..{}}? */
@@ -504,24 +512,28 @@
       /* commas will be discarded by filter_output (i) */
     if (*s == '.' && new_beaming == 0 && !dottedbeamnotes) 
       spacing = spacing * 1.50; 
-    else if ( (*s == '^' || *s == '_' || *s == '=' || *s == '>') )
+    else if ( (*s == '^' || *s == '_' || *s == '=' || *s == '>') 
+              && !vspacing_active[i]  /* is additional spacing needed? */
+            )
     /* leave space for normal accidentals */
-    { if (debug)
+    { update_global_skip (3) ;
+      if (debug)
       { fprintf (logfile, "\nLeave space for accidental\n");
         status (i);
         status_beam (i);
         status_collective (i);
       }
-      update_global_skip (3) ;
     }
-    else if ( (*s == '<') /* double-flat */ )
-    { if (debug)
+    else if ( (*s == '<') /* double-flat */ 
+              && !vspacing_active[i]  /* is additional spacing needed? */
+            )
+    { update_global_skip (5);
+      if (debug)
       { fprintf (logfile, "\nLeave space for double-flat\n");
         status (i);
         status_beam (i);
         status_collective (i);
       }
-      update_global_skip (5);
     }
     else if (isalnum (*s) || *s == '*')
     {  
@@ -535,6 +547,7 @@
         status (i);
         status_collective (i);
       }
+      vspacing_active[i] = false;
       return spacing; 
     }
     s++;
@@ -766,7 +779,8 @@
       break;
     }
 
-    if (prefix("\\tqqq", s) )
+    if (prefix("\\tqqq", s) ||
+        prefix("\\nqqq", s) )
     { if (beaming[i] > SP(32)) 
         beaming[i] = SP(32);
       spacing = beaming[i];
@@ -780,7 +794,8 @@
       break;
     }
 
-    if (prefix("\\tqq", s) )
+    if (prefix("\\tqq", s) ||
+        prefix("\\nqq", s) )
     { if (beaming[i] > SP(16)) 
         beaming[i] = SP(16);
       spacing = beaming[i];
@@ -820,7 +835,9 @@
     /* non-spacing beam termination */
       new_beaming = 0; 
 
-    else if ( prefix("\\xtuplet", s))
+    else if ( prefix("\\xtuplet", s) ||
+              prefix("\\xxtuplet", s)||
+              prefix("\\Xtuplet", s) )
     { char *t = s+1;
       while (!isdigit(*t)) t++;
       xtuplet[i] = atoi(t);
@@ -827,6 +844,7 @@
     }
     else 
     if ( prefix("\\triolet", s)
+      || prefix("\\Triolet", s)
       || prefix("\\uptrio", s)
       || prefix("\\downtrio", s)
       || prefix("\\uptuplet", s)
@@ -948,6 +966,7 @@
   if (prefix ("\\whpp", s)
    || prefix ("\\hupp", s)
    || prefix ("\\hlpp", s)
+   || prefix ("\\happ", s)
    || prefix ("\\hspp", s)
    || prefix ("\\hppp", s)
    || prefix ("\\hpausepp", s)
@@ -971,6 +990,7 @@
   if (prefix ("\\whp", s)
    || prefix ("\\hup", s)
    || prefix ("\\hlp", s)
+   || prefix ("\\hap", s)
    || prefix ("\\hsp", s)
    || prefix ("\\hpp", s)
    || prefix ("\\hpausep", s)
@@ -1012,6 +1032,7 @@
   { fprintf (logfile, "\nAfter spacing_note:\n");
     status (i);
   }
+  vspacing_active[i] = false;
   return spacing;
 }
 
@@ -1045,6 +1066,9 @@
   { fprintf (logfile, "\nEntering initialize_notes\n");
     status_all ();
   }
+  if ( nastaffs == 1 && spacing != MAX_SPACING && restbars > 0) 
+    output_rests ();
+
   if (spacing == MAX_SPACING)
     fprintf (outfile, "\\znotes");
   else if (spacing == SP(1)+SP(2) || spacing == SP(1)+SP(2)+SP(4))
@@ -1270,7 +1294,10 @@
     }
   }
 
-  if (debug) fprintf (logfile, "\nDetermine xtuplet duration:\n");
+  if (debug) 
+  { fprintf (logfile, "\nDetermine xtuplet duration:\n");
+    fflush (logfile);
+  }
   for (i=1; i <= nstaffs; i++)
     if (xtuplet[i] > 1)
     {
@@ -1278,7 +1305,7 @@
       save_state (xi);
       pseudo_output_notes (xi);
       xspacing = spacings[xi];
-      do
+      while (xspacing % xtuplet[xi] != 0)
       { 
         xspacing +=  spacing_note (xi);
         pseudo_output_notes (xi);
@@ -1285,7 +1312,6 @@
         if (xspacing >= MAX_SPACING) 
           error ("Can't determine xtuplet duration.");
       }
-      while (xspacing % xtuplet[xi] != 0);
       restore_state (xi);
       break;
     }
@@ -1448,8 +1474,7 @@
         return;
       }
       if (old_spacing < MAX_SPACING) putc ('\n', outfile);
-      if ( nastaffs == 1 && spacing != MAX_SPACING && restbars > 0) 
-        output_rests ();
+
       initialize_notes ();
     }
 
@@ -1462,6 +1487,7 @@
       if (active[i] && spacings[i] != MAX_SPACING && spacings[i] != spacing && vspacing[i] == 0 )
       {
         vspacing[i] = spacings[i];
+        vspacing_active[i] = true;
         vspacing[i] = vspacing[i] - spacing;
         if (debug)
         { fprintf (logfile, "\nAfter vspacing initialization:\n");
@@ -1527,11 +1553,18 @@
            active[nstaffs] = true;
         }
       }   
+      nastaffs = nstaffs;
+      if (debug)
+        fprintf (logfile, "default TransformNotes2=%s\n", TransformNotes2);
     }
+    if (nstaffs == 1) fprintf (outfile, "\\nostartrule\n");
     if (debug)
-      fprintf (logfile, "default TransformNotes2=%s\n", TransformNotes2);
-    if (nstaffs == 1) fprintf (outfile, "\\nostartrule\n");
-    nastaffs = nstaffs;
+    {
+      int j;
+      fprintf (logfile, "ninstr=%d nstaffs=%d nastaffs=%d\n", ninstr, nstaffs, nastaffs);
+      for (j=1; j <= nstaffs; j++)
+        fprintf (logfile, "active[%d]=%d\n", j, active[j]);
+    }
     fprintf (outfile, "\\startpiece");
     t = strpbrk (*ln+1, "\\%\n");
     *ln = t;
@@ -1555,11 +1588,11 @@
            active[nstaffs] = true;
         }
       }   
+      nastaffs = nstaffs;
+      if (debug)
+        fprintf (logfile, "default TransformNotes2=%s\n", TransformNotes2);
     }
-    if (debug)
-      fprintf (logfile, "default TransformNotes2=%s\n", TransformNotes2);
     if (nstaffs == 1) fprintf (outfile, "\\nostartrule\n");
-    nastaffs = nstaffs;
     fprintf (outfile, "\\startextract");
     t = strpbrk (*ln+1, "\\%\n");
     *ln = t;
@@ -1611,6 +1644,13 @@
       t = strpbrk (t+1, "#}"); 
       if (t == NULL) break;
     }
+    if (debug)
+    {
+      int j;
+      fprintf (logfile, "ninstr=%d nstaffs=%d nastaffs=%d\n", ninstr, nstaffs, nastaffs);
+      for (j=1; j <= nstaffs; j++)
+        fprintf (logfile, "active[%d]=%d\n", j, active[j]);
+    }
 
     /* output \TransformNotes...  as a comment:  */
     putc ('%', outfile);  
@@ -1805,6 +1845,7 @@
 
   else if ( prefix ("\\bar", *ln) && !prefix ("\\barno", *ln))
   { int i;
+    char *s, *t;
     bool atnextbar = false; 
     for (i=1; i <= nstaffs; i++)
       if (active[i] && bar_rest[i]) 
@@ -1824,8 +1865,16 @@
     else
     { if (atnextbar)
       { fprintf (outfile, "\\def\\atnextbar{\\znotes");
-        for (i=1; i <= nstaffs; i++)
+        t = TransformNotes2;
+        while (true)
         {
+          s = strchr (t, '#');
+          if (s == NULL) 
+            break;
+          while (t < s)  /* output any initial \transpose etc. */
+          { putc (*t, outfile); t++; }
+          t++; /* skip # */
+          i = atoi (t) -1; t++;
           if (active[i])
           {
             if (bar_rest[i])
@@ -1832,8 +1881,8 @@
               fprintf (outfile, "\\centerpause");
             bar_rest[i] = false;
           }
-          if ( (terminator[i] == '&') || (terminator[i] == '|') ) 
-            putc (terminator[i], outfile);
+          if (*t != '\0') 
+          { putc (*t, outfile); t++; }  /* terminator */
         }
         fprintf (outfile, "\\en}%%\n");
       }
@@ -1962,7 +2011,13 @@
     *ln = *ln + strlen(*ln);
   }
 
+  else if ( prefix ("\\end", *ln))
+  {
+    fprintf (outfile, "\\end\n");
+    exit(0);
+  }
 
+
   else  /* everything else */
   { 
     fputs (*ln, outfile);

Modified: trunk/Build/source/utils/autosp/autosp-src/autosp.test
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/autosp.test	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/autosp.test	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,5 +1,6 @@
 #! /bin/sh -vx
-# Copyright 2016-2017 Karl Berry <tex-live at tug.org>
+
+# Copyright 2016 Karl Berry <tex-live at tug.org>
 # Copyright 2015 Peter Breitenlohner <tex-live at tug.org>
 # You may freely use, modify and/or distribute this file.
 

Modified: trunk/Build/source/utils/autosp/autosp-src/compile
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/configure
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/configure.ac
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/configure.ac	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/configure.ac	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,5 +1,5 @@
 AC_PREREQ(2.63)
-AC_INIT([autosp],[2017-07-14],[rdt at cs.queensu.ca])
+AC_INIT([autosp],[2017-12-26],[rdt at cs.queensu.ca])
 AC_CONFIG_AUX_DIR([.])
 AM_INIT_AUTOMAKE
 AC_CONFIG_HEADERS([config.h])

Modified: trunk/Build/source/utils/autosp/autosp-src/depcomp
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/install-sh
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/rebar.test
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/autosp-src/tests/quod2.tex
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/tests/quod2.tex	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/autosp-src/tests/quod2.tex	2017-12-30 22:19:20 UTC (rev 46169)
@@ -1,4 +1,4 @@
-%  Generated by autosp (2017-07-14).
+%  Generated by autosp (2017-12-22).
 \input musixtex
 \input musixplt
 \input soul.sty
@@ -77,7 +77,7 @@
 \Notes\qa{.L}\sk\sk&\ibl1n{-1}\qb1{n}\qb1{o}\qb1{n}&\ttie2\ibl2r{-2}\qb2r\tqb2q\qa p&\ibl3n{-2}\qb3{n}\qb3{m}\qb3{l}\en
 \notes\ibbl0M2\qb0M\tqb0N&\tqb1m\sk&\sk\sk&\tqb3k\sk\hqsk\en%
 \Notes\tqsk\itieu0a\qa a&\tqsk\ibl1l{-2}\qb1l&\tqsk\qa{.o}&\tqsk\shake{n}\ibl3i0\qb3{^j}\en
-\notes\sk\sk\tqsk\ttie0\ibbl0a{-2}\qb0{a}\qb0{N}\qb0{M}\tqsk\tqb0L&\tqb1k\sk\tqsk\cl{^j}\sk\ds\tqsk\sk&\sk\sk\tqsk\sk\sk\ibbl2i2\qb2i\tqsk\tqb2{^j}&\nbbl3\qb3i\tqb3j\tqsk\cu h\sk\ds\tqsk\sk\hqsk\en%
+\notes\sk\sk\ttie0\ibbl0a{-2}\qb0{a}\qb0{N}\qb0{M}\tqsk\tqb0L&\tqb1k\sk\cl{^j}\sk\ds\tqsk\sk&\sk\sk\sk\sk\ibbl2i2\qb2i\tqsk\tqb2{^j}&\nbbl3\qb3i\tqb3j\cu h\sk\ds\tqsk\sk\hqsk\en%
 \bar%7
 \Notes\qa{M}\sk\qa{K}\sk&\ibu1g0\qb1{f}\qb1{g}\qb1{h}\tqh1f&\ibl2k0\qb2{k}\qb2{l}\qb2{m}\tqb2k&\qa{h}\sk\qa{h}\sk\en%
 \Notes\qa{N}\sk\qa{G}\sk&\ibu1g{-2}\qb1{g}\qb1{f}\qb1{e}\tqh1d&\ibl2i4\qb2{i}\qb2{k}\qb2{n}\tqb2m&\qa{i}\sk\qa{i}\sk\en%
@@ -85,7 +85,7 @@
 \nspace
 \Notes\tqsk\qu{.H}&\tqsk\ibu1c4\qb1{^c}&\tqsk\ibl2l{-1}\qb2{.l}&\tqsk\ibu3h{0}\qb3{h}\en
 \notes\sk\sk\sk\tqsk\sk&\qb1{d}\sk\qb1{e}\tqsk\sk&\sk\itieu2k\tbbl2\tqb2k\ttie2\ibbl2j0\qb2k\tqsk\tbbl2\qb2{^j}&\qb3{i}\sk\qb3{h}\tqsk\sk\en
-\Notes\tqsk\cu{^J}&\tqsk\itied1h\tqh1h&\tqsk\itieu2l\tqb2l&\tqsk\tqh3g\en%
+\Notes\cu{^J}&\itied1h\tqh1h&\itieu2l\tqb2l&\tqh3g\en%
 \notes\ql K\sk\sk\sk&\ttie1\ibu1h{-2}\qb1h\sk\tqh1g\sk&\ttie2\ibbl2l{-1}\qb2{l}\qb2{k}\qb2{l}\tqb2j&\ibu3f{-1}\qb3f\sk\tqh3e\sk\en
 \Notes\cl K&\cu f&\cl k&\cu d\en%
 \leftrightrepeat
@@ -100,12 +100,12 @@
 \Notes\ibl0b{-1}\qb0{c}\qb0{b}\qb0{c}\tqb0a&\cl l\ds\qp\sk&\ibl2o{-1}\qb2{o}\qb2{p}\qb2{o}\tqb2n&\ibl3o{-2}\qb3{o}\qb3{n}\qb3{m}\tqb3l\en%
 \Notes\tqsk\qa{.b}&\tqsk\qa{m}&\tqsk\ibl2m{-2}\qb2m&\tqsk\ibl3j0\shake n\qb3{^k}\en
 \notes\tqsk\sk\sk&\tqsk\sk\sk&\tqsk\tqb2l\sk&\tqsk\nbbl3\qb3{^j}\tqb3k\en
-\Notes\tqsk\sk\tqsk\cl{^a}&\tqsk\qa{m}\tqsk\sk&\tqsk\cl{^k}\tqsk\ds&\tqsk\ibl3i8\qb3i\tqsk\tqb3{p}\en%
+\Notes\sk\cl{^a}&\qa{m}\sk&\cl{^k}\ds&\ibl3i8\qb3i\tqb3{p}\en%
 \bar%11
 \Notes\qa{N}\sk\qa{N}\sk&\ibl1l0\qb1{n}\qb1{l}\qb1{n}\tqb1l&\qa{p}\sk\qa{p}\sk&\ibl3m0\qb3{l}\qb3{p}\qb3{l}\tqb3{p}\en%
 \notes\tqsk\qa{.a}\sk\sk\sk&\tqsk\ibl1m{-1}\qb1{m}\sk\qb1{n}\sk&\tqsk\qa{q}\sk\sk\sk&\tqsk\ibbl3k2\qb3{^k}\qb3{l}\qb3{m}\tqb3n\en
 \Notes\sk&\qb1{m}&\qa{q}&\ibl3o{-2}\qb3o\en
-\notes\tqsk\cl{^a}\sk&\tqsk\tqb1l\sk&\tqsk\sk\sk&\tqsk\nbbl3\qb3n\tqb3m\hqsk\en%
+\notes\cl{^a}\sk&\tqb1l\sk&\sk\sk&\nbbl3\qb3n\tqb3m\hqsk\en%
 \bar%12
 \nspace
 \Notes\tqsk\qa b&\tqsk\ibl1k2\qb1{^k}&\tqsk\ibl2o{-1}\qb2p&\tqsk\ibl3n{-2}\qb3n\en
@@ -113,7 +113,7 @@
 \Notes\qa{.L}&\ttie1\ibu1i0\qb1i&\ibl2n0\qb2n&\itieu3l\ha l\en
 \notes\sk\sk&\nbbu1\qb1h\tqh1i&\nbbl2\qb2m\tqb2n&\sk\sk\en
 \Notes\sk&\ibu1g2\qb1g&\cl l&\sk\en
-\notes\tqsk\cl{=K}\sk&\tqsk\nbbu1\qb1h\tqh1i&\tqsk\ds\sk&\tqsk\sk\sk\hqsk\en%
+\notes\cl{=K}\sk&\nbbu1\qb1h\tqh1i&\ds\sk&\sk\sk\hqsk\en%
 \bar%13
 \notes\qa{J}\sk\sk\sk\qa{c}\sk&\ibl1j2\qb1{j}\sk\qb1{k}\sk\qb1{l}\sk&\hp\sk\sk\sk\sk\sk&\ttie3\ibbl3k1\slur lku1\qb3{l}\qb3{k}\slur mlu1\qb3m\tqb3l\ibbl3m1\isluru3n\qb3n\tbbl3\tslur3m\qb3m\en
 \Notes\sk&\tqb1m&\sk&\tqb3o\en%
@@ -135,7 +135,7 @@
 \Notes\qb0{I}\tqh0G&\qa{d}\sk&\cu g\ds&\qb3{k}\tqb3i\en%
 \Notes\qa{.J}&\qa{e}&\ds&\ibu3j{-2}\qb3{j}\en
 \notes\sk\sk&\sk\sk&\ibbl2l{-2}\qb2l\tqb2k&\qb3{i}\sk\en
-\Notes\sk\tqsk\cu{^J}&\qa{e}\tqsk\sk&\ibl2j4\qb2j\tqsk\tqb2l&\qb3{h}\tqsk\tqh3g\en%
+\Notes\sk\cu{^J}&\qa{e}\sk&\ibl2j4\qb2j\tqb2l&\qb3{h}\tqh3g\en%
 \bar%16
 \notes\qa{K}\sk\sk\sk\qa{K}\sk&\ibu1g{1}\qb1{d}\sk\qb1{e}\sk\qb1{d}\sk&\ibbl2h1\qb2{h}\qb2{k}\qb2{j}\tqb2i\ibbl2j0\qb2j\tbbl2\qb2h&\ibu3f2\qb3f\sk\tqh3g\sk\ibu3h{-4}\qb3h\sk\en
 \Notes\sk&\tqh1j&\itieu2k\tqb2k&\tqh3f\en%

Added: trunk/Build/source/utils/autosp/autosp-src/tests/quod4.aspc
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/tests/quod4.aspc	                        (rev 0)
+++ trunk/Build/source/utils/autosp/autosp-src/tests/quod4.aspc	2017-12-30 22:19:20 UTC (rev 46169)
@@ -0,0 +1,160 @@
+%  Generated by tex2aspc (2017-12-15).
+%  Generated by autosp (2017-12-22).
+\input musixtex
+\input musixplt
+\input soul.sty
+\sodef{\so}{}{0.15em}{0.5em}{0.5em}
+\input musixsty
+\input musixps
+\nohalfties
+\def\pstiehgt{0.5}
+\def\psslurhgt{0.5}
+\vsize9.75in
+\voffset-0.5in
+\hsize7.0in
+\hoffset-0.25in
+\smallmusicsize
+\bigaccid
+\advance\parindent by 10pt
+\def\raisebarno{7\internote}%
+\nobarnumbers
+\relativeaccid
+\geometricskipscale
+\instrumentnumber4
+\setclef1\bass\setbassclefsymbol1\bassoct
+\setclef4\treble\settrebleclefsymbol4\trebleoct
+\generalsignature{+1}
+\generalmeter\meterC
+\setname1{B}
+\setname2{T}
+\setname3{A}
+\setname4{S}
+\songtop4\songbottom1
+\fulltitle{\sc\so{Quodlibet}}
+\subtitle{\it Variation 30 of the Goldberg Variations for Clavier}
+\title{\it Quodlibet}
+\author{J. S. Bach (1685--1750)}
+\shortauthor{\it J. S. Bach}
+\othermention{Arranged for Recorders by R. D. Tennent}
+\maketitle
+\startbarno=0
+\nobarnumbers
+\stafftopmarg=3.0\Interligne%
+\staffbotmarg=3.0\Interligne%
+\startpiece\addspace\afterruleskip%
+\systemnumbers%
+\anotes
+  \ds&
+  \cu d&
+  \ds&
+  \ds\en
+\bar%1
+\anotes
+  \ha N\sk\sk\sk\ha M\sk\sk\sk\sk\sk&
+  \ibu1g2\qb1{g}\qb1{h}\qb1{i}\tqh1j\ibl1k{-2}\qb1k\nbbl1\qb1j\tqb1i\ibu1h0\qb1h\nbbu1\qb1g\tqh1h&
+  &
+  \hp\sk\sk\sk\qp\sk\sk\ds\cu d\sk\hqsk\en
+\def\atnextbar{\znotes&&\centerpause&\en}%
+\bar%2
+\anotes
+  \ha L\sk\sk\sk\qa{.K}\sk\sk\sk\cu J\sk&
+  \ibu1i{-2}\qb1i\tqh1h\itied1g\qa g\sk\ttie1\qa g\sk\sk\ibu1f0\shake{n}\qb1f\nbbu1\qb1e\tqh1f&
+  \qa{n}\sk\qa{n}\sk\qa o\sk\sk\cl o\ds\sk&
+  \ibu3g2\qb3{g}\qb3{h}\qb3{i}\tqh3j\ibl3k{-2}\qb3k\nbbl3\qb3j\tqb3i\cu h\ds\sk\hqsk\en
+\bar%3
+\anotes
+  \hu I\sk\sk\tqsk\sk\hu J\sk\sk\sk&
+  \qa g\sk\ds\tqsk\cl k\ibu1j{-2}\qb1{j}\qb1{i}\qb1h\tqh1g&
+  \ibl2n{-1}\qb2{n}\qb2{o}\qb2{n}\tqsk\tqb2{=m}\ibl2j{0}\qb2{l}\qb2{k}\qb2j\tqb2p&
+  \qa{k}\sk\qa{k}\tqsk\sk\qa{l}\sk\qa{l}\sk\en
+\bar%4
+\anotes
+  \ha K\sk\sk\sk\sk\qa G\sk\ds\ibbl0b{-1}\qb0b\tqb0a&
+  \itied1f\shake{n}\qa f\sk\ttie1\ibbu1e{-2}\qb1f\tbbu1\qb1e\itied1d\tqh1d\ttie1\qa d\sk\qp\sk\sk&
+  \ibl2o{-1}\qb2{o}\qb2{n}\qb2{o}\sk\tqb2m\ibl2n{-2}\qb2n\tqb2m\ibl2n{-5}\qb2n\tqb2k\sk&
+  \ibl3k{-1}\qb3{k}\qb3{l}\qb3{k}\sk\tqb3j\ibu3h{-2}\shake{p}\qb3i\tqh3h\qa g\sk\sk\hqsk\en
+\bar%5
+\anotes
+  \ibl0M0\qb0N\nbbl0\qb0M\tqb0N\ibl0K0\qb0L\nbbl0\qb0K\tqb0L\qa{.M}\sk\sk\sk\cu I&
+  \qa{n}\sk\sk\qa{n}\sk\sk\qa{o}\sk\sk\qa{o}\sk&
+  \ibl2n2\qb2{n}\qb2{o}\sk\qb2{p}\tqb2q\sk\ibl2r{-2}\qb2r\nbbl2\qb2q\tqb2p\ibl2o6\qb2o\itieu2r\tqb2r&
+  \hp\sk\sk\sk\sk\sk\hqsk\qp\sk\sk\ds\cl k\en
+\bar%6
+\anotes
+  \qa{.L}\sk\sk\ibbl0M2\qb0M\tqb0N\tqsk\itieu0a\qa a\sk\sk\ttie0\ibbl0a{-2}\qb0{a}\qb0{N}\qb0{M}\tqsk\tqb0L&
+  \ibl1n{-1}\qb1{n}\qb1{o}\qb1{n}\tqb1m\sk\tqsk\ibl1l{-2}\qb1l\tqb1k\sk\cl{^j}\sk\ds\tqsk\sk&
+  \ttie2\ibl2r{-2}\qb2r\tqb2q\qa p\sk\sk\tqsk\qa{.o}\sk\sk\sk\sk\ibbl2i2\qb2i\tqsk\tqb2{^j}&
+  \ibl3n{-2}\qb3{n}\qb3{m}\qb3{l}\tqb3k\sk\hqsk\tqsk\shake{n}\ibl3i0\qb3{^j}\nbbl3\qb3i\tqb3j\cu h\sk\ds\tqsk\sk\hqsk\en
+\bar%7
+\anotes
+  \qa{M}\sk\qa{K}\sk\qa{N}\sk\qa{G}\sk&
+  \ibu1g0\qb1{f}\qb1{g}\qb1{h}\tqh1f\ibu1g{-2}\qb1{g}\qb1{f}\qb1{e}\tqh1d&
+  \ibl2k0\qb2{k}\qb2{l}\qb2{m}\tqb2k\ibl2i4\qb2{i}\qb2{k}\qb2{n}\tqb2m&
+  \qa{h}\sk\qa{h}\sk\qa{i}\sk\qa{i}\sk\en
+\bar%8
+\nspace
+\anotes
+  \tqsk\qu{.H}\sk\sk\sk\tqsk\sk\cu{^J}\ql K\sk\sk\sk\cl K&
+  \tqsk\ibu1c4\qb1{^c}\qb1{d}\sk\qb1{e}\tqsk\sk\itied1h\tqh1h\ttie1\ibu1h{-2}\qb1h\sk\tqh1g\sk\cu f&
+  \tqsk\ibl2l{-1}\qb2{.l}\sk\itieu2k\tbbl2\tqb2k\ttie2\ibbl2j0\qb2k\tqsk\tbbl2\qb2{^j}\itieu2l\tqb2l\ttie2\ibbl2l{-1}\qb2{l}\qb2{k}\qb2{l}\tqb2j\cl k&
+  \tqsk\ibu3h{0}\qb3{h}\qb3{i}\sk\qb3{h}\tqsk\sk\tqh3g\ibu3f{-1}\qb3f\sk\tqh3e\sk\cu d\en
+\leftrightrepeat
+\advance\barno-1%
+\anotes
+  \ds&
+  \cl m&
+  \ds&
+  \cl o\en
+\bar%9
+\anotes
+  \qa{d}\sk\qa{c}\sk\qa{b}\sk\sk\qa{N}\sk&
+  \ibl1k0\qb1{k}\qb1{m}\qb1{k}\tqb1{m}\ibl1k0\qb1{n}\qb1{k}\sk\qb1{k}\tqb1n&
+  \qa{o}\sk\qa{o}\sk\qa{p}\sk\sk\qa{p}\sk&
+  \ibl3m0\qb3{m}\qb3{o}\qb3{m}\tqb3o\ibl3k2\qb3k\nbbl3\qb3l\tqb3m\ibl3n{-4}\qb3n\tqb3l\en
+\bar%10
+\anotes
+  \ibl0b{-1}\qb0{c}\qb0{b}\qb0{c}\tqb0a\tqsk\qa{.b}\tqsk\sk\sk\sk\cl{^a}&
+  \cl l\ds\qp\sk\tqsk\qa{m}\tqsk\sk\sk\qa{m}\sk&
+  \ibl2o{-1}\qb2{o}\qb2{p}\qb2{o}\tqb2n\tqsk\ibl2m{-2}\qb2m\tqsk\tqb2l\sk\cl{^k}\ds&
+  \ibl3o{-2}\qb3{o}\qb3{n}\qb3{m}\tqb3l\tqsk\ibl3j0\shake n\qb3{^k}\tqsk\nbbl3\qb3{^j}\tqb3k\ibl3i8\qb3i\tqb3{p}\en
+\bar%11
+\anotes
+  \qa{N}\sk\qa{N}\sk\tqsk\qa{.a}\sk\sk\sk\sk\cl{^a}\sk&
+  \ibl1l0\qb1{n}\qb1{l}\qb1{n}\tqb1l\tqsk\ibl1m{-1}\qb1{m}\sk\qb1{n}\sk\qb1{m}\tqb1l\sk&
+  \qa{p}\sk\qa{p}\sk\tqsk\qa{q}\sk\sk\sk\qa{q}\sk\sk&
+  \ibl3m0\qb3{l}\qb3{p}\qb3{l}\tqb3{p}\tqsk\ibbl3k2\qb3{^k}\qb3{l}\qb3{m}\tqb3n\ibl3o{-2}\qb3o\nbbl3\qb3n\tqb3m\hqsk\en
+\bar%12
+\nspace
+\anotes
+  \tqsk\qa b\sk\sk\tqsk\qa I\sk\sk\sk\qa{.L}\sk\sk\sk\cl{=K}\sk&
+  \tqsk\ibl1k2\qb1{^k}\nbbl1\qb1l\tqb1m\tqsk\itied1i\qu i\sk\sk\sk\ttie1\ibu1i0\qb1i\nbbu1\qb1h\tqh1i\ibu1g2\qb1g\nbbu1\qb1h\tqh1i&
+  \tqsk\ibl2o{-1}\qb2p\qb2q\sk\tqsk\qb2p\sk\tqb2o\sk\ibl2n0\qb2n\nbbl2\qb2m\tqb2n\cl l\ds\sk&
+  \tqsk\ibl3n{-2}\qb3n\nbbl3\qb3m\tqb3l\tqsk\ibbl3k0\qb3{^k}\qb3{l}\qb3m\tqb3k\hqsk\itieu3l\ha l\sk\sk\sk\sk\sk\hqsk\en
+\bar%13
+\anotes
+  \qa{J}\sk\sk\sk\qa{c}\sk\sk\qa{.b}\sk\sk\sk\ibbu0J{-2}\qb0J\tqh0I&
+  \ibl1j2\qb1{j}\sk\qb1{k}\sk\qb1{l}\sk\tqb1m\ibl1n{-1}\qb1n\nbbl1\qb1m\tqb1l\cl k\ds\sk&
+  \hp\sk\sk\sk\sk\sk\sk\qa n\sk\sk\ibl2i{-5}\qb2n\tqb2g\sk&
+  \ttie3\ibbl3k1\slur lku1\qb3{l}\qb3{k}\slur mlu1\qb3m\tqb3l\ibbl3m1\isluru3n\qb3n\tbbl3\tslur3m\qb3m\tqb3o\qa{.k}\sk\sk\sk\ibbl3j2\qb3j\tqb3k\hqsk\en
+\bar%14
+\anotes
+  \qa{.H}\sk\sk\sk\ibbu0I2\qb0I\tqh0J\qa{.K}\sk\sk\sk\ibbu0J2\qb0J\tqh0K&
+  \ds\cu h\sk\ibu1e0\qb1e\nbbu1\qb1d\tqh1e\ibu1g1\qb1f\sk\itied1g\tqh1g\ttie1\ibu1g{-1}\qb1g\tqh1f\sk&
+  \ibl2j1\qb2{.j}\sk\tbbl2\tqb2k\ibl2j{-2}\qb2j\tqb2i\sk\ibu2h1\qb2h\sk\tqh2i\ibl2j2\qb2j\tqb2k\sk&
+  \ibl3l2\qb3l\nbbl3\qb3m\tqb3n\ibl3o{-2}\qb3o\tqb3n\sk\hqsk\ibbl3m{-2}\shake{o}\qb3m\tbbl3\qb3l\tqb3k\ibu3i{-6}\qb3j\tqh3d\sk\hqsk\en
+\bar%15
+\anotes
+  \ibu0I0\qb0{G}\qb0{H}\sk\qb0{I}\tqh0G\qa{.J}\sk\sk\sk\cu{^J}&
+  \qa{d}\sk\sk\qa{d}\sk\qa{e}\sk\sk\qa{e}\sk&
+  \ibu2i0\qb2i\nbbu2\qb2h\tqh2i\cu g\ds\ds\ibbl2l{-2}\qb2l\tqb2k\ibl2j4\qb2j\tqb2l&
+  \ibl3i0\qb3{i}\qb3{j}\sk\qb3{k}\tqb3i\ibu3j{-2}\qb3{j}\qb3{i}\sk\qb3{h}\tqh3g\en
+\bar%16
+\anotes
+  \qa{K}\sk\sk\sk\qa{K}\sk\sk\qa N\sk\sk\cu G&
+  \ibu1g{1}\qb1{d}\sk\qb1{e}\sk\qb1{d}\sk\tqh1j\ibu1i{-2}\qb1i\tqh1h\sk\cu g&
+  \ibbl2h1\qb2{h}\qb2{k}\qb2{j}\tqb2i\ibbl2j0\qb2j\tbbl2\qb2h\itieu2k\tqb2k\ttie2\ibl2j0\qb2k\nbbl2\qb2j\tqb2k\cl i&
+  \ibu3f2\qb3f\sk\tqh3g\sk\ibu3h{-4}\qb3h\sk\tqh3f\qa g\sk\sk\cu g\en
+\setrightrepeat
+\endpiece%
+\eject
+\end

Added: trunk/Build/source/utils/autosp/autosp-src/tex2aspc.1
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/tex2aspc.1	                        (rev 0)
+++ trunk/Build/source/utils/autosp/autosp-src/tex2aspc.1	2017-12-30 22:19:20 UTC (rev 46169)
@@ -0,0 +1,37 @@
+.\" This manpage is licensed under the GNU Public License
+.TH TEX2ASPC 1 2017-12-13  "" ""
+
+.SH NAME
+
+tex2aspc \- converts conventional MusiXTeX scores to .aspc format 
+for processing by
+.BR autosp (1).
+
+.SH SYNOPSIS
+
+.B tex2aspc 
+.RB  [ \-v\ |\ \-\-version\ |\ \-h\ |\ \-\-help ]
+
+.B tex2aspc
+.IR infile [\fR.tex\fP]
+.RI [ outfile [ \fR.aspc\fP ]]
+
+This program re-factors (sequences of) conventional 
+note-spacing commands (\\notes \\Notes \\NOtes ...)
+into
+\\anotes commands.
+This is intended for "legacy" scores in order to take advantage of
+features 
+only provided by 
+.BR autosp (1),
+such as "global" skips.
+
+.SH SEE ALSO
+.BR autosp (1)
+.PP 
+musixdoc.pdf
+
+.SH AUTHOR 
+This program and manual page were written by Bob Tennent <rdt at cs.queensu.ca>.
+
+

Added: trunk/Build/source/utils/autosp/autosp-src/tex2aspc.c
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/tex2aspc.c	                        (rev 0)
+++ trunk/Build/source/utils/autosp/autosp-src/tex2aspc.c	2017-12-30 22:19:20 UTC (rev 46169)
@@ -0,0 +1,353 @@
+char version[12] = "2017-12-15";
+
+/*  Copyright (C) 2017 R. D. Tennent School of Computing,
+ *  Queen's University, rdt at cs.queensu.ca
+ *  
+ *  This program is free software; you can redistribute it
+ *  and/or modify it under the terms of the GNU General
+ *  Public License as published by the Free Software
+ *  Foundation; either version 2 of the License, or (at your
+ *  option) any later version.
+ *  
+ *  This program is distributed in the hope that it will
+ *  be useful, but WITHOUT ANY WARRANTY; without even the
+ *  implied warranty of MERCHANTABILITY or FITNESS FOR A
+ *  PARTICULAR PURPOSE. See the GNU General Public License
+ *  for more details.
+ *  You should have received a copy of the GNU General
+ *  Public License along with this program; if not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street,
+ *  Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/*  tex2aspc  - converts conventional MusiXTeX code to autosp-compatible format   */
+
+/*  Usage:  tex2aspc infile[.tex] [outfile[.aspc]]
+ *          tex2aspc [-v | --version | -h | --help]
+ */ 
+
+
+# include "utils.h"
+
+#ifdef HAVE_CONFIG_H   /* for TeXLive */
+#include <config.h>
+#endif
+
+# ifdef KPATHSEA
+# include <kpathsea/getopt.h>
+# else
+# include <getopt.h>
+# endif
+
+# ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+# else
+# ifndef HAVE__BOOL
+# define _Bool signed char
+# endif
+# define bool    _Bool
+# define true    1
+# define false   0
+# endif
+
+# define PRIVATE static
+
+# define SHORT_LEN 256
+# define MAX_STAFFS 9
+
+
+PRIVATE char infilename[SHORT_LEN];
+PRIVATE char *infilename_n = infilename;
+PRIVATE char outfilename[SHORT_LEN];
+PRIVATE char *outfilename_n = outfilename;
+PRIVATE FILE *infile, *outfile;
+
+PRIVATE char line[LINE_LEN];            /* line of input                      */
+
+PRIVATE int ninstr = 1;                 /* number of instruments              */
+PRIVATE int staffs[MAX_STAFFS] = {0,1}; /* number of staffs for ith instrument*/
+PRIVATE int nstaffs = 1;                /* number of staffs                   */
+PRIVATE char terminator[MAX_STAFFS];    /* one of '&' "|', '$'                */
+
+PRIVATE char notes[MAX_STAFFS][LINE_LEN];  
+                                        /* accumulate commands to be output   */
+PRIVATE char *n_notes[MAX_STAFFS];
+PRIVATE bool outputs = false;           /* are there commands to be output?   */
+
+
+
+PRIVATE void
+usage ()
+{
+  printf ("Usage: tex2aspc [-v | --version | -h | --help]\n");
+  printf ("       tex2aspc infile[.tex] [outfile[.aspc]]\n");
+}
+
+
+PRIVATE
+void analyze_notes (char **ln) 
+/* append material from *ln to \en to notes[*] and initialize terminator[*]. */
+{
+  int i; char *s; char *t;  
+  int newlines = 0;
+  s = *ln+1;  /* skip "/"  */
+  while (isalpha(*s)) {s++;}  /* skip rest of the initial command  */
+  while (true)
+  { /* look for \en */
+    t = strstr(s, "\\en");
+    if (t != NULL) break;
+    /* replace EOL by a blank and append another line of input */
+    { char new_line[LINE_LEN];  
+      char *nl;
+      if (fgets (new_line, LINE_LEN, infile) == NULL)
+        error ("Unexpected EOF.");
+      nl = new_line;
+      while (*nl == ' ') nl++;  /* avoid spaces */
+      t = strpbrk (s, "\n%");
+      if (t == NULL) error ("Missing EOL.");
+      if (*t == '\n') 
+      { *t = ' '; t++;}
+      *t = '\0';
+      if (append (line, &t, nl, LINE_LEN) >= LINE_LEN)
+        error ("Line too long.");
+      newlines++;
+    }
+  }
+  /* t -> "\en"  */
+  if ( prefix("\\enotes", t) ) *ln = t+7;
+  else *ln = t+3;
+  *t = '$'; /* replace '\' by '$' (a distinctive terminating character) */
+  for (i=1; i <= nstaffs; i++)      
+  { char *tt;
+    while (*s == ' ') s++;  /* skip spaces  */
+    tt = strpbrk (s, "|&$");
+    if (tt == NULL) error ("can't parse note-spacing command.");
+    while (s < tt)
+    { *n_notes[i] = *s; 
+      n_notes[i]++; s++;
+    }
+    *n_notes[i] = '\0';
+    terminator[i] = *s;
+    if (*s != '$') s++;
+  }
+  lineno = lineno + newlines;
+}
+
+PRIVATE
+void process_command (char **ln)
+{ char *s;
+  if ( prefix("\\def\\nbinstrument", *ln) ||
+       prefix("\\instrumentnumber", *ln)  )
+  { 
+    s = strpbrk (*ln, "123456789");
+    if ( s == NULL ) error ("instrument number command unreadable.");
+    ninstr = atoi (s);
+    while (*ln <= s) { putc (**ln, outfile); (*ln)++;}
+  }
+
+  else if ( prefix("\\setstaffs", *ln) )
+  { /* for now, just record in staffs[i]  */
+    int n, p;
+    s = strpbrk (*ln, "123456789");
+    if ( s == NULL ) error ("\\setstaffs command unreadable.");
+    n = (int)(*s) - (int)('0'); /* instrument number  */
+    s = strpbrk (s+1, "123456789");
+    if ( s == NULL ) error ("\\setstaffs command unreadable.");
+    p = (int)(*s) - (int)('0'); /* number of staffs */
+    staffs[n] = p;
+    while (*ln <= s) { putc (**ln, outfile); (*ln)++;}
+  }
+
+  else if ( prefix("\\startpiece", *ln)     ||
+            prefix("\\startextract", *ln)   ) 
+  { int i, j; 
+    nstaffs = 1;
+    for (j=2; j <= staffs[1]; j++)
+      nstaffs++; 
+    for (i=2; i <= ninstr; i++) 
+    { nstaffs++; 
+      for (j=2; j <= staffs[i]; j++)
+        nstaffs++; 
+    }   
+    fputs (*ln, outfile);
+    *ln =*ln + strlen(*ln);
+  }
+
+  else if ( prefix("\\nnnotes", *ln) ||
+            prefix("\\nnotes", *ln) ||
+            prefix("\\notes", *ln) || 
+            prefix("\\Notes", *ln) ||
+            prefix("\\NOtes", *ln) ||
+            prefix("\\NOTes", *ln) ||
+            prefix("\\NOTEs", *ln) ) 
+  { char *s;
+    analyze_notes (ln);
+    outputs = true;
+    s = strchr (*ln, '\n');
+    if (s == NULL) s = *ln + strlen (*ln);
+    *ln = s+1;
+  }
+
+  else 
+  { /* if there is output, generate it and re-initialize n_notes[*]  */
+    if (outputs)
+    { int i;
+      fputs ("\\anotes\n", outfile);
+      for (i=1; i <= nstaffs; i++)
+      {
+        fputs ("  ", outfile);
+        fputs (notes[i], outfile);
+        if (terminator[i] == '$')
+          fputs ("\\en", outfile);
+        else
+          fputc (terminator[i], outfile);
+        fputc ('\n', outfile);
+        n_notes[i] = notes[i];
+        *n_notes[i] = '\0';
+      }
+      outputs = false;
+    }
+    fputs (*ln, outfile);
+    *ln =*ln + strlen(*ln);
+  }
+
+}
+
+PRIVATE
+void process_line ()
+{
+  char  *ln; 
+  ln = &line[0];
+  while ( *ln != '\0') 
+  {
+    while (*ln == ' ') { ln++; fputc (' ', outfile); }
+    if (*ln == '%') {
+      fprintf (outfile, "%s", ln);
+      return;
+    }
+  process_command (&ln); 
+  }     
+}
+
+
+PRIVATE
+void process_score ()
+{
+  int c; int i;
+  lineno = 0;
+  for (i=1; i < MAX_STAFFS; i++) 
+  {
+    staffs[i] = 1; 
+    n_notes[i] = notes[i];
+    *n_notes[i] = '\0';
+  }
+  c = getc (infile);
+
+  while ( c != EOF )
+  {
+    ungetc (c, infile);
+    fgets(line, LINE_LEN, infile); 
+    lineno++;
+    process_line ();
+    c = getc (infile);
+  }     /* c == EOF  */
+}     
+
+int main (int argc, char *argv[])
+{
+  int c;
+  char today[12];
+  time_t mytime; 
+# define NOPTS 3
+  struct option longopts[NOPTS] =
+  {  { "help", 0, NULL, 'h'},
+     { "version", 0, NULL, 'v'},
+     { NULL, 0, NULL, 0}
+  };
+  
+  time (&mytime);
+  strftime (today, 11, "%Y-%m-%d", localtime (&mytime) );
+  printf ("This is tex2aspc, version %s.\n", version);
+  printf ("Copyright (C) 2017  R. D. Tennent\n" );
+  printf ("School of Computing, Queen's University, rdt at cs.queensu.ca\n" );
+  printf ("License GNU GPL version 2 or later <http://gnu.org/licences/gpl.html>.\n" );
+  printf ("There is NO WARRANTY, to the extent permitted by law.\n\n" );
+
+  c = getopt_long (argc, argv, "hv", longopts, NULL);
+  while (c != -1)
+    {
+      switch (c)
+        {
+        case 'h':
+          usage ();
+          printf ("Please report bugs to rdt at cs.queensu.ca.\n" );
+          exit (0);
+        case 'v':
+          exit (0);
+        case '?':
+          exit (EXIT_FAILURE);
+        default:
+          printf ("Function getopt returned character code 0%o.\n",
+                  (unsigned int) c);
+          exit (EXIT_FAILURE);
+        }
+      c = getopt_long (argc, argv, "hv", longopts, NULL);
+    }
+
+  infilename[0] = '\0';
+  infilename_n = infilename;
+  if (optind < argc)
+    append (infilename, &infilename_n, argv[optind], sizeof (infilename));
+  else 
+  { usage();
+    exit (EXIT_FAILURE);
+  }
+  infile = fopen (infilename, "r");
+  if (infile == NULL)
+  {
+    if (suffix (".tex", infilename) )
+    { printf ("Can't open %s\n", infilename);
+      exit (EXIT_FAILURE);
+    }
+    else
+    { append (infilename, &infilename_n, ".tex", sizeof (infilename));
+      infile = fopen (infilename, "r");
+      if (infile == NULL)
+      { printf ("Can't open %s\n", infilename);
+        exit (EXIT_FAILURE);
+      }
+    }
+  }
+  printf ("Reading from %s.", infilename);
+
+  optind++;
+  outfilename[0] = '\0';
+  outfilename_n = outfilename;
+  if (optind < argc)  /* user-provided outfilename */
+  {
+    append (outfilename, &outfilename_n, argv[optind], sizeof (outfilename));
+    if (!suffix (".aspc", outfilename))
+      append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename));
+  }
+  else 
+  { /* output to infile.aspc  */
+    append (outfilename, &outfilename_n, infilename, sizeof (outfilename));
+    outfilename_n -= 4;
+    *outfilename_n = '\0';
+    append (outfilename, &outfilename_n, ".aspc", sizeof (outfilename));
+  }
+
+  outfile = fopen (outfilename, "w");
+  if (outfile == NULL)
+  { printf ("Can't open %s\n", outfilename);
+    exit (EXIT_FAILURE);
+  }
+  printf (" Writing to %s.", outfilename);
+
+  printf ("\n\n");
+
+  fprintf (outfile, "%%  Generated by tex2aspc (%s).\n", version);
+    process_score (); 
+  
+  return 0;
+}


Property changes on: trunk/Build/source/utils/autosp/autosp-src/tex2aspc.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: trunk/Build/source/utils/autosp/autosp-src/tex2aspc.test
===================================================================
--- trunk/Build/source/utils/autosp/autosp-src/tex2aspc.test	                        (rev 0)
+++ trunk/Build/source/utils/autosp/autosp-src/tex2aspc.test	2017-12-30 22:19:20 UTC (rev 46169)
@@ -0,0 +1,21 @@
+#! /bin/sh -vx
+
+# Copyright (C) 2015 Peter Breitenlohner <tex-live at tug.org>
+# You may freely use, modify and/or distribute this file.
+
+echo && echo "*** tex2aspc --help"
+./tex2aspc --help || exit 1
+
+echo && echo "*** tex2aspc --version"
+./tex2aspc --version || exit 1
+
+echo && echo "*** tex2aspc  (missing infile)"
+./tex2aspc  && exit 1
+
+echo && echo "*** tex2aspc quod2.tex quod4.aspc"
+cp tests/quod4.aspc .
+rm -f quod4.aspc
+./tex2aspc quod2.tex quod4.aspc || exit 1
+
+echo && echo "*** diff quod4.aspc tests/quod4.aspc"
+diff quod4.aspc tests/quod4.aspc || exit 1

Modified: trunk/Build/source/utils/autosp/configure
===================================================================
(Binary files differ)

Modified: trunk/Build/source/utils/autosp/configure.ac
===================================================================
--- trunk/Build/source/utils/autosp/configure.ac	2017-12-30 06:49:10 UTC (rev 46168)
+++ trunk/Build/source/utils/autosp/configure.ac	2017-12-30 22:19:20 UTC (rev 46169)
@@ -7,7 +7,7 @@
 dnl   gives unlimited permission to copy and/or distribute it,
 dnl   with or without modifications, as long as this notice is preserved.
 dnl
-m4_define([autosp_version], [2017-07-14])[]dnl using unmodified autosp source
+m4_define([autosp_version], [2017-12-26])[]dnl using unmodified autosp source
 AC_INIT([autosp (TeX Live)], autosp_version, [tex-k at tug.org])
 AC_PREREQ([2.65])
 AC_CONFIG_SRCDIR([autosp-src/autosp.c])



More information about the tex-live-commits mailing list