back to list

Please remind me

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/17/2003 12:31:03 PM

When calculating generators for Linear Temperaments, is root-mean-
square used, poptimal, or some other method used?

Thanks!

🔗Gene Ward Smith <gwsmith@svpal.org>

9/18/2003 12:11:11 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> When calculating generators for Linear Temperaments, is root-mean-
> square used, poptimal, or some other method used?

Poptimal isn't a method, but a defintion. As it happens when dealing
with it, my usual system is to calculate root-mean-square, root-mean-
cube, root-mean-fourth-power, and minimax (root-mean-infinity.)

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/18/2003 1:01:06 PM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > When calculating generators for Linear Temperaments, is root-mean-
> > square used, poptimal, or some other method used?
>
> Poptimal isn't a method, but a defintion. As it happens when
dealing
> with it, my usual system is to calculate root-mean-square, root-
mean-
> cube, root-mean-fourth-power, and minimax (root-mean-infinity.)

Thanks. I look at your lists a lot. However, with respect to Linear
Temperaments, as calculated in Python, for example, I still am not
clear. Per Graham Breed's web site, I've learned that the generator
for a Linear Temperament is (in simple situations) g such that
n*g+1=0 mod d (where m,n are temperaments such that m+n=d) I can see
that the generator is always real close the this fraction (for
example 13/31 for 12&19, with a generator of 503.4 is close to (13/31)
*(1200) which is 503.2258... How is 503.4 calculated, exactly?

🔗Paul Erlich <perlich@aya.yale.edu>

9/18/2003 1:45:54 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> --- In tuning-math@yahoogroups.com, "Gene Ward Smith"
<gwsmith@s...>
> wrote:
> > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > <paul.hjelmstad@u...> wrote:
> >
> > > When calculating generators for Linear Temperaments, is root-
mean-
> > > square used, poptimal, or some other method used?
> >
> > Poptimal isn't a method, but a defintion. As it happens when
> dealing
> > with it, my usual system is to calculate root-mean-square, root-
> mean-
> > cube, root-mean-fourth-power, and minimax (root-mean-infinity.)
>
> Thanks. I look at your lists a lot. However, with respect to Linear
> Temperaments, as calculated in Python, for example, I still am not
> clear. Per Graham Breed's web site, I've learned that the generator
> for a Linear Temperament is (in simple situations) g such that
> n*g+1=0 mod d (where m,n are temperaments such that m+n=d) I can
see
> that the generator is always real close the this fraction (for
> example 13/31 for 12&19, with a generator of 503.4 is close to
(13/31)
> *(1200) which is 503.2258... How is 503.4 calculated, exactly?

503.4 looks like the 1/4-comma meantone fourth, so graham must be
using minimax here. oftentimes minimax is not defined, but you can
take the limit as the exponent in the "norm" goes to infinity.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/18/2003 3:07:33 PM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
> > --- In tuning-math@yahoogroups.com, "Gene Ward Smith"
> <gwsmith@s...>
> > wrote:
> > > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > > <paul.hjelmstad@u...> wrote:
> > >
> > > > When calculating generators for Linear Temperaments, is root-
> mean-
> > > > square used, poptimal, or some other method used?
> > >
> > > Poptimal isn't a method, but a defintion. As it happens when
> > dealing
> > > with it, my usual system is to calculate root-mean-square, root-
> > mean-
> > > cube, root-mean-fourth-power, and minimax (root-mean-infinity.)
> >
> > Thanks. I look at your lists a lot. However, with respect to
Linear
> > Temperaments, as calculated in Python, for example, I still am not
> > clear. Per Graham Breed's web site, I've learned that the
generator
> > for a Linear Temperament is (in simple situations) g such that
> > n*g+1=0 mod d (where m,n are temperaments such that m+n=d) I can
> see
> > that the generator is always real close the this fraction (for
> > example 13/31 for 12&19, with a generator of 503.4 is close to
> (13/31)
> > *(1200) which is 503.2258... How is 503.4 calculated, exactly?
>
> 503.4 looks like the 1/4-comma meantone fourth, so graham must be
> using minimax here. oftentimes minimax is not defined, but you can
> take the limit as the exponent in the "norm" goes to infinity.

It's definitely 1/4-comma meantone. I should have known.
(generator=503.4, or .41951797627815945 basis). Another meantone that
Python calculates is a 251.7 cent generator, or 1.0,
0.20975898813907973 basis. This is for 5&19 together, which is clearly
exactly half of the other one 12&19. This corresponds to a g/d of 5/24
I'm starting to get the hang of this. 5*19+1=0 mod 24. So, the
generator is cut in half to be in the same neighborhood? Graham?

Paul

🔗Graham Breed <graham@microtonal.co.uk>

9/18/2003 3:18:49 PM

Paul Erlich wrote:

>503.4 looks like the 1/4-comma meantone fourth, so graham must be >using minimax here. oftentimes minimax is not defined, but you can >take the limit as the exponent in the "norm" goes to infinity.
> >
Yes, the module can do either minimax or RMS, and defaults to minimax. For simple cases, the minimax (which should probably be called maximin for consistency with game theory) can be found by choosing a generator such that each consonance in turn is perfectly tuned. For each choice, score by the most out of tune consonance and take the generator that makes this a minimum.

For more details, see the optimizeMinimax method. There are so many complications, it turns out the RMS is simpler, so see optimizeRMS for that. If anybody's following the OCaml, the methods there are optimize_minimax and optimize_rms.

Graham

🔗Paul Erlich <perlich@aya.yale.edu>

9/18/2003 3:57:41 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> Another meantone that
> Python calculates is a 251.7 cent generator, or 1.0,
> 0.20975898813907973 basis.

that's meantone? i don't think so! :)

🔗Paul Erlich <perlich@aya.yale.edu>

9/18/2003 4:01:08 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul Erlich wrote:
>
> >503.4 looks like the 1/4-comma meantone fourth, so graham must be
> >using minimax here. oftentimes minimax is not defined, but you can
> >take the limit as the exponent in the "norm" goes to infinity.
> >
> >
> Yes, the module can do either minimax or RMS, and defaults to
>minimax.
> For simple cases, the minimax (which should probably be called
>maximin
> for consistency with game theory)

why? in game theory you're trying to maximize profits, in
optimization or statistics (where the term minimax is found) you're
trying to minimize error. maximin is where the smallest possible
profit is maximized. minimax is where the largest possible error is
minimized.

> can be found by choosing a generator
> such that each consonance in turn is perfectly tuned. For each
choice,
> score by the most out of tune consonance and take the generator
that
> makes this a minimum.

so it's minimax, not maximin.

🔗Dave Keenan <d.keenan@bigpond.net.au>

9/18/2003 8:13:51 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> For more details, see the optimizeMinimax method. There are so many
> complications, it turns out the RMS is simpler, so see optimizeRMS for
> that. If anybody's following the OCaml, the methods there are
> optimize_minimax and optimize_rms.

Graham,

I'm not looking at the code, but since minimax is
root-mean-infinite-power, could you implement it the same as RMS but
with a large power and thereby get rid of all those complications? It
would take some experimentation to find what power is high enough to
give an accurate enough result without risking floating-point overflow
or losing so many low bits that you can't find the minimum 'cause it's
too flat.

Or could you use a high power (but not so high as assumed above, maybe
even RMS would do) to put you in the right ballpark, and then use
successive approximation until you decide you're close enough?

When I used you excellent wonderful fabulous free web-based
temperament finder recently, I found it was giving me lots of
temperaments with more error than I had asked for. Is that because it
is filtering based on RMS and then giving minimax, or what?

🔗Graham Breed <graham@microtonal.co.uk>

9/19/2003 1:15:36 AM

Paul Erlich wrote:

>why? in game theory you're trying to maximize profits, in >optimization or statistics (where the term minimax is found) you're >trying to minimize error. maximin is where the smallest possible >profit is maximized. minimax is where the largest possible error is >minimized.
> >
Oh, that's okay, then. I always had a 50% chance of getting it right!

Graham

🔗Graham Breed <graham@microtonal.co.uk>

9/19/2003 3:15:48 AM

Dave Keenan wrote:

>I'm not looking at the code, but since minimax is
>root-mean-infinite-power, could you implement it the same as RMS but
>with a large power and thereby get rid of all those complications? It
>would take some experimentation to find what power is high enough to
>give an accurate enough result without risking floating-point overflow
>or losing so many low bits that you can't find the minimum 'cause it's
>too flat.
> >
I might be able to implement it that way, but I don't see it removing any complications. The first one -- that intervals which don't depend on the generator have to be removed -- may as well stay there, as it makes the calculation more efficient. It might be better to consider the whole second-order diamond instead of the more complex and probably incorrect way I do it at the moment. I already have the routine to find a second order diamond.

>Or could you use a high power (but not so high as assumed above, maybe
>even RMS would do) to put you in the right ballpark, and then use
>successive approximation until you decide you're close enough?
> >
Why use approximations? If you are in the right ballpark, taking the best-tuned second order consonance and making it perfect should work. But that all depends on knowing you're in the right ballpark. If the curve approximates minimax, then it'll have more than one local minimum, so you have to check them all anyway, but as the solutions of fairly complicated polynomials instead of simple equivalences of intervals.

It has to be an even power so that you don't have to take absolute errors (which would stop the derivative being discontinuous). So the next simplest curve is the quartic one, which means solving a cubic equation. I don't even know how to do that algebraically -- it certainly won't be conceptually simpler than the minimax. It may be faster, because it's only linear in the number of consonances. But where there's a large number of consonances, so that the calculation is slow in the first place, an RMS is probably more appropriate anyway.

>When I used you excellent wonderful fabulous free web-based
>temperament finder recently, I found it was giving me lots of
>temperaments with more error than I had asked for. Is that because it
>is filtering based on RMS and then giving minimax, or what?
> >
Yes, that's it. I need to work on the output. Or get the OCaml back end wired up. That's fast enough that the penalty for calculating the mimimax isn't a problem.

Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/19/2003 8:07:36 AM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > Another meantone that
> > Python calculates is a 251.7 cent generator, or 1.0,
> > 0.20975898813907973 basis.
>
> that's meantone? i don't think so! :)

You didn't read the whole post. This is exactly 1/2 of 1/4-comma
meantone (503.4 cents). It's the calculation that Python does
for 5&19 temperaments, close to 5/24 of an octave with g=5
being (n*g+1=0 mod d) according to Graham. What I don't see is
how it 'knows' to cut this in half to "match" 5/24

🔗Graham Breed <graham@microtonal.co.uk>

9/19/2003 9:54:38 AM

Paul G Hjelmstad wrote:

>You didn't read the whole post. This is exactly 1/2 of 1/4-comma >meantone (503.4 cents). It's the calculation that Python does
>for 5&19 temperaments, close to 5/24 of an octave with g=5
>being (n*g+1=0 mod d) according to Graham. What I don't see is
>how it 'knows' to cut this in half to "match" 5/24
> >
That's contorsion. It's covered in

http://x31eq.com/temper/method.html

If you get 5&19 for the 7-limit, you'll see it is different to meantone.

Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/19/2003 10:13:10 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> >You didn't read the whole post. This is exactly 1/2 of 1/4-comma
> >meantone (503.4 cents). It's the calculation that Python does
> >for 5&19 temperaments, close to 5/24 of an octave with g=5
> >being (n*g+1=0 mod d) according to Graham. What I don't see is
> >how it 'knows' to cut this in half to "match" 5/24
> >
> >
> That's contorsion. It's covered in
>
> http://x31eq.com/temper/method.html
>
> If you get 5&19 for the 7-limit, you'll see it is different to
meantone.
>
>
> Graham

Right. Sorry to be a pain, but could you tell me how 497.1 cents
is calculated as the generator for 5&12 (7/17)? Is is based on 81/80
or something else?

🔗Graham Breed <graham@microtonal.co.uk>

9/19/2003 10:57:02 AM

Paul G Hjelmstad wrote:

>Right. Sorry to be a pain, but could you tell me how 497.1 cents
>is calculated as the generator for 5&12 (7/17)? Is is based on 81/80
>or something else?
> >
It's 200*log2(5.6) by the looks of it.

It does temper out 81:80, but also a 7-limit comma such that 7:4 is approximated by two perfect fourths. The minimax optimum is where 7:5 is just.

Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/19/2003 1:05:08 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> >Right. Sorry to be a pain, but could you tell me how 497.1 cents
> >is calculated as the generator for 5&12 (7/17)? Is is based on
81/80
> >or something else?
> >
> >
> It's 200*log2(5.6) by the looks of it.
>
> It does temper out 81:80, but also a 7-limit comma such that 7:4 is
> approximated by two perfect fourths. The minimax optimum is where
7:5
> is just.
>
>
> Graham

Cool. I've read your method page, very interesting, but need to ask,
how for example, does the generator get calculated so that 497.1
cents is approximately 1200*(7/17)? How does the algorithm "know"
to use log2(56/10)^1/6 *1200 which I admit, works great... is this
the "minimax optimum?"

🔗Gene Ward Smith <gwsmith@svpal.org>

9/19/2003 2:26:41 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> You didn't read the whole post. This is exactly 1/2 of 1/4-comma
> meantone (503.4 cents). It's the calculation that Python does
> for 5&19 temperaments, close to 5/24 of an octave with g=5
> being (n*g+1=0 mod d) according to Graham. What I don't see is
> how it 'knows' to cut this in half to "match" 5/24

I don't know what Graham does, but these sort of (con)torsion problems
are always eliminated if you use wedgies to define temperaments. In
the 5-limit case, we have

h5^h19 = (81/80)^2 = [-8, 8, -2].

The corresponding wedgie is 81/80, or [-4, 4, -1] in monzo terms, and
this is simply (5-limit) meantone.

🔗Gene Ward Smith <gwsmith@svpal.org>

9/19/2003 2:31:37 PM

--- In tuning-math@yahoogroups.com, "Dave Keenan" <d.keenan@b...> wrote:

> --- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> > For more details, see the optimizeMinimax method. There are so many
> > complications, it turns out the RMS is simpler, so see optimizeRMS
for
> > that. If anybody's following the OCaml, the methods there are
> > optimize_minimax and optimize_rms.
>
> Graham,
>
> I'm not looking at the code, but since minimax is
> root-mean-infinite-power, could you implement it the same as RMS but
> with a large power and thereby get rid of all those complications?

That would be more complicated than simply using minimax, since you
would need to find the root of a high-order polynomial. Minimax isn't
complicated anyway, at least in the way I did it. I set the thing up
as a linear programming problem, which means standard simplex methods
quickly find the solution. What's the problem?

🔗Gene Ward Smith <gwsmith@svpal.org>

9/19/2003 2:33:06 PM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...> wrote:

> why? in game theory you're trying to maximize profits, in
> optimization or statistics (where the term minimax is found) you're
> trying to minimize error. maximin is where the smallest possible
> profit is maximized. minimax is where the largest possible error is
> minimized.

When I took a course in game theory as an undergrad the instructor
called it minimax anyway.

🔗Paul Erlich <perlich@aya.yale.edu>

9/19/2003 2:38:47 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Dave Keenan wrote:
>
> It might be better to consider
> the whole second-order diamond instead of the more complex and
>probably
> incorrect way I do it at the moment.

what does the second-order diamond have to do with optimizing
temperaments?

> If the
> curve approximates minimax, then it'll have more than one local
>minimum,

not true. why would you think so? minimax can often have a "floor"
for a range of values, the approximating curve will then have a very
broad, flat local minimum, but still only one . . .

🔗Gene Ward Smith <gwsmith@svpal.org>

9/19/2003 3:03:48 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> Thanks. I look at your lists a lot. However, with respect to Linear
> Temperaments, as calculated in Python, for example, I still am not
> clear. Per Graham Breed's web site, I've learned that the generator
> for a Linear Temperament is (in simple situations) g such that
> n*g+1=0 mod d (where m,n are temperaments such that m+n=d)

If 1 < n < d is prime to d and g = +-1/n (mod d, reduced to 1<g<d)
then by definition n*g = +-1 (mod d.) It follows from this that there
is an a < n such that either

a/n < g/d < (g-a)/(d-n)

or

(g-a)/(d-n) < g/d < a/n

are successive members of the dth row of the Farey sequence. We've
picked out a range of generators, even if not always the one you hoped
to obtain.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/19/2003 3:55:33 PM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> If 1 < n < d is prime to d and g = +-1/n (mod d, reduced to 1<g<d)
> then by definition n*g = +-1 (mod d.) It follows from this that
there
> is an a < n such that either
>
> a/n < g/d < (g-a)/(d-n)
>
> or
>
> (g-a)/(d-n) < g/d < a/n
>
> are successive members of the dth row of the Farey sequence. We've
> picked out a range of generators, even if not always the one you
> hoped to obtain.

Cool. Since d-n=m, you get a generator for n, m and d each, right?
I get 2/5, 7/17, 5/12 (.4, .412..,.416...) with a=5

🔗Graham Breed <graham@microtonal.co.uk>

9/20/2003 3:10:32 AM

Gene Ward Smith wrote:

>That would be more complicated than simply using minimax, since you
>would need to find the root of a high-order polynomial. Minimax isn't
>complicated anyway, at least in the way I did it. I set the thing up
>as a linear programming problem, which means standard simplex methods
>quickly find the solution. What's the problem?
> >
Minimax is complicated the way I do it -- it requires 50 lines of code whereas RMS only needs 37 lines, including the comment explaining the derivation of the formula. If you can implement minimax optimization using simplex methods in under 50 lines of Python code, I'll consider using it. I haven't myself, because I don't know what you're talking about.

Graham

🔗Graham Breed <graham@microtonal.co.uk>

9/20/2003 4:29:45 AM

Paul Erlich wrote:

>what does the second-order diamond have to do with optimizing >temperaments?
> >
It's the set of intervals that may be tuned perfectly to get the minimax when the optimizing set is a subset of a first-order diamond.

For the optimization I'm doing, the minimax has to be a well defined point. For some temperaments, some consonances are exact multiples of the period and so any tuning where such an interval has the highest error will do as a minimax. However, I got complaints about the old algorithm that worked like this, so I now exclude all such intervals from consideration.

In addition, you only need to consider one of each pair of octave complements. The error of 5:4 will always be the same as that for 8:5 for example.

If the minimax is a single point, then any deviation from it has to result in the error of one of the worst tuned consonances increasing. If there's a single worst tuned consonance this doesn't make sense.

If the error increases however you change the tuning, then the interval must be optimally tuned. That means it has an error of zero. But this is supposed to be the worst tuned interval! What we have in this case is a form of just intonation, not a temperament. It can be trivially optimized by setting any member of the first or second-order tonality diamond to be just.

If the error doesn't change as you change the tuning, then the minimax can't be a single point. This interval should have been removed from consideration.

It's impossible for the error to decrease however you change the tuning. But if it did, it would mean you hadn't reached the minimax point.

So there has to be more than one worst tuned consonance. That means that the minimax is always at the point where two consonances (which are not octave complements) are equally badly tuned. If you either add or subtract these intervals, the result will be a third interval that is perfectly tuned. The set of all intervals that can be formed by adding or subtracting a pair of intervals within a tonality diamond is the second order tonality diamond. Hence the minimax point of the subset of a tonality diamond where all intervals depend on the generator must have one member of the second order tonality diamond perfectly tuned.

Usually, this means that a member of the first-order tonality diamond will be perfectly tuned as well. I suggest, but can't prove, that it will always be the case when all consonances depend on the generator. It makes sense if you look at graphs showing the signed error of each prime interval as a function of the generator. The minimax is where the distance between the lowest and highest lines (including the origin) is its smallest, and has to be where two lines cross.

I'm not sure exactly what goes wrong when a consonance is a multiple of the period, but an example is pajara. The minimax is 109.363 cents. At this point, 7:5 and 10:7 are the worst tuned pair of octave complements. Because they're equal to the period, they're excluded from the calculation. So of the intervals that are left, the worst tuned are 6:5 and 8:7 (and octave complements). Because of this, the second-order interval 35:34 is perfectly tuned.

It happens that there's a tie for the best tuned consonance. 7:6 and 5:4 are equal, which also follows from 35:34 being perfect. They're related by periods to the worst tuned independent consonances

7:5 / 7:6 = 6:5
10:7 / 5:4 = 8:7

From all this, it also happens that if you set each independent consonance in turn to be perfectly tuned, then you get two equally good minimax candidates, with either 7:6 or 6:5 perfect. So that's how my program goes on to find the true minimax. I don't know if it always works like that, which is why I suggested trying each member of the second order diamond, (which will probably be simpler anyway).

Me:

>>If the >>curve approximates minimax, then it'll have more than one local >>minimum,
>> >>
Paul E:

>not true. why would you think so? minimax can often have a "floor" >for a range of values, the approximating curve will then have a very >broad, flat local minimum, but still only one . . .
> >
The general case of a piecewise linear or polynomal curve is that there'll be more than one local minimum. Why do you think that isn't the case for these optimization problems? If we can count on it, then the minimax algorithm can be made more efficient as follows:

1) Guess a point
2) Find the two worst tuned intervals
3) If they're the same, this is the minimax
4) Otherwise, find the point where they have equal absolute error
5) Go to step 2

