Compare commits

..

5 Commits

Author SHA1 Message Date
sshlien
e42463f39f 2025.01.30 2025-01-30 13:20:03 -05:00
sshlien
a67babdb21 2025.01.29 2025-01-29 16:43:42 -05:00
sshlien
abf7e15301 2025.01.22 2025-01-22 08:14:45 -05:00
sshlien
7c7ef4c2c6 2025.01.20 2025-01-20 13:40:30 -05:00
sshlien
c85053c4db 2025.01.12 2025-01-12 12:39:05 -05:00
8 changed files with 145 additions and 35 deletions

View File

@@ -1 +1 @@
January 07 2025
January 30 2025

View File

@@ -15557,3 +15557,34 @@ In addition event_key was not receiving negative fractional microtones.
The problem was traced to a missing check in process_microtones()
in parseabc.c
January 12 2025
abc2midi ignores non-microtone accidentals. In the following example,
X:1
T: Non microtone accidentals
L:1/8
Q:1/4=60
M:8/8
%%MIDI temperamentequal 36
K:C
EF^FG^Gc^cd|
The accidentals in front of F, G, and c were
ignored.
Fix: in pitchof_b, for TEMPERLN or TEMPEREQ respect accidentals
occurring outside of microtones.
January 20 2025
January 22 2025
midi2abc
Added new options -midinotes and -midinotes-brief for listing the
notes (including pitchbends) present in the midi file. This is
useful for checking the accuracy of abc2midi or the abc notation
representation.

View File

@@ -1,4 +1,4 @@
.TH MIDI2ABC 1 "1 January 2017"
.TH MIDI2ABC 1 "20 January 2025"
.SH NAME
\fBmidi2abc\fP \- program to convert MIDI format files to abc notation
.SH SYNOPSIS
@@ -9,7 +9,8 @@ midi2abc \-f \fIinfile\fP [\-xa] [\-ga]
[\-k \fIkey\fP] [\-c \fIchannel\fP] [\-obpl] [\-bpl \fibars\fP] [\-bps \fPbars\fP]
[\-o \fIfilename\fP] [\-s] [\-sr \fiunits\fP] [\-sum] [\-nb] [\-nt]
[\-splitvoices] [\-midigram] [\-mftext] [-mftextpulses] [\-nogr] [\-title \fistring\fP]
[\-origin \fistring\fP]
[\-origin \fistring\fP][\-midinotes][\-midinotes-brief]
@@ -172,6 +173,19 @@ the given string.
.B -origin \fistring\fP
Adds an O: field with the given string.
.TP
.B -midinotes
Like -mftext, this option outputs the notes present in the
midi file; however, the output is more consise (note-on and
noteoff are combined) in order to make it easier to compare
one or more midi files using dif, diffuse, or winmerge.
The time as beat number, track number, channel number, pitch,
and pitch bend are presented.
.TP
.B -midinotes-brief
Similar to -midinotes except only the pitch and pitch bend
values are presented.
.SS FEATURES

View File

@@ -277,13 +277,9 @@ of numbers ranging from 0 to 7 indicating the presence of note onsets
for the selected percussion instrument for the sequence of beats
in the midi file. Here is a truncated sample of the output.
.br
0 0 0 0 0 0 0 0 1 0 0 4 1 0 0 4 1 0 0 4 1 0 0 4 1 0 0 4 1 0 0 4 1 4 4 0
1 0 0 0 1 0 5 0 1 0 5 0 1 0 5 0 1 0 5 0 1 0 5 0 1 0 5 0 1 0 5 0 1 0 0 0
1 0 5 0 1 0 5 0 1 etc.
11 71 c1 1 11 51 f1 c1 1 11 51 e1 1 11 d1 c1 31 1 1 1 21 b1 d1 d1 51
.br
One can see a repeating 4 beat pattern.
51 51 51 51 41 71 c1 11 1 11 41 11 1 11 41 11 1 11 41 11 31 51 41 11
.PP
-ppat
@@ -294,14 +290,12 @@ If it is unsuccessful, it returns a message of its failue. Otherwise,
encodes the position of these drum onsets in a 8 bit byte for each
quarter note beat in the midi file. The lower (right) 4 bits encode the
bass drum and the higher (left) 4 bits encode the snare drum in the
same manner as described above for -ppatfor.
same manner as described above for -ppatfor. The integers are printed
in hexadecimal.
.br
0 0 0 0 0 0 0 0 0 0 33 145 33 145 33 145 33 145 33 145 33 145 33 145
02 88 20 02 a0 08 80 02 82 08 80 02 82 08 80 02 82 08 80 02 82 08
.br
33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145
.br
33 145 33 145 33 145 33 145 33 145 33 and etc.
80 02 82 08 80 02 82 08 80 02 82 08 20 a0 0a 08 80 02 82 08 80 02
.PP
-ppathist

