2024.04.30

This commit is contained in:
sshlien
2024-05-06 11:06:48 -04:00
parent 328d4920c9
commit 224930548b
11 changed files with 79 additions and 148 deletions

View File

@@ -1,2 +1,2 @@
March 21 2024 April 30 2024

View File

@@ -15450,3 +15450,22 @@ d8 |\
[V:1 transpose=0] d8 |] [V:1 transpose=0] d8 |]
April 30 2024
According to the abc standards 2.1 and 2.2 the %% (pseudo comment)
and the I: (stylesheet directive) should access the same functionality
in the same way. Thus if
%%MIDI program 10
should appear in an I: command as I:MIDI program 10 and not as
I:MIDI= program 10. James Allwright has updated abcMIDI C code
to comply with the standards. If you need to run some of the older
abc files that do not obey this standard and you do not want
to edit these files, then you should use an older version of
the abcMIDI package.
The following files were updated: matchsup.c, parseabc.h, pareseabc.c
parser2.c, store.c, toabc.c. and yapstree.c. Look for the comments
[JA] 2024-04-30.

View File

@@ -3,6 +3,9 @@ Guide to writing abc for abc2midi - minor revision [JA] 2021-05-24
Updated June 1 2017. %%MIDI program ranges from 0 to 127 not 1 to 128. Updated June 1 2017. %%MIDI program ranges from 0 to 127 not 1 to 128.
Updated April 30 2024: The [I:MIDI= ..] no longer works. You
must use [I:MIDI ...] instead (without the equal sign).
The abc notation language is described by the version 1.6 specification The abc notation language is described by the version 1.6 specification
document and later modifications to this document referred to as document and later modifications to this document referred to as
version 2.1 and version 2.2. These can be found at abcnotation.com . version 2.1 and version 2.2. These can be found at abcnotation.com .
@@ -1244,12 +1247,12 @@ C2 D2|
you can place the MIDI instruction inside an info field you can place the MIDI instruction inside an info field
using the following syntax. using the following syntax.
A2 B2|[I:MIDI= drumon] C2 D2| A2 B2|[I:MIDI drumon] C2 D2|
The '=' following the MIDI is very important. The info field The '=' following the MIDI is very important. The info field
syntax allows you to place several MIDI commands in one inline syntax allows you to place several MIDI commands in one inline
block, for example block, for example
[I: MIDI = program 73 MIDI=chordprog 29] [I: MIDI program 73 MIDI chordprog 29]
(Spaces are optional.) (Spaces are optional.)
Other examples can be seen in the file CHANGES in the Other examples can be seen in the file CHANGES in the
following the March 25 2005 entry. following the March 25 2005 entry.

View File

@@ -1,9 +1,9 @@
abcMIDI : abc <-> MIDI conversion utilities abcMIDI : abc <-> MIDI conversion utilities
midi2abc version 3.59 February 08 2023 midi2abc version 3.59 February 08 2023
abc2midi version 4.91 March 02 2024 abc2midi version 4.92 April 30 2024
abc2abc version 2.21 February 19 2024 abc2abc version 2.22 April 30 2024
yaps version 1.93 February 19 2024 yaps version 1.94 April 30 2024
abcmatch version 1.83 February 19 2024 abcmatch version 1.83 February 19 2024
midicopy version 1.39 November 08 2022 midicopy version 1.39 November 08 2022
midistats version 0.91 March 21 2024 midistats version 0.91 March 21 2024
@@ -14,7 +14,7 @@ jamesallwright@yahoo.co.uk
University of Westminster, University of Westminster,
London, UK London, UK
August 2023 May 2024
Copyright Seymour Shlien Copyright Seymour Shlien
fy733@ncf.ca fy733@ncf.ca
Ottawa, Canada Ottawa, Canada

4
matchsup.c Normal file → Executable file
View File

@@ -422,8 +422,10 @@ char *s;
} }
void event_specific (package, s) /* [JA] 2024-04-30 added in_I argument */
void event_specific (package, s, in_I)
char *package, *s; char *package, *s;
int in_I;
{ {
} }

2
parseabc.c Normal file → Executable file
View File

