Compare commits

..

2 Commits

Author SHA1 Message Date
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
5 changed files with 57 additions and 5 deletions

View File

@@ -1,2 +1,2 @@
2021 January 13 2022
2022 January 27 2022

View File

@@ -14567,3 +14567,26 @@ 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 |

View File

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

View File

@@ -1420,8 +1420,6 @@ static void midi_re_tune (int channel) {
this is done.
*/
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
the following two control commands.
control 101 0
@@ -1444,6 +1442,29 @@ data[1] = (char) (bend & 0x7f); /* least significant bits */
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 */
@@ -2100,6 +2121,14 @@ int noteson;
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) {
skipspace(&p);

View File

@@ -186,7 +186,7 @@ int main()
*/
#define VERSION "4.65 January 13 2022 abc2midi"
#define VERSION "4.66 January 27 2022 abc2midi"
/* enables reading V: indication in header */
#define XTEN1 1