Modified:
trunk/examples/abcdump/abcdump.c
trunk/src/abcp.h
trunk/src/abcpkey.pmx
trunk/src/abcpnote.c
Log:
Modified: trunk/examples/abcdump/abcdump.c
==============================================================================
--- trunk/examples/abcdump/abcdump.c (original)
+++ trunk/examples/abcdump/abcdump.c Tue Feb 24 14:52:47 2009
@@ -241,9 +241,15 @@
printf("KEY: %.*s ", abcKeyTonicLen(scn),
abcKeyTonicStart(scn));
printf("mode: %c\n", abcKeyMode(scn));
printf(" sig: ");
- printf("%.0f", abcKeySignature(scn)[0]);
+ printf("%6.2f", abcKeySignature(scn)[0]);
for (k=1; k<7; k++) {
- printf(", %.0f", abcKeySignature(scn)[k]);
+ printf(", %6.2f", abcKeySignature(scn)[k]);
+ }
+ printf("\n");
+ printf(" exp: ");
+ printf("%6.2f", abcKeyExpSignature(scn)[0]);
+ for (k=1; k<7; k++) {
+ printf(", %6.2f", abcKeyExpSignature(scn)[k]);
}
printf("\n");
/* printf(" accidentals: <%s>", abcKeyAccidentals(scn));*/
Modified: trunk/src/abcp.h
==============================================================================
--- trunk/src/abcp.h (original)
+++ trunk/src/abcp.h Tue Feb 24 14:52:47 2009
@@ -194,8 +194,11 @@
float abcNoteDuration(abcScanner *scn);
unsigned short abcNoteOctave(abcScanner *scn);
unsigned char *abcNotePitch(abcScanner *scn);
+
float abcNoteCents(abcScanner *scn);
-float abcNoteBending(abcScanner *scn);
+
+#define abcNoteBending(s) abc_notebending(s,T_NOTE)
+float abc_notebending(abcScanner *scn, unsigned short tok);
unsigned short abcNoteMidi(abcScanner *scn);
unsigned short abcNoteMidiPitchBend(abcScanner *scn);
@@ -326,6 +329,11 @@
short abcKVParm(abcScanner *scn,int p);
short abcVoiceTranspose(abcScanner *scn);
float *abcKeySignature(abcScanner *scn);
+float *abcKeyExpSignature(abcScanner *scn);
+
+#define ABC_Natural 9999.0
+int abcKeyExpNatural(abcScanner *scn,char pitch);
+float abcKeyExpBending(abcScanner *scn,char pitch);
#define abcKeyTonicStart(s) abcKVStringStart(s,ABC_Tonic)
#define abcKeyTonicLen(s) abcKVStringLen(s,ABC_Tonic)
Modified: trunk/src/abcpkey.pmx
==============================================================================
--- trunk/src/abcpkey.pmx (original)
+++ trunk/src/abcpkey.pmx Tue Feb 24 14:52:47 2009
@@ -260,9 +260,9 @@
p = abcTokenStart(scn,3);
q = abcTokenEnd(scn,3);
- if (p == NULL || p >= q || abcTestFlag(scn,ABC_F_CLEFSCANNED)) return;
+ if (p == NULL || p >= q || abcTestFlag(scn,ABC_F_FIELDSCANNED)) return;
- abcSetFlag(scn,ABC_F_CLEFSCANNED);
+ abcSetFlag(scn,ABC_F_FIELDSCANNED);
for (k = 0; k<MAXTABSTRINGS; k++) tablature[k] = 0;
for (k = 0; k<MAXPARMS; k++) parms[k] = 0;
@@ -318,7 +318,26 @@
switch pmx(p) {
case "&iexp&K<?==>&K" : break;
- }
+ }
+
+ /* Get explicit accidentals */
+ k = 1;
+ while (k) {
+ printf("[%s]\n",p);
+ switch pmx(p) {
+ case "&k" : break;
+ case "(<+=^_=>)(&F)(<*=/>)(&F)(<=A-Ga-g>)&K" :
+ k = abcNote2Num(*abcTokenStart(scn,5));
+ expsig[k] = abc_notebending(scn,abcToken(scn));
+ if (expsig[k] == 0.0 && abcTokenLen(scn,1) == 1 &&
+ *abcTokenStart(scn,1) == '=')
+ expsig[k] = ABC_Natural;
+ k = 1;
+ break;
+
+ default: k = 0;
+ }
+ }
}
if (abcTokenLen(scn,ABC_Tonic) == 0) {
@@ -331,34 +350,24 @@
abcTokenStart(scn,ABC_Tonic)[1],
parms[ABC_Mode] );
- if (kv == 'K') {
- /* Apply explicit accidentals
- k = 1;
- while (k) {
- switch pmx(p) {
- case "(<+=^_=>)(&F)(<*=/>)(&F)(<=A-Ga-g>)&K" :
- k = (tolower(*pmx(Start,2)) - 'c' + 7) % 7;
- if (pmx(Len,1) == 1 && *pmx(Start,1) == '=')
- keysig[k] = 0;
- cents = abc_getfraction(scn,2);
-
- switch (*pmx(Start,1)) {
- case '=' : break;
- case '_' : keysig[k] -= 100.0 * pmx(Len,1); break;
- case '^' : keysig[k] += 100.0 * pmx(Len,1); break;
- }
- k = 1;
- break;
- default: k = 0;
- }
- }
- */
- }
abc_clef(scn,p,q);
}
+int abcKeyExpNatural(abcScanner *scn,char pitch)
+{
+ if (expsig[abcNote2Num(pitch)] == ABC_Natural) return 1;
+ return 0;
+}
+
+float abcKeyExpBending(abcScanner *scn,char pitch)
+{
+ float bend;
+ bend = expsig[abcNote2Num(pitch)];
+ if (bend == ABC_Natural) return 0.0;
+ return bend;
+}
char *abcKVStringStart(abcScanner *scn,int str)
{
@@ -390,4 +399,11 @@
returnifnotKV(scn, NULL);
return keysig;
}
+
+float *abcKeyExpSignature(abcScanner *scn)
+{
+ returnifnotKV(scn, NULL);
+ return expsig;
+}
+
Modified: trunk/src/abcpnote.c
==============================================================================
--- trunk/src/abcpnote.c (original)
+++ trunk/src/abcpnote.c Tue Feb 24 14:52:47 2009
@@ -48,12 +48,12 @@
return cents ;
}
-float abcNoteBending(abcScanner *scn)
+float abc_notebending(abcScanner *scn, unsigned short tok)
{
float cents = 0.0;
char *p;
- if (abcToken(scn) != T_NOTE) return 0.0;
+ if (abcToken(scn) != tok) return 0.0;
p = abcTokenEnd(scn,1);
@@ -73,6 +73,7 @@
case '_' : cents -= 100.0; break ;
}
}
+ printf("==%s==\n",abcTokenStart(scn,1));
return cents ;
}