[abcp commit] r75 - in trunk: . examples/abcdump examples/explicit src test

0 views
Skip to first unread message

codesite...@google.com

unread,
Feb 26, 2009, 6:41:08 PM2/26/09
to abcp-...@googlegroups.com
Author: rdentato
Date: Thu Feb 26 14:05:18 2009
New Revision: 75

Added:
trunk/examples/explicit/makefile
trunk/test/a8.txt
trunk/test/a9.txt
trunk/test/key.txt
Modified:
trunk/abcp.ppr
trunk/examples/abcdump/abcdump.c
trunk/examples/explicit/explicit.c
trunk/src/abcp.h
trunk/src/abcp_priv.h
trunk/src/abcpcommon.c
trunk/src/abcpkey.pmx
trunk/src/abcpnote.c
trunk/src/abcpscan.pmx

Log:


Modified: trunk/abcp.ppr
==============================================================================
--- trunk/abcp.ppr (original)
+++ trunk/abcp.ppr Thu Feb 26 14:05:18 2009
@@ -18,10 +18,13 @@
abcp
+abcp
+examples
+ +crdlyr
+ examples\crdlyr\crdlyr.c
+ examples\crdlyr\marcha.txt
+explicit
examples\explicit\explicit.c
+nousym
- examples\nousym\makefile
+ examples\crdlyr\makefile
examples\nousym\nousym.c
+abcdump
examples\nousym\makefile.mk
@@ -73,52 +76,72 @@
3=src\abcp.h
4=src\abcpkey.pmx
5=examples\makefile
-6=key.lua
-7=src\abcpcommon.c
-8=src\New4.pmx
-9=test\a6.txt
-10=test\a5.txt
-11=src\a.c
-12=test\a7.txt
+6=src\abcptext.pmx
+7=examples\crdlyr\crdlyr.c
+8=examples\nousym\nousym.c
+9=test\key.txt
+10=src\abcpcommon.c
+11=test\a6.txt
+12=test\a5.txt
+13=test\a4.txt
+14=test\a3.txt
+15=test\mtones.abc
+16=test\a7.txt
+17=test\a8.txt
[Selected Project Files]
Main=
-Selected=examples\abcdump\abcdump.c
+Selected=src\abcpnote.c
[examples\abcdump\abcdump.c]
-TopLine=204
-Caret=27,222
+TopLine=199
+Caret=15,203
[src\abcpscan.pmx]
-TopLine=572
-Caret=23,581
+TopLine=502
+Caret=24,517
[src\abcpnote.c]
-TopLine=92
-Caret=25,119
+TopLine=57
+Caret=13,78
[src\abcp.h]
-TopLine=175
-Caret=16,198
+TopLine=159
+Caret=73,175
[src\abcpkey.pmx]
-TopLine=12
-Caret=1,34
+TopLine=320
+Caret=64,332
[examples\makefile]
TopLine=1
-Caret=1,17
-[key.lua]
-TopLine=21
-Caret=1,66
-[src\abcpcommon.c]
+Caret=11,13
+[src\abcptext.pmx]
+TopLine=99
+Caret=26,116
+[examples\crdlyr\crdlyr.c]
+TopLine=77
+Caret=28,110
+[examples\nousym\nousym.c]
TopLine=1
-Caret=47,13
-[src\New4.pmx]
+Caret=3,15
+[test\key.txt]
TopLine=1
-Caret=1,12
+Caret=1,2
+[src\abcpcommon.c]
+TopLine=12
+Caret=21,20
[test\a6.txt]
TopLine=1
Caret=1,1
[test\a5.txt]
TopLine=1
Caret=1,6
-[src\a.c]
-TopLine=164
+[test\a4.txt]
+TopLine=1
+Caret=10,9
+[test\a3.txt]
+TopLine=1
+Caret=1,5
+[test\mtones.abc]
+TopLine=1
Caret=1,1
[test\a7.txt]
TopLine=1
-Caret=9,9
+Caret=1,10
+[test\a8.txt]
+TopLine=1
+Caret=14,3

Modified: trunk/examples/abcdump/abcdump.c
==============================================================================
--- trunk/examples/abcdump/abcdump.c (original)
+++ trunk/examples/abcdump/abcdump.c Thu Feb 26 14:05:18 2009
@@ -204,7 +204,7 @@