@@ -2100,7 +2100,7 @@ parse_precomment (s)
{ {
p = s + 1; p = s + 1;
readstr (package, &p, 40); readstr (package, &p, 40);
event_specific (package, p); event_specific (package, p, 0); /* [JA] 2024-04-30 */
} }
else else
{ {

6
parseabc.h Normal file → Executable file
View File

@@ -116,7 +116,7 @@ extern void event_startmusicline(void);
extern void event_endmusicline(char endchar); extern void event_endmusicline(char endchar);
extern void event_eof(void); extern void event_eof(void);
extern void event_comment(char *s); extern void event_comment(char *s);
extern void event_specific(char *package, char *s); extern void event_specific(char *package, char *s, int in_I);
extern void event_specific_in_header(char *package, char *s); extern void event_specific_in_header(char *package, char *s);
extern void event_startinline(void); extern void event_startinline(void);
extern void event_closeinline(void); extern void event_closeinline(void);
@@ -133,7 +133,7 @@ extern void event_refno(int n);
extern void event_tempo(int n, int a, int b, int rel, char *pre, char *post); extern void event_tempo(int n, int a, int b, int rel, char *pre, char *post);
extern void event_timesig(timesig_details_t *timesig); extern void event_timesig(timesig_details_t *timesig);
extern void event_octave(int num, int local); extern void event_octave(int num, int local);
extern void event_info_key(char *key, char *value); /* extern void event_info_key(char *key, char *value); [JA] 2024-04-30 */
extern void event_info(char *s); extern void event_info(char *s);
extern void event_key(int sharps, char *s, int modeindex, extern void event_key(int sharps, char *s, int modeindex,
char modmap[7], int modmul[7], struct fraction modmicro[7], char modmap[7], int modmul[7], struct fraction modmicro[7],
@@ -203,7 +203,7 @@ extern void event_refno();
extern void event_tempo(); extern void event_tempo();
extern void event_timesig(); extern void event_timesig();
extern void event_octave(); extern void event_octave();
extern void event_info_key(); /* extern void event_info_key(); [JA] 2024-04-30 */
extern void event_info(); extern void event_info();
extern void event_key(); extern void event_key();
extern void event_microtone(); extern void event_microtone();

92
parser2.c Normal file → Executable file
View File

@@ -9,89 +9,21 @@
#include "parseabc.h" #include "parseabc.h"
#include "parser2.h" #include "parser2.h"
void event_info(s) /* [JA] 2024-04-30 */
char* s; void event_info(char* s)
/* An I: field has been encountered. This routine scans the following /* An I: field has been encountered. The 2.1 and 2.2 abc standards
text to extract items of the form key=value. The equal sign is optional specify that this field (stylesheet directive) is handled in the
if only one key (eg MIDI, octave, vol, etc.) occurs in the I: field. same way as %% (pseudo-comment). If it isn't recognized it should
Otherwise we need to follow each key with an equal sign so that we be silently ignored.
know that the preceding item was a key.
*/ */
{ {
char* key; char package[40];
char* endkey; char *p;
char* value;
char* endvalue;
char* lastendvalue;
char* newword;
char* lastnewword;
char* ptr;
int doval;
ptr = s; p = s;
doval = 0; skipspace(&p);
while (*ptr != '\0') { readstr (package, &p, 40);
if (doval == 0) { event_specific (package, p, 1);
/* look for key */
skipspace(&ptr);
key = ptr;
while ((*ptr != '\0') && (*ptr != ' ') && (*ptr != '=')) {
ptr = ptr + 1;
};
endkey = ptr;
skipspace(&ptr);
if (*ptr == '=') {
doval = 1;
ptr = ptr + 1;
skipspace(&ptr);
value = ptr;
newword = ptr;
endvalue = NULL;
lastendvalue = NULL;
} else {
/* [SS] 2015-09-08 */
/* assume only one I: key occurs; grab the rest in value */
*endkey = '\0'; /* end the key ptr */
value = ptr; /* start the value ptr here */
event_info_key(key,value);
return;
};
} else {
/* look for value */
skipspace(&ptr);
while ((*ptr != '\0') && (*ptr != ' ') && (*ptr != '=')) {
ptr = ptr + 1;
};
lastendvalue = endvalue;
endvalue = ptr;
skipspace(&ptr);
lastnewword = newword;
newword = ptr;
if (*ptr == '\0') {
*endkey = '\0';
*endvalue = '\0';
event_info_key(key, value);
} else {
if (*ptr == '=') {
*endkey = '\0';
if (lastendvalue == NULL) {
event_error("missing key or value in I: field");
} else {
*lastendvalue = '\0';
event_info_key(key, value);
};
key = lastnewword;
endkey = endvalue;
doval = 1;
ptr = ptr + 1;
skipspace(&ptr);
value = ptr;
endvalue = NULL;
lastendvalue = NULL;
};
};
};
};
} }

67
store.c Normal file → Executable file
View File

@@ -186,7 +186,7 @@ int main()
*/ */
#define VERSION "4.91 March 02 2024 abc2midi" #define VERSION "4.92 April 30 2024 abc2midi"
/* enables reading V: indication in header */ /* enables reading V: indication in header */
#define XTEN1 1 #define XTEN1 1
@@ -1936,6 +1936,11 @@ char *s;
skipspace(&p); skipspace(&p);
readstr(command, &p, 40); readstr(command, &p, 40);
if (s[0] == '=') {
event_warning("Do not use MIDI= in I: command. Just use MIDI");
done = 0;
} /*[SS] 2024.04.30 */
if (strcmp(command, "channel") == 0) { if (strcmp(command, "channel") == 0) {
skipspace(&p); skipspace(&p);
ch = readnump(&p) - 1; ch = readnump(&p) - 1;
@@ -2362,10 +2367,9 @@ char *s;
}; };
} }
void event_specific(package, s)
/* package-specific command found i.e. %%NAME */ /* package-specific command found i.e. %%NAME */
char *package, *s; /* [JA] 2024.04.30 introducing in_I */
void event_specific(char *package, char *s, int in_I)
{ {
char msg[200], command[40]; char msg[200], command[40];
char *p; char *p;
@@ -2386,7 +2390,6 @@ char *package, *s;
process_midix(s); process_midix(s);
} }
if (strcmp(package, "MIDI") == 0) if (strcmp(package, "MIDI") == 0)
event_midi(s); else { event_midi(s); else {
@@ -2507,7 +2510,6 @@ char *package, *s;
} }
#endif #endif
event_comment(msg);
} }
} }
} }
@@ -3148,38 +3150,7 @@ int local;
}; };
} }
void event_info_key(key, value) /* deleted event_info_key(key,value) [JA] 2024-04-30 */
char* key;
char* value;
{
int num;
char midicmd[64];
char errmsg[80];
if (strcmp(key, "octave")==0) {
num = readsnumf(value);
event_octave(num,0);
};
/* [SS] 2015-06-02 */
if (strcmp(key, "MIDI") == 0 || strcmp(key, "MIDIx") == 0 )
event_specific(key, value);
else if(strcmp(key, "volinc") == 0 || strcmp(key,"vol") == 0)
{
midicmd[0] = 0;
strcat(midicmd, key);
strcat(midicmd, " ");
strcat(midicmd, value);
event_specific("MIDI",midicmd);
}
else if (is_abcm2ps_option (key)) return;
else {
/* [KG] 2022-01-13 stack overflow */
snprintf(errmsg, 80, "I: key \' %s\' not recognized", key);
if (quiet == -1 && silent == 0) event_error(errmsg); /* [SS] 2018-04-01 */
}
}
static void stack_broken(v) static void stack_broken(v)
/* store away broken rhythm context on encountering grace notes */ /* store away broken rhythm context on encountering grace notes */
@@ -4618,42 +4589,42 @@ char* s;
/* add nofnop ... */ /* add nofnop ... */
if (nofnop == 0) { if (nofnop == 0) {
if (strcmp(p, "ppp") == 0) { if (strcmp(p, "ppp") == 0) {
event_specific("MIDI", "beat 30 20 10 1"); event_specific("MIDI", "beat 30 20 10 1", 0); /* [JA] 2024-04-30 and etc */
done = 1; done = 1;
}; };
if (strcmp(p, "pp") == 0) { if (strcmp(p, "pp") == 0) {
event_specific("MIDI", "beat 45 35 20 1"); event_specific("MIDI", "beat 45 35 20 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "p") == 0) { if (strcmp(p, "p") == 0) {
event_specific("MIDI", "beat 60 50 35 1"); event_specific("MIDI", "beat 60 50 35 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "mp") == 0) { if (strcmp(p, "mp") == 0) {
event_specific("MIDI", "beat 75 65 50 1"); event_specific("MIDI", "beat 75 65 50 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "mf") == 0) { if (strcmp(p, "mf") == 0) {
event_specific("MIDI", "beat 90 80 65 1"); event_specific("MIDI", "beat 90 80 65 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "f") == 0) { if (strcmp(p, "f") == 0) {
event_specific("MIDI", "beat 105 95 80 1"); event_specific("MIDI", "beat 105 95 80 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "ff") == 0) { if (strcmp(p, "ff") == 0) {
event_specific("MIDI", "beat 120 110 95 1"); event_specific("MIDI", "beat 120 110 95 1", 0);
done = 1; done = 1;
}; };
if (strcmp(p, "fff") == 0) { if (strcmp(p, "fff") == 0) {
event_specific("MIDI", "beat 127 125 110 1"); event_specific("MIDI", "beat 127 125 110 1", 0);
done = 1; done = 1;
}; };
if ((strcmp(p,"crescendo(") == 0) || (strcmp(p,"<(") == 0) || if ((strcmp(p,"crescendo(") == 0) || (strcmp(p,"<(") == 0) ||
(strcmp(p,"crescendo)") == 0) || (strcmp(p,"<)") == 0)) { (strcmp(p,"crescendo)") == 0) || (strcmp(p,"<)") == 0)) {
sprintf(midimsg,"beatmod %d",velocitychange); sprintf(midimsg,"beatmod %d",velocitychange);
event_specific("MIDI", midimsg); event_specific("MIDI", midimsg, 0); /* [JA] 2024-04-30 */
done = 1; done = 1;
} }
@@ -4661,7 +4632,7 @@ if (nofnop == 0) {
(strcmp(p,"diminuendo)") == 0) || (strcmp(p,">)") == 0) || (strcmp(p,"diminuendo)") == 0) || (strcmp(p,">)") == 0) ||
(strcmp(p,"diminuendo(") == 0) || (strcmp(p,">(") == 0)) { (strcmp(p,"diminuendo(") == 0) || (strcmp(p,">(") == 0)) {
sprintf(midimsg,"beatmod -%d",velocitychange); sprintf(midimsg,"beatmod -%d",velocitychange);
event_specific("MIDI", midimsg); event_specific("MIDI", midimsg, 0);
done = 1; done = 1;
} }

13
toabc.c Normal file → Executable file
View File

@@ -21,7 +21,7 @@
/* back-end for outputting (possibly modified) abc */ /* back-end for outputting (possibly modified) abc */
#define VERSION "2.21 Feb 19 2024 abc2abc" #define VERSION "2.22 April 30 2024 abc2abc"
/* for Microsoft Visual C++ 6.0 or higher */ /* for Microsoft Visual C++ 6.0 or higher */
#ifdef _MSC_VER #ifdef _MSC_VER
@@ -908,13 +908,18 @@ char *s;
inmusic = 0; inmusic = 0;
} }
void event_specific(package, s) /* [JA] 2024-04-30 */
char *package, *s; void event_specific(char *package, char *s, int in_I)
{ {
char command[40]; char command[40];
int ch; int ch;
char *p; char *p;
emit_string("%%");
if (in_I) { /* [JA] 2024-04-30 */
emit_string("I:");
} else {
emit_string("%%");
}
emit_string(package); emit_string(package);
emit_string(s); emit_string(s);
inmusic = 0; inmusic = 0;

7
yapstree.c Normal file → Executable file
View File

@@ -22,7 +22,7 @@
/* yapstree.c - back-end for abc parser. */ /* yapstree.c - back-end for abc parser. */
/* generates a data structure suitable for typeset music */ /* generates a data structure suitable for typeset music */
#define VERSION "1.93 February 19 2024 yaps" #define VERSION "1.94 April 30 2024 yaps"
#include <stdio.h> #include <stdio.h>
#ifdef USE_INDEX #ifdef USE_INDEX
#define strchr index #define strchr index
@@ -1525,9 +1525,8 @@ int make_open()
return(1); return(1);
} }
void event_specific(p, str) /* [JA] 2024-04-30 introducing in_I */
char *p; /* first word after %% */ void event_specific(char *p, char *str, int in_I)
char *str; /* string following first word */
/* The special comment %% has been found */ /* The special comment %% has been found */
/* abc2midi uses it for the %%MIDI commands */ /* abc2midi uses it for the %%MIDI commands */
/* yaps implements some of the abc2ps commands */ /* yaps implements some of the abc2ps commands */