Compare commits

..

7 Commits

Author SHA1 Message Date
Seymour Shlien
eaf451d6ad 2022.02.21 2022-02-21 17:13:57 -05:00
Seymour Shlien
cded63b590 2022.02.18 2022-02-18 12:33:35 -05:00
Seymour Shlien
57a5ae2ba7 2022.02.13 2022-02-13 14:33:57 -05:00
Seymour Shlien
6c7ff05c49 2022.02.07 2022-02-07 15:55:39 -05:00
Seymour Shlien
e58956238a 2022.01.28 2022-01-28 07:43:41 -05:00
Seymour Shlien
0b83ee2c7b 2022.01.27 2022-01-27 12:46:08 -05:00
Seymour Shlien
fb5479e801 2022.01.13 2022-01-13 18:08:38 -05:00
9 changed files with 189 additions and 25 deletions

View File

@@ -13,7 +13,7 @@ Seymour added two more programs:
1. abcmatch for finding common elements in a collection of abc tunes and, 1. abcmatch for finding common elements in a collection of abc tunes and,
2. midicopy for copying parts of a midi file to a new midi file. 2. midicopy for copying parts of a midi file to a new midi file.
Yaps has been superceded by [Jef Moine](http://moinejf.free.fr/) abcm2ps and abc2svg programs. Midi2abc has been expanded to include mftext and various other features for supporting the [runabc](https://ifdo.ca/~seymour/runabc/top.html) application. Abc2midi has numerous new features that are described in its own web page [abc2midi guide](https://ifdo.ca/~seymour/runabc/abcguide/abc2midi_guide.html). Yaps has been superceded by [Jef Moine](http://moinejf.free.fr/) abcm2ps and abc2svg programs. Midi2abc has been expanded to include mftext and various other features for supporting the [runabc](https://ifdo.ca/~seymour/runabc/top.html) application. Abc2midi has numerous new features that are described in its own web page [abc2midi guide](https://abcmidi.sourceforge.io).
Components of the abcMIDI package are parts of numerous applications for creating and editing abc files. Compilations of these components for various operating systems can be found on [The ABC Plus Project](http://abcplus.sourceforge.net/) web page. Components of the abcMIDI package are parts of numerous applications for creating and editing abc files. Compilations of these components for various operating systems can be found on [The ABC Plus Project](http://abcplus.sourceforge.net/) web page.

View File

@@ -1,2 +1,2 @@
2021 December 12 2021 2022 February 22 2022

View File

@@ -14537,3 +14537,128 @@ December 12 2021
abcmidi: changed bar length warning as suggested by James Allwright. 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);
January 27 2022
abcmidi: new feature
%%MIDI pitchbendrange semi
maps the pitchwheel 0 to 16383 to semi semitones. By default semi
is set to 2. If you change it to 4, then the pitchwheel maps into
+/-4 semitones. This effects all microtones in the active channel
when semi is not 2. %%MIDI temperament commands may not work
correctly. Here is an example.
X:1
T: pitch bend with RPN
M: 4/4
L: 1/4
K: G
%%MIDI program 70
G2 B2 |\
%%MIDI bendstring 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500
!bend! G4 |\
%%MIDI pitchbendrange 7
!bend! G4 |
February 12 2022
Midi2abc -mftext: adjusted the pitchbend sensitivity bend2cents when
a RPN control command is received (in function mftxt_parameter).
February 13 2022
abc2midi: added an optional third parameter to %%MIDI bendvelocity
which specifies the number of MIDI pitchbend messages to create.
If this parameter is missing, the default is 8 as before.
February 18 2022
abc2midi bug: the K: and V: score option transposes the music in the
wrong direction. eg
X:1
T: transpose
M: 4/4
L: 1/4
K: G sound = DC
CDEF|GABc|
CDEF... converted to BbCDE.. instead of DEF#G...
Fix: swapped p2 and p1 in
*transpose = p2 - p1;
in parsesound() in parseabc.c
February 21 2022
abc2abc mangles text. eg
input:
X:1
T: Text mangled by abc2abc
Q:1/2=120
M:4/4
L:1/8
K:G bass octave=-2
%%begintext center
this text is mangled
%%endtext
%%
!f! g2 z d g2 z d | gdgb d'2 z2 | c'2 z a c'2 z a | cafa d2 z2 | gggg gggg | [I:repeat] |
abc2abc text.abc -t 2 >output.abc
output:
X:1
T:Text mangled by abc2abc
Q:1/2=120
M:4/4
L:1/8
K:Amaj clef=bass octave=-2
%%begintext center
this tfxt is mbnalfe
%%endtext
%%
!f! a2 z e a2 z e | aeac' e'2 z2 | d'2 z b d'2 z b | dbgb e2 z2 | aaaa aaaa | [I:repeat] |
Analysis:
Parseline (line) in parseabc.c checks the line for %%begintext using strcmp.
Unfortunately, it does not find a match because the line also contains
the word 'center'.
Fix: replaced
if (strcmp(line,"%%begintext") == 0) {
with
if (strstr(line,"%%begintext") != NULL) {
which returns the pointer to %%begintext in the line.

View File

@@ -1,9 +1,9 @@
abcMIDI : abc <-> MIDI conversion utilities abcMIDI : abc <-> MIDI conversion utilities
midi2abc version 3.48 June 27 2021 midi2abc version 3.50 February 12 2022
abc2midi version 4.64 December 12 2021 abc2midi version 4.69 February 22 2022
abc2abc version 2.15 May 25 2021 abc2abc version 2.16 February 22 2022
yaps version 1.87 May 25 2021 yaps version 1.88 February 22 2022
abcmatch version 1.80 November 25 2021 abcmatch version 1.80 November 25 2021
midicopy version 1.37 October 10 2020 midicopy version 1.37 October 10 2020

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"
@@ -811,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--;
} }
@@ -966,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 */
@@ -1252,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;
}; };
@@ -1415,8 +1420,6 @@ static void midi_re_tune (int channel) {
this is done. this is done.
*/ */
char data[2]; char data[2];
data[0] = (char) (bend & 0x7f); /* least significant bits */
data[1] = (char) ((bend >>7) & 0x7f);
/* indicate that we are applying RPN fine and gross tuning using /* indicate that we are applying RPN fine and gross tuning using
the following two control commands. the following two control commands.
control 101 0 control 101 0
@@ -1439,6 +1442,29 @@ data[1] = (char) (bend & 0x7f); /* least significant bits */
write_event(control_change, channel, data, 2); write_event(control_change, channel, data, 2);
} }
/* [SS] 2022-01-27 */
static void midiPitchBendRange (int semis) {
/* by default the pitch wheel maps 0 to 16383 to a range of 4
* semitones. This function uses the RPN control command to
* expand the range to semis semitones.
*/
char data[2];
/* indicate that we are applying RPN fine and gross tuning using
the following two control commands.
control 101 0
control 100 0 */
data[0] = 101; /* RPN command */
data[1] = 0; /* type of command */
write_event(control_change, channel, data, 2);
data[0] = 6; /* contains most significant byte */
data[1] = semis;
write_event(control_change, channel, data, 2);
data[0] = 38; /* contains least significant byte (range in cents) */
data[1] = 0;
write_event(control_change, channel, data, 2);
}
/* [SS] 2011-07-04 */ /* [SS] 2011-07-04 */
@@ -2048,14 +2074,17 @@ int noteson;
skipspace(&p); skipspace(&p);
val = readsnump(&p); val = readsnump(&p);
bendacceleration = val; bendacceleration = val;
skipspace(&p); /* [SS] 2022-02-13 */
val = readsnump(&p);
if (val > 0 && val < 100) bendnvals = val;
else bendnvals = 8;
/* [SS] 2015-08-11 */ /* [SS] 2015-08-11 */
bendnvals = 0;
if (bendvelocity != 0 || bendacceleration != 0) { if (bendvelocity != 0 || bendacceleration != 0) {
for (i = 0; i<8; i++) { for (i = 0; i<bendnvals; i++) { /* [SS] 2022-02-13 */
benddata[i] = bendvelocity; benddata[i] = bendvelocity;
bendvelocity = bendvelocity + bendacceleration; bendvelocity = bendvelocity + bendacceleration;
} }
bendnvals = 8;
} }
/*bendtype = 1; [SS] 2015-08-11 */ /*bendtype = 1; [SS] 2015-08-11 */
if (bendnvals == 1) bendtype = 3; /* [SS] 2014-09-22 */ if (bendnvals == 1) bendtype = 3; /* [SS] 2014-09-22 */
@@ -2095,6 +2124,14 @@ int noteson;
else bendtype = 2; else bendtype = 2;
} }
/* [SS] 2022-01-27 */
else if (strcmp(command, "pitchbendrange") == 0) {
int semis;
semis = readsnump(&p);
midiPitchBendRange(semis);
done = 1;
}
else if (strcmp(command, "drone") == 0) { else if (strcmp(command, "drone") == 0) {
skipspace(&p); skipspace(&p);

View File

@@ -1056,7 +1056,7 @@ parsesound (s, word, gottranspose, transpose)
*transpose = 0; *transpose = 0;
} else { } else {
/* printf("midi note = %d\n",p2); */ /* printf("midi note = %d\n",p2); */
*transpose = p2 - p1; *transpose = p1 - p2; /* [SS] 2022.02.18 */
/* printf("transpose = %d\n",*transpose); */ /* printf("transpose = %d\n",*transpose); */
*gottranspose = 1; *gottranspose = 1;
} }
@@ -3353,11 +3353,11 @@ parseline (line)
{ {
char *p, *q; char *p, *q;
/* [SS] 2020-01-03 */ /* [SS] 2020-01-03 2021-02-21 */
if (strcmp(line,"%%begintext") == 0) { if (strstr(line,"%%begintext") != NULL) {
ignore_line = 1; ignore_line = 1;
} }
if (strcmp(line,"%%endtext") == 0) { if (strstr(line,"%%endtext") != NULL) {
ignore_line = 0; ignore_line = 0;
} }
/* [SS] 2021-05-09 */ /* [SS] 2021-05-09 */

View File

@@ -186,7 +186,7 @@ int main()
*/ */
#define VERSION "4.64 December 12 2021 abc2midi" #define VERSION "4.70 February 22 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 */
} }
} }
@@ -4747,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);
}; };
} }

View File

@@ -21,7 +21,7 @@
/* back-end for outputting (possibly modified) abc */ /* back-end for outputting (possibly modified) abc */
#define VERSION "2.15 May 25 2021 abc2abc" #define VERSION "2.16 February 21 2022 abc2abc"
/* for Microsoft Visual C++ 6.0 or higher */ /* for Microsoft Visual C++ 6.0 or higher */
#ifdef _MSC_VER #ifdef _MSC_VER

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.87 May 25 2021 yaps" #define VERSION "1.88 February 22 2022 yaps"
#include <stdio.h> #include <stdio.h>
#ifdef USE_INDEX #ifdef USE_INDEX
#define strchr index #define strchr index