Added:
trunk/src/abcpnote.pmx
trunk/test/b7.txt
Removed:
trunk/src/abcpnote.c
Modified:
trunk/abcp.ppr
trunk/examples/abcdump/abcdump.c
trunk/src/abcp.h
trunk/src/abcp_priv.h
trunk/src/abcpcommon.c
trunk/src/abcpkey.pmx
trunk/src/abcpscan.pmx
trunk/src/makefile
trunk/test/a7.txt
Log:
Modified: trunk/abcp.ppr
==============================================================================
--- trunk/abcp.ppr (original)
+++ trunk/abcp.ppr Sun Mar 15 08:15:38 2009
@@ -35,11 +35,11 @@
examples\makefile
+src
src\abcpscan.pmx
- src\abcpnote.c
src\abcpkey.pmx
src\abcpchords.pmx
src\abcptext.pmx
src\abcpcommon.c
+ src\abcpnote.pmx
src\abcp_priv.h
src\abcp.h
src\makefile
@@ -75,68 +75,38 @@
[Open project files]
0=examples\abcdump\abcdump.c
1=src\abcpscan.pmx
-2=src\abcpnote.c
-3=src\abcp.h
-4=examples\explicit\explicit.c
-5=src\abcpcommon.c
-6=test\a10.txt
-7=test\a4.txt
-8=src\abcpkey.pmx
-9=examples\crdnotes\makefile
-10=test\a7.txt
-11=test\a9.txt
-12=test\a6.txt
-13=test\a5.txt
-14=src\abcpfield.pmx
-15=test\a11.txt
-16=doc\sag.txt
-17=doc\s2.txt
-18=New1.txt
+2=src\abcp.h
+3=src\abcpcommon.c
+4=src\abcpkey.pmx
+5=src\abcpfield.pmx
+6=test\a11.txt
+7=doc\sag.txt
+8=doc\s2.txt
+9=src\makefile
+10=src\abcpnote.pmx
+11=..\abcm2ps-5.9.3\features.txt
+12=..\abcmidi\doc\abc2midi.1
+13=..\abcmidi\doc\abcguide.txt
+14=src\abcp_priv.h
+15=test\a7.txt
[Selected Project Files]
Main=
-Selected=New1.txt
+Selected=test\a7.txt
[examples\abcdump\abcdump.c]
-TopLine=265
-Caret=23,276
+TopLine=220
+Caret=21,206
[src\abcpscan.pmx]
-TopLine=509
-Caret=47,517
-[src\abcpnote.c]
-TopLine=778
-Caret=3,806
+TopLine=506
+Caret=1,531
[src\abcp.h]
-TopLine=313
-Caret=27,329
-[examples\explicit\explicit.c]
-TopLine=133
-Caret=10,158
+TopLine=162
+Caret=1,185
[src\abcpcommon.c]
-TopLine=23
-Caret=29,25
-[test\a10.txt]
TopLine=1
-Caret=38,7
-[test\a4.txt]
-TopLine=1
-Caret=47,12
+Caret=19,20
[src\abcpkey.pmx]
-TopLine=230
-Caret=1,244
-[examples\crdnotes\makefile]
-TopLine=1
-Caret=1,23
-[test\a7.txt]
-TopLine=1
-Caret=28,11
-[test\a9.txt]
-TopLine=1
-Caret=1,1
-[test\a6.txt]
-TopLine=1
-Caret=1,3
-[test\a5.txt]
-TopLine=1
-Caret=1,1
+TopLine=311
+Caret=1,324
[src\abcpfield.pmx]
TopLine=79
Caret=22,106
@@ -147,8 +117,26 @@
TopLine=75
Caret=40,87
[doc\s2.txt]
+TopLine=53
+Caret=40,226
+[src\makefile]
+TopLine=1
+Caret=35,13
+[src\abcpnote.pmx]
+TopLine=107
+Caret=29,116
+[..\abcm2ps-5.9.3\features.txt]
+TopLine=166
+Caret=11,177
+[..\abcmidi\doc\abc2midi.1]
+TopLine=225
+Caret=1,1
+[..\abcmidi\doc\abcguide.txt]
+TopLine=185
+Caret=6,205
+[src\abcp_priv.h]
TopLine=1
-Caret=29,230
-[New1.txt]
-TopLine=181
-Caret=7,229
+Caret=19,29
+[test\a7.txt]
+TopLine=17
+Caret=13,26
Modified: trunk/examples/abcdump/abcdump.c
==============================================================================
--- trunk/examples/abcdump/abcdump.c (original)
+++ trunk/examples/abcdump/abcdump.c Sun Mar 15 08:15:38 2009
@@ -208,13 +208,14 @@
case T_NOTE:
bend = abcNoteBending(scn);
printf("NOTE: ");
- printf("%s%s ", abcNotePitch(scn), bend == abcNatural?"
(natural)":"");
+ printf("%c%s ", abcNote(scn), bend == abcNatural?"
(natural)":"");
+ printf("octave: %d ",abcNoteOctave(scn));
printf("bend: %.2f (%.2f/%.2f) ",bend==
abcNatural?0.0:bend,abcNoteMicrotoneNum(scn),abcNoteMicrotoneDen(scn));
- printf("court: %d\n",abcNoteCourtesyAccidentals(scn));
+ printf("court: %d\n",abcNoteAccidentalCourtesy(scn));
printf("
accidental: %.*s\n",abcNoteAccidentalLen(scn),abcNoteAccidentalStart(scn));
printf(" duration: %.2f ",abcNoteDuration(scn));
- printf("octave: %d ",abcNoteOctave(scn));
- printf("midi:
(%d,%d)\n",abcNoteMidi(scn),abcNoteMidiPitchBend(scn));
+ printf("midi:
(%d,%d)",abcNoteMidi(scn),abcNoteMidiPitchBend(scn));
+ printf("\n");
break;
case T_REST:
@@ -226,6 +227,14 @@
printf("INCLUDE: %.*s%.*s",
abcTokenLen(scn,1),abcTokenStart(scn,1),
abcTokenLen(scn,2),abcTokenStart(scn,2));
printf(" %s\n", abcInclude(scn)? "OK":"FAILED");
+ break;
+
+ case T_GRACEEND:
+ printf("GRACEEND\n");
+ break;
+
+ case T_GRACE:
+ printf("GRACE\n");
break;
case T_INCLUDEEND:
Modified: trunk/src/abcp.h
==============================================================================
--- trunk/src/abcp.h (original)
+++ trunk/src/abcp.h Sun Mar 15 08:15:38 2009
@@ -177,7 +177,9 @@
#define abcNote2Num(c) ((tolower(c)-'c'+7) % 7)
unsigned short abcNote2Midi(char pitch, int octave, int acc);
-int abcNoteCourtesyAccidentals(abcScanner *scn);
+char abcNote(abcScanner *scn);
+
+int abcNoteAccidentalCourtesy(abcScanner *scn);
int abcNoteAccidentalLen(abcScanner *scn);
char *abcNoteAccidentalStart(abcScanner *scn);
Modified: trunk/src/abcp_priv.h
==============================================================================
--- trunk/src/abcp_priv.h (original)
+++ trunk/src/abcp_priv.h Sun Mar 15 08:15:38 2009
@@ -26,11 +26,10 @@
-float abc_getfracion(char *a, int al,
+float abc_getfraction(char *a, int al,
char *b, int bl,
char *c, int cl);
-float abc_notebending(char *e, int el, char *a, int al,
- char *b, int bl, char *c, int cl);
+float abc_notebending(char *e, int el);
#endif
Modified: trunk/src/abcpcommon.c
==============================================================================
--- trunk/src/abcpcommon.c (original)
+++ trunk/src/abcpcommon.c Sun Mar 15 08:15:38 2009
@@ -17,7 +17,7 @@
a___b______c___
al b cl
*/
-float abc_getfracion(char *a, int al,
+float abc_getfraction(char *a, int al,
char *b, int bl,
char *c, int cl)
{
@@ -41,31 +41,3 @@
}
-float abc_notebending(char *e, int el, char *a, int al,
- char *b, int bl, char *c, int cl)
-{
- float cents = 0.0;
- char *p;
-
- p = e+el;
-
- if (al > 0 || bl > 0 ) {
- /* Got microtones last accidental gives direction*/
- cents = abc_getfracion(a,al,b,bl,c,cl);
- if (bl > 0)
- cents = cents * 100.0;
- if (p > e && *--p == '_')
- cents = cents *-1.0;
- }
- else if (el == 1 && *e == '=')
- return abcNatural;
-
- while (p > e) {
- switch (*--p) {
- case '^' : cents += 100.0; break ;
- case '_' : cents -= 100.0; break ;
- }
- }
-
- return cents ;
-}
Modified: trunk/src/abcpkey.pmx
==============================================================================
--- trunk/src/abcpkey.pmx (original)
+++ trunk/src/abcpkey.pmx Sun Mar 15 08:15:38 2009
@@ -318,16 +318,9 @@
while (k) {
switch pmx(p) {
case "&k" : break;
- case "(<+=^_=>)(&F)(<*=/>)(&F)(<=A-Ga-g>)&K" :
- k = abcNote2Num(*pmx(Start,5));
-
- expsig[k] = abc_notebending(pmx(Start,1), pmx(Len,1),
- pmx(Start,2), pmx(Len,2),
- pmx(Start,3), pmx(Len,3),
- pmx(Start,4), pmx(Len,4) );
-
- if (expsig[k] == 0.0 && pmx(Len,1) == 1 && *pmx(Start,1) == '=')
- expsig[k] = abcNatural;
+ case "(<+=^_=><*!A-Ga-g\t\n\r\f >)(<=A-Ga-g>)&K" :
+ k = abcNote2Num(*pmx(Start,2));
+ expsig[k] = abc_notebending(pmx(Start,1), pmx(Len,1));
k = 1;
break;
Added: trunk/src/abcpnote.pmx
==============================================================================
--- (empty file)
+++ trunk/src/abcpnote.pmx Sun Mar 15 08:15:38 2009
@@ -0,0 +1,399 @@
+/*
+** (C) by Remo Dentato (rden...@gmail.com)
+**
+** This software is distributed under the terms of the BSD license:
+** http://creativecommons.org/licenses/BSD/
+** http://opensource.org/licenses/bsd-license.php
+*/
+
+#include <ctype.h>
+#include "abcp_priv.h"
+
+
+
+#define getfraction(s,n) abc_getfraction(abcTokenStart(s,n), \
+ abcTokenLen(s,n), \
+ abcTokenStart(s,n+1), \
+ abcTokenLen(s,n+1), \
+ abcTokenStart(s,n+2), \
+ abcTokenLen(s,n+2))
+
+
+char *abcNoteAccidentalStart(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return utlEmptyString;
+ return abcTokenStart(scn,1);
+}
+
+int abcNoteAccidentalLen(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0;
+ return abcTokenLen(scn,1);
+}
+
+int abcNoteAccidentalCourtesy(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0;
+ if (*abcTokenStart(scn,0) != '(') return 0;
+ return 1;
+}
+
+float abcNoteDuration(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 1.0;
+ return getfraction(scn,4);
+}
+
+int abcNoteOctave(abcScanner *scn)
+{
+ int oct = 4;
+ int k;
+ char *p;
+
+ if (abcToken(scn) != T_NOTE) return 0;
+
+ if (islower(*abcTokenStart(scn,2)))
+ oct++;
+
+ p = abcTokenStart(scn,3);
+ k = abcTokenLen(scn,3);
+ while (k-- > 0) {
+ switch (*p++) {
+ case '\'' : oct++; break;
+ case ',' : oct--; break;
+ }
+ }
+ return oct;
+}
+
+char abcNote(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return '\0';
+ return toupper(*abcTokenStart(scn,2));
+}
+
+float abcNoteCents(abcScanner *scn)
+{
+ float cents;
+ cents = abcNoteBending(scn);
+ if (cents == abcNatural)
+ cents = 0.0;
+ return cents ;
+}
+
+static float abc_bend;
+static float abc_num;
+static float abc_den;
+
+float abc_notebending(char *acc,int len)
+{
+ float bend = 0.0;
+ float frac;
+ char *p,*q=NULL;
+
+ abc_bend = 0.0;
+ abc_num = 0.0;
+ abc_den = 0.0;
+
+ if (len > 0) {
+ p = acc;
+ if (*p == '=') {
+ if (len == 1) bend = abcNatural;
+ else do {
+ switch (*++p) {
+ case '+' : bend += 21.506290; break;
+ case '-' : bend += -21.506290; break;
+ case '>' : bend += 53.272943; break;
+ case '<' : bend += -53.272943; break;
+ case '@' : bend += 27.264092; break;
+ case '*' : bend += -27.264092; break;
+ case 'm' : bend += 65.337341; break;
+ case 'w' : bend += -65.337341; break;
+ case 'n' : bend += 104.955410; break;
+ case 'v' : bend += -104.955410; break;
+ case ']' : bend += 93.603014; break;
+ case '[' : bend += -93.603014; break;
+ case '}' : bend += 73.680654; break;
+ case '{' : bend += -73.680654; break;
+ case '^' : bend += 100.000000; break;
+ case '_' : bend += -100.000000; break;
+ case '\'': bend += 12.500000; break;
+ case ',' : bend += -12.500000; break;
+ case '|' : bend += 16.666667; break;
+ case '!' : bend += -16.666667; break;
+ case 'p' : bend += 5.000000; break;
+ case 'q' : bend += -5.000000; break;
+ case '\\':
+ case '/' : frac = 50.0;
+ while (len>2 && *p == p[1]) {
+ frac /= 2.0; len--; p++;
+ }
+ if (*p == '\\') frac = -frac;
+ bend += frac;
+ break;
+ }
+ } while (--len > 1) ;
+ }
+ else {
+ while (len > 0) {
+ if (*p == '^') bend += 100;
+ else if (*p == '_') bend -= 100;
+ else break;
+ q=p; p++; len--;
+ }
+ if (len > 0) {
+ switch pmx(p) {
+ case "(&F)(<*=/>)(&F)" :
+ frac = abc_getfraction(pmx(Start,1),pmx(Len,1),
+ pmx(Start,2),pmx(Len,2),
+ pmx(Start,3),pmx(Len,3));
+ if (pmx(Len,2) != 0) frac *= 100;
+ if (pmx(Len,1) > 0) abc_num = atof(pmx(Start,1));
+ if (pmx(Len,3) > 0) abc_den = atof(pmx(Start,3));
+ if (q) {
+ switch (*q) {
+ case '^' : bend -= 100; break;
+ case '_' : bend += 100;
+ frac *= -1;
+ abc_num *= -1;
+ break;
+ }
+ }
+ bend += frac;
+ break;
+ }
+ }
+ }
+ }
+ abc_bend = bend;
+ return bend;
+}
+
+
+float abcNoteBending(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0.0;
+
+ if (!abcTestFlag(scn, ABC_F_BENDCOMPUTED)) {
+ abcSetFlag(scn,ABC_F_BENDCOMPUTED);
+ abc_bend = abc_notebending(abcTokenStart(scn,1), abcTokenLen(scn,1)) ;
+ }
+ return abc_bend;
+}
+
+float abcNoteMicrotoneNum(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0.0;
+
+ if (!abcTestFlag(scn, ABC_F_BENDCOMPUTED)) {
+ abcSetFlag(scn,ABC_F_BENDCOMPUTED);
+ abc_bend = abc_notebending(abcTokenStart(scn,1), abcTokenLen(scn,1)) ;
+ }
+ return abc_num;
+}
+
+float abcNoteMicrotoneDen(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0.0;
+
+ if (!abcTestFlag(scn, ABC_F_BENDCOMPUTED)) {
+ abcSetFlag(scn,ABC_F_BENDCOMPUTED);
+ abc_bend = abc_notebending(abcTokenStart(scn,1), abcTokenLen(scn,1)) ;
+ }
+ return abc_den;
+}
+
+unsigned short abcNote2Midi(char pitch, int octave, int acc)
+{
+ int n;
+ n = abcSemitones[abcNote2Num(pitch)] - 1 + acc;
+ n += 12 * octave;
+ while (n>127) n -= 12;
+ while (n<0) n += 12;
+ return n;
+}
+
+unsigned short abcNoteMidi(abcScanner *scn)
+{
+ if (abcToken(scn) != T_NOTE) return 0;
+ return abcNote2Midi(*abcTokenStart(scn,5),
+ abcNoteOctave(scn)+1,
+ (int)(abcNoteCents(scn)/100.0));
+ }
+
+unsigned short abcNoteMidiPitchBend(abcScanner *scn)
+{
+ float bend;
+ if (abcToken(scn) != T_NOTE) return 0;
+
+ bend = abcNoteCents(scn)/100;
+ return (8192 + (int)(8192.0 * (bend - trunc(bend))));
+}
+
+
+unsigned short abcRestInvisible(abcScanner *scn)
+{
+ if (abcToken(scn) != T_REST) return 1;
+ return (*abcTokenStart(scn,1) == 'x');
+}
+
+unsigned short abcRestMultimeasure(abcScanner *scn)
+{
+ if (abcToken(scn) != T_REST) return 0;
+ return (*abcTokenStart(scn,1) == 'Z');
+}
+
+float abcRestDuration(abcScanner *scn)
+{
+ if (abcToken(scn) != T_REST) return 1;
+ return getfraction(scn,2);
+}
+
+/*************/
+
+char *abcBarStart(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BAR) return utlEmptyString;
+ if (abcTokenLen(scn,3) == 0) return utlEmptyString;
+ return abcTokenStart(scn,3);
+}
+
+int abcBarLen(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BAR) return 0;
+ return abcTokenLen(scn,3);
+}
+
+int abcBarDotted(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BAR) return 0;
+ if (abcTokenLen(scn,2) > 0) return 1;
+ if (abcTokenLen(scn,3) == 0 && abcTokenLen(scn,1) & 1) return 1;
+ return 0;
+}
+
+int abcBarInvisible(abcScanner *scn)
+{
+ char *b;
+ int l;
+
+ if (abcToken(scn) != T_BAR) return 1;
+ l = abcTokenLen(scn,3);
+ b = abcTokenStart(scn,3);
+ if (b[1] == '[') {
+ if (l == 2 && b[1] == ']') return 1;
+ if (l == 3 && b[1] == '|' && b[2] == ']') return 1;
+ }
+ else if (l == 1 && b[0] == ']') return 1;
+ return 0;
+}
+
+int abcBarRepeatBefore(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BAR) return 0;
+ if (abcTokenLen(scn,2) > 0 || abcTokenLen(scn,3) > 0)
+ return abcTokenLen(scn,1);
+ else
+ return abcTokenLen(scn,1) / 2;
+}
+
+int abcBarRepeatAfter(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BAR) return 0;
+ if (abcTokenLen(scn,2) > 0 || abcTokenLen(scn,3) > 0)
+ return abcTokenLen(scn,4);
+ else
+ return abcTokenLen(scn,1) / 2;
+}
+
+int abcBarEnding(abcScanner *scn)
+{
+ if (abcToken(scn) != T_ENDING) return 0;
+ return atoi(abcTokenStart(scn,2));
+}
+
+char *abcBarEndingStart(abcScanner *scn)
+{
+ if (abcToken(scn) != T_ENDING) return utlEmptyString;
+ return abcTokenStart(scn,2);
+}
+
+int abcBarEndingLen(abcScanner *scn)
+{
+ if (abcToken(scn) != T_ENDING) return 0;
+ return abcTokenLen(scn,2);
+}
+
+/*** Broken rythm */
+
+int abcBroken(abcScanner *scn)
+{
+ if (abcToken(scn) != T_BROKENLEFT && abcToken(scn) != T_BROKENRIGHT)
+ return 0;
+ return abcTokenLen(scn,0);
+}
+
+/*** Chord */
+
+float abcChordDuration(abcScanner *scn)
+{
+ if (abcToken(scn) != T_CHORDEND) return 1;
+ return getfraction(scn,1);
+}
+
+/*** Overlay */
+
+int abcOverlay(abcScanner *scn)
+{
+ if (abcToken(scn) != T_OVLRESET && abcToken(scn) != T_OVLSTART &&
abcToken(scn) != T_OVLEND)
+ return 0;
+ return abcTokenLen(scn,1);
+}
+
+/** slur and tie */
+
+char abcSlurDirection(abcScanner *scn)
+{
+ if ((abcToken(scn) != T_SLURSTART && abcToken(scn) != T_SLUREND) ||
+ abcTokenLen(scn,2) == 0) return '-';
+ return *abcTokenStart(scn,2);
+}
+
+char abcTieDirection(abcScanner *scn)
+{
+ if (abcToken(scn) != T_TIE || abcTokenLen(scn,2) == 0) return '-';
+ return *abcTokenStart(scn,2);
+}
+
+int abcSlurDotted(abcScanner *scn)
+{
+ if (abcToken(scn) != T_SLURSTART && abcToken(scn) != T_SLUREND) return 0;
+ return (abcTokenLen(scn,1) > 0);
+}
+
+int abcTieDotted(abcScanner *scn)
+{
+ if (abcToken(scn) != T_TIE) return 0;
+ return (abcTokenLen(scn,1) > 0);
+}
+
+/** TUPLET */
+
+int abcTuplet(abcScanner *scn)
+{
+ if (abcToken(scn) != T_TUPLET) return 0;
+ return atoi(abcTokenStart(scn,1));
+}
+
+int abcTupletTime(abcScanner *scn)
+{
+ if (abcToken(scn) != T_TUPLET || abcTokenLen(scn,2)==0) return 0;
+ return atoi(abcTokenStart(scn,2));
+}
+
+int abcTupletNext(abcScanner *scn)
+{
+ if (abcToken(scn) != T_TUPLET || abcTokenLen(scn,3)==0) return 0;
+ return atoi(abcTokenStart(scn,3));
+}
+
Modified: trunk/src/abcpscan.pmx
==============================================================================
--- trunk/src/abcpscan.pmx (original)
+++ trunk/src/abcpscan.pmx Sun Mar 15 08:15:38 2009
@@ -203,16 +203,6 @@
(s)->tok_str[0][0]++; \
} while(utlZero)
-#define settoken_NOTE(s) do { \
- settoken(s,T_NOTE); \
- if (*(s)->tok_str[0][0] == '(' &&
(s)->tok_str[1][1][-1] == ')') \
- (s)->tok_str[1][1]--;\
- if (pmx(Len,2)> 0 && pmx(Len,1) > 1 &&
(s)->tok_str[1][1][-1] == '-' ) {\
- (s)->tok_str[1][1]--; \
- (s)->tok_str[2][0]--; \
- } \
- } while(utlZero)
-
#define stategoto(scn,st) (((scn)->prevstate = S_NONE), \
((scn)->nextstate = st))
@@ -522,9 +512,11 @@
settoken(scn,T_TEXT);
break;
-
case "<?=&(>(=<*!A-Ga-g0-9>)(&F)(<*=/>)(&F)<?=&)>(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
-
case "<?=&(>(<*=^_>)(&F)(<*=/>)(&F)<?=&)>(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
- settoken_NOTE(scn);
+ case "<?=&(>(<=^_=><*!A-Ga-g\t\n\r\f
>)<?=&)>(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
+ case "()(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
+ settoken(scn,T_NOTE);
+ if (*scn->tok_str[0][0] == '(' &&
scn->tok_str[1][1][-1] == ')')
+ scn->tok_str[1][1]--;
break;
case "(<=Zzx>)(<*d>)(<*=/>)(<*d>)" :
@@ -805,9 +797,11 @@
stategoto(scn,S_TUNE);
break;
-
case "&((<+=^_=>)(<*d>)(<*=/>)(<*d>)&)(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
-
case "(<*=^_=>)(<*d>)(<*=/>)(<*d>)(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
+ case "<?=&(>(<=^_=><*!A-Ga-g\t\n\r\f
>)<?=&)>(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
+ case "()(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
settoken(scn,T_NOTE);
+ if (*scn->tok_str[0][0] == '(' &&
scn->tok_str[1][1][-1] == ')')
+ scn->tok_str[1][1]--;
break;
case "(<?=.>)&)" : settoken(scn,T_SLUREND);
@@ -860,9 +854,11 @@
_dbgmsg("state: %04X
next: %04X\n",scn->state,scn->nextstate);
break;
-
case "&((<+=^_=>)&)(<*d>)(<*=/>)(<*d>)(<=A-Ga-g>)()(<*d>)(<*=/>)(<*d>)" :
- case "(<*=^_=>)(<*d>)(<*=/>)(<*d>)(<=A-Ga-g>)()(<*d>)(<*=/>)(<*d>)" :
+ case "<?=&(>(<=^_=><*!A-Ga-g\t\n\r\f
>)<?=&)>(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
+ case "()(<=A-Ga-g>)(<*=,'>)(<*d>)(<*=/>)(<*d>)" :
settoken(scn,T_NOTE);
+ if (*scn->tok_str[0][0] == '(' &&
scn->tok_str[1][1][-1] == ')')
+ scn->tok_str[1][1]--;
break;
case "(((<=.H-Wh-w~>)))" :
Modified: trunk/src/makefile
==============================================================================
--- trunk/src/makefile (original)
+++ trunk/src/makefile Sun Mar 15 08:15:38 2009
@@ -10,7 +10,7 @@
include $(TOP)config.mk
-LIBSRC = abcpscan.pmx abcpnote.c abcpkey.pmx abcpcommon.c \
+LIBSRC = abcpscan.pmx abcpnote.pmx abcpkey.pmx abcpcommon.c \
abcptext.pmx abcpchords.pmx abcpfield.pmx
LIBHDR = abcp.h abcp_priv.h
LIBOBJ = abcpscan$(_OBJ) abcpnote$(_OBJ) abcpkey$(_OBJ) abcpcommon$(_OBJ) \
Modified: trunk/test/a7.txt
==============================================================================
--- trunk/test/a7.txt (original)
+++ trunk/test/a7.txt Sun Mar 15 08:15:38 2009
@@ -10,11 +10,14 @@
X:4
^_2/3C _3/4C _75C _^3C =|\C
-X:5
-=/X\C =||)C ='|D =`|D
-
X:6
=+E =-E =<E =>E =[E =]E =@E =*E ={E =}E =wE =mE =vE =nE
-X:7
-=-1//F =-F
\ No newline at end of file
+X:4
+=''C =//C ^//C =/\\C
+
+X:9 % 72-ET
+=F =|F =||F =/F =!!^F =!^F ^F
+_G =|_G =||_G =\G =!!G =!G =G
+%
+[=/'C =/G =,/E] {^3/91D}C
Added: trunk/test/b7.txt
==============================================================================
--- (empty file)
+++ trunk/test/b7.txt Sun Mar 15 08:15:38 2009
@@ -0,0 +1,24 @@
+
+X:1 % 12-ET
+=C ^C _D D ^D
+
+X:2 % 24-ET
+=C ^/C ^C
+ _D _/D D
+
+X:5 % 48-ET
+=C =//C =/C =\\^C ^C
+ _D =//_D =\D =\\D D
+
+X:3 % 36-ET
+=C =||C =|/C ^C
+ _D =!\D =!!D =D
+
+X:9 % 72-ET
+=F =|F =||F =/F =|/F =||/F ^F
+ _G =!!\G =!\G =\G =!!G =!G =G
+
+X:4 % 96-ET
+=C ='C =''C =,/C =/C =/'C =,,^C =,^C ^C
+ _D ='_D =''_D =\,D =\D ='\D =,,D =,D
=D
+