The higher order polynomials could also be solved numerically, but that can hardly be a simpler algorithm. An algebraic solution of the polynomials has to involve considering all stationary points (doesn't it?) so again complexity is unlikely to decrease.

Graham

🔗Graham Breed <graham@microtonal.co.uk>

9/20/2003 4:38:33 AM

I wrote:

>1) Guess a point
>2) Find the two worst tuned intervals
>3) If they're the same, this is the minimax
>4) Otherwise, find the point where they have equal absolute error
>5) Go to step 2
> >
3) should start "If the absolute errors are the same..."

Graham

🔗Graham Breed <graham@microtonal.co.uk>

9/20/2003 8:40:22 AM

I wrote:

>>1) Guess a point
>>2) Find the two worst tuned intervals
>>3) If they're the same, this is the minimax
>>4) Otherwise, find the point where they have equal absolute error
>>5) Go to step 2
>> >>
>> >>
>3) should start "If the absolute errors are the same..."
> >
That's still wrong, but I've got a variant that's more reliable than the algorithm I was using before. That is, it's always gives the same or lower minimax error than the old algorithm, which means the old one wasn't always right were a consonance is a muliple of the period.

And the new algorithm only makes the full calculation 13% slower than using RMS.

I'm uploading the changes to http://x31eq.com/temper.py

