mirror of
https://github.com/sshlien/abcmidi.git
synced 2025-12-16 08:31:02 +00:00
Compare commits
1 Commits
2022.08.01
...
2022.08.24
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3562b0c92 |
@@ -14853,3 +14853,7 @@ Fixed the abc parser so it does not report a malformed note
|
|||||||
when it encounters a dotted bar line .| -- (in parsemusic() in parseabc.c).
|
when it encounters a dotted bar line .| -- (in parsemusic() in parseabc.c).
|
||||||
The dotted bar line is treated as a regular bar line.
|
The dotted bar line is treated as a regular bar line.
|
||||||
|
|
||||||
|
August 23 2022
|
||||||
|
|
||||||
|
midi2abc -midistats introducing channel spread.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
abcMIDI : abc <-> MIDI conversion utilities
|
abcMIDI : abc <-> MIDI conversion utilities
|
||||||
|
|
||||||
midi2abc version 3.54 April 28 2022
|
midi2abc version 3.56 August 24 2022
|
||||||
abc2midi version 4.76 August 01 2022
|
abc2midi version 4.76 August 01 2022
|
||||||
abc2abc version 2.18 June 14 2022
|
abc2abc version 2.18 June 14 2022
|
||||||
yaps version 1.90 June 14 2022
|
yaps version 1.90 June 14 2022
|
||||||
|
|||||||
35
midi2abc.c
35
midi2abc.c
@@ -45,7 +45,7 @@
|
|||||||
* based on public domain 'midifilelib' package.
|
* based on public domain 'midifilelib' package.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define VERSION "3.54 April 28 2022 midi2abc"
|
#define VERSION "3.56 August 24 2022 midi2abc"
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
/* Microsoft Visual C++ Version 6.0 or higher */
|
/* Microsoft Visual C++ Version 6.0 or higher */
|
||||||
@@ -97,6 +97,7 @@ static FILE *outhandle; /* for producing the abc file */
|
|||||||
|
|
||||||
int tracknum=0; /* track number */
|
int tracknum=0; /* track number */
|
||||||
int division; /* pulses per quarter note defined in MIDI header */
|
int division; /* pulses per quarter note defined in MIDI header */
|
||||||
|
int quietLimit; /* minumum number of pulses with no activity */
|
||||||
long tempo = 500000; /* the default tempo is 120 quarter notes/minute */
|
long tempo = 500000; /* the default tempo is 120 quarter notes/minute */
|
||||||
int unitlen; /* abc unit length usually defined in L: field */
|
int unitlen; /* abc unit length usually defined in L: field */
|
||||||
int header_unitlen; /* first unitlen set */
|
int header_unitlen; /* first unitlen set */
|
||||||
@@ -265,6 +266,8 @@ struct trkstat {
|
|||||||
int program[17];
|
int program[17];
|
||||||
int tempo[17];
|
int tempo[17];
|
||||||
int npulses[17];
|
int npulses[17];
|
||||||
|
int lastNoteOff[17];
|
||||||
|
int quietTime[17];
|
||||||
} trkdata;
|
} trkdata;
|
||||||
|
|
||||||
/* The trkstat references the individual channels in the midi file.
|
/* The trkstat references the individual channels in the midi file.
|
||||||
@@ -1141,6 +1144,7 @@ void stats_header (int format, int ntrks, int ldivision)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
division = ldivision;
|
division = ldivision;
|
||||||
|
quietLimit = ldivision*8;
|
||||||
printf("ntrks %d\n",ntrks);
|
printf("ntrks %d\n",ntrks);
|
||||||
printf("ppqn %d\n",ldivision);
|
printf("ppqn %d\n",ldivision);
|
||||||
chordthreshold = ldivision/16; /* [SS] 2018-01-21 */
|
chordthreshold = ldivision/16; /* [SS] 2018-01-21 */
|
||||||
@@ -1152,6 +1156,7 @@ void stats_header (int format, int ntrks, int ldivision)
|
|||||||
trkdata.pitchbend[i] = 0;
|
trkdata.pitchbend[i] = 0;
|
||||||
trkdata.cntlparam[i] = 0; /* [SS] 2022-03-04 */
|
trkdata.cntlparam[i] = 0; /* [SS] 2022-03-04 */
|
||||||
trkdata.pressure[i] = 0; /* [SS] 2022-03-04 */
|
trkdata.pressure[i] = 0; /* [SS] 2022-03-04 */
|
||||||
|
trkdata.quietTime[i] = 0; /* [SS] 2022-08-22 */
|
||||||
progcolor[i] = 0;
|
progcolor[i] = 0;
|
||||||
channel2prog[i] = -1;
|
channel2prog[i] = -1;
|
||||||
channel2nnotes[i] = 0;
|
channel2nnotes[i] = 0;
|
||||||
@@ -1193,6 +1198,7 @@ void stats_finish()
|
|||||||
int i; /* [SDG] 2020-06-03 */
|
int i; /* [SDG] 2020-06-03 */
|
||||||
int npulses;
|
int npulses;
|
||||||
int nprogs;
|
int nprogs;
|
||||||
|
double delta;
|
||||||
|
|
||||||
npulses = trkdata.npulses[0];
|
npulses = trkdata.npulses[0];
|
||||||
printf("npulses %d\n",trkdata.npulses[0]);
|
printf("npulses %d\n",trkdata.npulses[0]);
|
||||||
@@ -1247,6 +1253,14 @@ if (npulses > 0)
|
|||||||
for (i=1;i<17;i++) printf("%5.2f ",chnactivity[i]/(double) trkdata.npulses[0]);
|
for (i=1;i<17;i++) printf("%5.2f ",chnactivity[i]/(double) trkdata.npulses[0]);
|
||||||
else
|
else
|
||||||
for (i=0;i<17;i++) printf("%5.2f ",(double) chnactivity[i]);
|
for (i=0;i<17;i++) printf("%5.2f ",(double) chnactivity[i]);
|
||||||
|
printf("\nspread ");
|
||||||
|
for (i=1;i<17;i++) {
|
||||||
|
delta = trkdata.npulses[0] - trkdata.quietTime[i];
|
||||||
|
if (trkdata.quietTime[i] < quietLimit) delta = trkdata.npulses[0];
|
||||||
|
delta = delta / (double) trkdata.npulses[0];
|
||||||
|
printf (" %5.3f ", delta);
|
||||||
|
}
|
||||||
|
|
||||||
printf("\npitchentropy %f\n",histogram_entropy(pitchclass_activity,12));
|
printf("\npitchentropy %f\n",histogram_entropy(pitchclass_activity,12));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
@@ -1363,12 +1377,22 @@ int chan, pitch, vol;
|
|||||||
void stats_noteon(chan,pitch,vol)
|
void stats_noteon(chan,pitch,vol)
|
||||||
int chan, pitch, vol;
|
int chan, pitch, vol;
|
||||||
{
|
{
|
||||||
|
int delta;
|
||||||
if (vol == 0) {
|
if (vol == 0) {
|
||||||
/* treat as noteoff */
|
/* treat as noteoff */
|
||||||
stats_noteoff(chan,pitch,vol);
|
stats_noteoff(chan,pitch,vol);
|
||||||
|
trkdata.lastNoteOff[chan+1] = Mf_currtime; /* [SS] 2022.08.22 */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
trkdata.notemeanpitch[chan+1] += pitch;
|
trkdata.notemeanpitch[chan+1] += pitch;
|
||||||
|
if (trkdata.lastNoteOff[chan+1] >= 0) {
|
||||||
|
delta = Mf_currtime - trkdata.lastNoteOff[chan+1];
|
||||||
|
trkdata.lastNoteOff[chan+1] = -1; /* in case of chord */
|
||||||
|
if (delta > quietLimit) {
|
||||||
|
trkdata.quietTime[chan+1] += delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (abs(Mf_currtime - last_on_tick[chan+1]) < chordthreshold) trkdata.chordcount[chan+1]++;
|
if (abs(Mf_currtime - last_on_tick[chan+1]) < chordthreshold) trkdata.chordcount[chan+1]++;
|
||||||
else trkdata.notecount[chan+1]++; /* [SS] 2019-08-02 */
|
else trkdata.notecount[chan+1]++; /* [SS] 2019-08-02 */
|
||||||
last_tick[chan+1] = Mf_currtime;
|
last_tick[chan+1] = Mf_currtime;
|
||||||
@@ -1404,6 +1428,7 @@ void stats_noteoff(int chan,int pitch,int vol)
|
|||||||
if (last_tick[chan+1] == -1) return;
|
if (last_tick[chan+1] == -1) return;
|
||||||
length = Mf_currtime - last_tick[chan+1];
|
length = Mf_currtime - last_tick[chan+1];
|
||||||
trkdata.notelength[chan+1] += length;
|
trkdata.notelength[chan+1] += length;
|
||||||
|
trkdata.lastNoteOff[chan+1] = Mf_currtime; /* [SS] 2022.08.22 */
|
||||||
chnactivity[chan+1] += length;
|
chnactivity[chan+1] += length;
|
||||||
if (chan == 9) return; /* drum channel */
|
if (chan == 9) return; /* drum channel */
|
||||||
pitchclass_activity[pitch % 12] += length;
|
pitchclass_activity[pitch % 12] += length;
|
||||||
@@ -1413,6 +1438,12 @@ void stats_noteoff(int chan,int pitch,int vol)
|
|||||||
if(Mf_currtime > last_tick[chan+1]) last_tick[chan+1] = Mf_currtime;
|
if(Mf_currtime > last_tick[chan+1]) last_tick[chan+1] = Mf_currtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void stats_eot () {
|
||||||
|
trkdata.lastNoteOff[0] = Mf_currtime; /* [SS] 2022.08.24 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void mftxt_polypressure(chan,pitch,press)
|
void mftxt_polypressure(chan,pitch,press)
|
||||||
int chan, pitch, press;
|
int chan, pitch, press;
|
||||||
{
|
{
|
||||||
@@ -1826,7 +1857,7 @@ void initfunc_for_stats()
|
|||||||
Mf_sysex = no_op2;
|
Mf_sysex = no_op2;
|
||||||
Mf_metamisc = no_op3;
|
Mf_metamisc = no_op3;
|
||||||
Mf_seqnum = no_op1;
|
Mf_seqnum = no_op1;
|
||||||
Mf_eot = no_op0;
|
Mf_eot = stats_eot;
|
||||||
Mf_timesig = stats_timesig;
|
Mf_timesig = stats_timesig;
|
||||||
Mf_smpte = no_op5;
|
Mf_smpte = no_op5;
|
||||||
Mf_tempo = stats_tempo;
|
Mf_tempo = stats_tempo;
|
||||||
|
|||||||
Reference in New Issue
Block a user