case T_NOTE:
printf("NOTE: ");
- printf("%s%s ", abcNotePitch(scn),abcNoteNatural(scn)?"
(natural)":"");
+ printf("%s%s ", abcNotePitch(scn),abcNoteBending(scn) ==
abcNatural?" (natural)":"");
printf("bend: %.2f ",abcNoteBending(scn));
printf("courtesy: %d\n",abcNoteCourtesyAccidentals(scn));
printf(" duration: %.2f ",abcNoteDuration(scn));
@@ -234,7 +234,7 @@
break;

case T_FIELD:
- switch (abcField(scn)) {
+ switch (abcField(scn)) {
case 'V' :
case 'K' :
printf("VOICE: %.*s ", abcVoiceIdLen(scn),
abcVoiceIdStart(scn));
@@ -245,7 +245,7 @@
for (k=1; k<7; k++) {
printf(", %6.2f", abcKeySignature(scn)[k]);
}
- printf("\n");
+ printf("\n");
printf(" exp: ");
printf("%6.2f", abcKeyExpSignature(scn)[0]);
for (k=1; k<7; k++) {

Modified: trunk/examples/explicit/explicit.c
==============================================================================
--- trunk/examples/explicit/explicit.c (original)
+++ trunk/examples/explicit/explicit.c Thu Feb 26 14:05:18 2009
@@ -20,48 +20,83 @@
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
+#include <ctype.h>
#include "abcp.h"

-#define GLOBAL_HEADER 0
-#define LOCAL_HEADER 1
-#define USYM_MAXLEN 100
-#define USYM_NUM 35
+float keysig[7];
+float expsig[7];
+float barsig[7];

-char usyms[2][USYM_NUM][USYM_MAXLEN];
-
-abcFraction keyacc[7];
-abcFraction measureacc[7];
+void printtok(abcScanner *scn)
+{
+ printf("%.*s",abcTokenLen(scn,0),abcTokenStart(scn,0));
+}

+void printnotetok(abcScanner *scn, float bend)
+{
+ if (bend != 0.0) {
+ barsig[abcNote2Num(*abcTokenStart(scn,5))] = bend;
+ printtok(scn);
+ return;
+ }

+ bend = barsig[abcNote2Num(*abcTokenStart(scn,5))];
+ if (bend != abcNatural) {
+ while (bend <= -100.0) {
+ printf("_");
+ bend += 100.0;
+ }
+ if (bend < 0.0) {
+ printf("_%.2f",bend);
+ }
+ while (bend >= 100.0) {
+ printf("^");
+ bend -= 100.0;
+ }
+ if (bend > 0.0) {
+ printf("^%.2f",bend);
+ }
+ }
+ printf("%.*s",abcTokenLen(scn,5),abcTokenStart(scn,5));
+ printf("%.*s",abcTokenLen(scn,6),abcTokenStart(scn,6));
+ printf("%.*s",abcTokenLen(scn,7),abcTokenStart(scn,7));
+ printf("%.*s",abcTokenLen(scn,8),abcTokenStart(scn,8));
+ printf("%.*s",abcTokenLen(scn,9),abcTokenStart(scn,9));
+}

-void resetsyms()
+void zerosig()
{
int k;
- for (k = 0; k<USYM_NUM; k++ ) {
- strcpy(usyms[LOCAL_HEADER][k],usyms[GLOBAL_HEADER][k]);
- }
+ for (k=0; k<7; k++) {
+ keysig[k] = 0.0;
+ expsig[k] = 0.0;
+ barsig[k] = 0.0;
+ }
}

-void printtok(abcScanner *scn)
+void copysig(float *dest, float *src)
{
- printf("%.*s",abcTokenLen(scn,0),abcTokenStart(scn,0));
+ int k;
+ for (k=0; k<7; k++) {
+ dest[k] = src[k];
+ }
}

-void initkey(abcScanner *scn)
+void resetbarsig()
{
int k;
-
-
-
+ for (k=0; k<7; k++) {
+ if (expsig[k] != 0.0)
+ barsig[k] = expsig[k];
+ else
+ barsig[k] = keysig[k];
+ }
}

int main(int argc, char *argv[])
{
abcScanner *scn;
abcToken tok;
- int cur_header = GLOBAL_HEADER;
- char sym;
- int k;

if (argc < 2) {
fprintf(stderr,"Usage: explicit filename\n");
@@ -74,23 +109,22 @@
exit (1);
}

- initkey(scn);
-
+ zerosig();
+ resetbarsig();
+
while ((tok = abcNextToken(scn)) != T_EOF) {
switch(tok) {
- case T_EMPTYLINE : resetsyms();
- cur_header = GLOBAL_HEADER;
- printtok(scn);
- break;
-
+ case T_BAR:
+ resetbarsig();
+ printtok(scn);
+ break;
+
case T_FIELD :
switch (abcField(scn)) {
- case 'U' :
- setsym(cur_header,scn);
- break;
-
- case 'X' :
- cur_header = LOCAL_HEADER;
+ case 'K' :
+ copysig(keysig, abcKeySignature(scn));
+ copysig(expsig, abcKeyExpSignature(scn));
+ resetbarsig();
printtok(scn);
break;

@@ -98,8 +132,8 @@
}
break;

- case T_USERSYMBOL :
- printf("%s", symval(cur_header,abcUserSymbol(scn)));
+ case T_NOTE :
+ printnotetok(scn,abcNoteBending(scn));
break;

default: printtok(scn);

Added: trunk/examples/explicit/makefile
==============================================================================
--- (empty file)
+++ trunk/examples/explicit/makefile Thu Feb 26 14:05:18 2009
@@ -0,0 +1,21 @@
+#
+# (C) by Remo Dentato (rden...@gmail.com)
+#
+# This sofwtare is distributed under the terms of the BSD license:
+# http://creativecommons.org/licenses/BSD/
+# http://opensource.org/licenses/bsd-license.php
+#
+
+TOP=../../
+
+include $(TOP)config.mk
+
+explicit$(_EXE): $(CHKLIB) explicit$(_OBJ)
+ $(LN)$@ explicit$(_OBJ) -labcp $(MLIB)
+
+clean:
+ $(RM) explicit$(_EXE)
+ $(RM) explicit$(_OBJ)
+ $(RM) gmon.out
+
+include $(TOP)targets.mk

Modified: trunk/src/abcp.h
==============================================================================
--- trunk/src/abcp.h (original)
+++ trunk/src/abcp.h Thu Feb 26 14:05:18 2009
@@ -98,15 +98,6 @@

/* -- END TOKENS */

-#define ABC_F_CLEFSCANNED 0x0001
-#define ABC_F_CHORDSCANNED 0x0001
-#define ABC_F_FIELDSCANNED 0x0001
-#define ABC_F_ONETIMERS 0x00FF
-
-#define abcSetFlag(s,f) ((s)->flags |= (f))
-#define abcClrFlag(s,f) ((s)->flags &= ~(f))
-#define abcTestFlag(s,f) ((s)->flags & (f))
-
typedef unsigned short abcToken;

/* must be abc_MAXTOKSTR >= abcPMXCAPT */
@@ -139,45 +130,42 @@
#define abcNew_str(s) abc_newscanner(s,'S')
#define abcNew_chs(s) abc_newscanner(s,'C')

-#define abcScannerNew(x,y) abcNew_##x(y)
-
+#define abcScannerNew(x,y) abcNew_##x(y)
abcScanner *abcScannerFree(abcScanner *scn);

-char *abcScannerAddToIncludePath(abcScanner *scn,char *path);
-char *abcScannerSetIncludePath(abcScanner *scn,char *path);
+#define abcScannerLineNumber(s) ((s)->ln_logical)
+
char *abcScannerGetIncludePath(abcScanner *scn);
+char *abcScannerSetIncludePath(abcScanner *scn,char *path);
+char *abcScannerAddToIncludePath(abcScanner *scn,char *path);
+
+int abcInclude(abcScanner *scn);
+char *abcIncludePathStart(abcScanner *scn);
+int abcIncludePathLen(abcScanner *scn);
+char *abcIncludePathSet(abcScanner *scn);
+int abcIncludePathAdding(abcScanner *scn);

abcToken abcNextToken(abcScanner *scn);

#define abcToken(s) ((s)->tok)
-char *abcTokenStart(abcScanner *scn, int strnum);
-char *abcTokenEnd(abcScanner *scn, int strnum);
-int abcTokenLen(abcScanner *scn, int strnum);
+char *abcTokenStart(abcScanner *scn, int strnum);
+char *abcTokenEnd(abcScanner *scn, int strnum);
+int abcTokenLen(abcScanner *scn, int strnum);

#define abcStateCurrent(s) ((s)->state)
#define abcStateNext(s) ((s)->nextstate)
#define abcStateSet(s,t) ((s)->nextstate = (t))

-#define abcScannerLineNumber(s) ((s)->ln_logical)
-
-int abcInclude(abcScanner *scn);
-
-char *abcScannerGetIncludePath(abcScanner *scn);
-char *abcScannerSetIncludePath(abcScanner *scn,char *path);
-char *abcScannerAddToIncludePath(abcScanner *scn,char *path);
-char *abcIncludePathStart(abcScanner *scn);
-int abcIncludePathLen(abcScanner *scn);
-char *abcIncludePathSet(abcScanner *scn);
-int abcIncludePathAdding(abcScanner *scn);


/********/
+float abc_getfracion(char *a, int al, char *b, int bl, char *c, int cl);

-float abc_getfraction(abcScanner *scn,int ndx);

/* abcpfield.pmx */
-char abcField(abcScanner *scn);
-int abcFieldLen(abcScanner *scn);
+
+char abcField(abcScanner *scn);
+int abcFieldLen(abcScanner *scn);
char *abcFieldStart(abcScanner *scn);

/****** */
@@ -186,48 +174,48 @@

extern char abcSemitones[7];

-int abcNoteCourtesyAccidentals(abcScanner *scn);
-int abcNoteNatural(abcScanner *scn);
-
#define abcNote2Num(c) ((tolower(c)-'c'+7) % 7)

-float abcNoteDuration(abcScanner *scn);
+int abcNoteCourtesyAccidentals(abcScanner *scn);
+
+float abcNoteDuration(abcScanner *scn);
unsigned short abcNoteOctave(abcScanner *scn);
unsigned char *abcNotePitch(abcScanner *scn);

-float abcNoteCents(abcScanner *scn);
-
-#define abcNoteBending(s) abc_notebending(s,T_NOTE)
-float abc_notebending(abcScanner *scn, unsigned short tok);
+float abcNoteCents(abcScanner *scn);
+float abcNoteBending(abcScanner *scn);

unsigned short abcNoteMidi(abcScanner *scn);
unsigned short abcNoteMidiPitchBend(abcScanner *scn);

unsigned short abcRestInvisible(abcScanner *scn);
unsigned short abcRestMultimeasure(abcScanner *scn);
-float abcRestDuration(abcScanner *scn);
+float abcRestDuration(abcScanner *scn);
+

char *abcBarStart(abcScanner *scn);
-int abcBarLen(abcScanner *scn);
-int abcBarDotted(abcScanner *scn);
-int abcBarInvisible(abcScanner *scn);
-int abcBarRepeatBefore(abcScanner *scn);
-int abcBarRepeatAfter(abcScanner *scn);
+int abcBarLen(abcScanner *scn);
+int abcBarDotted(abcScanner *scn);
+int abcBarInvisible(abcScanner *scn);
+int abcBarRepeatBefore(abcScanner *scn);
+int abcBarRepeatAfter(abcScanner *scn);
char *abcBarEndingStart(abcScanner *scn);
-int abcBarEndingLen(abcScanner *scn);
+int abcBarEndingLen(abcScanner *scn);

-int abcBroken(abcScanner *scn);
+int abcBroken(abcScanner *scn);
float abcChordDuration(abcScanner *scn);

-int abcOverlay(abcScanner *scn);
+int abcOverlay(abcScanner *scn);
+
char abcSlurDirection(abcScanner *scn);
char abcTieDirection(abcScanner *scn);
-int abcSlurDotted(abcScanner *scn);
-int abcTieDotted(abcScanner *scn);

-int abcTupletNext(abcScanner *scn);
-int abcTupletTime(abcScanner *scn);
-int abcTuplet(abcScanner *scn);
+int abcSlurDotted(abcScanner *scn);
+int abcTieDotted(abcScanner *scn);
+
+int abcTupletNext(abcScanner *scn);
+int abcTupletTime(abcScanner *scn);
+int abcTuplet(abcScanner *scn);

/* abcptext.c */

@@ -331,7 +319,7 @@
float *abcKeySignature(abcScanner *scn);
float *abcKeyExpSignature(abcScanner *scn);

-#define ABC_Natural 9999.0
+#define abcNatural 999.0
int abcKeyExpNatural(abcScanner *scn,char pitch);
float abcKeyExpBending(abcScanner *scn,char pitch);


Modified: trunk/src/abcp_priv.h
==============================================================================
--- trunk/src/abcp_priv.h (original)
+++ trunk/src/abcp_priv.h Thu Feb 26 14:05:18 2009
@@ -13,4 +13,23 @@
#include "abcp.h"
#include <ctype.h>

+
+#define ABC_F_CLEFSCANNED 0x0001
+#define ABC_F_CHORDSCANNED 0x0001
+#define ABC_F_FIELDSCANNED 0x0001
+#define ABC_F_ONETIMERS 0x00FF
+
+#define abcSetFlag(s,f) ((s)->flags |= (f))
+#define abcClrFlag(s,f) ((s)->flags &= ~(f))
+#define abcTestFlag(s,f) ((s)->flags & (f))
+
+
+
+float abc_getfracion(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);
+
#endif

Modified: trunk/src/abcpcommon.c
==============================================================================
--- trunk/src/abcpcommon.c (original)
+++ trunk/src/abcpcommon.c Thu Feb 26 14:05:18 2009
@@ -10,21 +10,26 @@

int abc_tmpi;

-float abc_getfraction(abcScanner *scn,int ndx)
-{

- int k, j = 0;
+/*
+ (&F)(<*=/>)(&F)
+ | | |
+ a___b______c___
+ al b cl
+*/
+float abc_getfracion(char *a, int al,
+ char *b, int bl,
+ char *c, int cl)
+{
+ int j = 0;
float num = 1.0 ,den=-1.0;

- if (abcToken(scn) != T_NOTE) return 0;
+ if (al>0) {num = atof(a); j++;}
+ if (cl>0) {den = atof(c); j++;}

- if (abcTokenLen(scn,ndx)>0) {num = atof(abcTokenStart(scn,ndx)); j++;}
- if (abcTokenLen(scn,ndx+2)>0) {den = atof(abcTokenStart(scn,ndx+2));
j++;}
-
- k = abcTokenLen(scn,ndx+1);
- if (k > 0) {
+ if (bl > 0) {
if (den <= 0.0) den = 2.0;
- den = den * ((float)(1 << (k-1)));
+ den = den * ((float)(1 << (bl-1)));
j++;
}

@@ -33,5 +38,34 @@
_dbgmsg("FR: %d %f/%f\n",j,num,den);

return num/den;
-}
+}
+
+
+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 Thu Feb 26 14:05:18 2009
@@ -51,8 +51,15 @@
char tmp[7];
int k;

- if (note < 'A' || note > 'g' ||
- (note > 'G' && note < 'a')) return;
+ if (tolower(note) == 'h' && tolower(acc) == 'p') {
+ /* Highland Pipes */
+ expsig[0] = 100; /* ^C */
+ expsig[3] = 100; /* ^F */
+ expsig[4] = abcNatural; /* =G */
+ return;
+ }
+
+ if (tolower(note) < 'a' || tolower(note) > 'g') return;

note = abcNote2Num(note);
_dbgmsg("NT: %d ",note);
@@ -65,14 +72,6 @@
sig[k+1] = ((sig[k] + modes[mode][k] - 1) % 12)+1;
}

- #if 0
- fprintf(stderr, "\n");
- for (k=0; k<7; k++) {
- fprintf(stderr, "%d, ", sig[k]);
- }
- fprintf(stderr, "\n");
- #endif
-
for (k=0; k<7; k++) { /* shift */
tmp[(k+note) % 7] = sig[k];
}
@@ -85,13 +84,6 @@
keysig[k] = (tmp[k] - abcSemitones[k]) * 100.0;
}

- #if 0
- fprintf(stderr, "\n");
- for (k=0; k<7; k++) {
- fprintf(stderr, "%.2f, ", keysig[k]);
- }
- fprintf(stderr, "\n");
- #endif
}

static void abc_clef(abcScanner *scn, char *start, char *end)
@@ -269,6 +261,7 @@
parms[ABC_Mode] = ABC_Mode_Ion;

for (k = 0; k<8; k++) keysig[k] = 0.0;
+ for (k = 0; k<8; k++) expsig[k] = 0.0;

if (kv == 'V') {
switch pmx(p) {
@@ -297,7 +290,7 @@
if (kv == 'K') {
switch pmx(p) {
case "(<=A-Ga-g><?=&#b>)&K" :
- case "(<$none$hp$Hp>)&K" :
+ case "(&i<$none$hp$perc&drum>)&K" :
setstring(scn,ABC_Tonic,pmx(Start,1),pmx(End,1));
break;
}
@@ -320,26 +313,29 @@
case "&iexp&K<?==>&K" : break;
}

- /* Get explicit accidentals */
+ /* 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 = 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;
k = 1;
break;

default: k = 0;
}
}
+ /**/
}
-
if (abcTokenLen(scn,ABC_Tonic) == 0) {
scn->tok_str[ABC_Tonic][0]="C";
scn->tok_str[ABC_Tonic][1]=scn->tok_str[ABC_Tonic][0] + 1;
@@ -357,7 +353,7 @@

int abcKeyExpNatural(abcScanner *scn,char pitch)
{
- if (expsig[abcNote2Num(pitch)] == ABC_Natural) return 1;
+ if (expsig[abcNote2Num(pitch)] == abcNatural) return 1;
return 0;
}

@@ -365,7 +361,7 @@
{
float bend;
bend = expsig[abcNote2Num(pitch)];
- if (bend == ABC_Natural) return 0.0;
+ if (bend == abcNatural) return 0.0;
return bend;
}


Modified: trunk/src/abcpnote.c
==============================================================================
--- trunk/src/abcpnote.c (original)
+++ trunk/src/abcpnote.c Thu Feb 26 14:05:18 2009
@@ -9,6 +9,13 @@
#include <ctype.h>
#include "abcp_priv.h"

+#define getfraction(s,n) abc_getfracion(abcTokenStart(s,n), \
+ abcTokenLen(s,n), \
+ abcTokenStart(s,n+1), \
+ abcTokenLen(s,n+1), \
+ abcTokenStart(s,n+2), \
+ abcTokenLen(s,n+2))
+
unsigned short abcNoteAccidentals(abcScanner *scn)
{
unsigned short acc = 0;
@@ -33,49 +40,26 @@
float abcNoteDuration(abcScanner *scn)
{
if (abcToken(scn) != T_NOTE) return 1.0;
- return abc_getfraction(scn,7);
+ return getfraction(scn,7);
}

float abcNoteCents(abcScanner *scn)
{
float cents;
- if (abcToken(scn) != T_NOTE) return 0.0;
- if (abcTokenLen(scn,2) == 0) return 0.0;
-
- cents = abc_getfraction(scn,2);
- if (abcTokenLen(scn,3) > 0)
- cents = cents * 100.0;
+ cents = abcNoteBending(scn);
+ if (cents == abcNatural)
+ cents = 0.0;
return cents ;
}

-float abc_notebending(abcScanner *scn, unsigned short tok)
+float abcNoteBending(abcScanner *scn)
{
- float cents = 0.0;
- char *p;
-
- if (abcToken(scn) != tok) return 0.0;
-
- p = abcTokenEnd(scn,1);
-
- if (abcTokenLen(scn,2) > 0 || abcTokenLen(scn,3) > 0 ) {
- /* Got microtones last accidental gives direction*/
- cents = abc_getfraction(scn,2);
- if (abcTokenLen(scn,3) > 0)
- cents = cents * 100.0;
- if (p > abcTokenStart(scn,1)) {
- if (*--p == '_') cents = cents *-1.0;
- }
- }
+ if (abcToken(scn) != T_NOTE) return 0.0;

- while (p > abcTokenStart(scn,1)) {
- switch (*--p) {
- case '^' : cents += 100.0; break ;
- case '_' : cents -= 100.0; break ;
- }
- }
- printf("==%s==\n",abcTokenStart(scn,1));
-
- return cents ;
+ return abc_notebending(abcTokenStart(scn,1), abcTokenLen(scn,1),
+ abcTokenStart(scn,2), abcTokenLen(scn,2),
+ abcTokenStart(scn,3), abcTokenLen(scn,3),
+ abcTokenStart(scn,4), abcTokenLen(scn,4) );
}

unsigned short abcNoteOctave(abcScanner *scn)
@@ -101,15 +85,6 @@
return oct;
}

-int abcNoteNatural(abcScanner *scn)
-{
- if (abcToken(scn) != T_NOTE) return 0;
- if (abcNoteBending(scn) > 0.0) return 0;
- if (abcTokenLen(scn,1) != 1) return 0;
- if (*abcTokenStart(scn,1) != '=') return 0;
- return 1;
-}
-
int abcNoteCourtesyAccidentals(abcScanner *scn)
{
if (abcToken(scn) != T_NOTE) return 0;
@@ -117,7 +92,6 @@
return 1;
}

-
unsigned char *abcNotePitch(abcScanner *scn)
{
static char pitch[8];
@@ -127,6 +101,8 @@
if (abcToken(scn) == T_NOTE) {
pitch[k++] = toupper(*abcTokenStart(scn,5));
bend = abcNoteBending(scn);
+ if (bend == abcNatural)
+ bend = 0.0;
if (bend > 0.0) {
while (bend >= 100.0) {
pitch[k++] = '#';
@@ -146,11 +122,11 @@

unsigned short abcNoteMidi(abcScanner *scn)
{
- int n;
+ int n;
if (abcToken(scn) != T_NOTE) return 0;

n = abcSemitones[abcNote2Num(*abcTokenStart(scn,5))];
- n += (int)(abcNoteBending(scn)/100.0);
+ n += (int)(abcNoteCents(scn)/100.0);
n += 12 * (abcNoteOctave(scn)+1);
if (n<0) n = 0;
return n & 0x7F;
@@ -161,7 +137,7 @@
float bend;
if (abcToken(scn) != T_NOTE) return 0;

- bend = abcNoteBending(scn)/100;
+ bend = abcNoteCents(scn)/100;
return (8192 + (int)(8192.0 * (bend - trunc(bend))));
}

@@ -181,7 +157,7 @@
float abcRestDuration(abcScanner *scn)
{
if (abcToken(scn) != T_REST) return 1;
- return abc_getfraction(scn,2);
+ return getfraction(scn,2);
}

/*************/
@@ -267,7 +243,7 @@
float abcChordDuration(abcScanner *scn)
{
if (abcToken(scn) != T_CHORDEND) return 1;
- return abc_getfraction(scn,1);
+ return getfraction(scn,1);
}

/*** Overlay */

Modified: trunk/src/abcpscan.pmx
==============================================================================
--- trunk/src/abcpscan.pmx (original)
+++ trunk/src/abcpscan.pmx Thu Feb 26 14:05:18 2009
@@ -374,7 +374,7 @@
case "()(&k)" : settoken(scn,T_WHITESPACE);
break;

- case "\f&N" : settoken(scn,T_CONTINUE);
+ case "\f&K&N" : settoken(scn,T_CONTINUE);
break;

case "&n" : settoken(scn,T_ENDLINE);

Added: trunk/test/a8.txt
==============================================================================
--- (empty file)
+++ trunk/test/a8.txt Thu Feb 26 14:05:18 2009
@@ -0,0 +1,3 @@
+X:1
+^/A
+a7/8 [C^//E^/G]2/3
\ No newline at end of file

Added: trunk/test/a9.txt
==============================================================================
--- (empty file)
+++ trunk/test/a9.txt Thu Feb 26 14:05:18 2009
@@ -0,0 +1,9 @@
+K:C
+A ^C d C | C _d =d d |
+
+K:Hp
+a b c d e f g | a b =c c
+
+K:E#
+a b c d e f g | a b =c c
+
\ No newline at end of file

Added: trunk/test/key.txt
==============================================================================
--- (empty file)
+++ trunk/test/key.txt Thu Feb 26 14:05:18 2009
@@ -0,0 +1,4 @@
+K: C exp ^F^C=G
+K:Hp
+K:None
+F =C (_)F
\ No newline at end of file

Reply all
Reply to author
Forward
0 new messages