Graham

🔗Dave Keenan <d.keenan@bigpond.net.au>

9/20/2003 2:34:41 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
...
> I've got a variant that's more reliable than the
> algorithm I was using before. That is, it's always gives the same or
> lower minimax error than the old algorithm, which means the old one
> wasn't always right were a consonance is a muliple of the period.
>
> And the new algorithm only makes the full calculation 13% slower than
> using RMS.

Well done Graham!

So will it be possible to let the user of your online temperament
finder choose whether they want to use RMS or minimax and have it used
for both filtering and output? If so, I suggest it should also say in
the output, which one was used, at least once near the start, but
preferably next to every error.

I expect you're well aware of this, but I remind you just in case,
that although when optimising the generator by minimax error you need
to ignore the intervals that do not depend on the generator, as you
said, but when filtering temperaments by minimax error, and when
quoting the minimax error in the output, you need to give the worst
error over _all_ the diamond intervals.

Note that ignoring the intervals that don't depend on the generator,
when optimising the generator for minimum max-absolute error, is fully
justified by the definition of minimax as the limit of the
p-th-root-of-the-mean-of-the-p-th-powers as p goes to infinity, not
merely by the fact that some people complained. :-)

🔗Graham Breed <graham@microtonal.co.uk>

9/21/2003 2:40:46 PM

Dave Keenan wrote:

>So will it be possible to let the user of your online temperament
>finder choose whether they want to use RMS or minimax and have it used
>for both filtering and output? If so, I suggest it should also say in
>the output, which one was used, at least once near the start, but
>preferably next to every error.
> >
It's always been possible. The whole UI needs an overhaul, pending sufficient supplies of tuits, ideally the round ones. I could switch it to always use minimax so that it's consistent as an interim measure.

I'm shy of updating with what I have now because I lost the test cases for the unison vector side. If anybody has canonical lists of unison vectors for different limits, that would help.

I'm also trying to get it to do the hard calculations in OCaml. The trouble is that it looks like I need to understand the C interfaces for both languages :-( If I do that, the option to supply your own figure of demerit will go, probably replaced by a drop down list of standard options.

It'd also be nice if I could remove some of the arbitrary options. When it's fast, the number of equal temperaments can probably be guessed from the complexity/accuracy tradeoff. That leaves the consistency cutoff as a free parameter. Does anybody have ideas for theory behind this?

