Provided by: abcmidi_20240222+ds1-1_amd64 bug

NAME

       midistats - program to summarize the statistical properties of a midi file

SYNOPSIS

       midistats infile

DESCRIPTION

       midistats  analyzes  the  contents  of a midi file and outputs key information and various
       statistical measures. Each line of output starts with the name of the variable or variable
       array  and  the  associated  values.  The  output  is  interpreted  by  the user interface
       midiexplorer.tcl. Both programs are still being improved. Here is an explanation  of  some
       of the output.

       ntrks indicates the number of tracks in the midi file.

       ppqn the number of midi pulses per quarter note.

       keysig the key signature, followed by a major/minor flag,  the number of sharps (positive)
       or flats (negative) in the key, and the beat number where the key signature was found.

       trk is followed by the track number for which the following information applies.

       program is followed by the channel number and the General Midi Program number.

       trkinfo is an array of 19 numbers which indicates the statistical properties of the  track
       of  interest.  The following data is given: the channel number, the first program assigned
       to this channel, the number of notes for this channel counting any chords as one note, the
       total  number  of notes for this for this channel, the sum of the MIDI pitches for all the
       notes, the sum of the note durations in MIDI pulse units, the number of control  parameter
       messages,  the  number  of  pressure messages.  the number of distinct rhythm patterns for
       each channel the number of pulses the channel was inactive the  minimum  pitch  value  the
       maximum  pitch  value  the minimum note length in pulses the maximum note length in pulses
       the number of gaps in the channel the entropy  of  the  pitch  class  histogram  for  that
       channel  the  number of notes whose pitch were the same as the previous note the number of
       notes whose pitch changed by less than 4 semitones the number of notes whose pitch changed
       by 4 or more semitones (In event of a chords the maximum pitches are compared.)

       After  processing  all  the  individual  tracks,  the following information applies to the
       entire midi file.

       npulses is the length of the longest midi track in midi pulse units

       tempocmds specifies the number of times the tempo is changed in this file.

       pitchbends specifies the total number of pitchbends in this file.

       pitchbendin c n specifies the number of pitchbends n in channel c

       progs is a list of all the midi programs addressed

       progsact the amount of activity for each of the above midi programs.  The activity is  the
       sum of the note durations in midi pulse units.

       progcolor:  is  a 17 dimensional vector where each component maps into a specific group of
       MIDI programs. Some of these groups are, keyboard  instruments,  brass  instruments,  wind
       instruments, and etc. More information can be found in the midiexplorer documentation.

       drums is a list of all the percussion instruments (channel 9) that were used.

       drumhits indicates the number of notes for each of the above percussion instruments.

       pitches  is  a  histogram  for the 11 pitch classes (C, C#, D ...B) that occur in the midi
       file.

       key indicates the key of the music, the number of sharps (positive) or flats (negative) in
       the  key  signature,  and  a  measure of the confidence in this key signature. The key was
       estimated from the above pitch histogram by convolving with Craig Sapp's model.  The  peak
       of rmaj or rmin (below) indicates the key.  A correlation less than 0.4 indicates that the
       pitch histogram does not follow the histogram of a major or minor scale.  (It may  be  the
       result of a mixture of two key signatures.)

       rmaj  the cross correlation coefficients with Craig Sapp's major key model for each of the
       11 keys (C, C#, D, ...,B).

       rmaj the cross correlation coefficients with Craig Sapp's minor key model for each of  the
       11 keys (C, C#, D, ...,B).

       pitchact is a similar histogram but is weighted by the length of the notes.

       chanvol  indicates  the  value of the control volume commands in the midi file for each of
       the 16 channels. The maximum value is 127.  It scales the loudness of the notes (velocity)
       by its value.

       chnact returns the amount of note activity in each channel.

       trkact returns the number of notes in each track.

       totalrhythmpatterns is the total number of bar rhythm patterns for all channels except the
       percussion channel.

       collisions. Midistats counts the bar rhythm patterns using a hashing  function.  Presently
       collisions are ignored so occasionally two distinct rhythm patterns are counted as one.

       Midistats  prints a number of arrays which may be useful in determining where the music in
       the track is a melody  line  or  chordal  rhythmic  support.  These  arrays  indicate  the
       properties  for each of the 16 channels. (The percussion channel 9 contains zeros.) In the
       case same channel occurs in several tracks, these numbers are the  totals  for  all  track
       containing that channel.  Here is a description of these properties.

       nnotes:  the total number of notes in each channel
       nzeros:  the number of notes whose previous note was the same pitch
       nsteps:  the number of notes whose pitch difference with the previous note was less than 4
       semitones.
       njumps:  the number of notes whose pitch difference with the previous note was 4  or  more
       semitones.
       rpats:  the  number  of  rhythmpatterns  for  each channels. This is a duplication of data
       printed previously.
       pavg: the average pitch of all the notes for each channel.

       In addition the midistats may return other codes that describe other characteristics. They
       include

       unquantized - the note onsets are not quantized
       triplets - 3 notes played in the time of 2 notes are present
       qnotes - the rhythm is basically simple
       clean_quantization - the note onsets are quantized into 1/4, 1/8, 1/16 time units.
       dithered_quantization - small variations in the quantized note onsets.
       Lyrics - lyrics are present in the meta data
       programcmd - there may be multiple program changes in a midi channel

Advanced Percussion Analysis Tools

       The  MIDI  file  devotes  channel  9  to the percussion instruments and over 60 percussion
       instruments are defined in the MIDI standard. Though there is a lot of  diversity  in  the
       percussion  track,  for most MIDI files only the first 10 or so percussion instruments are
       important in defining the character of the track. The  program  Midiexplorer  has  various
       tools  for  exposing  the percussion channel which are described in the documentation. The
       goal here is  to  find  the  essential  characteristics  of  the  percussion  track  which
       distinguishes the MIDI files. This is attempted in the program midistats.  Here is a short
       description.

       A number  of  experimental  tools  for  analyzing  the  percussion  channel  (track)  were
       introduced  into  midistats  and  are accessible through the runtime arguments. When these
       tools are used in a script which runs through a collection of midi files, you can build  a
       database of percussion descriptors.

OPTIONS

       -corestats
       outputs a line with 5 numbers separated by tabs. eg
       1       8       384     4057    375
       It  returns  the  number  of  tracks,  the number of channels, the number of divisions per
       quarter note beat (ppqn), the number of note onsets in the  midi  file,  and  the  maximum
       number of quarter note beats in midi file.

       -pulseanalysis
       counts  the  number  of  note  onsets  as a function of its onset time relative to a beat,
       grouping them into 12 intervals and returns the result as a discrete  probability  density
       function.  Generally,  the  distribution  consists  of  a couple of peaks corresponding to
       quarter notes or eigth notes. If the distribution is flat, it indicates that the times  of
       the  note  occurrences  have not been quantized into beats and fractions. Here is a sample
       output.
       0.349,0.000,0.000,0.160,0.000,0.000,0.298,0.000,0.000,0.191,0.000,0.000

       -panal
       Counts the number of note onsets for each percussion instrument. The first number  is  the
       code (pitch) of the instrument, the second number is the number of occurrences. eg.
       35 337  37 16   38 432  39 208  40 231  42 1088 46 384  49 42   54 1104 57 5    70 1040 85
       16

       -ppatfor n
       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 indicates the time in the beat when the drum
       onset occurs. The bits are ordered from left to right (higher order bits  to  lower  order
       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 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.

       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.

       One can see a repeating 4 beat pattern.

       -ppat
       midistats  attempts to find two percussion instruments in the midi file which come closest
       to acting as the bass drum and snare drum.  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.
       0 0 0 0 0 0 0 0 0 0 33 145 33 145 33 145 33 145 33 145 33 145 33 145
       33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145 33 145
       33 145 33 145 33 145 33 145 33 145 33 and etc.

       -ppathist
       computes and displays the histogram of the values  that  would  appear  when  running  the
       -ppat. eg.
       bass 35 337
       snare 38 432
       1 (0.1) 64  32 (2.0) 8  33 (2.1) 136  144 (9.0) 8  145 (9.1) 136
       The  bass  percussion  code,  the  number of onsets, and the snare percussion code and the
       number of onsets are given in the first  two  lines.  In  the  next  line  the  number  of
       occurrences  of each value in the -ppat listing is given. The number in parentheses splits
       the two 4-bit values with a period. Thus 33 = (2*16 + 1).

       -pitchclass
       Returns the pitch class distribution for the entire midi file.

       -nseqfor n
       Note sequence for channel n. This  option  produces  a  string  of  bytes  indicating  the
       presence  of  a note in a time unit corresponding to an eigth note. Thus each quarter note
       beat is represented by two bytes. The pitch class is represented by the line number on the
       staff,  where  0  is C. Thus the notes on a scale are represented by 7 numbers, and sharps
       and flats are ignored. The line number is then converted to a bit position in the byte, so
       that  the  pitch  classes  are  represented  by  the  numbers 1,2,4,8, and etc. A chord of
       consisting of two note onsets would set two of the  corresponding  bits.  If  we  were  to
       represent  the  full  chromatic scale consisting of 12 pitches, then we would require two-
       byte integers or twice of much memory.
       Though the pitch resolution is not sufficient to distinguish major  or  minor  chords,  it
       should be sufficient to be identify some repeating patterns.

       -nseq
       Same as above except it is applied to all channels except the percussion channel.

       -nseqtokens  Returns  the  number  of  distinct  sequence  elements for each channel.  The
       channel number and number of distinct elements separated by a comma is returned in  a  tab
       separated list for all active channels except the percussion channel. Here is an example.
       2,3  3,4  4,11 5,6  6,3  7,3  8,6  9,3  11,2 12,1

       -ver (version number)

AUTHOR

       Seymour Shlien <fy733@ncf.ca>

                                         11 February 2024                            MIDISTATS(1)