From eac28d948960f10d6f7eb73034bd1dfb14d1c2f1 Mon Sep 17 00:00:00 2001 From: sshlien Date: Fri, 9 Feb 2024 16:24:21 -0500 Subject: [PATCH] 2024-02-09 --- midistats.c | 77 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/midistats.c b/midistats.c index 1e252cc..6c3765b 100644 --- a/midistats.c +++ b/midistats.c @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#define VERSION "0.86 February 04 2024 midistats" +#define VERSION "0.87 February 09 2024 midistats" /* midistrats.c is a descendent of midi2abc.c which was becoming to large. The object of the program is to extract statistical characterisitic @@ -69,6 +69,8 @@ void stats_noteoff(int chan,int pitch,int vol); void stats_eot (); void keymatch(); void outputNoteMemory(); +void clearTrackNm (); + #define max(a,b) (( a > b ? a : b)) #define min(a,b) (( a < b ? a : b)) @@ -195,6 +197,17 @@ struct trkstat { * npulses is the number of pulses. */ +struct notememory {int eighthUnit; + int nowPitch; + int beforePitch; + int previousPitch; + int zeroCount; + int stepCount; + int jumpCount; + } nm[17]; + +struct notememory tracknm; + int progcolor[17]; /* used by stats_program */ int drumhistogram[100]; /* counts drum noteons */ int pitchhistogram[12]; /* pitch distribution for non drum notes */ @@ -707,6 +720,7 @@ for (i=1;i<17;i++) { printf("\n"); channel2nnotes[i] += trkdata.notecount[i] + trkdata.chordcount[i]; + if (lasttrack > 1) printf("nzeros = %d nsteps = %d njumps = %d\n",tracknm.zeroCount,tracknm.stepCount,tracknm.jumpCount); } } @@ -717,6 +731,7 @@ void stats_trackstart() { int i; tracknum++; + clearTrackNm (); for (i=0;i<17;i++) { trkdata.notecount[i] = 0; trkdata.notemeanpitch[i] = 0; @@ -752,15 +767,6 @@ void stats_trackend() output_track_summary(); } -struct notememory {int eighthUnit; - int nowPitch; - int beforePitch; - int previousPitch; - int zeroCount; - int stepCount; - int jumpCount; - } nm[17]; - void clearNotememory () { int i; @@ -774,6 +780,16 @@ void clearNotememory () { nm[i].jumpCount = 0; } } + +void clearTrackNm () { + tracknm.eighthUnit = 0; + tracknm.nowPitch = 0; + tracknm.beforePitch = 0; + tracknm.previousPitch = 0; + tracknm.zeroCount = 0; + tracknm.stepCount = 0; + tracknm.jumpCount = 0; +} void updateNotememory (int unit, int chn, int pitch) { int deltaPitch; @@ -801,6 +817,34 @@ nm[chn].eighthUnit = unit; } +void updateTrackNotememory (int unit, int chn, int pitch) { +int deltaPitch; +if (chn == 9) return; +if (unit == tracknm.eighthUnit) { + if (pitch > tracknm.nowPitch) tracknm.nowPitch = pitch; + return; + } +/* unit is different */ +tracknm.beforePitch = tracknm.nowPitch; +tracknm.nowPitch = pitch; +if (tracknm.previousPitch > 0) + { + deltaPitch = tracknm.beforePitch - tracknm.previousPitch; + if (deltaPitch < 0) deltaPitch = -deltaPitch; + if (deltaPitch == 0) tracknm.zeroCount++; + else if (deltaPitch < 4) tracknm.stepCount++; + else tracknm.jumpCount++; + } +if (tracknm.beforePitch != 0) tracknm.previousPitch = tracknm.beforePitch; +tracknm.eighthUnit = unit; +/*printf("%d, %d, %d, %d, %d, %d %d\n",unit,nm[chn].beforePitch,nm[chn].previousPitch,\ + deltaPitch,nm[chn].zeroCount,nm[chn].stepCount,nm[chn].jumpCount); +*/ + +} + + + void stats_noteon(chan,pitch,vol) @@ -864,6 +908,7 @@ int chan, pitch, vol; eigthunit = Mf_currtime/halfdivision; updateNotememory (eigthunit, chan, pitch); + updateTrackNotememory (eigthunit, chan, pitch); } @@ -1377,8 +1422,18 @@ int i; for (i=0;i<17;i++) { if (i == 9) continue; if ((nm[i].zeroCount + nm[i].stepCount+nm[i].jumpCount) == 0) continue; - printf("pmove: %d %d %d %d\n",i+1,nm[i].zeroCount,nm[i].stepCount,nm[i].jumpCount); + printf("nzeros: "); + for(i=0;i<16;i++) printf(" %d",nm[i].zeroCount); + printf("\nnsteps: "); + for(i=0;i<16;i++) printf(" %d",nm[i].stepCount); + printf("\nnjumps: "); + for(i=0;i<16;i++) printf(" %d",nm[i].jumpCount); + printf("\n"); } + + +/* printf("pmove: %d %d %d %d\n",i+1,nm[i].zeroCount,nm[i].stepCount,nm[i].jumpCount); + }*/ } void dualDrumPattern (int perc1, int perc2) {