>I expect you're well aware of this, but I remind you just in case,
>that although when optimising the generator by minimax error you need
>to ignore the intervals that do not depend on the generator, as you
>said, but when filtering temperaments by minimax error, and when
>quoting the minimax error in the output, you need to give the worst
>error over _all_ the diamond intervals.
> >
Yes, I forgot that in the update, but it's fixed now. It has a knock-on effect for writetemper.py, so anybody with that needs to download both.

That's also something that's been wrong in the past, and may affect the static files. I think the current CGI's okay.

>Note that ignoring the intervals that don't depend on the generator,
>when optimising the generator for minimum max-absolute error, is fully
>justified by the definition of minimax as the limit of the
>p-th-root-of-the-mean-of-the-p-th-powers as p goes to infinity, not
>merely by the fact that some people complained. :-)
> >
It's also useful to get a unique answer for regression testing. It doesn't matter for the search, but it turns out that even the dumb set-each-consonance-just method is slower than this new algorithm, now that I've tuned it. The new algorithm's still horribly complicated, though.

Graham

🔗Paul Erlich <perlich@aya.yale.edu>

9/21/2003 4:40:20 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul Erlich wrote:
>
> >what does the second-order diamond have to do with optimizing
> >temperaments?

> So there has to be more than one worst tuned consonance. That
means
> that the minimax is always at the point where two consonances
(which are
> not octave complements) are equally badly tuned. If you either add
or
> subtract these intervals, the result will be a third interval that
is
> perfectly tuned.

> The set of all intervals that can be formed by adding
> or subtracting a pair of intervals within a tonality diamond is the
> second order tonality diamond. Hence the minimax point of the
subset of
> a tonality diamond where all intervals depend on the generator must
have
> one member of the second order tonality diamond perfectly tuned.
>
> Usually, this means that a member of the first-order tonality
diamond
> will be perfectly tuned as well. I suggest, but can't prove, that
it
> will always be the case when all consonances depend on the
generator.
> It makes sense if you look at graphs showing the signed error of
each
> prime interval as a function of the generator. The minimax is
where the
> distance between the lowest and highest lines (including the
origin) is
> its smallest, and has to be where two lines cross.
>
> I'm not sure exactly what goes wrong when a consonance is a
multiple of
> the period, but an example is pajara. The minimax is 109.363
cents. At
> this point, 7:5 and 10:7 are the worst tuned pair of octave
> complements. Because they're equal to the period, they're excluded
from
> the calculation. So of the intervals that are left, the worst
tuned are
> 6:5 and 8:7 (and octave complements). Because of this, the second-
order
> interval 35:34 is perfectly tuned.

you must mean 35:36?

> Me:
>
> >>If the
> >>curve approximates minimax, then it'll have more than one local
> >>minimum,
> >>
> >>
> Paul E:
>
> >not true. why would you think so? minimax can often have a "floor"
> >for a range of values, the approximating curve will then have a
very
> >broad, flat local minimum, but still only one . . .
> >
> >
> The general case of a piecewise linear or polynomal curve is that
> there'll be more than one local minimum. Why do you think that
isn't
> the case for these optimization problems?

i guess it's just a conjecture at this point . . . based on
experience with the matlab optimization toolbox doing the heavy
lifting for me.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/22/2003 9:18:42 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul Erlich wrote:
>
> >503.4 looks like the 1/4-comma meantone fourth, so graham must be
> >using minimax here. oftentimes minimax is not defined, but you can
> >take the limit as the exponent in the "norm" goes to infinity.
> >
> >
> Yes, the module can do either minimax or RMS, and defaults to
minimax.
> For simple cases, the minimax (which should probably be called
maximin
> for consistency with game theory) can be found by choosing a
generator
> such that each consonance in turn is perfectly tuned. For each
choice,
> score by the most out of tune consonance and take the generator
that
> makes this a minimum.
>
> For more details, see the optimizeMinimax method. There are so
many
> complications, it turns out the RMS is simpler, so see optimizeRMS
for
> that. If anybody's following the OCaml, the methods there are
> optimize_minimax and optimize_rms.
>
>
> Graham

How do I run optimizeMinimax and optimizeRMS in Python?

Paul

🔗Graham Breed <graham@microtonal.co.uk>

9/22/2003 9:26:04 AM

Paul G Hjelmstad wrote:

>How do I run optimizeMinimax and optimizeRMS in Python?
> >
First get the latest code. I've speeded them up again (and updated the CGI). They're methods called on LinearTemperament objects. When you generate the list of linear temperaments, optimizeMinimax gets called for each one unless you call it with useRMS=1, in which case optimizeRMS gets called instead. Here's the basic example for one temperament:

>>> import temper
>>> meantone = temper.Temperament(12,19,temper.limit7)
>>> meantone.optimizeMinimax()
>>> meantone.getWorstError()
0.0044804769993158633
>>> meantone.getRMSError()
0.0033700062279259104
>>> meantone.optimizeRMS()
>>> meantone.getWorstError()
0.004654327295457783
>>> meantone.getRMSError()
0.0033457036298405727
>>>

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/22/2003 2:05:36 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> >How do I run optimizeMinimax and optimizeRMS in Python?
> >
> >
> First get the latest code. I've speeded them up again (and updated
the
> CGI). They're methods called on LinearTemperament objects. When
you
> generate the list of linear temperaments, optimizeMinimax gets
called
> for each one unless you call it with useRMS=1, in which case
optimizeRMS
> gets called instead. Here's the basic example for one temperament:
>
>
> >>> import temper
> >>> meantone = temper.Temperament(12,19,temper.limit7)
> >>> meantone.optimizeMinimax()
> >>> meantone.getWorstError()
> 0.0044804769993158633
> >>> meantone.getRMSError()
> 0.0033700062279259104
> >>> meantone.optimizeRMS()
> >>> meantone.getWorstError()
> 0.004654327295457783
> >>> meantone.getRMSError()
> 0.0033457036298405727
> >>>
Thanks. I notice running, for example, meantone.optimizeRMS also
works. Have tried this for various Linear Temperaments. I notice
RMS is only slightly different from Minimax in Meantone. Both
are ~ 503.4 cents. I was expecting 503.8 cents, (7/26-comma
temperament) for RMS. Isn't RMS "root-mean-squared?"

🔗Graham Breed <graham@microtonal.co.uk>

9/23/2003 1:42:46 AM

Paul G Hjelmstad wrote:

>Thanks. I notice running, for example, meantone.optimizeRMS also >works. Have tried this for various Linear Temperaments. I notice
>RMS is only slightly different from Minimax in Meantone. Both
>are ~ 503.4 cents. I was expecting 503.8 cents, (7/26-comma >temperament) for RMS. Isn't RMS "root-mean-squared?"
> >
Yes, the 5-limit RMS is 503.8 cents. The examples I gave were 7-limit, where the two optima are much closer.

Graham

🔗Gene Ward Smith <gwsmith@svpal.org>

9/23/2003 10:35:12 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
If anybody has canonical lists of unison
> vectors for different limits, that would help.

What makes a list canonical?

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/23/2003 2:06:41 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> >Thanks. I notice running, for example, meantone.optimizeRMS also
> >works. Have tried this for various Linear Temperaments. I notice
> >RMS is only slightly different from Minimax in Meantone. Both
> >are ~ 503.4 cents. I was expecting 503.8 cents, (7/26-comma
> >temperament) for RMS. Isn't RMS "root-mean-squared?"
> >
> >
> Yes, the 5-limit RMS is 503.8 cents. The examples I gave were 7-
limit,
> where the two optima are much closer.
>
>
> Graham

I see. In the 7-limit for meantone, is 126/125 used instead of 81/80?
Or are they both used somehow... Thanks

🔗Paul Erlich <perlich@aya.yale.edu>

9/23/2003 2:17:38 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> I see. In the 7-limit for meantone, is 126/125 used instead of
>81/80?
> Or are they both used somehow...

they are both used, and together they form a basis for the kernel of
7-limit meantone. you need two independent vanishing unison vectors
to get a linear temperament out of a 3-dimensional space like 7-limit
JI, since 3-2=1 (this language ignores the 'octave' dimension).

🔗Graham Breed <graham@microtonal.co.uk>

9/23/2003 2:31:12 PM

Gene Ward Smith wrote:

