Added:
trunk/examples/crdnotes/
trunk/examples/crdnotes/crdnotes.c
trunk/examples/crdnotes/makefile
trunk/test/a10.txt
Modified:
trunk/abcp.ppr
trunk/examples/abcdump/abcdump.c
trunk/src/abcp.h
trunk/src/abcpchords.pmx
trunk/src/abcpnote.c
trunk/src/abcpscan.pmx
trunk/test/a4.txt
Log:
Modified: trunk/abcp.ppr
==============================================================================
--- trunk/abcp.ppr (original)
+++ trunk/abcp.ppr Sun Mar 1 07:55:12 2009
@@ -18,6 +18,9 @@
abcp
+abcp
+examples
+ +crdnotes
+ examples\crdnotes\makefile
+ examples\crdnotes\crdnotes.c
+crdlyr
examples\crdlyr\crdlyr.c
examples\crdlyr\marcha.txt
@@ -74,46 +77,46 @@
1=src\abcpscan.pmx
2=src\abcpnote.c
3=src\abcp.h
-4=src\abcpkey.pmx
-5=src\abcptext.pmx
-6=examples\explicit\explicit.c
-7=src\abcpcommon.c
-8=test\key.txt
-9=examples\explicit\makefile
-10=test\a9.txt
+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
[Selected Project Files]
Main=
-Selected=test\a9.txt
+Selected=src\abcpscan.pmx
[examples\abcdump\abcdump.c]
-TopLine=199
-Caret=31,206
+TopLine=182
+Caret=14,192
[src\abcpscan.pmx]
-TopLine=437
-Caret=40,518
+TopLine=459
+Caret=14,213
[src\abcpnote.c]
-TopLine=87
-Caret=27,104
+TopLine=109
+Caret=19,126
[src\abcp.h]
-TopLine=171
-Caret=1,180
-[src\abcpkey.pmx]
-TopLine=41
-Caret=27,58
-[src\abcptext.pmx]
-TopLine=99
-Caret=3,104
+TopLine=158
+Caret=27,175
[examples\explicit\explicit.c]
-TopLine=104
-Caret=4,114
+TopLine=133
+Caret=10,158
[src\abcpcommon.c]
-TopLine=30
-Caret=3,51
-[test\key.txt]
+TopLine=15
+Caret=27,52
+[src\abcpchords.pmx]
+TopLine=38
+Caret=1,111
+[test\a10.txt]
TopLine=1
-Caret=8,4
-[examples\explicit\makefile]
+Caret=33,7
+[test\a4.txt]
TopLine=1
-Caret=16,18
-[test\a9.txt]
+Caret=47,12
+[src\abcpkey.pmx]
+TopLine=16
+Caret=18,33
+[examples\crdnotes\makefile]
TopLine=1
-Caret=26,8
+Caret=1,23
Modified: trunk/examples/abcdump/abcdump.c
==============================================================================
--- trunk/examples/abcdump/abcdump.c (original)
+++ trunk/examples/abcdump/abcdump.c Sun Mar 1 07:55:12 2009
@@ -198,7 +198,8 @@
printf("[%.*s]",abcChordAltRootLen(scn),abcChordAltRootStart(scn));
printf("[%.*s]",abcChordAltTypeLen(scn),abcChordAltTypeStart(scn));
printf("[%.*s]",abcChordAltBassLen(scn),abcChordAltBassStart(scn));
- /*printf(" %.*s",abcTokenLen(scn,0),abcTokenStart(scn,0));*/
+ printf(" (%d)",abcChordOctave(scn));
+ printf(" %d",*abcChordFormula(scn));
printf("\n");
break;
Added: trunk/examples/crdnotes/crdnotes.c
==============================================================================
--- (empty file)
+++ trunk/examples/crdnotes/crdnotes.c Sun Mar 1 07:55:12 2009
@@ -0,0 +1,75 @@
+/*
+** (C) by Remo Dentato (rden...@gmail.com)
+**
+** This software is distributed under the terms of the BSD license:
+** http://creativecommons.org/licenses/BSD/
+*/
+
+/* .% Overview
+==============
+
+ This is an example of use for ABCp. It extracts guitar
+chords and prints the corresponding MIDI notes.
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <ctype.h>
+#include "abcp.h"
+
+char *notes[12]={"C", "^C", "D", "^D","E","F","^F","G","^G","A","^A","B"};
+/*char
*notes[12]={"Cb","C", "Db", "D", "Eb","E","F","Gb","G","Ab","A","Bb","B"}*/
+
+int main(int argc, char *argv[])
+{
+ abcScanner *scn;
+ abcToken tok;
+ char *formula;
+ int k;
+ int n;
+
+ if (argc < 2) {
+ fprintf(stderr,"Usage: crdmidi filename\n");
+ exit (1);
+ }
+
+ scn = abcScannerNew(file,argv[1]);
+ if (scn == NULL) {
+ fprintf(stderr,"Unable to create an ABC scanner for
file: '%s'\n",argv[1]);
+ exit (1);
+ }
+
+ while ((tok = abcNextToken(scn)) != T_EOF) {
+ switch(tok) {
+ case T_GCHORD :
+ n = abcSemitones[abcNote2Num(*abcChordRootStart(scn))]-1;
+ if (abcChordRootLen(scn)>1) {
+ k = abcChordRootStart(scn)[1];
+ if (k == '#') n++;
+ if (k == 'b') n--;
+ }
+ n = (n + 12) % 12;
+ formula = abcChordFormula(scn);
+
+ printf("\"");
+ printf("%.*s",abcChordRootLen(scn),abcChordRootStart(scn));
+ printf("%.*s",abcChordTypeLen(scn),abcChordTypeStart(scn));
+ printf("%.*s",abcChordBassLen(scn),abcChordBassStart(scn));
+ printf("\" -> ");
+
+ printf("[%s",notes[n]);
+ for (k=0; formula[k] != 0; k++) {
+ printf("%s",notes[(n+formula[k]) % 12]);
+ }
+ printf("]\n");
+ break;
+ }
+ }
+
+ abcScannerFree(scn);
+
+ return (0);
+}
Added: trunk/examples/crdnotes/makefile
==============================================================================
--- (empty file)
+++ trunk/examples/crdnotes/makefile Sun Mar 1 07:55:12 2009
@@ -0,0 +1,22 @@
+#
+# (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
+#
+
+TOP=../../
+PROG=crdnotes
+
+include $(TOP)config.mk
+
+$(PROG)$(_EXE): $(CHKLIB) $(PROG)$(_OBJ)
+ $(LN)$@ $(PROG)$(_OBJ) -labcp $(MLIB)
+
+clean:
+ $(RM) $(PROG)$(_EXE)
+ $(RM) $(PROG)$(_OBJ)
+ $(RM) gmon.out
+
+include $(TOP)targets.mk
Modified: trunk/src/abcp.h
==============================================================================
--- trunk/src/abcp.h (original)
+++ trunk/src/abcp.h Sun Mar 1 07:55:12 2009
@@ -175,11 +175,12 @@
extern char abcSemitones[7];
#define abcNote2Num(c) ((tolower(c)-'c'+7) % 7)
+unsigned short abcNote2Midi(char pitch, int octave, int acc);
int abcNoteCourtesyAccidentals(abcScanner *scn);
float abcNoteDuration(abcScanner *scn);
-unsigned short abcNoteOctave(abcScanner *scn);
+int abcNoteOctave(abcScanner *scn);
unsigned char *abcNotePitch(abcScanner *scn);
float abcNoteCents(abcScanner *scn);
@@ -205,6 +206,8 @@
int abcBroken(abcScanner *scn);
float abcChordDuration(abcScanner *scn);
+int abcChordOctave(abcScanner *scn);
+char *abcChordFormula(abcScanner *scn);
int abcOverlay(abcScanner *scn);
Modified: trunk/src/abcpchords.pmx
==============================================================================
--- trunk/src/abcpchords.pmx (original)
+++ trunk/src/abcpchords.pmx Sun Mar 1 07:55:12 2009
@@ -9,10 +9,120 @@
#include "abcp_priv.h"
+#define NCHORDS 87
+
+typedef struct {
+ char *chordName;
+ char *chordFormula;
+} abcChordFormula_t;
+
+/* Chords have been adapted from the paper "CHORD FORMULAS" by Bill Wrobel
+ (http://www.filmscorerundowns.net/herrmann/chord_formulas.pdf)
+*/
+
+abcChordFormula_t abcChordFormula_v[NCHORDS] = {
+ {"11" , "\004\007\012\016\021"} ,
+ {"11b5" , "\004\006\012\016\021"} ,
+ {"13" , "\004\007\012\016\025"} ,
+ {"7" , "\004\007\012"} ,
+ {"7#5" , "\004\010\012"} ,
+ {"7#9" , "\004\007\012\017"} ,
+ {"7/11" , "\004\007\012\021"} ,
+ {"7/4" , "\004\005\007\013"} ,
+ {"7/6" , "\004\007\011\012"} ,
+ {"7b5" , "\004\006\012"} ,
+ {"7b9" , "\004\007\012\015"} ,
+ {"7sus" , "\005\007\012"} ,
+ {"9" , "\004\007\012\016"} ,
+ {"9#5" , "\004\010\012\016"} ,
+ {"9b5" , "\004\006\012\016"} ,
+ {"aug" , "\004\010"} ,
+ {"aug/4" , "\004\005\010"} ,
+ {"augsus" , "\005\010"} ,
+ {"dim" , "\003\006"} ,
+ {"dim6" , "\003\006\011"} ,
+ {"dim6sus" , "\005\006\011"} ,
+ {"dim7" , "\003\006\011"} ,
+ {"dim7sus" , "\005\006\011"} ,
+ {"dimsus" , "\005\006"} ,
+ {"maj" , "\004\007"} ,
+ {"maj/4" , "\004\005\007"} ,
+ {"maj/9" , "\004\007\016"} ,
+ {"maj/9/4" , "\004\005\007\016"} ,
+ {"maj11" , "\004\007\013\016\021"} ,
+ {"maj11#5" , "\004\010\013\016\021"} ,
+ {"maj11#9" , "\004\007\013\017\021"} ,
+ {"maj11/13" , "\004\007\013\016\021"} ,
+ {"maj11b5" , "\004\006\013\016\021"} ,
+ {"maj11b9" , "\004\007\013\015\021"} ,
+ {"maj13" , "\004\007\013\016\025"} ,
+ {"maj13#5" , "\004\010\013\016\025"} ,
+ {"maj13b5" , "\004\006\013\016\025"} ,
+ {"maj6" , "\004\007\011"} ,
+ {"maj6/4" , "\004\005\007\011"} ,
+ {"maj6/9" , "\004\007\011\016"} ,
+ {"maj7" , "\004\007\013"} ,
+ {"maj7#5" , "\004\010\013"} ,
+ {"maj7#9" , "\004\007\013\017"} ,
+ {"maj7/11" , "\004\007\013\021"} ,
+ {"maj7/4" , "\004\005\007\013"} ,
+ {"maj7/6" , "\004\007\011\013"} ,
+ {"maj7b5" , "\004\006\013"} ,
+ {"maj7b5#9" , "\004\006\013\017"} ,
+ {"maj7b9" , "\004\007\013\015"} ,
+ {"maj9" , "\004\007\013\016"} ,
+ {"maj9#11" , "\004\007\013\016\022"} ,
+ {"maj9#5" , "\004\010\013\016"} ,
+ {"maj9b5" , "\004\006\013\016"} ,
+ {"majb5" , "\004\006"} ,
+ {"min" , "\003\007"} ,
+ {"min/4" , "\003\005\007"} ,
+ {"min/9" , "\003\007\016"} ,
+ {"min11" , "\003\007\012\016\021"} ,
+ {"min11#5" , "\003\010\012\016\021"} ,
+ {"min11b5" , "\003\006\012\016\021"} ,
+ {"min13" , "\003\007\012\016\025"} ,
+ {"min13b5" , "\003\006\012\016\025"} ,
+ {"min6" , "\003\007\011"} ,
+ {"min6/4" , "\003\005\007\011"} ,
+ {"min6/9" , "\003\007\011\016"} ,
+ {"min7" , "\003\007\012"} ,
+ {"min7#5" , "\003\010\012"} ,
+ {"min7#9" , "\003\007\012\017"} ,
+ {"min7/11" , "\003\007\012\021"} ,
+ {"min7/4" , "\003\005\007\012"} ,
+ {"min7/6" , "\003\007\011\012"} ,
+ {"min7b5" , "\003\006\012"} ,
+ {"min7b9" , "\003\007\012\015"} ,
+ {"min9" , "\003\007\012\016"} ,
+ {"min9#5" , "\003\010\012\016"} ,
+ {"min9b5" , "\003\006\012\016"} ,
+ {"minmaj11" , "\003\007\013\016\021"} ,
+ {"minmaj7" , "\003\007\013"} ,
+ {"minmaj9" , "\003\007\013\016"} ,
+ {"sus/9" , "\005\007\016"} ,
+ {"sus4" , "\005\007"} ,
+ {"sus6" , "\005\007\011"} ,
+ {"sus6/9" , "\005\007\011\016"} ,
+ {"sus7" , "\005\007\013"} ,
+ {"sus7#5" , "\005\010\013"} ,
+ {"sus7b5" , "\005\006\013"} ,
+ {"sus9" , "\005\007\013\016"} ,
+};
+
+
#define setstr(s,k,t,e) \
(s)->tok_str[k][0] = t;\
(s)->tok_str[k][1] = e;\
+#define ABC_ChordRoot 1
+#define ABC_ChordType 2
+#define ABC_ChordOctave 3
+#define ABC_ChordBass 4
+#define ABC_ChordAltRoot 5
+#define ABC_ChordAltType 6
+#define ABC_ChordAltBass 7
+
static void abc_chord(abcScanner *scn)
{
char *start;
@@ -23,9 +133,9 @@
start = abcTokenStart(scn,2);
end = abcTokenEnd(scn,2);
- setstr(scn,2,NULL,NULL);
- setstr(scn,3,NULL,NULL); setstr(scn,4,NULL,NULL);
- setstr(scn,5,NULL,NULL); setstr(scn,6,NULL,NULL);
+ setstr(scn,ABC_ChordType,NULL,NULL);
+ setstr(scn,ABC_ChordAltBass,NULL,NULL);
setstr(scn,ABC_ChordBass,NULL,NULL);
+ setstr(scn,ABC_ChordAltRoot,NULL,NULL);
setstr(scn,ABC_ChordAltType,NULL,NULL);
abcSetFlag(scn,ABC_F_CHORDSCANNED);
@@ -42,12 +152,12 @@
default: j = 1; break;
}
}
- setstr(scn,2,p,q);
+ setstr(scn,ABC_ChordType,p,q);
if (start >= end) return;
switch pmx(start) { /* Bass */
case "&K/(<+=IiVvA-Ga-g><?=#b>)&K":
- setstr(scn,3,pmx(Start,1),pmx(End,1));
+ setstr(scn,ABC_ChordBass,pmx(Start,1),pmx(End,1));
break;
}
if (start >= end) return;
@@ -58,7 +168,7 @@
switch pmx(start) { /* Root note */
case "&K&((<+=A-Ga-gIiVv><?=#b>)&K":
- setstr(scn,4,pmx(Start,1),pmx(End,1));
+ setstr(scn,ABC_ChordAltRoot,pmx(Start,1),pmx(End,1));
break;
default : return;
}
@@ -76,16 +186,17 @@
default: j = 1; break;
}
}
- setstr(scn,5,p,q);
+ setstr(scn,ABC_ChordAltType,p,q);
if (start >= end) return;
switch pmx(start) { /* Bass */
case "&K/(<+=IiVvA-Ga-g><?=#b>)&K":
- setstr(scn,6,pmx(Start,1),pmx(End,1));
+ setstr(scn,ABC_ChordAltBass,pmx(Start,1),pmx(End,1));
break;
- }
- return;
+ }
+
+ return;
}
#define returnifnot(s,r) do {\
@@ -98,74 +209,163 @@
char *abcChordRootStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,1);
+ return abcTokenStart(scn,ABC_ChordRoot);
}
char *abcChordTypeStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,2);
+ return abcTokenStart(scn,ABC_ChordType);
}
char *abcChordBassStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,3);
+ return abcTokenStart(scn,ABC_ChordBass);
}
char *abcChordAltRootStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,4);
+ return abcTokenStart(scn,ABC_ChordAltRoot);
}
char *abcChordAltTypeStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,5);
+ return abcTokenStart(scn,ABC_ChordAltType);
}
char *abcChordAltBassStart(abcScanner *scn)
{
returnifnot(scn,utlEmptyString);
- return abcTokenStart(scn,6);
+ return abcTokenStart(scn,ABC_ChordAltBass);
}
-
int abcChordRootLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,1);
+ return abcTokenLen(scn,ABC_ChordRoot);
}
int abcChordTypeLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,2);
+ return abcTokenLen(scn,ABC_ChordType);
}
int abcChordBassLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,3);
+ return abcTokenLen(scn,ABC_ChordBass);
}
int abcChordAltRootLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,4);
+ return abcTokenLen(scn,ABC_ChordAltRoot);
}
int abcChordAltTypeLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,5);
+ return abcTokenLen(scn,ABC_ChordAltType);
}
int abcChordAltBassLen(abcScanner *scn)
{
returnifnot(scn,0);
- return abcTokenLen(scn,6);
+ return abcTokenLen(scn,ABC_ChordAltBass);
+}
+
+int abcChordOctave(abcScanner *scn)
+{
+ int oct = 3;
+ int k; char *p;
+
+ if (abcToken(scn) != T_GCHORD) return oct;
+
+
_dbgmsg("{%.*s}",abcTokenLen(scn,ABC_ChordOctave),abcTokenStart(scn,ABC_ChordOctave));
+ p = abcTokenStart(scn,ABC_ChordOctave);
+ for (k=0; k<abcTokenLen(scn,ABC_ChordOctave);k++) {
+ if (*p == '\'') oct++;
+ else if (*p == ',') oct--;
+ p++;
+ }
+ if (oct < 0) oct = 0;
+ else if(oct >10) oct = 10;
+ return oct;
}
+
+static int frml_cmp(const void *a, const void *b)
+{
+ return strcmp(((abcChordFormula_t *)a)->chordName,
+ ((abcChordFormula_t *)b)->chordName);
+}
+
+char *abcChordFormula(abcScanner *scn)
+{
+ #define chordname scn->tmpbuf
+
+ char *formula = utlEmptyString;
+
+ abcChordFormula_t frml_tmp;
+ abcChordFormula_t *frml_res;
+
+ int k;
+ char *p;
+
+ returnifnot(scn,utlEmptyString);
+
+ chordname = chsCpy(chordname,"");
+ p = abcTokenStart(scn,ABC_ChordType);
+ k = abcTokenLen(scn,ABC_ChordType);
+
+ if (k==0)
+ chordname = chsCpy(chordname,"maj");
+ else {
+ switch pmx(p) {
+ case "&K&imaj" : chordname = chsAddStr(chordname,"maj");
+ k -= pmx(Len,0);
+ break;
+ case "&K&i<$min$-$m>" : chordname = chsAddStr(chordname,"min");
+ k -= pmx(Len,0);
+ break;
+ }
+
+ while (k>0) {
+ switch pmx(p) {
+ case "&k" :
+ case "<=()>" : k -= pmx(Len,0);
+ break;
+
+ case "-(<+d>)" :
+ case "(<+d>)b" : chordname = chsAddChr(chordname,'b');
+ chordname =
chsAddStrL(chordname,pmx(Start,1),pmx(Len,1));
+ k -= pmx(Len,0);
+ break;
+
+ case "+(<+d>)" :
+ case "(<+d>)+" : chordname = chsAddChr(chordname,'#');
+ chordname =
chsAddStrL(chordname,pmx(Start,1),pmx(Len,1));
+ k -= pmx(Len,0);
+ break;
+
+ case "<.>" : chordname =
chsAddChr(chordname,tolower(*pmx(Start,1)));
+ k -= pmx(Len,0);
+ break;
+ }
+ }
+ }
+ _dbgmsg("CN: [%s]",chordname);
+
+ frml_tmp.chordName = chordname;
+ frml_tmp.chordFormula = NULL;
+ frml_res= bsearch(&frml_tmp, abcChordFormula_v, NCHORDS,
+ sizeof(abcChordFormula_t),
frml_cmp);
+ if (frml_res)
+ formula = frml_res->chordFormula;
+ return formula;
+}
Modified: trunk/src/abcpnote.c
==============================================================================
--- trunk/src/abcpnote.c (original)
+++ trunk/src/abcpnote.c Sun Mar 1 07:55:12 2009
@@ -62,7 +62,7 @@
abcTokenStart(scn,4), abcTokenLen(scn,4) );
}
-unsigned short abcNoteOctave(abcScanner *scn)
+int abcNoteOctave(abcScanner *scn)
{
int oct = 4;
int k;
@@ -80,8 +80,8 @@
case ',' : oct--; break;
}
}
- if (oct < 0) oct = 0;
- else if (oct > 10) oct = 10;
+ if (oct < -1) oct = -1;
+ else if (oct > 9) oct = 9;
return oct;
}
@@ -120,17 +120,24 @@
return pitch;
}
+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)
{
int n;
if (abcToken(scn) != T_NOTE) return 0;
-
- n = abcSemitones[abcNote2Num(*abcTokenStart(scn,5))];
- n += (int)(abcNoteCents(scn)/100.0);
- n += 12 * (abcNoteOctave(scn)+1);
- if (n<0) n = 0;
- return n & 0x7F;
-}
+ return abcNote2Midi(*abcTokenStart(scn,5),
+ abcNoteOctave(scn)+1,
+ (int)(abcNoteCents(scn)/100.0));
+ }
unsigned short abcNoteMidiPitchBend(abcScanner *scn)
{
Modified: trunk/src/abcpscan.pmx
==============================================================================
--- trunk/src/abcpscan.pmx (original)
+++ trunk/src/abcpscan.pmx Sun Mar 1 07:55:12 2009
@@ -406,9 +406,9 @@
case "()()(|)" :settoken(scn,T_SYMBAR);
break;
- case "\"(<+=iv><?=#b>)(<*!\">)\"" :
- case "\"(<+=IV><?=#b>)(<*!\">)\"" :
- case "\"(<=A-Ga-g><?=#b>)(<*!\">)\"" :
+ case "\"(<+=iv><*=#b>)(<*!\">)\"(<*=',>)" :
+ case "\"(<+=IV><*=#b>)(<*!\">)\"(<*=',>)" :
+ case "\"(<=A-Ga-g><*=#b>)(<*!\">)\"(<*=',>)" :
settoken(scn,T_GCHORD);
break;
@@ -607,9 +607,9 @@
settoken(scn,T_CONTINUE);
break;
- case "\"(<+=iv><?=#b>)(<*!\">)\"" :
- case "\"(<+=IV><?=#b>)(<*!\">)\"" :
- case "\"(<=A-Ga-g><?=#b>)(<*!\">)\"" :
+ case "\"(<+=iv><*=#b>)(<*!\">)\"(<*=',>)" :
+ case "\"(<+=IV><*=#b>)(<*!\">)\"(<*=',>)" :
+ case "\"(<=A-Ga-g><*=#b>)(<*!\">)\"(<*=',>)" :
settoken(scn,T_GCHORD);
break;
@@ -621,8 +621,7 @@
case "()(<.>)" : settoken(scn,T_UNKNOWN);
break;
}
-
-
+
return scn->tok;
}
@@ -1121,11 +1120,11 @@
ret = 1;
while (save == NULL && ret == 1) {
switch pmx(pname) {
- case "<+!;>" : c = *pmx(End,0);
- *pmx(End,0) = '\0';
- _dbgmsg("trying: %s\n",pmx(Start,0));
- save = abcScannerNew(file,pmx(Start,0));
- *pmx(End,0) = c;
+ case "<+!;>" : c = *pmx(End,0);
+ *pmx(End,0) = '\0';
+ _dbgmsg("trying: %s\n",pmx(Start,0));
+ save = abcScannerNew(file,pmx(Start,0));
+ *pmx(End,0) = c;
break;
case ";" : break;
Added: trunk/test/a10.txt
==============================================================================
--- (empty file)
+++ trunk/test/a10.txt Sun Mar 1 07:55:12 2009
@@ -0,0 +1,7 @@
+X:2
+"A" "Amin" "Amin7"
+"Amaj/9/4/Bb(Cmaj/9/4/A)" "Bbmin(6)(B)"
+"C" "D-7(5b)" "Am6/4", "FMaj7" "A#mMaj7"
+
+X:3
+"C" "D-" "E-" "F" "A-" "G" "Bdim"
\ No newline at end of file
Modified: trunk/test/a4.txt
==============================================================================
--- trunk/test/a4.txt (original)
+++ trunk/test/a4.txt Sun Mar 1 07:55:12 2009
@@ -7,3 +7,6 @@
X:3
^C _C ^^C __C ^_C _^C ^/C ^3/2C _3/7C ^19.35C ^1C
^3241/8192A _4321/4992C
+
+X:4
+C,,,,, C,,,, C,,, C,, C, C c c' c'' c''' c''''
\ No newline at end of file