View File

@@ -1,12 +1,12 @@
abcMIDI : abc <-> MIDI conversion utilities
midi2abc version 3.59 February 08 2023
abc2midi version 4.98 January 07 2025
midi2abc version 3.61 January 22 2025
abc2midi version 4.99 January 12 2025
abc2abc version 2.22 April 30 2024
yaps version 1.94 April 30 2024
abcmatch version 1.83 February 19 2024
midicopy version 1.40 August 11 2024
midistats version 0.96 July 26 2024
midistats version 0.98 January 30 2025
24th January 2002
Copyright James Allwright

View File

@@ -45,7 +45,7 @@
* based on public domain 'midifilelib' package.
*/
#define VERSION "3.59 February 08 2023 midi2abc"
#define VERSION "3.61 January 22 2025 midi2abc"
#include <limits.h>
/* Microsoft Visual C++ Version 6.0 or higher */
@@ -229,6 +229,7 @@ struct dlistx {
int notechan[2048],notechanvol[2048]; /*for linking on and off midi
channel commands */
int chanbend[17]; /* pitchbend for each channel */
int last_tick[17]; /* for getting last pulse number in MIDI file */
int last_on_tick[17]; /* for detecting chords [SS] 2019-08-02 */
@@ -668,6 +669,9 @@ int chan, control, value;
void txt_pitchbend(chan,lsb,msb)
int chan, msb, lsb;
{
int pitchbend;
pitchbend = (msb*128 + lsb);
chanbend[chan+1] = pitchbend;
}
void txt_program(chan,program)
@@ -942,6 +946,28 @@ if (start_time >= 0)
}
void print_txt_noteoff_and_bends(chan, pitch, vol)
int chan, pitch, vol;
/* substitutes pitchbend for volume */
{
int start_time,initvol;
start_time = close_note(chan, pitch, &initvol);
if (start_time >= 0)
/*
printf("%8.4f %8.4f %d %d %d %d\n",
(double) start_time/(double) division,
(double) Mf_currtime/(double) division,
trackno+1, chan+1, pitch,initvol);
*/
/* printf("%6.2f %6.2f %d %d %d %d\n",
(double) start_time/(double) division, (double) Mf_currtime/(double) division, trackno+1, chan +1, pitch,chanbend[chan+1]);
*/
if (midiprint == 3) printf("%6.2f %d %d %d %d\n",
(double) start_time/(double) division, trackno+1, chan +1, pitch,chanbend[chan+1]);
else printf("%d %d\n", pitch,chanbend[chan+1]);
if(Mf_currtime > last_tick[chan+1]) last_tick[chan+1] = Mf_currtime;
}
/* In order to associate a channel note off message with its
* corresponding note on message, we maintain the information
@@ -958,6 +984,11 @@ void init_notechan()
for (i = 0; i < 2048; i++) notechan[i] = -1;
}
void init_chanbend()
{
int i;
for (i= 0; i < 17; i++) chanbend[i] = 8192;
}
/* The next two functions update notechan when a channel note on
or note off is encountered. The second function close_note,
@@ -1379,7 +1410,7 @@ void initfunc_for_midinotes()
Mf_noteoff = print_txt_noteoff;
Mf_pressure = no_op3;
Mf_parameter = no_op3;
Mf_pitchbend = no_op3;
Mf_pitchbend = txt_pitchbend;
Mf_program = print_txt_program;
Mf_chanpressure = no_op3;
Mf_sysex = no_op2;
@@ -1395,6 +1426,13 @@ void initfunc_for_midinotes()
Mf_arbitrary = no_op2;
}
void initfunc_for_midipitch()
{
initfunc_for_midinotes();
Mf_noteoff = print_txt_noteoff_and_bends;
}
void initfunc_for_mftext()
{
@@ -3197,6 +3235,16 @@ int argc;
{
midiprint = 1;
}
arg = getarg("-midinotes",argc,argv);
if (arg != -1)
{
midiprint = 3;
}
arg = getarg("-midinotes-brief",argc,argv);
if (arg != -1)
{
midiprint = 4;
}
usesplits = 0;
@@ -3433,7 +3481,9 @@ int argc;
printf(" -splitvoices splits voices to avoid nonhomophonic chords\n");
printf(" -title <string> Pastes title following\n");
printf(" -origin <string> Adds O: field containing string\n");
printf(" -midigram Prints midigram instead of abc file\n");
printf(" -midigram Prints midigram \n");
printf(" -midinotes Prints pitches with bends\n");
printf(" -midinotes-brief Prints only pitches and bends\n");
printf(" -mftext mftext output in beats\n");
printf(" -mftextpulses mftext output in midi pulses\n");
printf(" -mftext mftext output in seconds\n");
@@ -3463,6 +3513,7 @@ int j;
int ten,ninety;
int argc;
printf("calling midi2abc\n");
/* initialization */
trackno = 0;
@@ -3657,8 +3708,8 @@ int argc;
{
int i;
int verylasttick;
initfunc_for_midinotes();
init_notechan();
init_chanbend();
for (i=0;i<17;i++) {last_tick[i]=0;}
/*F = efopen(argv[argc -1],"rb");*/
Mf_getc = filegetc;
@@ -3694,8 +3745,23 @@ int argc;
int arg;
arg = process_command_line_arguments(argc,argv);
if(midiprint ==1) { midigram(argc,argv);
} else if(midiprint ==2) { mftext(argc,argv);
} else midi2abc(argc,argv);
switch (midiprint) {
case 1: initfunc_for_midinotes();
midigram(argc,argv);
break;
case 2: mftext(argc,argv);
break;
case 3: initfunc_for_midinotes();
initfunc_for_midipitch();
midigram(argc,argv);
break;
case 4: initfunc_for_midinotes();
initfunc_for_midipitch();
midigram(argc,argv);
break;
default:
midi2abc(argc,argv);
}
return 0;
}