>What makes a list canonical?
>
I thought you were working on algorithms to produce simple lists of unison vectors that produce all siginificant temperaments in a given limit. But anything would to for testing, as long as there aren't too many unison vectors, and enough interesting temperaments come out.

Graham

🔗Gene Ward Smith <gwsmith@svpal.org>

9/23/2003 11:45:41 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Gene Ward Smith wrote:
>
> >What makes a list canonical?
> >
> I thought you were working on algorithms to produce simple lists of
> unison vectors that produce all siginificant temperaments in a
given
> limit. But anything would to for testing, as long as there aren't
too
> many unison vectors, and enough interesting temperaments come out.

You are probably thinking of my idea to simply list everything in a p-
limit with an "epimeric exponent" less than a given figure, where if
p/q is in reduced form, e = ln(p-q)/ln(q) is the epimeric exponent.
If p/q is superparticular, this is zero, but even if the bound E
satisfies 0 < E < 1, we have only a finite number of p-limited
solutions. Hence it generalizes the idea of defining the canonical
list as being simply the superparticular commas.

To make it canonical, we would need a canonical way of choosing e.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/26/2003 8:27:35 AM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > I see. In the 7-limit for meantone, is 126/125 used instead of
> >81/80?
> > Or are they both used somehow...
>
> they are both used, and together they form a basis for the kernel
of
> 7-limit meantone. you need two independent vanishing unison vectors
> to get a linear temperament out of a 3-dimensional space like 7-
limit
> JI, since 3-2=1 (this language ignores the 'octave' dimension).

Interesting. Could you give me the formula (or point me to a message)
that would extract a generator for a linear temperament like this
(that uses 2 unison vectors vanishing...)

🔗Paul Erlich <perlich@aya.yale.edu>

9/29/2003 3:15:48 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> --- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
> wrote:
> > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > <paul.hjelmstad@u...> wrote:
> >
> > > I see. In the 7-limit for meantone, is 126/125 used instead of
> > >81/80?
> > > Or are they both used somehow...
> >
> > they are both used, and together they form a basis for the kernel
> of
> > 7-limit meantone. you need two independent vanishing unison
vectors
> > to get a linear temperament out of a 3-dimensional space like 7-
> limit
> > JI, since 3-2=1 (this language ignores the 'octave' dimension).
>
> Interesting. Could you give me the formula (or point me to a
message)
> that would extract a generator for a linear temperament like this
> (that uses 2 unison vectors vanishing...)

i don't even know the formula in the case of only 1 unison vector
vanishing! i've seen some of your posts, but what happens in cases
where the period comes out to a fraction of an octave (such as
2048:2025, where the period comes out to 1/2 octave)? you can
probably handle this, i just wasn't paying enough attention :(

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/30/2003 7:11:10 AM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
> > --- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
> > wrote:
> > > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > > <paul.hjelmstad@u...> wrote:
> > >
> > > > I see. In the 7-limit for meantone, is 126/125 used instead
of
> > > >81/80?
> > > > Or are they both used somehow...
> > >
> > > they are both used, and together they form a basis for the
kernel
> > of
> > > 7-limit meantone. you need two independent vanishing unison
> vectors
> > > to get a linear temperament out of a 3-dimensional space like 7-
> > limit
> > > JI, since 3-2=1 (this language ignores the 'octave' dimension).
> >
> > Interesting. Could you give me the formula (or point me to a
> message)
> > that would extract a generator for a linear temperament like this
> > (that uses 2 unison vectors vanishing...)
>
> i don't even know the formula in the case of only 1 unison vector
> vanishing! i've seen some of your posts, but what happens in cases
> where the period comes out to a fraction of an octave (such as
> 2048:2025, where the period comes out to 1/2 octave)? you can
> probably handle this, i just wasn't paying enough attention :(

