Modified:
trunk/abcp.ppr
trunk/examples/abcdump/abcdump.c
trunk/src/abcp.h
trunk/src/abcpfield.pmx
Log:
Modified: trunk/abcp.ppr
==============================================================================
--- trunk/abcp.ppr (original)
+++ trunk/abcp.ppr Sun Mar 8 08:28:24 2009
@@ -79,35 +79,38 @@
3=src\abcp.h
4=examples\explicit\explicit.c
5=src\abcpcommon.c
-6=src\abcpchords.pmx
-7=test\a10.txt
-8=test\a4.txt
-9=src\abcpkey.pmx
-10=examples\crdnotes\makefile
+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=test\a3.txt
+15=test\a2.txt
+16=src\abcpfield.pmx
[Selected Project Files]
Main=
-Selected=src\abcpchords.pmx
+Selected=src\abcpfield.pmx
[examples\abcdump\abcdump.c]
-TopLine=182
-Caret=14,192
+TopLine=184
+Caret=20,194
[src\abcpscan.pmx]
-TopLine=213
-Caret=14,213
+TopLine=249
+Caret=41,257
[src\abcpnote.c]
-TopLine=109
-Caret=19,126
+TopLine=61
+Caret=35,87
[src\abcp.h]
-TopLine=158
-Caret=27,175
+TopLine=168
+Caret=44,190
[examples\explicit\explicit.c]
TopLine=133
Caret=10,158
[src\abcpcommon.c]
-TopLine=15
-Caret=27,52
-[src\abcpchords.pmx]
-TopLine=81
-Caret=36,50
+TopLine=9
+Caret=1,38
[test\a10.txt]
TopLine=1
Caret=38,7
@@ -120,3 +123,24 @@
[examples\crdnotes\makefile]
TopLine=1
Caret=1,23
+[test\a7.txt]
+TopLine=1
+Caret=1,13
+[test\a9.txt]
+TopLine=1
+Caret=1,1
+[test\a6.txt]
+TopLine=1
+Caret=1,3
+[test\a5.txt]
+TopLine=1
+Caret=1,1
+[test\a3.txt]
+TopLine=1
+Caret=1,1
+[test\a2.txt]
+TopLine=1
+Caret=1,1
+[src\abcpfield.pmx]
+TopLine=38
+Caret=2,61
Modified: trunk/examples/abcdump/abcdump.c
==============================================================================
--- trunk/examples/abcdump/abcdump.c (original)
+++ trunk/examples/abcdump/abcdump.c Sun Mar 8 08:28:24 2009
@@ -14,6 +14,7 @@
abcToken tok;
chs_t abctext = NULL;
int k = S_NONE;
+ int j;
FILE *f;
int argn;
@@ -280,6 +281,17 @@
printf("USRSYMDEF: [%c][%.*s]\n", abcUserSymbol(scn),
abcUserSymbolDefineLen(scn),
abcUserSymbolDefineStart(scn));
+ break;
+
+ case 'M' :
+ printf("METER: %d/%d ", abcMeterBeats(scn),
abcMeterUnits(scn));
+ printf("(%d",abcMeterBeatsNth(scn,1));
+ k=2;
+
+ while ((j = abcMeterBeatsNth(scn,k++)) != 0)
+ printf("+%d",j);
+
+ printf(")\n");
break;
default:
Modified: trunk/src/abcp.h
==============================================================================
--- trunk/src/abcp.h (original)
+++ trunk/src/abcp.h Sun Mar 8 08:28:24 2009
@@ -365,6 +365,11 @@
/********* */
-
+/* in abcpfield.pmx */
+
+int abcMeterBeatsNth(abcScanner *scn,int k);
+int abcMeterUnits(abcScanner *scn);
+
+#define abcMeterBeats(s) abcMeterBeatsNth(s,0)
#endif
Modified: trunk/src/abcpfield.pmx
==============================================================================
--- trunk/src/abcpfield.pmx (original)
+++ trunk/src/abcpfield.pmx Sun Mar 8 08:28:24 2009
@@ -1,7 +1,7 @@
/*
** (C) by Remo Dentato (rden...@gmail.com)
**
-** This sofwtare is distributed under the terms of the BSD license:
+** This software is distributed under the terms of the BSD license:
** http://creativecommons.org/licenses/BSD/
** http://opensource.org/licenses/bsd-license.php
*/
@@ -46,7 +46,6 @@
return 1;
}
-
/*
M: none
M: free
@@ -57,9 +56,70 @@
<?=(>(<+= 0-9+>)<?=)>&K<?=/>&K(<*d>)
*/
+#define MAXBEATS 32
+static char beats[MAXBEATS];
+static char units;
+
+static void abc_meter(abcScanner *scn)
+{
+ char *p;
+ int k;
+ int i;
+
+ for (i=0; i < MAXBEATS; i++)
+ beats[i] = 0;
+
+ units = 0;
+
+ i = 1;
+ p = abcFieldStart(scn);
+ k = abcFieldLen(scn);
+ while (k>0) {
+ switch pmx(p) {
+ case "&k" :
+ k -= pmx(Len,0);
+ break;
+
+ case "C|" :
+ beats[0] = 2; beats[1] = 2; beats[3] = 0;
+ units = 2;
+ k = 0;
+ break;
+
+ case "C" :
+ beats[0] = 4; beats[1] = 4; beats[3] = 0;
+ units = 2;
+ k = 0;
+ break;
+
+ case "none&|free" :
+ beats[0] = 1; beats[1] = 1; beats[3] = 0;
+ units = 1;
+ k = 0;
+ break;
+
+ case "&d&K" :
+ beats[i] = atoi(pmx(Start,0));
+ beats[0] += beats[i];
+ if (i<MAXBEATS) i++;
+ beats[i] = 0;
+ k -= pmx(Len,0);
+ break;
+
+ case "/&K(&d)" :
+ units = atoi(pmx(Start,1));
+ k = 0;
+ break;
+
+ case "<.>&K" :
+ k -= pmx(Len,0);
+ break;
+ }
+ }
+}
-
+#if 0
char *abcMeterStart(abcScanner *scn)
{
@@ -69,16 +129,26 @@
{
}
+#endif
-
-int abcMeterBeats(abcScanner *scn)
+int abcMeterUnits(abcScanner *scn)
{
+ if (abcToken(scn) != T_FIELD || abcField(scn) != 'M') return 0;
+ if (!abcTestFlag(scn,ABC_F_FIELDSCANNED))
+ abc_meter(scn);
+
+ return units;
}
-int abcMeterUnit(abcScanner *scn)
+int abcMeterBeatsNth(abcScanner *scn, int k)
{
-
+ if (abcToken(scn) != T_FIELD || abcField(scn) != 'M') return 0;
+
+ if (k >= MAXBEATS) return 0;
+
+ if (!abcTestFlag(scn, ABC_F_FIELDSCANNED))
+ abc_meter(scn);
+
+ return beats[k];
}
-
-