View File

@@ -17,7 +17,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define VERSION "0.96 October 10 2024 midistats"
#define VERSION "0.98 January 30 2025 midistats"
/* midistrats.c is a descendent of midi2abc.c which was becoming to
large. The object of the program is to extract statistical characterisitic
@@ -1513,9 +1513,9 @@ for (i=1;i<256;i++) {
}
void output_drumpat () {
void output_drumpat (char * c) {
int i;
for (i=0;i<=lastBeat;i++) printf("%d ",drumpat[i]);
for (i=0;i<=lastBeat;i++) printf(c,drumpat[i]);
/*for (i=0;i<lastBeat;i++) output_perc_pattern(drumpat[i]);*/
printf("\n");
}
@@ -1654,11 +1654,11 @@ for (i=0;i<4;i++) {
snaremax = drumhistogram[snareindex];
}
}
if (bassmax && snaremax) {
if (bassmax || snaremax) {
printf("bass %d %d\n",bassindex,bassmax);
printf("snare %d %d\n",snareindex,snaremax);
} else {
printf("missing bass or snare\n");
printf("missing bass and snare\n");
return;
}
dualDrumPattern(bassindex,snareindex);
@@ -1944,11 +1944,11 @@ if (percanalysis) {
if (percpattern) {
drumanalysis();
percsummary();
output_drumpat();
output_drumpat("%02x ");
}
if (percpatternfor) {
drumpattern(percnum);
output_drumpat();
output_drumpat("%d ");
}
if (percpatternhist) {
drumanalysis();

11
store.c
View File

@@ -186,7 +186,7 @@ int main()
*/
#define VERSION "4.98 January 07 2025 abc2midi"
#define VERSION "4.99 January 12 2025 abc2midi"
/* enables reading V: indication in header */
#define XTEN1 1
@@ -3723,7 +3723,9 @@ int *pitchbend;
fifth_size,
(3*fifth_size-octave_size),
(5*fifth_size-2*octave_size) };
/* in units cents [SS] 2020-07-17 */
/* contains the pitches of c,d,etc in cent units after accounting
for fifth_size and octave_size
*/
static const char *anoctave = "cdefgab";
acc = accidental;
@@ -3731,7 +3733,6 @@ int *pitchbend;
noteno = (int)note - 'a';
/* [SS] 2015-08-18 */
if (acc == ' ' && !microtone) { /* no accidentals, apply current state */
acc = v->workmap[noteno][octave+4];
@@ -3774,6 +3775,10 @@ int *pitchbend;
if ((temperament==TEMPERLN) || (temperament==TEMPEREQ)) {
pitchvalue = tscale[p]/100.0; /* cents to semitones */
/* respect accidentals when they do not occur in a microtone */
if (acc == '^' && !microtone) pitchvalue = pitchvalue + (float) mul; /* [SS] 2025-01-12 */
if (acc == '_' && !microtone) pitchvalue = pitchvalue - (float) mul;
/* printf("note = %c accidental = %c mul = %d p = %d pitchvalue = %f\n",note,accidental,mul,p,pitchvalue); */
pitchvalue = pitchvalue + octave*octave_size/100.0 + middle_c;