________________________________________________________________________ Date: Tue, 14 Aug 2001. Subject: [tuning] Purity Ratings by Joos Vos Vos found that in general, the relationship between the average purity rating (y) and the amount of tempering (x) in cents can be adequately described by means of the exponential function y = a*exp (b*x). The values of a and b for each set of conditions are shown in the following table: Tone Musical Tempering Harmonics of Tone 2 Duration Interval Direction All Odd -------------- -------------- a b r^2 a b r^2 0.5 Fifth Compress 8.8 .040 .99 9.7 .037 .97 Stretch 8.9 -.038 .99 9.4 -.035 .96 Major Third Compress 6.6 .028 .88 7.9 .023 .97 Stretch 7.0 -.026 .96 8.1 -.017 .98 0.25 Fifth Compress 8.6 .037 .99 9.2 .028 .99 Stretch 8.2 -.033 .98 8.8 -.028 .96 Major Third Compress 6.7 .025 .97 7.7 .022 .91 Stretch 6.7 -.019 .97 7.8 -.014 .93 Just to clarify, x is negative in the case of compression, and positive in the case of stretching. ------------------------------------------------------------------------ Date: Mon, 08 Jul 2002. Subject: [harmonic_entropy] HE algorithms I posted a summary of some of joos vos's research to the tuning list -- basically he found that the "purity" rating for harmonic intervals, even with sine waves, follows an absolute exponential, rather than bell, curve (with the peak, of course, at the just ratio). It's easy enough to incorporate this idea into the harmonic entropy function by using a probability function of the form exp(-|r|/s) instead of exp(-r^2/s). There may be some justification for this in the neurological timing mechanisms for pitch perception that have come to the forefront in the last 20 years. The resulting curves seem to be fractal-like; there appears to be a infinitude of ever-finer local minima at more and more complex ratios, but only big minima, corresponding as always to the simplest ratios, are visible. The results have seemed to provide a much more satisfying dissonance function for various listeners such as Margo, Gene, and George. Here's the matlab code i'm using to calculate the latest curves, which are tenney-seeded, 1/sqrt(n*d)-width-approximated, Vos-curve entropy functions: function entropy=t2vosinp(cents,r,s); in=cents/1200*log(2); a=size(r,1); p=r(:,1).*exp(-abs((in-log(r(:,2)./r(:,3)))/s)); n=sum(p); p=p/n; p(find(p==0))=ones(size(find(p==0))); entropy=-sum(p.*log(p))'; The input arguments are cents (the independent variable which is the actual interval in cents), s (the hearing resolution, usually .01 for a 1% hearing resolution), and the seed-ratio array r. r has 3 columns: "width", numerator, and denominator. For example, for the latest graph I produced for George, which was seeded with Tenney limit n*d <=10000, r was an array with 63868 rows. Here are the first 10 rows: 0.01 1 10000 0.0100005000375031 1 9999 0.010001000150025 1 9998 0.0100015003375844 1 9997 0.0100020006002001 1 9996 0.0100025009378908 1 9995 0.0100030013506754 1 9994 0.0100035018385725 1 9993 0.0100040024016011 1 9992 0.0100045030397799 1 9991 Clear? This itself only required a few lines of code to generate. So altogether, not much is required in the way of coding, and the entire harmonic entropy function could probably be written as a single-line expression if you have fancy enough symbology for taking sums over a pair of indices which are restricted to be mutually prime, etc. . . . Happy computing! ------------------------------------------------------------------------