From 8d5df5659606eb6e58ceb1be5d8159bf95206ec1 Mon Sep 17 00:00:00 2001 From: sshlien Date: Tue, 7 Jan 2025 13:06:04 -0500 Subject: [PATCH] 2025.01.07 --- VERSION | 2 +- doc/CHANGES | 31 +++++++++++++++++++++++++++++++ doc/readme.txt | 2 +- parseabc.c | 3 ++- store.c | 48 ++++++++++++++++++++---------------------------- 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/VERSION b/VERSION index e66a5ed..0e326b2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -January 04 2025 +January 07 2025 diff --git a/doc/CHANGES b/doc/CHANGES index 1039a3a..dd9ff6a 100644 --- a/doc/CHANGES +++ b/doc/CHANGES @@ -15526,3 +15526,34 @@ is called before event_note. It is hard to determine what is going on. Many people have worked on this code. +January 07 2025 + +abc2midi: works correctly with microtone shortcuts but does not +handle the fraction expression of microtones. eg. + +X:1 +T: equaltempered 53 +M: 4/4 +L: 1/4 +%%MIDI temperamentequal 53 +K: none +C ^12/53C ^24/53C ^36/53C |^48/53C _48/53D _36/53D _24/53D |_12/53D =D ^12/53D ^24/53D| ^36/53D ^48/53D _48/53E _36/53E | +_24/53E _12/53E =E ^12/53E | ^24/53E ^36/53E F ^12/53F| ^24/53F ^36/53F ^48/53F _48/53G| _36/53G _24/53G _12/53G =G | +^12/53G ^24/53G ^36/53G ^48/53G| _48/53A _36/53A _24/53A _12/53A | A ^12/53A ^24/53A ^36/53A| ^48/53A _48/53B _36/53B _24/53B| +_12/53B =B ^12/53B ^24/53B _12/53c| + +Fix: there were numerous minor fixes to ensure that the variable +setmicrotone.denom is initialized to 1 rather than 0 (to avoid division +by 0). New code was inserted in pitchof_b() in store.c. + if (microtone) { + /* [SS] 2025-01-03 2025-01-06*/ + if (setmicrotone.denom == 1) + /* microtone shortcut (eg _1B,) */ + microtoneshift = setmicrotone.num * microstep_size/100.0; + else + /* microtone fraction (eg _12/53B,) */ + microtoneshift = (float) setmicrotone.num /(float) setmicrotone.denom; +In addition event_key was not receiving negative fractional microtones. +The problem was traced to a missing check in process_microtones() +in parseabc.c + diff --git a/doc/readme.txt b/doc/readme.txt index 48d0262..89278c3 100644 --- a/doc/readme.txt +++ b/doc/readme.txt @@ -1,7 +1,7 @@ abcMIDI : abc <-> MIDI conversion utilities midi2abc version 3.59 February 08 2023 -abc2midi version 4.96 December 16 2024 +abc2midi version 4.98 January 07 2025 abc2abc version 2.22 April 30 2024 yaps version 1.94 April 30 2024 abcmatch version 1.83 February 19 2024 diff --git a/parseabc.c b/parseabc.c index 0d15e11..46d7faf 100755 --- a/parseabc.c +++ b/parseabc.c @@ -674,7 +674,7 @@ ismicrotone (p, dir) return 1; } setmicrotone.num = 0; - setmicrotone.denom = 0; + setmicrotone.denom = 1; return 0; } @@ -1347,6 +1347,7 @@ static void process_microtones (int *parsed, char word[], if (j > 7) { j = (int) c - 'a'; } + if (word[0] == '_') a = -a; /* [SS] 2025-01-07 */ if (j > 7 || j < 0) { event_error ("Not a valid microtone"); return; diff --git a/store.c b/store.c index 718965c..5c57588 100755 --- a/store.c +++ b/store.c @@ -186,7 +186,7 @@ int main() */ -#define VERSION "4.97 January 03 2025 abc2midi" +#define VERSION "4.98 January 07 2025 abc2midi" /* enables reading V: indication in header */ #define XTEN1 1 @@ -3746,9 +3746,7 @@ int *pitchbend; */ if(a != 0) { - /* [SS] 2025-01-03 */ - //printf("calling event_microtone from pitchof_b\n"); - event_microtone(1,a,b); + event_microtone(1,a,b); /* [SS] 2025-01-03 */ } } else { /* some accidentals save the state if propagate_accs != 0 */ if (propagate_accs) { @@ -3782,28 +3780,23 @@ int *pitchbend; /* [HL] 2020-06-27 Adjust for A=440.0 with zero pitchbend */ pitchvalue += 9.0 - (3.0*fifth_size-octave_size)/100.0; - /* [HL] 2015-05-15 */ + /* [HL] 2015-05-15 2025-01-06*/ if (microtone) { - if (setmicrotone.denom == 100) /* microtone in cents */ - pitchvalue+= setmicrotone.num / 100.0; /* [HL] 2020-07-28 */ - else if (setmicrotone.denom == 0) { /* [HL] 2020-06-20 / 2020-06-27 */ - /* microstep_size is accidental_size for temperamentlinear, - * or - * microstep_size is the octave fraction for temperamentequal - * */ - /* [SS] 2025-01-03 */ - microtoneshift = setmicrotone.num * microstep_size/100.0; - pitchvalue += microtoneshift; + /* [SS] 2025-01-03 2025-01-06*/ + if (setmicrotone.denom == 1) + /* microtone shortcut (eg _1B,) */ + microtoneshift = setmicrotone.num * microstep_size/100.0; + else + /* microtone fraction (eg _12/53B,) */ + microtoneshift = (float) setmicrotone.num /(float) setmicrotone.denom; + /* printf("microtoneshift = %f for setmicrotone %d %d\n",microtoneshift, setmicrotone.num,setmicrotone.denom); */ + pitchvalue += microtoneshift; } - else /* microtone relative to sharp step in the current temperament */ - pitchvalue += (((float)setmicrotone.num) / ((float)setmicrotone.denom)) * accidental_size; /* [HL] 2020-07-28 */ - - /* needed? */ microtone = 0; - setmicrotone.num = setmicrotone.denom = 0; + setmicrotone.num = 0; + setmicrotone.denom = 1; /* [SS] 2025-01-06 */ active_pitchbend = 8192; - } pitch = (int) (pitchvalue + 0.5); bend = (int) (0.5 + 8192.0 + 4096.0 * (pitchvalue - (float) pitch)); @@ -3822,13 +3815,14 @@ int *pitchbend; if (!microtone) *pitchbend = bend; /* don't override microtone */ /* if (comma53) [SDG] 2020-06-03 ambiguous statement * should the following lines be included in if statement? */ -#ifdef MAKAM +/*#ifdef MAKAM if (comma53) fprintf(fc53,"%c%d ",note,octave+4); #endif +*/ if (comma53) convert_to_comma53 (acc, &pitch, pitchbend); microtone = 0; /* [SS] 2014-01-25 */ setmicrotone.num = 0; /* [SS] 2014-01-25 */ - setmicrotone.denom = 0; + setmicrotone.denom = 1; /* [SS] 2025-01-06 */ return pitch; } @@ -4342,10 +4336,6 @@ int xoctave, n, m; if (v->drumchannel) pitch = barepitch(note,accidental,mult,octave); /* [SS] 2015-08-18 */ pitch = pitchof_b(note, accidental, mult, octave, propagate_accidentals,&active_pitchbend); -/*#ifndef MAKAM - pitch_noacc = pitchof_b(note, 0, 0, octave, 0,&dummy); -#endif -*/ if (decorators[FERMATA] && !ignore_fermata) { if(fermata_fixed) addfract(&num,&denom,1,1); else num = num*2; @@ -4455,7 +4445,7 @@ setmicrotone.denom = b; if (a == 0) {bend = 8192; /* [SS] 2014-01-19 */ microtone = 0; /* [SS] 2014-01-20 */ setmicrotone.num = 0; /* [SS] 2014-01-25 */ - setmicrotone.denom = 0; + setmicrotone.denom = 1; /* [SS] 2025-01-06 */ return; } else { @@ -4464,6 +4454,8 @@ else { } active_pitchbend = bend; microtone=1; +if (b == 0) setmicrotone.denom = 1; /* [SS] 2025-01-06 */ +return; }