*********************************************************************** 29 October 2017 Added a backwards pass of rhythm data thru the filterbank, to deal with the problem of poor entrainment at the beginning. Tweaked rhythm parameters. Tried logistic oscillator. It didn't pick up anything below 2.6 Hz. Eliminated align-to-marker feature, to be replaced with align-to-clicktrack feature. Eliminated legato feature, replaced with fake velocity feature, based on melodic contour. *********************************************************************** 20 October 2017 Eliminated iterative clustering, apportionment, and spectral clustering. Revised TCLUST to use mixture decomposition of Student distributions as described by Geoffrey McLachlan and Donald Peel. Tweaks to fitness function and parameters in GENE. *********************************************************************** 17 September 2017 Number of clusters is now allowed to vary according to the threshhold distance based on the initial seeding. *********************************************************************** 5 November 2016 Wrote missing subroutine MKPQR for computing chord probability data. Configuration data is now a user-editable text file. *********************************************************************** 27 October 2016 Wrote POLYPHI as an interface to Melisma2 by David Temperley, as an alternative to ANALYZ. Not for commercial use. Must be turned on by a compiled-in parameter. *********************************************************************** 24 October 2016 Wrote new text output for ANALYZ. Fixed bug in AFFINE of allowing xcrit to equal 0. *********************************************************************** 15 October 2016 Revised an interface to ARPACK, to use spectral clustering, and so not depend on graclus, which is not available for Microsoft Windows. *********************************************************************** 9 October 2016 Fixed bug in DUROFF, that wrote wrong off-velocities. *********************************************************************** 20 September 2016 Fixed bug in BLELIM. Now the arrays are allocated to fit all blobs in the input. Changed option -B so that only note events are considered when finding the beginning time. Fixed typo bug in JITTER. Greatly reduced amount of jitter. Simplified options processing. Numbers must now follow the letter option with no space. Fixed bug in WMIDI in writing SysEx and continued SysEx. *********************************************************************** 17 September 2016 Wrote replacement for APPORT, previous gave wrong answers sometimes. Changed singular value decomposition from Golub & Reinsch SVD to DSVDC from LINPACK for better precision. Made a couple corrections to figuring the t distribution. *********************************************************************** 11 September 2016 Changed FCLUST to TCLUST, using Student's t distribution. Fixed bug in sorting voice assignments. Fixed bug in the data increment button handling in RMIDI. Changed RANP to RANG to draw one random number at a time. Attempted to optimize rhythmic salience parameters by simulated annealing, *********************************************************************** July 2016 Hand-classified notes in five performances of "Maple Leaf Rag" compared against the score. Computed pooled variances over all classes, set new importance weights for clustering. Data set maple.csv is included in the distribution. *********************************************************************** 22 May 2016 Deleted unused DISTG. Revised FCLUST to use the common algorithm. *********************************************************************** 7 May 2016 Wrote subroutine to determine the number of clusters by the eigengap heuristic. *********************************************************************** 23 April 2016 Wrote subroutine SVIAD for linear algebra with a real covariance matrix. *********************************************************************** 2 March 2016 Fixed bug in midifile.f writing default events to nonexistent track 0. Added provision to ignore a duplicate note-on if it causes the earlier note event to have zero duration. That is, if two note-ons have the same onset time, pitch, and channel, only the first one encountered in the file is kept. *********************************************************************** 16 February 2016 Compiled program MM first time since ?2012? 2 seg faults fixed so far. *********************************************************************** 13 February 2016 Revised MULLIN to seek the optimal partition point to merge. The segments are merged by solving an overall least-squares problem instead of splitting the difference between segment endpoints. Fixed bug in SLOG so that SLOG(1.) returns 0. instead of a positive number. *********************************************************************** 6 February 2016 Wrote subroutine GENE to apply a genetic algorithm to MIDI. *********************************************************************** 28 January 2016 Wrote new clustering routine using an expectation-maximization type algorithm for a multivariate model with categorical variables embedded as vertices of a regular simplex, and contra-categorical variables as imaginary vertices of a regular simplex. *********************************************************************** 16 December 2015 Wrote RANP for jittering according to a normal distribution. *********************************************************************** 14 December 2015 Computed new RAF coefficients for SNAP and SLOG. SLOG is now optimized for lower absolute error instead of relative error. It is still the roughest approximation in thrift.f *********************************************************************** 12 December 2015 Found Thomassen's article on melodic accent. Wrote CONTOUR as a fully public domain replacement for MELACC. *********************************************************************** 3 December 2015 Began to renumber the event kinds in midifile.f -- 16 new events! *********************************************************************** 2 December 2015 Wrote subroutine SUCCOD to map a list of integers to 1, 2, 3... Wrote subroutine NUNIQ to count how many distinct instances are in a list of integers. SUCCOD is reduced from IEID, and NUNIQ is in turn a reduction of SUCCOD. ************************************************************************ Fall 2015 Wrote KEYAL as a replacement for SKEY. Support for detecting key changes. *********************************************************************** 13 November 2015 Corrected midifile.f to read SMPTE frame rates as negative numbers. *********************************************************************** December 2013 Flipped rows and columns in the main data matrix in the clustering routine with hopes of better locality of reference. *********************************************************************** November 2013 Rewrote utree to use an improved formula for the UGH trees. Removed modulo arithmetic from MEDIAN. Wrote CYMEAN, and CYMED to take correct averages in modulo arithmetic. *********************************************************************** 6 October 2013 Wrote the RMODE subroutine. *********************************************************************** Early 2013 - wrote utree.f, translated FNV32 *********************************************************************** 2012 Wrote PUNTAL, AFFINE, midifile.f, mixmidi.f, MELODY, MSORTR, translated MELACC. *********************************************************************** Fall 2011 Wrote OSCILL and STRATA for analyzing rhythm *********************************************************************** Summer 2011 Wrote CHORDAL and SKEY for analyzing harmony *********************************************************************** 18 June 2011 Wrote the valpos subroutine to select an array element by partial sorting. The sigma parameter to kasc() is adjustable now, but the eigenproblem size is compiled in. *********************************************************************** 11 June 2011 Wrote subroutine WKM for spectral clustering. *********************************************************************** 12 May 2011 Wrote the rsort subroutine. *********************************************************************** 8 May 2011 Translated kmeans_Lloyd to Fortran.