mirror of
https://github.com/sshlien/abcmidi.git
synced 2025-12-08 10:41:02 +00:00
Compare commits
3 Commits
2021.11.25
...
2022.01.13
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb5479e801 | ||
|
|
402f1ba212 | ||
|
|
3e1306aa26 |
76
doc/CHANGES
76
doc/CHANGES
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
35
genmidi.c
35
genmidi.c
@@ -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
24
store.c
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user