2023.05.30

This commit is contained in:
Seymour Shlien
2023-05-30 09:22:17 -04:00
parent e49858809a
commit afe323d8b7
4 changed files with 56 additions and 6 deletions

View File

@@ -1,2 +1,2 @@
March 15 2023 May 30 2023

View File

@@ -15079,3 +15079,10 @@ February 08 2023
midi2abc, mftext, midistats: modified midifile.c so that it indicates where midi2abc, mftext, midistats: modified midifile.c so that it indicates where
it encounters an unexpected byte in the input midi file. it encounters an unexpected byte in the input midi file.
March 24 2023
More functions for the percussion track was added to midistats.c to
support some future analysis.

View File

@@ -40,9 +40,12 @@ number of occurrences. eg.
-ppatfor n -ppatfor n
where n is the code number of the percussion instrument. Each beat where n is the code number of the percussion instrument. Each beat
is represented by a 4 bit number where the position of the on-bit is represented by a 4 bit number where the position of the on-bit
indicates the time in the beat when the drum onset occurs. Thus indicates the time in the beat when the drum onset occurs. The bits
0 indicates that there was no note onset in that beat, 1 indicates are ordered from left to right (higher order bits to lower order
a note onset in the beginning of the beat, 4 indicates a note onset bits). This is the order of bits that you would expect in a
time series.
Thus 0 indicates that there was no note onset in that beat, 1 indicates
a note onset at the end of the beat, 4 indicates a note onset
in the middle of the beat, and etc. The function returns a string in the middle of the beat, and etc. The function returns a string
of numbers ranging from 0 to 7 indicating the presence of note onsets of numbers ranging from 0 to 7 indicating the presence of note onsets
for the selected percussion instrument for the sequence of beats for the selected percussion instrument for the sequence of beats

View File

@@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/ */
#define VERSION "0.67 March 14 2023 midistats" #define VERSION "0.69 May 27 2023 midistats"
#include <limits.h> #include <limits.h>
/* Microsoft Visual C++ Version 6.0 or higher */ /* Microsoft Visual C++ Version 6.0 or higher */
@@ -77,6 +77,7 @@ int percanalysis;
int percpattern; int percpattern;
int percpatternfor; int percpatternfor;
int percpatternhist; int percpatternhist;
int pitchclassanalysis;
int corestats; int corestats;
int chordthreshold; /* number of maximum number of pulses separating note */ int chordthreshold; /* number of maximum number of pulses separating note */
int beatsPerBar = 4; /* 4/4 time */ int beatsPerBar = 4; /* 4/4 time */
@@ -104,6 +105,7 @@ int percanalysis = 0;
int percpattern = 0; int percpattern = 0;
int percpatternfor = 0; int percpatternfor = 0;
int percpatternhist = 0; int percpatternhist = 0;
int pitchclassanalysis = 0;
int corestats = 0; int corestats = 0;
@@ -982,6 +984,7 @@ for (i = 0; i <lastEvent; i++) {
if (index >= 8000) {printf("index too large in drumpattern\n"); if (index >= 8000) {printf("index too large in drumpattern\n");
break; break;
} }
part = 3 - part; /* order the bits going left to right */
drumpat[index] = drumpat[index] |= 1 << part; drumpat[index] = drumpat[index] |= 1 << part;
} }
} }
@@ -1009,11 +1012,25 @@ for (i = 0; i <lastEvent; i++) {
} }
remainder = onset % division; remainder = onset % division;
part = remainder/quarter; part = remainder/quarter;
part = 3 - part; /* order the bits from left to right */
if (pitch == perc1) drumpat[index] = drumpat[index] |= 1 << part; if (pitch == perc1) drumpat[index] = drumpat[index] |= 1 << part;
else drumpat[index] = drumpat[index] |= 16 * (1 << part); else drumpat[index] = drumpat[index] |= 16 * (1 << part);
} }
} }
void pitchClassAnalysis () {
int i;
int channel;
int pitch;
for (i=0;i<12;i++) pitchclass_activity[i] = 0;
for (i = 0; i < lastEvent; i++) {
channel = midievents[i].channel;
if (channel == 9) continue;
pitch = midievents[i].pitch;
pitchclass_activity[pitch % 12]++;
}
}
void output_perc_pattern (int i) { void output_perc_pattern (int i) {
int left,right; int left,right;
left = i/16; left = i/16;
@@ -1078,6 +1095,17 @@ if (bassmax && snaremax) {
dualDrumPattern(bassindex,snareindex); dualDrumPattern(bassindex,snareindex);
} }
void outputPitchClassHistogram() {
int i;
float activity;
activity = 0;
for (i=0;i<12;i++) activity += (float) pitchclass_activity[i];
for (i=0;i<11;i++) printf("%5.3f,",pitchclass_activity[i]/activity);
printf("%5.3f",pitchclass_activity[11]/activity);
printf("\n");
}
void corestatsOutput() { void corestatsOutput() {
printf("%d\t%d\t%d\n", division,lastEvent,lastBeat); printf("%d\t%d\t%d\n", division,lastEvent,lastBeat);
@@ -1229,6 +1257,12 @@ int argc;
stats = 0; stats = 0;
} }
arg = getarg("-pitchclass",argc,argv);
if (arg != -1) {
pitchclassanalysis = 1;
stats = 0;
}
arg = getarg("-o",argc,argv); arg = getarg("-o",argc,argv);
if ((arg != -1) && (arg < argc)) { if ((arg != -1) && (arg < argc)) {
@@ -1256,6 +1290,7 @@ int argc;
printf(" -ppat\n"); printf(" -ppat\n");
printf(" -ppatfor\n"); printf(" -ppatfor\n");
printf(" -ppathist\n"); printf(" -ppathist\n");
printf(" -pitchclass\n");
printf(" -ver version number\n"); printf(" -ver version number\n");
printf(" -d <number> debug parameter\n"); printf(" -d <number> debug parameter\n");
printf(" The input filename is assumed to be any string not\n"); printf(" The input filename is assumed to be any string not\n");
@@ -1308,6 +1343,10 @@ if (percpatternhist) {
drumPatternHistogram(); drumPatternHistogram();
} }
if (corestats) corestatsOutput(); if (corestats) corestatsOutput();
if (pitchclassanalysis) {
pitchClassAnalysis();
outputPitchClassHistogram();
}
} }
@@ -1322,6 +1361,7 @@ int argc;
arg = process_command_line_arguments(argc,argv); arg = process_command_line_arguments(argc,argv);
if(stats == 1) midistats(argc,argv); if(stats == 1) midistats(argc,argv);
if(pulseanalysis || corestats || percanalysis ||\ if(pulseanalysis || corestats || percanalysis ||\
percpatternfor || percpattern || percpatternhist) loadEvents(); percpatternfor || percpattern || percpatternhist ||\
pitchclassanalysis) loadEvents();
return 0; return 0;
} }