Compare commits

..

3 Commits

Author SHA1 Message Date
Seymour Shlien
fb5479e801 2022.01.13 2022-01-13 18:08:38 -05:00
Seymour Shlien
402f1ba212 2021.12.12 2021-12-12 15:59:49 -05:00
Seymour Shlien
3e1306aa26 2021.12.10 2021-12-10 12:08:42 -05:00
5 changed files with 123 additions and 16 deletions

View File

@@ -1,2 +1,2 @@
2021 November 25 2021 2021 January 13 2022

View File

@@ -14491,3 +14491,79 @@ with
if (*nnotes > 0) { /* [SS] 2021-11-25 */ if (*nnotes > 0) { /* [SS] 2021-11-25 */
in the function make_note_representation(...) in the function make_note_representation(...)
December 05 2021
abc2midi new feature. Abc2midi did not recognize double flats or double sharps
in the gchord. For example
X:1
T: Double flat gchord
M: 4/4
L: 1/4
K: C
"Dbb" C4| C4 |
returns the error message
Error in line-char 6-0 : Unrecognized chord name "b"
(Hint: use %MIDI chordname to define it. eg %MIDI chordname sus4 0 4 7).
Fix: in event_handle_gchord in store.c, now check for a double accidental.
December 10 2021
abc2midi: introduced gchord elements k and K. A gchord string can
contain and of the letters in zcfbghijkGHIJKx. Note that the chord
elements j,J,k,K are only defined for gchords with 4 or 5 notes like
M9 or M11. Here is a test example.
X:1
T: Gchord string
M: 4/4
L: 1/4
K: C
%%MIDI chordname x 0 3 5 7 9
%%MIDI gchord fGHIJK
"C11" C4 | C4 |
"Cx" C4 | C4|
"C11/E" C4 | C4|
"C11/G" C4 | C4|
"C11/B" C4 | C4|
December 12 2021
abcmidi: changed bar length warning as suggested by James Allwright.
January 13 2022
abc2midi: stack overflow bugs reported by Kolja Grassmann
<koljagrassman@mailbox.org>
static int getword(place,w) in genmidi.c
check that the syllable[200] array is not overrun
in the while loop ((syllastus != postword)...) add && (i<199)
static void karaokestarttrack in genmidi.c
replace strcpy(atitle+2,atext[pitch[j]])
with strncpy(atitle+2,atext[pitch[j]], 197)
to prevent overflowing the atitle[200] array
in three places.
static int inlist(place, passno) in genmidi.c
To prevent stack overflow in msg[100];
use snprintf instead of sprintf
snprintf(msg, 100, "Bad variant list : %s", atext[pitch[place]]);
void event_handle_instruction(s) in store.c
To prevent overrunning the array buff[MAXLINE]
used snprintf instead of sprintf
snprintf(buff, MAXLINE, "instruction !%s! ignored", s);
void event_info_key(key, value) in store.c
To prevent overrunning the array errmsg[80]
used snprintf instead of sprintf
snprintf(errmsg, 80, "I: key \' %s\' not recognized", key);

View File

@@ -1,7 +1,7 @@
abcMIDI : abc <-> MIDI conversion utilities abcMIDI : abc <-> MIDI conversion utilities
midi2abc version 3.48 June 27 2021 midi2abc version 3.48 June 27 2021
abc2midi version 4.61 October 11 2021 abc2midi version 4.65 January 13 2022
abc2abc version 2.15 May 25 2021 abc2abc version 2.15 May 25 2021
yaps version 1.87 May 25 2021 yaps version 1.87 May 25 2021
abcmatch version 1.80 November 25 2021 abcmatch version 1.80 November 25 2021

View File

@@ -31,8 +31,11 @@
/* for Microsoft Visual C++ Ver 6 and higher */ /* for Microsoft Visual C++ Ver 6 and higher */
#ifdef _MSC_VER #ifdef _MSC_VER
#define ANSILIBS #define ANSILIBS
#define snprintf _snprintf
#define strncasecmp strnicmp
#endif #endif
#include "abc.h" #include "abc.h"
#include "parseabc.h" #include "parseabc.h"
#include "queues.h" #include "queues.h"
@@ -398,7 +401,8 @@ char* s;
p = s; p = s;
j = 0; j = 0;
seq_len = 0; seq_len = 0;
while ((strchr("zcfbghijGHIJx", *p) != NULL) && (j <39)) { /* [SS] 2021-12-10 */
while ((strchr("zcfbghijkGHIJKx", *p) != NULL) && (j <39)) {
if (*p == 0) break; if (*p == 0) break;
gchord_seq[j] = *p; gchord_seq[j] = *p;
p = p + 1; p = p + 1;
@@ -530,7 +534,7 @@ int pass;
if (bar_denom != 1) { if (bar_denom != 1) {
sprintf(msg+strlen(msg), "/%d", bar_denom); sprintf(msg+strlen(msg), "/%d", bar_denom);
}; };
sprintf(msg+strlen(msg), " units instead of %d", barsize); sprintf(msg+strlen(msg), " time units while the time signature has %d", barsize);
if (pass == 2) { if (pass == 2) {
strcat(msg, " in repeat"); strcat(msg, " in repeat");
}; };
@@ -810,17 +814,17 @@ int track;
if (feature[j] == TITLE) { if (feature[j] == TITLE) {
if (track != 2) if (track != 2)
mf_write_meta_event(0L, sequence_name, atext[pitch[j]], strlen (atext[pitch[j]])); mf_write_meta_event(0L, sequence_name, atext[pitch[j]], strlen (atext[pitch[j]]));
strcpy(atitle+2, atext[pitch[j]]); strncpy(atitle+2, atext[pitch[j]], 197); /* [KG] 2022-01-13 stack overflow bug */
text_data(atitle); text_data(atitle);
done--; done--;
} }
if (feature[j] == COMPOSER) { if (feature[j] == COMPOSER) {
strcpy(atitle+2, atext[pitch[j]]); strncpy(atitle+2, atext[pitch[j]], 197); /* [KG] 2022-01-13 stack overflow bug */
text_data(atitle); text_data(atitle);
done--; done--;
} }
if (feature[j] == COPYRIGHT) { if (feature[j] == COPYRIGHT) {
strcpy(atitle+2, atext[pitch[j]]); strcpy(atitle+2, atext[pitch[j]]); /* [KG] 2022-01-13 stack overflow bug */
text_data(atitle); text_data(atitle);
done--; done--;
} }
@@ -965,7 +969,8 @@ int w;
syllstatus = empty; syllstatus = empty;
c = *(words[w]+(*place)); c = *(words[w]+(*place));
isBig5 = 0; /* [BI] 2012-10-03 */ isBig5 = 0; /* [BI] 2012-10-03 */
while ((syllstatus != postword) && (syllstatus != failed)) { while ((syllstatus != postword) && (syllstatus != failed) && (i<199)) {
/* [KG] 2022-01-13 stack overflow bug fix */
syllable[i] = c; syllable[i] = c;
/* printf("syllstatus = %d c = %c i = %d place = %d row= %d \n",syllstatus,c,i,*place,w); */ /* printf("syllstatus = %d c = %c i = %d place = %d row= %d \n",syllstatus,c,i,*place,w); */
if (isBig5) { /* [BI] 2012-10-03 */ if (isBig5) { /* [BI] 2012-10-03 */
@@ -1251,7 +1256,8 @@ int passno;
found = 0; found = 0;
while ((found == 0) && (*p != '\0')) { while ((found == 0) && (*p != '\0')) {
if (!isdigit(*p)) { if (!isdigit(*p)) {
sprintf(msg, "Bad variant list : %s", atext[pitch[place]]); snprintf(msg, 100, "Bad variant list : %s", atext[pitch[place]]);
/* [KG] 2022-01-13 stack overflow bug */
event_error(msg); event_error(msg);
found = 1; found = 1;
}; };
@@ -2453,6 +2459,13 @@ int j;
save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel); save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel);
break; break;
/* [SS] 2021-12-10 */
case 'k':
if(gchordnotes_size >4 && g_started && gchords)
save_note(g_num*len, g_denom, gchordnotes[4], 8192, gchord.chan, gchord.vel);
else /* [SS] 2016-01-03 */
save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel);
case 'G': case 'G':
if(gchordnotes_size>0 && g_started && gchords) if(gchordnotes_size>0 && g_started && gchords)
save_note(g_num*len, g_denom, gchordnotes[0]-12, 8192, gchord.chan, gchord.vel); save_note(g_num*len, g_denom, gchordnotes[0]-12, 8192, gchord.chan, gchord.vel);
@@ -2481,6 +2494,14 @@ int j;
save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel); save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel);
break; break;
/* [SS] 2021-12-10 */
case 'K':
if(gchordnotes_size >3 && g_started && gchords)
save_note(g_num*len, g_denom, gchordnotes[4]-12, 8192, gchord.chan, gchord.vel);
else /* [SS] 2016-01-03 */
save_note(g_num*len, g_denom, gchordnotes[gchordnotes_size], 8192, gchord.chan, gchord.vel);
break;
case 'x': case 'x':
if(!gchord_error) { if(!gchord_error) {
gchord_error++; gchord_error++;

24
store.c
View File

@@ -186,7 +186,7 @@ int main()
*/ */
#define VERSION "4.61 October 11 2021 abc2midi" #define VERSION "4.65 January 13 2022 abc2midi"
/* enables reading V: indication in header */ /* enables reading V: indication in header */
#define XTEN1 1 #define XTEN1 1
@@ -3171,7 +3171,8 @@ char* value;
else if (is_abcm2ps_option (key)) return; else if (is_abcm2ps_option (key)) return;
else { else {
sprintf(errmsg,"I: key \' %s\' not recognized", key); /* [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 */ if (quiet == -1 && silent == 0) event_error(errmsg); /* [SS] 2018-04-01 */
} }
} }
@@ -4494,13 +4495,15 @@ void event_handle_gchord(s)
char* s; char* s;
{ {
int basepitch; int basepitch;
char accidental, note; char accidental, accidental2, note; /* [SS] 2021-12-05 */
char* p; char* p;
char name[9]; char name[9];
int i; int i;
int chordno; int chordno;
int bassnote; int bassnote;
int inversion; int inversion;
int mult; /* [SS] 2021-12-05 */
mult = 1;
if (ignore_guitarchords == 1) return; /* [SS] 2019-12-09 */ if (ignore_guitarchords == 1) return; /* [SS] 2019-12-09 */
if ((*s >= '0') && (*s <= '5')) { if ((*s >= '0') && (*s <= '5')) {
@@ -4527,7 +4530,9 @@ char* s;
}; };
}; };
p = get_accidental(p, &accidental); p = get_accidental(p, &accidental);
basepitch = pitchof(note, accidental, 1, 0, 0) - middle_c; p = get_accidental(p, &accidental2); /* [SS] 2021-12-05 */
if (accidental2 != '=') mult = 2; /* [SS] 2021-12-05 */
basepitch = pitchof(note, accidental, mult, 0, 0) - middle_c;
i = 0; i = 0;
while ((i<9) && (*p != ' ') && (*p != '\0') && (*p != '(') while ((i<9) && (*p != ' ') && (*p != '\0') && (*p != '(')
&& (*p != '/') && (*p != ')')) { && (*p != '/') && (*p != ')')) {
@@ -4543,12 +4548,16 @@ char* s;
note = (int)*p - 'A' + 'a'; note = (int)*p - 'A' + 'a';
p = p + 1; p = p + 1;
p = get_accidental(p, &accidental); p = get_accidental(p, &accidental);
inversion = pitchof(note, accidental, 1, 0, 0) - middle_c; p = get_accidental(p, &accidental2); /* [SS] 2021-12-05 */
if (accidental2 != '=') mult = 2; /* [SS] 2021-12-05 */
inversion = pitchof(note, accidental, mult, 0, 0) - middle_c;
} else if ((*p >= 'a') && (*p <= 'g')) { } else if ((*p >= 'a') && (*p <= 'g')) {
note = (int)*p; note = (int)*p;
p = p + 1; p = p + 1;
p = get_accidental(p, &accidental); p = get_accidental(p, &accidental);
inversion = pitchof(note, accidental, 1, 0, 0) - middle_c; p = get_accidental(p, &accidental2); /* [SS] 2021-12-05 */
if (accidental2 != '=') mult = 2; /* [SS] 2021-12-05 */
inversion = pitchof(note, accidental, mult, 0, 0) - middle_c;
} else if (!silent) { } else if (!silent) {
event_error(" / must be followed by A-G or a-g in gchord"); event_error(" / must be followed by A-G or a-g in gchord");
}; };
@@ -4739,7 +4748,8 @@ if (nofnop == 0) {
}; };
if (done == 0 && quiet == -1) { /* [SS] 2013-11-02 */ if (done == 0 && quiet == -1) { /* [SS] 2013-11-02 */
sprintf(buff, "instruction !%s! ignored", s); snprintf(buff, MAXLINE, "instruction !%s! ignored", s);
/* [KG] 2022-01-13 static overflow */
event_warning(buff); event_warning(buff);
}; };
} }