Compare commits

..

3 Commits

Author SHA1 Message Date
Seymour Shlien
538896e1b9 2021.05.21 2021-05-23 10:03:30 -04:00
Seymour Shlien
dcfa5cc7ad 2021.05.19 2021-05-19 09:46:57 -04:00
Seymour Shlien
96570dbb2d 2021.05.10 2021-05-12 10:57:42 -04:00
5 changed files with 114 additions and 40 deletions

View File

@@ -1,2 +1,2 @@
2021 May 09 2021
2021 May 23 2021

View File

@@ -14172,3 +14172,71 @@ to 1 when parseline() encounters "%%beginps" and is reset to 0
when %%endps" is encountered. If ignore_line is 1, the rest of
the code in parseline() is ignored when abc2midi is running.
May 10 2020
abc2midi: the following file causes a core dump.
X:1
T:Autumn Ale
C:Chance Thomas, Stephen DiGregorio, Geoff Scott and/or Brad Spear
R:Jig
S:The Lord of the Rings Online Soundtrack
O:Turbine's Middle Earth
Z:Northman
N:This is not intended for percussion instruments.
Q:333
M:6/8
L:1/8
K:D
AGA BA/3B/3A/3G | FE/3F/3E/3D EFG |
abc2midi notpowerof2.abc
4.53 May 09 2021 abc2midi
Error in line-char 13-5 : 3 b is not a power of 2
Error in line-char 13-8 : 3 b is not a power of 2
Floating point exception (core dumped)
Analysis: the crash occurs in the function reduce (0)
which cannot handle a division by zero. The function
check_power_of_two(3) in parseabc.c returns 0 when the
argument is not a power of 2. Fix: changed the return
to -1. The program does not crash but the midi file
is not created correctly.
May 19 2020
abc2midi: the following file causes abc2midi to hang.
X:1
T: Hangs abc2midi
L:1/4
K:C
2c/2fac'/c'/c'/c'/c'///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
James Allwright intoduced a fix in readlen() in parseabc.c
May 22 2021
abc2midi: treble-8 not applied in K: or V: commands after October 19 2020
update. For example,
X:1
T: transposition
L:1/2
M:C
K:none clef=treble-8
V:1
cz
V:2
zc
The note c should be played with midi pitch 60 instead of 72.
James Allwright made minor fixes to parseabc.c and store.c, in order
to get these options working again.

View File

@@ -1,7 +1,7 @@
abcMIDI : abc <-> MIDI conversion utilities
midi2abc version 3.47 November 01 2020
abc2midi version 4.53 May 08 2021
abc2midi version 4.56 May 21 2021
abc2abc version 2.13 May 08 2021
yaps version 1.86 December 10 2020
abcmatch version 1.78 March 27 2021

View File

@@ -420,7 +420,7 @@ int check_power_of_two(int denom)
if (t % 2 != 0) {
snprintf(error_message, 80, "%d b is not a power of 2", denom);
event_error (error_message);
return 0;
return -1;
} else {
t = t / 2;
}
@@ -543,37 +543,37 @@ void readsig (char **sig, timesig_details_t *timesig)
}
}
void
readlen (a, b, p)
int *a, *b;
char **p;
void readlen (int *a, int *b, char **p)
/* read length part of a note and advance character pointer */
{
int t;
*a = readnump (p);
if (*a == 0)
{
*a = 1;
};
if (*a == 0) {
*a = 1;
}
*b = 1;
if (**p == '/')
{
*p = *p + 1;
*b = readnump (p);
if (*b == 0)
{
*b = 2;
while (**p == '/')
{
*b = *b * 2;
*p = *p + 1;
};
};
};
if (**p == '/') {
*p = *p + 1;
*b = readnump (p);
if (*b == 0) {
*b = 2;
/* [JA] 2021-05-19 prevent infinite loop */
/* limit the number of '/'s we support */
while ((**p == '/') && (*b < 1024)) {
*b = *b * 2;
*p = *p + 1;
}
if (*b >= 1024) {
event_warning ("Exceeded maximum note denominator");
}
}
}
*b = check_power_of_two(*b);
}
/* [JA] 2020-12-10 */
static void read_L_unitlen(int *num, int *denom, char **place)
{
@@ -1261,7 +1261,17 @@ static void process_microtones (int *parsed, char word[],
modmicrotone[j].denom = b;
/* printf("%c microtone = %d/%d\n",modmap[j],modmicrotone[j].num,modmicrotone[j].denom); */
}
} /* finished ^ = _ */
} /* finished ^ = _ */
static void set_voice_from_master(int voice_num)
{
voice_context_t *current_voice;
current_voice = &voicecode[voice_num - 1];
copy_timesig(&current_voice->timesig, &master_timesig);
copy_clef(&current_voice->clef, &master_clef);
current_voice->unitlen = master_unitlen;
}
int
parsekey (str)
@@ -1345,7 +1355,7 @@ parsekey (str)
while (*s != '\0')
{
parsed = parseclef (&s, word, &gotclef, clefstr, &newclef, &cgotoctave, &coctave);
if (gotclef) {
if (parsed) { /* [JA] 2021-05-21 changed (gotclef) to (parsed) */
/* make clef an attribute of current voice */
if (inhead) {
copy_clef (&master_clef, &newclef);
@@ -1550,16 +1560,6 @@ parsekey (str)
return (gotkey);
}
static void set_voice_from_master(int voice_num)
{
voice_context_t *current_voice;
current_voice = &voicecode[voice_num - 1];
copy_timesig(&current_voice->timesig, &master_timesig);
copy_clef(&current_voice->clef, &master_clef);
current_voice->unitlen = master_unitlen;
}
void
parsevoice (s)
char *s;
@@ -2306,10 +2306,12 @@ parsefield (key, field)
* if L: fields was missing in the header.
*/
resolve_unitlen();
}
foundkey = parsekey (place); /* [JA] 2021.05.21 parsekey called before set_voice_from_master(1) */
if (inhead) {
/* set voice parameters using values from header */
set_voice_from_master(1);
}
foundkey = parsekey (place);
if (inhead || inbody) {
if (foundkey)
{

View File

@@ -186,7 +186,7 @@ int main()
*/
#define VERSION "4.53 May 09 2021 abc2midi"
#define VERSION "4.56 May 21 2021 abc2midi"
/* enables reading V: indication in header */
#define XTEN1 1
@@ -4300,7 +4300,11 @@ int xoctave, n, m;
event_fatal_error("Internal error - no voice allocated");
};
if (gracenotes && ignore_gracenotes) return; /* [SS] 2010-01-08 */
octave = xoctave + v->octaveshift;
if (v->octaveshift == 0) { /* [JA] 2021-05-21 */
octave = xoctave + clef->octave_offset;
} else {
octave = xoctave + v->octaveshift;
}
num = n;
denom = m;
if (v->inchord) v->chordcount = v->chordcount + 1;