Douglas Blumeyer's RTT How-To: Difference between revisions
Cmloegcmluin (talk | contribs) some mapping -> map basis, where appropriate |
Cmloegcmluin (talk | contribs) normal → canonical |
||
Line 248: | Line 248: | ||
The truth about distances between related ETs on the PTS diagram is actually slightly even more complicated than that, though; as we mentioned, the scaled axes are only the first difference from our initial guess. In addition to the effect of the scaling of the axes, there is another effect, which is like a perspective effect. Basically, as ETs get more complex, you can think of them as getting farther and farther away; to suggest this, they are printed smaller and smaller on the page, and the distances between them appear smaller and smaller too. | The truth about distances between related ETs on the PTS diagram is actually slightly even more complicated than that, though; as we mentioned, the scaled axes are only the first difference from our initial guess. In addition to the effect of the scaling of the axes, there is another effect, which is like a perspective effect. Basically, as ETs get more complex, you can think of them as getting farther and farther away; to suggest this, they are printed smaller and smaller on the page, and the distances between them appear smaller and smaller too. | ||
Remember that 5-limit JI is 3D, but we’re viewing it on a 2D page. It’s not the case that its axes are flat on the page. They’re not literally occupying the same plane, 120° apart from each other. That’s just not how axes | Remember that 5-limit JI is 3D, but we’re viewing it on a 2D page. It’s not the case that its axes are flat on the page. They’re not literally occupying the same plane, 120° apart from each other. That’s just not how axes typically work, and it’s not how they work here either! The 5-axis is perpendicular to the 2-axis and 3-axis just like typical Cartesian space. Again, we’re looking only at the positive coordinates, which is to say that this is only the [https://en.wikipedia.org/wiki/Octant_(solid_geometry) +++ octant] of space, which comes to a point at the origin (0,0,0) like the corner of a cube. So you should think of this diagram as showing that cubic octant sticking its corner straight out of the page at us, like a triangular pyramid. So we’re like a tiny little bug, situated right at the tip of that corner, pointing straight down the octant’s interior diagonal, or in other words the line equidistant from three axes, the line which we understand represents theoretically pure JI. So we see that in the center of the page, represented as a red hexagram, and then toward the edges of the page is our peripheral vision. ''(See Figure 3h.)'' | ||
[[File:Understanding projection.png|600px|thumb|left|'''Figure 3h.''' Visualization of the projection process. (In real life, the cube is infinite in size. I made it smaller here to help make the shape clearer.)]] | [[File:Understanding projection.png|600px|thumb|left|'''Figure 3h.''' Visualization of the projection process. (In real life, the cube is infinite in size. I made it smaller here to help make the shape clearer.)]] | ||
Line 290: | Line 290: | ||
So if we take a look at a cross-section of projection again, but in terms of tuning space now ''(see Figure 3k)'', we can see how every point is about the same distance from us. | So if we take a look at a cross-section of projection again, but in terms of tuning space now ''(see Figure 3k)'', we can see how every point is about the same distance from us. | ||
[[File:Tuning space version.png|400px|thumb|right|'''Figure 3k.''' Demonstration of projection in terms of ''tuning'' space (compare with Figure 3i, which shows projection in terms of ''map'' space). As you can see here, all the points are in about the same region of space, since tuning space normalizes nearby JI.]] | [[File:Tuning space version.png|400px|thumb|right|'''Figure 3k.''' Demonstration of projection in terms of ''tuning'' space (compare with Figure 3i, which shows projection in terms of ''map'' space). As you can see here, all the points are in about the same region of space, since tuning space normalizes itself nearby to JI.]] | ||
The other major difference is that tuning space is continuous, where map space is discrete. In other words, to find a map between {{map|6 10 14}} and {{map|6 9 14}}, you’re subdividing it by 2 or 3 and picking a point in between, that sort of thing. But between {{map|1200 2000 2800}} and {{map|1200 1800 2800}} you’ve got an infinitude of choices smoothly transitioning between each other; you’ve basically got knobs you can turn on the proportions of the tuning of 2, 3, and 5. Everything from from {{map|1200 1999.999 2800}} to {{map|1200 1901.955 2800}} to {{map|1200 1817.643 2800}} is along the way. | The other major difference is that tuning space is continuous, where map space is discrete. In other words, to find a map between {{map|6 10 14}} and {{map|6 9 14}}, you’re subdividing it by 2 or 3 and picking a point in between, that sort of thing. But between {{map|1200 2000 2800}} and {{map|1200 1800 2800}} you’ve got an infinitude of choices smoothly transitioning between each other; you’ve basically got knobs you can turn on the proportions of the tuning of 2, 3, and 5. Everything from from {{map|1200 1999.999 2800}} to {{map|1200 1901.955 2800}} to {{map|1200 1817.643 2800}} is along the way. | ||
Line 1,049: | Line 1,049: | ||
On the other side of duality, septimal meantone’s map basis has two rows, corresponding to its two generators. We don’t have PTS for 7-limit JI handy, but because septimal meantone includes, or extends plain meantone, we can still refer to 5-limit PTS, and pick ETs from the meantone line there. The difference is that this time we need to include their 7-term. So the union of {{map|12 19 28 34}} and {{map|19 30 44 53}} would work. But so would {{map|19 30 44 53}} and {{map|31 49 72 87}}. We have an infinitude of options on this side of duality too, but here it’s not because our nullity is greater than 1, but because our rank is greater than 1. | On the other side of duality, septimal meantone’s map basis has two rows, corresponding to its two generators. We don’t have PTS for 7-limit JI handy, but because septimal meantone includes, or extends plain meantone, we can still refer to 5-limit PTS, and pick ETs from the meantone line there. The difference is that this time we need to include their 7-term. So the union of {{map|12 19 28 34}} and {{map|19 30 44 53}} would work. But so would {{map|19 30 44 53}} and {{map|31 49 72 87}}. We have an infinitude of options on this side of duality too, but here it’s not because our nullity is greater than 1, but because our rank is greater than 1. | ||
=== | === canonical form === | ||
Recently we reduced | Recently we reduced | ||
Line 1,082: | Line 1,082: | ||
maps the fourth (4/3, {{vector|2 -1 0 }}) to {{vector|0 1}}. | maps the fourth (4/3, {{vector|2 -1 0 }}) to {{vector|0 1}}. | ||
It’s often the case that a temperament’s nullity is greater than 1 or its rank is greater than 1, and therefore we have an infinitude of equivalent ways of expressing the comma basis or the map basis. This can be problematic, if we want to efficiently communicate about and catalog temperaments. It’s good to have a standardized form in these cases. The approach RTT takes here is to get these matrices into ''' | It’s often the case that a temperament’s nullity is greater than 1 or its rank is greater than 1, and therefore we have an infinitude of equivalent ways of expressing the comma basis or the map basis. This can be problematic, if we want to efficiently communicate about and catalog temperaments. It’s good to have a standardized form in these cases. The approach RTT takes here is to get these matrices into '''“canonical” form'''. In plain words, this just means: we have a function which takes in a matrix and spits out a matrix of the same shape, and no matter which matrix we input from a set of matrices which we consider all to be equivalent to each other, it will spit out the same result. This output is what we call the “canonical” matrix, and it can therefore uniquely identify a temperament. | ||
To be clear, | To be clear, canonical form isn’t necessary to avoid ambiguity: you will never find a comma basis that could represent more than one temperament. | ||
I've seen many specialized matrix forms used in RTT for problems like this, such as Smith normal form, IRREF, [https://en.wikipedia.org/wiki/Hermite_normal_form Hermite Normal Form], and maybe others. What we will be using here, however, is [http://home.iitk.ac.in/~rksr/html/03CANONICALFACTORIZATIONS.htm Hermite ''Canonical'' Form]<ref>Historically, Hermite Normal Form was used as if it gave a unique identifier for each temperament, when in fact it did not. Furthermore, Hermite Normal Form failed to remove possibly-hidden common factors in the columns of comma bases and rows of map bases, situations which were named "[[torsion]]" and "[[contorsion]]", respectively. We use Hermite Canonical Form here because it really does give a unique identifier, and also removes such common factors therefore eliminating the need to deal with torsion or contorsion.</ref>. | |||
For example, the | For example, the canonical form of meantone is: | ||
<math> | <math> | ||
Line 1,097: | Line 1,097: | ||
</math> | </math> | ||
If you take the | If you take the Hermite canonical form of {{vector|{{map|5 8 12}} {{map|7 11 16}}}}, that’s what you get. It’s also what you get if you take the Hermite canonical form of {{vector|{{map|12 19 28}} {{map|19 30 44}}}}, etc. That’s the power of canonicalization. | ||
To find the Hermite canonical form, we can combine the two processes we already know how to do: null-space for getting from a map basis to a comma basis, and undoing null-space to get from a comma basis to a map basis. Basically, to achieve canonical form of one type of basis, we convert it into the other type of basis, then back, and voilà: canonicalization. | |||
Unfortunately, Wolfram Alpha is incapable of computing this in one go. For that, you'll need up your game to Wolfram computable notebooks. It only takes a moment and you can sign up for free. | |||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+Wolfram Language code ([https://www.wolframcloud.com/ sign up for free]) | ||
!input | !input | ||
!output | !output | ||
|- | |- | ||
|<code> | |<code>nullSpaceBasis[m_] := Transpose[NullSpace[m]]</code> | ||
| | |||
<code>vFlip[m_] := Reverse[m]</code> | |||
<code>hFlip[m_] := Reverse[m,2]</code> | |||
<code>antiNullSpaceBasis[m_] := hFlip[Transpose[nullSpaceBasis[Transpose[vFlip[m]]]]]</code> | |||
<code>mapBasisHermiteCanonicalForm[m_] := antiNullSpaceBasis[nullSpaceBasis[m]]</code> | |||
<code>commaBasisHermiteCanonicalForm[m_] := nullSpaceBasis[antiNullSpaceBasis[m]]</code> | |||
<code>mapBasisHermiteCanonicalForm[{{5,8,12},{7,11,16}}]</code> | |||
<code>commaBasisHermiteCanonicalForm[{{-4,-10},{4,-1},{-1,5}}]</code> | |||
|{{1,0,-4},{0,1,4}} | |||
{{-44,-30},{0,19},{19,0}} | |||
|} | |} | ||
Line 1,128: | Line 1,148: | ||
So we mentioned that a multimap is an alternative way to represent a temperament. Let's look at an example now. Meantone's multimap looks like this: {{multicovector|1 4 4}}. As you can see, it is a bicovector, or bimap, because it has two of each bracket. | So we mentioned that a multimap is an alternative way to represent a temperament. Let's look at an example now. Meantone's multimap looks like this: {{multicovector|1 4 4}}. As you can see, it is a bicovector, or bimap, because it has two of each bracket. | ||
Why care about multimaps? Well, a key reason is that they can serve the same purpose as the | Why care about multimaps? Well, a key reason is that they can serve the same purpose as the canonical form of a temperament’s map basis: the process for converting a map basis to a multimap will convert any equivalent map basis to the same exact multimap. In other words, a multimap can serve as a unique identifier for its temperament. | ||
Alright, then, sounds great! But how do I convert a map basis to a multimap? The process is doable. It’s closely related to the wedge product (hence the name “wedgie”), but better known as the '''exterior product'''. We write it with the symbol ∧, which is great because that’s the logical operator for “and”, forming a clear association with the unioning of two ETs. | Alright, then, sounds great! But how do I convert a map basis to a multimap? The process is doable. It’s closely related to the wedge product (hence the name “wedgie”), but better known as the '''exterior product'''. We write it with the symbol ∧, which is great because that’s the logical operator for “and”, forming a clear association with the unioning of two ETs. | ||
Line 1,239: | Line 1,259: | ||
|} | |} | ||
And so our results are <span><math>-2</math></span>, <span><math>3</math></span>, <span><math>1</math></span>, <span><math>-11</math></span>. There's no GCD to extract. We prefer for the first term to be positive; this doesn’t make a difference in how things behave, but is done because it | And so our results are <span><math>-2</math></span>, <span><math>3</math></span>, <span><math>1</math></span>, <span><math>-11</math></span>. There's no GCD to extract. We prefer for the first term to be positive; this doesn’t make a difference in how things behave, but is done because it canonicalizes things (we could have found the result where the first term came out positive by simply changing the order of the rows of our map basis, which doesn’t affect how it works as a mapping at all, or mean there's anything different about the temperament). And so we change the signs<ref>If it helps you, you could think of this sign-changing step as paired with the GCD extraction step, if you think of it like extracting a GCD of -1.</ref>, and our list ends up as <span><math>2</math></span>, <span><math>-3</math></span>, <span><math>-1</math></span>, <span><math>11</math></span>. Finally, set these inside triply-nested brackets, because it’s a trimap for a rank-3 temperament, and we get {{multicovector|rank=3|2 -3 -1 11}}. | ||
As for getting from the multimap back to the map basis, you can solve a system of equations for that. Though it’s not easy and there may not be a unique solution. And you probably will never have the multimap without the map basis anyway. | As for getting from the multimap back to the map basis, you can solve a system of equations for that. Though it’s not easy and there may not be a unique solution. And you probably will never have the multimap without the map basis anyway. | ||
Line 1,500: | Line 1,520: | ||
=== finding approximate JI generators === | === finding approximate JI generators === | ||
=== non-octave periods === | === non-octave periods === |