Graham? I know how to do one unison vector vanishing, like (1.5/
(81/80)^7/26 for meantone, using RMS. How is it done for two unison
vectors? Thanks!
vanishing?

🔗Manuel Op de Coul <manuel.op.de.coul@eon-benelux.com>

9/30/2003 8:11:59 AM

>Graham? I know how to do one unison vector vanishing, like (1.5/
>(81/80)^7/26 for meantone, using RMS. How is it done for two unison
>vectors? Thanks!

There isn't one formula because you can temper out unison
vectors in different ways.
With Scala you can calculate a generator however, and with
Graham's programs too.

One way is to create a lattice big enough so it covers the
unison vectors (using the EULERFOKKER command for example).
Then temper out the unison vectors with PROJECT/TEMPER.
Don't forget to add 2/1 as a unison vector otherwise it will
also be tempered. Then do UNIQUE and then SHOW DATA will give
you a generator.

Another way is with the CALCULATE/LEASTSQUARE command.
You give it a set of intervals to approximate and their
mapping. Then the generator is given directly, both
for RMS and minimax.

Manuel

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/30/2003 11:16:29 AM

--- In tuning-math@yahoogroups.com, "Manuel Op de Coul"
<manuel.op.de.coul@e...> wrote:
>
>
> One way is to create a lattice big enough so it covers the
> unison vectors (using the EULERFOKKER command for example).
> Then temper out the unison vectors with PROJECT/TEMPER.
> Don't forget to add 2/1 as a unison vector otherwise it will
> also be tempered. Then do UNIQUE and then SHOW DATA will give
> you a generator.
>
> Another way is with the CALCULATE/LEASTSQUARE command.
> You give it a set of intervals to approximate and their
> mapping. Then the generator is given directly, both
> for RMS and minimax.
>
> Manuel

Thanks. Is SCALA your creation? I have it. I am confused when you say
to include 2/1 as a unison vector. Isn't the point to temper out the
unison vectors that you give?

🔗Graham Breed <graham@microtonal.co.uk>

9/30/2003 1:50:03 PM

Paul G Hjelmstad wrote:

>Graham? I know how to do one unison vector vanishing, like (1.5/
>(81/80)^7/26 for meantone, using RMS. How is it done for two unison >vectors? Thanks!
>vanishing?
> >
I don't know what yo want to do, but here's how you construct a linear temperament from two unison vectors:

>>> temper.temperOut((
... temper.factorizeRatio(81,80),
... temper.factorizeRatio(64,63)))

0/1, 1902.9 cent generator

basis:
(1.0, 1.5857621954716261)

mapping by period and generator:
[(1, 0), (0, 1), (-4, 4), (6, -2)]

mapping by steps:
[(1, 0), (-1, 1), (-8, 4), (8, -2)]

highest interval width: 6
complexity measure: 6 (7 for smallest MOS)
highest error: 0.021121 (25.345 cents)

Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

9/30/2003 2:46:45 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> >Graham? I know how to do one unison vector vanishing, like (1.5/
> >(81/80)^7/26 for meantone, using RMS. How is it done for two
unison
> >vectors? Thanks!
> >vanishing?
> >
> >
> I don't know what yo want to do, but here's how you construct a
linear
> temperament from two unison vectors:
>
> >>> temper.temperOut((
> ... temper.factorizeRatio(81,80),
> ... temper.factorizeRatio(64,63)))
>
> 0/1, 1902.9 cent generator
>
> basis:
> (1.0, 1.5857621954716261)
>
> mapping by period and generator:
> [(1, 0), (0, 1), (-4, 4), (6, -2)]
>
> mapping by steps:
> [(1, 0), (-1, 1), (-8, 4), (8, -2)]
>
> highest interval width: 6
> complexity measure: 6 (7 for smallest MOS)
> highest error: 0.021121 (25.345 cents)
>
>
> Graham

Thanks. Not to be a pain, but is there a way I could see the
calculations, like you can with RMS for meantone: (3/2)/(81/80)^7/26?
If its too cumbersome, I understand. Monzo's web site extracts the
above meantone, of course, I don't need all that, just the final
calculation...

🔗Paul Erlich <perlich@aya.yale.edu>

9/30/2003 2:54:51 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> --- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
> wrote:
> > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > <paul.hjelmstad@u...> wrote:
> > > --- In tuning-math@yahoogroups.com, "Paul Erlich"
<perlich@a...>
> > > wrote:
> > > > --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> > > > <paul.hjelmstad@u...> wrote:
> > > >
> > > > > I see. In the 7-limit for meantone, is 126/125 used instead
> of
> > > > >81/80?
> > > > > Or are they both used somehow...
> > > >
> > > > they are both used, and together they form a basis for the
> kernel
> > > of
> > > > 7-limit meantone. you need two independent vanishing unison
> > vectors
> > > > to get a linear temperament out of a 3-dimensional space like
7-
> > > limit
> > > > JI, since 3-2=1 (this language ignores the 'octave'
dimension).
> > >
> > > Interesting. Could you give me the formula (or point me to a
> > message)
> > > that would extract a generator for a linear temperament like
this
> > > (that uses 2 unison vectors vanishing...)
> >
> > i don't even know the formula in the case of only 1 unison vector
> > vanishing! i've seen some of your posts, but what happens in
cases
> > where the period comes out to a fraction of an octave (such as
> > 2048:2025, where the period comes out to 1/2 octave)? you can
> > probably handle this, i just wasn't paying enough attention :(
>
> Graham? I know how to do one unison vector vanishing, like (1.5/
> (81/80)^7/26 for meantone, using RMS.

in order to do that, you need to know the mapping from generators to
primes first!

> How is it done for two unison
> vectors?

once you know the mapping from generators to primes, it's no
different, you can use rms or whatever in exactly the same way. i've
done a huge number of such calculations for the case of 50:49 and
64:63 vanishing, on the main tuning list . . .

🔗Manuel Op de Coul <manuel.op.de.coul@eon-benelux.com>

10/1/2003 3:05:09 AM

>Is SCALA your creation?

Yes.

>I am confused when you say
>to include 2/1 as a unison vector. Isn't the point to temper out the
>unison vectors that you give?

Right, I should have said "as an interval in the list of
unison vectors". The largest interval in that list will
not be tempered if there's more than one, and it doesn't
need to be a 2/1.

Manuel

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/1/2003 2:08:25 PM

> once you know the mapping from generators to primes, it's no
> different, you can use rms or whatever in exactly the same way.
> i've done a huge number of such calculations for the case of 50:49
> and 64:63 vanishing, on the main tuning list . . .

Paul, would you be so kind as to reference a message on "tuning"
of the case of 50/49 & 64/63 vanishing, so I can look at the
calculations? Thanks!

Paul

🔗Paul Erlich <perlich@aya.yale.edu>

10/1/2003 2:46:54 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> > once you know the mapping from generators to primes, it's no
> > different, you can use rms or whatever in exactly the same way.
> > i've done a huge number of such calculations for the case of
50:49
> > and 64:63 vanishing, on the main tuning list . . .
>
> Paul, would you be so kind as to reference a message on "tuning"
> of the case of 50/49 & 64/63 vanishing, so I can look at the
> calculations? Thanks!
>
> Paul

i did the calculations numerically, but it would be no more difficult
to do symbolically than the meantone case. like there, you have to
first know the mapping from generators (and periods) to primes
(unless you've got a trick to get around that that i'm unaware of). i
used the following matlab program to calculate the 7-limit error for
a given choice of generator (use p=2 for the 'rms' case):

function err=decaton(inp,p);
err1=(abs(log(3/2)/log(2)-inp)).^p;
err2=(abs(log(7/4)/log(2)-2+2*inp)).^p;
err3=(abs(log(7/6)/log(2)-2+3*inp)).^p;
err4=(abs(log(5/4)/log(2)-1.5+2*inp)).^p;
err5=(abs(log(5/3)/log(2)-2.5+3*inp)).^p;
err6=(abs(log(7/5)/log(2)-.5)).^p;
err=(err1+err2+err3+err4+err5+err6).^(1/p);

and then used matlab's optimization toolbox to find the value
of 'inp' (that is, of the generator) that minimized this error.
nonetheless, at least for p=2, it would be straightforward to
minimize this error function using calculus.

how about another case, 225/224 and 2401/2400 vanishing? just to make
things interesting, let's optimize for 9-limit consonances rather
than just 7-limit consonances. here's all the calculus worked out:

/tuning/topicId_22626.html#22626

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/3/2003 9:16:34 AM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
> > > once you know the mapping from generators to primes, it's no
> > > different, you can use rms or whatever in exactly the same way.
> > > i've done a huge number of such calculations for the case of
> 50:49
> > > and 64:63 vanishing, on the main tuning list . . .
> >
> > Paul, would you be so kind as to reference a message on "tuning"
> > of the case of 50/49 & 64/63 vanishing, so I can look at the
> > calculations? Thanks!
> >
> > Paul
>
> i did the calculations numerically, but it would be no more
difficult
> to do symbolically than the meantone case. like there, you have to
> first know the mapping from generators (and periods) to primes
> (unless you've got a trick to get around that that i'm unaware of).
i
> used the following matlab program to calculate the 7-limit error
for
> a given choice of generator (use p=2 for the 'rms' case):
>
> function err=decaton(inp,p);
> err1=(abs(log(3/2)/log(2)-inp)).^p;
> err2=(abs(log(7/4)/log(2)-2+2*inp)).^p;
> err3=(abs(log(7/6)/log(2)-2+3*inp)).^p;
> err4=(abs(log(5/4)/log(2)-1.5+2*inp)).^p;
> err5=(abs(log(5/3)/log(2)-2.5+3*inp)).^p;
> err6=(abs(log(7/5)/log(2)-.5)).^p;
> err=(err1+err2+err3+err4+err5+err6).^(1/p);
>
> and then used matlab's optimization toolbox to find the value
> of 'inp' (that is, of the generator) that minimized this error.
> nonetheless, at least for p=2, it would be straightforward to
> minimize this error function using calculus.
>
> how about another case, 225/224 and 2401/2400 vanishing? just to
make
> things interesting, let's optimize for 9-limit consonances rather
> than just 7-limit consonances. here's all the calculus worked out:
>
> /tuning/topicId_22626.html#22626

Now I finally get it. I take it that mapping generators to primes is
based on commas that are tempered out? How is this calculated easily?
Thanks again.

🔗Paul Erlich <perlich@aya.yale.edu>

10/3/2003 2:38:04 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"

> I take it that mapping generators to primes is
> based on commas that are tempered out?

yes, each prime can then be expressed in terms of generators *and*
periods -- see for example this table:

/tuning/database?
method=reportRows&tbl=10&sortBy=4

hopefully you understand what everything means there?

> How is this calculated easily?

not so easily, it seems. gene and graham have different methods of
doing it . . .

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/3/2003 4:19:25 PM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
>
> > I take it that mapping generators to primes is
> > based on commas that are tempered out?
>
> yes, each prime can then be expressed in terms of generators *and*
> periods -- see for example this table:
>
> /tuning/database?
> method=reportRows&tbl=10&sortBy=4
>
> hopefully you understand what everything means there?
>
> > How is this calculated easily?
>
> not so easily, it seems. gene and graham have different methods of
> doing it . . .

I understand the table fine. And intuitively I am almost there, with
respect to understanding the mapping of generators to primes. I've
been playing with Python for a few weeks now, so maybe it would be
best to try to understand Graham's method first...

🔗Graham Breed <graham@microtonal.co.uk>

10/4/2003 2:21:37 AM

Paul Erlich wrote:

>not so easily, it seems. gene and graham have different methods of >doing it . . .
> >
This is unison vectors to mapping? I have two different methods, using either matrix or exterior algebra. The latter I got from Gene. It's really the same method formalized two different ways. And it's fairly easy as long as you understand the math it's based on.

I don't have time to write it up now -- and as it seems the more basic things aren't understood either I need to look to them first. So I'm going to take the easy way out and say to search back through the archives, or inspect the Python code (temper.py only uses exterior algebra (wedge products)).

Oh, and this page might help:

http://x31eq.com/lintemp.htm

It's out of date now, and only covers octave and fifth generators, but it's the same basic idea.

Going the other way, and getting unison vectors from a mapping, is more difficult because of torsion.

Graham

🔗Gene Ward Smith <gwsmith@svpal.org>

10/4/2003 2:29:37 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> Now I finally get it. I take it that mapping generators to primes
is
> based on commas that are tempered out? How is this calculated
easily?

I do all of this stuff via wedgies and using Maple.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/6/2003 10:21:26 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul Erlich wrote:
>
> >not so easily, it seems. gene and graham have different methods of
> >doing it . . .
> >
> >
> This is unison vectors to mapping? I have two different methods,
using
> either matrix or exterior algebra. The latter I got from Gene.
It's
> really the same method formalized two different ways. And it's
fairly
> easy as long as you understand the math it's based on.
>
> I don't have time to write it up now -- and as it seems the more
basic
> things aren't understood either I need to look to them first. So
I'm
> going to take the easy way out and say to search back through the
> archives, or inspect the Python code (temper.py only uses exterior
> algebra (wedge products)).
>
> Oh, and this page might help:
>
> http://x31eq.com/lintemp.htm
>
> It's out of date now, and only covers octave and fifth generators,
but
> it's the same basic idea.
>
> Going the other way, and getting unison vectors from a mapping, is
more
> difficult because of torsion.
>
>
> Graham
Thanks. It looks like your web page should give me the basic concept.
(I've studied exterior algebra (Grassman) too.)

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/6/2003 2:30:04 PM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > Now I finally get it. I take it that mapping generators to primes
> is
> > based on commas that are tempered out? How is this calculated
> easily?
>
> I do all of this stuff via wedgies and using Maple.

I really hate to ask, but what do wedgies have to do with mapping
generators to primes? (Now that I understand the RMS or minimax
process for getting the exact generator.) What I do know: How a
wedgie is formed from two commas, etc. etc. I'm also studying
Graham's Python code, which is based on wedgies, and his website,
which is based on matrices, blah blah. Thanks, everyone's been very
generous holding my hand with this stuff, so I hate to push it...

🔗Gene Ward Smith <gwsmith@svpal.org>

10/6/2003 2:32:32 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> Thanks. It looks like your web page should give me the basic
concept.
> (I've studied exterior algebra (Grassman) too.)

You might see what you can glean from my site (www.xenharmony.org)
also.

🔗Gene Ward Smith <gwsmith@svpal.org>

10/6/2003 2:37:52 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> I really hate to ask, but what do wedgies have to do with mapping
> generators to primes?

I take the wedgie, and from it generate what I call the subgroup vals.
Then I hermite-reduce these, and apply a further reduction to make
the generators of the generator/period pair as small, greater than
one, as possible. This gives a standarized period/generator for the
temperament in question.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/7/2003 8:38:12 AM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > I really hate to ask, but what do wedgies have to do with mapping
> > generators to primes?
>
> I take the wedgie, and from it generate what I call the subgroup
vals.
> Then I hermite-reduce these, and apply a further reduction to make
> the generators of the generator/period pair as small, greater than
> one, as possible. This gives a standarized period/generator for the
> temperament in question.

So it's not exactly like falling off a log? (haha) I take it that you
run minimax or RMS after that, to get an exact generator.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/7/2003 11:38:12 AM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
>
> You might see what you can glean from my site (www.xenharmony.org)
> also.

I've read through this entire site. However, "Linear Temperaments" is
coming up "This page cannot be displayed". I believe that therein
lies my answer Thanks - thought you'd like to know

🔗Gene Ward Smith <gwsmith@svpal.org>

10/7/2003 11:52:51 AM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> So it's not exactly like falling off a log? (haha)

Since Maple has a hermite reduction algorithm, it wasn't hard to code.

I take it that you
> run minimax or RMS after that, to get an exact generator.

Among other possibilities. For minimax I set up a linear programming
problem and solve it using Maple's simplex implementation. What is
hard or easy depends a lot on what functions you have already
available.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/8/2003 9:05:58 AM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > So it's not exactly like falling off a log? (haha)
>
> Since Maple has a hermite reduction algorithm, it wasn't hard to
code.
>
> I take it that you
> > run minimax or RMS after that, to get an exact generator.
>
> Among other possibilities. For minimax I set up a linear
programming
> problem and solve it using Maple's simplex implementation. What is
> hard or easy depends a lot on what functions you have already
> available.

I have been going through the archives. Any chance you could show
examples? Especially how you get Hermite Normal Form, and then
generators, say for meantone, with and without using wedge products
if possible. I've gotten partial information from the archives,
but I can't find anything that connects directly to generator
extraction...

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/23/2003 10:43:43 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Oh, and this page might help:
>
> http://x31eq.com/lintemp.htm
>
> It's out of date now, and only covers octave and fifth generators,
but
> it's the same basic idea.
>
> Going the other way, and getting unison vectors from a mapping, is
more
> difficult because of torsion.
>
>
> Graham
I've studied your Linear Temperaments page. Just one quick question,
regarding the 1 1 over 4 4 matrix at the end of the page. Does this
correspond to 2^1, (g)^1 and 2^4 (g)^4 or am I misunderstanding it?

🔗Graham Breed <graham@microtonal.co.uk>

10/23/2003 1:46:10 PM

Paul G Hjelmstad wrote:

> I've studied your Linear Temperaments page. Just one quick question,
> regarding the 1 1 over 4 4 matrix at the end of the page. Does this
> correspond to 2^1, (g)^1 and 2^4 (g)^4 or am I misunderstanding it?

I don't know, what's g? What it seems to be telling you is that the tempered fifth measured in octaves is the fractional part of (log2(3) + log2(5))/5 and the tempered major third is the fractional part of (log2(3) + log2(5))*4/5. In fact, you need to add or subtract arbitrary 1/5s to get the right answer. So the tempered fifth is

>>> ((math.log(3) + math.log(5))/math.log(2)/5-0.2)%1
0.58137811912170378

octaves and the tempered major third is

>>> ((math.log(3) + math.log(5))/math.log(2) * 4/5 + 0.2)%1
0.32551247648681514

octaves. I get the feeling I didn't appreciate this sublety when I wrote that original page.

Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/23/2003 2:11:08 PM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> > I've studied your Linear Temperaments page. Just one quick
question,
> > regarding the 1 1 over 4 4 matrix at the end of the page. Does
this
> > correspond to 2^1, (g)^1 and 2^4 (g)^4 or am I misunderstanding
it?
>
> I don't know, what's g? What it seems to be telling you is that
the
> tempered fifth measured in octaves is the fractional part of (log2
(3) +
> log2(5))/5 and the tempered major third is the fractional part of
> (log2(3) + log2(5))*4/5. In fact, you need to add or subtract
arbitrary
> 1/5s to get the right answer. So the tempered fifth is
>
> >>> ((math.log(3) + math.log(5))/math.log(2)/5-0.2)%1
> 0.58137811912170378
>
> octaves and the tempered major third is
>
> >>> ((math.log(3) + math.log(5))/math.log(2) * 4/5 + 0.2)%1
> 0.32551247648681514
>
> octaves. I get the feeling I didn't appreciate this sublety when I
> wrote that original page.
>
>
> Graham
Thanks. I am looking to find a program to multiply and invert matrices
(short of buying Mathematica). For tempering out 225/224 and 2401/2400
for example, would that be

1 0 0 0 1 0 0 0
-6 1 1 1 -6 1 1 1
-5 2 2 -2 H' = 0 0 0 0 H?
-5 -1 -2 4 0 0 0 0

🔗Dave Keenan <d.keenan@bigpond.net.au>

10/23/2003 5:15:18 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> Thanks. I am looking to find a program to multiply and invert matrices
> (short of buying Mathematica).

... or MATLAB.

Microsoft Excel will do it.

You can use formulas like
=MMULT(A1:B2, C1:D2)
and
=MINVERSE(A1:B2)
and
=TRANSPOSE(A1:B2)
and combinations thereof.

But you may have to go back to your installation CD (which may be for
Microsoft Office) and install the optional Add-In called "Analysis
ToolPak", if it does not appear when you choose "Tools/Add-Ins..."
from the menus. Once it is installed, then choose "Tools/Add-Ins...",
check "Analysis ToolPak" and click "OK".

The way you enter formulas that return multiple cells (called "array
formulas") is a little strange. You have to remember to select the
entire correct-sized region of cells for the result before you start
typing the formula, then when you're finished typing the formula you
have to remember to hold down the Ctrl and Shift keys while typing Enter.

There's also MDETERM() which takes a matrix and returns a single
value, the determinant.

Maybe you don't need the Analysis ToolPak for these, I'm not sure. But
one thing you do need it for is the GCD() function (greatest common
divisor). This is very useful for doing prime factorisations. For
example, the power of 3 contained in an integer in cell A1 can be
obtained by the formula
=GCD(A1,3^31)
or if you just want the exponent
=ROUND(LN(GCD(A1,3^31))/LN(3),0)

That magic number 3^31 is the largest power of 3 that can be
represented exactly in Excel. Since Excel has 15 (decimal) digit
accuracy, for other primes P you can calculate the maximum exponent as
INT(15/LOG(P)).

So to find the exponent of 2 you would use
=ROUND(LN(GCD(A1,2^49))/LN(2),0)

These GCD-based formulas don't work if the argument is greater than
2^50-1.

-- Dave Keenan

🔗Gene Ward Smith <gwsmith@svpal.org>

10/23/2003 7:37:23 PM

--- In tuning-math@yahoogroups.com, "Dave Keenan" <d.keenan@b...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:

> > Thanks. I am looking to find a program to multiply and invert
matrices
> > (short of buying Mathematica).
>
> ... or MATLAB.

Or Maple, if you would like to use my Maple routines. There are
freeware programs that can do this, for example Pari.

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/24/2003 9:00:41 AM

--- In tuning-math@yahoogroups.com, Graham Breed <graham@m...> wrote:
> Paul G Hjelmstad wrote:
>
> > I don't know, what's g? What it seems to be telling you is that
the
> tempered fifth measured in octaves is the fractional part of (log2
(3) +
> log2(5))/5 and the tempered major third is the fractional part of
> (log2(3) + log2(5))*4/5. In fact, you need to add or subtract
arbitrary
> 1/5s to get the right answer. So the tempered fifth is
>
> >>> ((math.log(3) + math.log(5))/math.log(2)/5-0.2)%1
> 0.58137811912170378
>
> octaves and the tempered major third is
>
> >>> ((math.log(3) + math.log(5))/math.log(2) * 4/5 + 0.2)%1
> 0.32551247648681514
>
> octaves. I get the feeling I didn't appreciate this sublety when I
> wrote that original page.
>
Have been crunching matrices in Excel. Using the above, for 225/224
and 2401/2400 tempered out I get a really bad 643 cents for a perfect
fifth, a very good 386 cents for a major third and a good seventh at
1029 cents. I still don't see how matrix operations are used to get a
mapping of generators to primes, though Thanks
> Graham

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

10/24/2003 11:40:45 AM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> --- In tuning-math@yahoogroups.com, Graham Breed <graham@m...>
wrote:
> > Paul G Hjelmstad wrote:
> >
> > > I don't know, what's g? What it seems to be telling you is
that
> the
> > tempered fifth measured in octaves is the fractional part of (log2
> (3) +
> > log2(5))/5 and the tempered major third is the fractional part of
> > (log2(3) + log2(5))*4/5. In fact, you need to add or subtract
> arbitrary
> > 1/5s to get the right answer. So the tempered fifth is
> >
> > >>> ((math.log(3) + math.log(5))/math.log(2)/5-0.2)%1
> > 0.58137811912170378
> >
> > octaves and the tempered major third is
> >
> > >>> ((math.log(3) + math.log(5))/math.log(2) * 4/5 + 0.2)%1
> > 0.32551247648681514
> >
> > octaves. I get the feeling I didn't appreciate this sublety when
I
> > wrote that original page.
> >
> Have been crunching matrices in Excel. Using the above, for 225/224
> and 2401/2400 tempered out I get a really bad 643 cents for a
perfect
> fifth, a very good 386 cents for a major third and a good seventh
at
> 1029 cents. I still don't see how matrix operations are used to get
a
> mapping of generators to primes, though Thanks
> > Paul
First, sorry to make it look like this came from Graham. Second,
I found an error in my original matrix. Fixed that and Voila, there
it is 6, -7, and -2 which give g^6, g^-7 and g^-2, which is the
correct answer for tempering out 225/224 and 2401/2400. No need to
explain anything!

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

3/10/2004 12:36:24 PM

I need a quick refresher. Would someone please remind me how
period-and-generators are found, from two temperaments (say 12&19)
without using wedgies (Not that I have anything against them...)

I know how to find them from commas, and from wedgies, and I have
Graham's Python code, so I can calculate them, just need to be
reminded what's behind the calculations. Once generators-to-primes
are found, I understand how rms is applied etc.

Thanx

Paul Hj

🔗Paul Erlich <perlich@aya.yale.edu>

3/10/2004 1:00:28 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:
> I need a quick refresher. Would someone please remind me how
> period-and-generators are found, from two temperaments (say 12&19)
> without using wedgies (Not that I have anything against them...)

One way: The period is 1 octave divided by the gcd of the 2 numbers.
The generator corresponds to the interval in one ET that is the
closest to an interval in the other ET, without being exactly
identical.

🔗Gene Ward Smith <gwsmith@svpal.org>

3/10/2004 1:50:03 PM

--- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
<paul.hjelmstad@u...> wrote:

> I need a quick refresher. Would someone please remind me how
> period-and-generators are found, from two temperaments (say 12&19)
> without using wedgies (Not that I have anything against them...)

Do you mean from two vals for 12 and 19, or simply from 12 and 19? If
the latter, the method I've been talking about for two relatively
prime numbers such as 12 and 19--call them a and b--is to take the
penultimate continued fraction convergent to a/b, call it u/v. Then
(u+v)/(a+b) is a generator of (a+b)-equal corresponding to a and b. In
the case of 12 and 19, 7/11 is the penultimate convergent to 12/19,
and so we get (7+11)/(12+19) = 18/31 as a generator.

🔗Gene Ward Smith <gwsmith@svpal.org>

3/10/2004 2:00:30 PM

--- In tuning-math@yahoogroups.com, "Paul Erlich" <perlich@a...> wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
> > I need a quick refresher. Would someone please remind me how
> > period-and-generators are found, from two temperaments (say 12&19)
> > without using wedgies (Not that I have anything against them...)
>
> One way: The period is 1 octave divided by the gcd of the 2 numbers.
> The generator corresponds to the interval in one ET that is the
> closest to an interval in the other ET, without being exactly
> identical.

Using continued fractions, this would go, for a and b not necessarily
relatively prime, period = 1/gcd(a,b), and the generator is found as
before. For instance, the penultimate convergent to 10/12 is 4/5, and
so the generator is (4+5)/(10+12), or 9/22 (pajara with a fourth as
generator.)

🔗Paul G Hjelmstad <paul.hjelmstad@us.ing.com>

3/10/2004 2:25:26 PM

--- In tuning-math@yahoogroups.com, "Gene Ward Smith" <gwsmith@s...>
wrote:
> --- In tuning-math@yahoogroups.com, "Paul G Hjelmstad"
> <paul.hjelmstad@u...> wrote:
>
> > I need a quick refresher. Would someone please remind me how
> > period-and-generators are found, from two temperaments (say 12&19)
> > without using wedgies (Not that I have anything against them...)
>
> Do you mean from two vals for 12 and 19, or simply from 12 and 19?

I actually meant two vals for 12 and 19, but below is good to know
anyway...I thought maybe there was a way to calculate generator-to-
primes using matrix math, even though the wedge method is sufficient
for getting results (as in message 8953)

If
> the latter, the method I've been talking about for two relatively
> prime numbers such as 12 and 19--call them a and b--is to take the
> penultimate continued fraction convergent to a/b, call it u/v. Then
> (u+v)/(a+b) is a generator of (a+b)-equal corresponding to a and b.
In
> the case of 12 and 19, 7/11 is the penultimate convergent to 12/19,
> and so we get (7+11)/(12+19) = 18/31 as a generator.

🔗Paul G Hjelmstad <paul.hjelmstad@medtronic.com>

8/8/2004 9:43:44 AM

Could Graham or someone remind me how to derive period and generator
when you know two temperaments and the limit? (If I knew how to read
Python code I suppose I could look at Grahams website)

For example, how do you get 0, -1, -4 from knowing 12, 19, and 5?
I know how to derive this from a matrix of commas, just don't
remember how to do this based on knowing two temperaments

Thanks

Paul Hj

🔗Graham Breed <graham@microtonal.co.uk>

8/8/2004 11:14:24 AM

Paul G Hjelmstad wrote:
> Could Graham or someone remind me how to derive period and generator
> when you know two temperaments and the limit? (If I knew how to read > Python code I suppose I could look at Grahams website)

There's a page here

http://local.microtonal.co.uk/temper/method.html

with no Python.

> For example, how do you get 0, -1, -4 from knowing 12, 19, and 5?
> I know how to derive this from a matrix of commas, just don't > remember how to do this based on knowing two temperaments

Let me know if you have trouble. I think Carl suggested some changes to the write-up, but I didn't get around to implementing them.

Graham