Projection: Difference between revisions

Cmloegcmluin (talk | contribs)
finally, a dedicated page for documenting information about projection matrices in RTT (previously the best we had was the brief and inscrutable Fractional monzo). please feel free to revise. broken links to D&D articles and missing assets coming soon.
 
Cmloegcmluin (talk | contribs)
some terminology fixes I failed to apply before publishing, oops
Line 18: Line 18:
Perhaps the simplest way to explain the difference would be to say that a mapping outputs intervals in the form of [[generator-count vector]]s, whereas a projection outputs intervals that are also in the form of prime-count vectors.  
Perhaps the simplest way to explain the difference would be to say that a mapping outputs intervals in the form of [[generator-count vector]]s, whereas a projection outputs intervals that are also in the form of prime-count vectors.  


The key reason for this difference is that mappings represent temperaments in the abstract, that is, without any specific tuning information; to find the cents value<ref>Any logarithmic pitch unit — cents, octaves, millioctaves, etc. — may be used, but this article has chosen to consistently use cents.</ref> of a ''mapped'' interval — one that has been mapped by a mapping — one must further map it by a [[generator tuning map]]. On the other hand, a ''projected'' interval — one that has been mapped by a projection, or "projected" — already includes the tuning information, and so their cents value can be obtained by mapping them with the generic [[just tuning map]] for the primes. In other words, the projection has applied tuning to the mapped intervals in a particular way, by embedding them back into the original JI space, where the tuning is known, so all we're really doing at that point is sizing the interval.
The key reason for this difference is that mappings represent temperaments in the abstract, that is, how intervals are approximated but without any specific information about how to embed them into tuning space; to find the cents value<ref>Any logarithmic pitch unit — cents, octaves, millioctaves, etc. — may be used, but this article has chosen to consistently use cents.</ref> of a ''mapped'' interval — one that has been mapped by a mapping — one must further map it by a [[generator tuning map]]. On the other hand, a ''projected'' interval — one that has been mapped by a projection, or "projected" — already includes the embedding information, and so their cents value can be obtained by mapping them with the generic [[just tuning map]] for the primes. In other words, the projection has applied tuning to the mapped intervals in a particular way, by embedding them back into the original JI space, where the tuning is known, so all we're really doing at that point is sizing the interval.


While a projection maps one prime-count vector to another prime-count vector, the output prime-count vector is usually quite different from the input prime-count vector. Most notably, the input interval is justly intoned, and therefore the entries of its prime-count vector are integers, while the output interval is tempered, and therefore the entries of its prime-count vector may be non-integers. Some temperament tunings are chosen so that certain JI intervals remain unchanged by the temperament; in such cases, if the input interval is one of the unchanged intervals, then its output will exactly match the input.  
While a projection maps one prime-count vector to another prime-count vector, the output prime-count vector is usually quite different from the input prime-count vector. Most notably, the input interval is justly intoned, and therefore the entries of its prime-count vector are integers, while the output interval is tempered, and therefore the entries of its prime-count vector may be non-integers. Some temperament tunings are chosen so that certain JI intervals remain unchanged by the temperament; in such cases, if the input interval is one of the unchanged-intervals, then its output will exactly match the input.  


===The tuning map===
===The tuning map===
Line 30: Line 30:
===The generator embedding===
===The generator embedding===


A projection matrix may be found as the combination of a mapping with a generator embedding, through matrix multiplication. The mapping represents the temperament information in the abstract, i.e. abstracted from any specific tuning, while the generator embedding specifies such a tuning. And so together, the projection matrix represents the specific tuning of the given temperament, de-abstracting it.
A projection matrix may be found as the combination of a mapping with a generator embedding, through matrix multiplication. The mapping represents the approximation information in the abstract, i.e. abstracted from any specific embedding, while the generator embedding specifies such a embedding. And so together, the projection matrix represents the specific embedding of the given approximation, or in other words, specific tuning of the given temperament, de-abstracting it.


Multiplying the mapping and generator embedding together in the opposite order, <math>MG</math>, instead gives an identity matrix, <math>I</math>. Using the example of 1/4-comma meantone again, {{rket|{{map|1 1 0}} {{map|0 1 4}}}}{{rbra|{{vector|1 0 0}} {{vector|0 0 1/4}}}} = {{rbra|{{rket|1 0}} {{rket|0 1}}}}. This simply proves that the generator embedding is, in fact, a matrix of generators.
Multiplying the mapping and generator embedding together in the opposite order, <math>MG</math>, instead gives an identity matrix, <math>I</math>. Using the example of 1/4-comma meantone again, {{rket|{{map|1 1 0}} {{map|0 1 4}}}}{{rbra|{{vector|1 0 0}} {{vector|0 0 1/4}}}} = {{rbra|{{rket|1 0}} {{rket|0 1}}}}. This simply proves that the generator embedding is, in fact, a matrix of generators.
Line 92: Line 92:
In order to understand projections, it is critical to understand the lesser-used and lesser-understood half of them: the generator embedding. So let's briefly cover this object next.
In order to understand projections, it is critical to understand the lesser-used and lesser-understood half of them: the generator embedding. So let's briefly cover this object next.


A '''generator embedding'''  is an object that represents the ''tuning'' of a [[regular temperament]]. It has one column for each of the temperament's [[generators]]. Each of these columns represents its generator's tuning in the form of a prime-count vector.
A '''generator embedding'''  is an object that represents the ''embedding'' of a [[regular temperament]] from the tempered lattice back into tuning space. It could be thought of as representing the "tuning" information of a temperament, if one leaves out the actual "sizing" part of that (the conversion of prime factors to their logarithmic pitch size). It has one column for each of the temperament's [[generators]]. Each of these columns represents its generator's tuning in the form of a prime-count vector.


===With respect to the generator tuning map===
===With respect to the generator tuning map===


A more common way to view the tuning information of a temperament than as a generator ''basis'' is as a [[generator tuning map|generator ''tuning map'']]. A generator tuning map <math>𝒈</math> is closely related to the generator embedding <math>G</math>; it is simply <math>G</math> left-multiplied by the [[just tuning map]] <math>𝒋</math><ref>Similarly, the projection matrix, when left-multiplied by <math>𝒋</math>, gives the ''temperament'' [[tuning map]] <math>𝒕</math>, usually referred to simply as the "tuning map" for short. 1/4-comma meantone's <math>𝒕</math> is {{map|1.000 1.585 2.232}}·{{ket|{{map|1 1 0}} {{map|0 0 0}} {{map|0 1/4 1}}}} = {{map|1.000 1.580 2.232}}. This is clearly closely related to the just tuning map, which represents the tuning of JI.</ref> (see [[Dave Keenan & Douglas Blumeyer's guide to RTT: units analysis#Just tuning map, generator embedding: generator tuning map]]). For example, since meantone is 5-limit, its just tuning map is {{map|log₂2 log₂3 log₂5}} ≈ {{map|1.000 1.585 2.232}}, so 1/4-comma meantone's <math>𝒈</math> is {{map|1.000 1.585 2.232}}·{{rbra|{{vector|1 0 0}} {{vector|0 0 1/4}}}} = {{map|1.000 0.580}}, or in cents instead of octaves, that's {{map|1200.000 696.578}}.  
A more common way to view the tuning of a temperament than as a generator ''embedding'' is as a [[generator tuning map|generator ''tuning map'']]. In cases where tuning is thought of as approximation followed by embedding, the generator tuning map <math>𝒈</math> is closely related to the generator embedding <math>G</math>; it is simply <math>G</math> left-multiplied by the [[just tuning map]] <math>𝒋</math><ref>Similarly, the projection matrix, when left-multiplied by <math>𝒋</math>, gives the ''temperament'' [[tuning map]] <math>𝒕</math>, usually referred to simply as the "tuning map" for short. 1/4-comma meantone's <math>𝒕</math> is {{map|1.000 1.585 2.232}}·{{ket|{{map|1 1 0}} {{map|0 0 0}} {{map|0 1/4 1}}}} = {{map|1.000 1.580 2.232}}. This is clearly closely related to the just tuning map, which represents the tuning of JI.</ref> (see [[Dave Keenan & Douglas Blumeyer's guide to RTT: units analysis#Just tuning map, generator embedding: generator tuning map]]). For example, since meantone is 5-limit, its just tuning map is {{map|log₂2 log₂3 log₂5}} ≈ {{map|1.000 1.585 2.232}}, so 1/4-comma meantone's <math>𝒈</math> is {{map|1.000 1.585 2.232}}·{{rbra|{{vector|1 0 0}} {{vector|0 0 1/4}}}} = {{map|1.000 0.580}}, or in cents instead of octaves, that's {{map|1200.000 696.578}}.  


Many popular regular temperament tuning schemes work by optimizing for the entries of <math>𝒈</math> directly, and many times it's not helpful or insightful to view the generators in non-integer prime-count vector form, which are reasons for <math>𝒈</math>'s popularity over <math>G</math>. Some practitioners may not even view tuning as an optimization problem and will simply choose values for <math>𝒈</math> on gut feeling. This is all to say that this idea of approximating and then re-embedding, AKA projecting, is not an inherently necessary feature of RTT; it is only one way to look at it which may be valuable to some musicians and theoreticians but completely bonkers-seeming and convoluted to others.
Many popular regular temperament tuning schemes work by optimizing for the entries of <math>𝒈</math> directly, and many times it's not helpful or insightful to view the generators in non-integer prime-count vector form, which are reasons for <math>𝒈</math>'s popularity over <math>G</math>. Some practitioners may not even view tuning as an optimization problem and will simply choose values for <math>𝒈</math> on gut feeling. This is all to say that this idea of approximating and then re-embedding, AKA projecting, is not an inherently necessary feature of RTT; it is only one way to look at it which may be valuable to some musicians and theoreticians but completely bonkers-seeming and convoluted to others.
Line 122: Line 122:
==Uniqueness==
==Uniqueness==


As just mentioned, projection matrices represent specific tunings of abstract temperaments, being the matrix product of a generator embedding which provides the tuning information, and a mapping which provides the temperament information. Notably, not only does the projection matrix represent the tuning of a temperament, it does so ''uniquely''. We can say that mappings and generator bases contain not only tuning and temperament information, but also ''generator-size'' information, and it is this generator-size information which causes them to be non-unique; however, when they are combined into a projection matrix, their generator-size information ''cancels out'', and so no matter which combination of matching mapping and generator embedding we choose for a given temperament tuning, we will end up with the same exact projection.<ref>The present author is not sure if any combination of mapping and generator embedding should lead to a projection matrix, and what the conditions on this would be. If anyone can figure this out, please add it to the article.</ref>
As just mentioned, projection matrices represent specific tunings of abstract temperaments, being the matrix product of a generator embedding which provides the embedding information, and a mapping which provides the approximation information. Notably, not only does the projection matrix represent the tuning of a temperament, it does so ''uniquely''. We can say that mappings and generator embeddings contain not only approximation and embedding information, but also ''generator form'' information, and it is this generator form information which causes them to be non-unique; however, when they are combined into a projection matrix, their generator form information ''cancels out'', and so no matter which combination of matching mapping and generator embedding we choose for a given temperament tuning, we will end up with the same exact projection.<ref>The present author is not sure if any combination of mapping and generator embedding should lead to a projection matrix, and what the conditions on this would be. If anyone can figure this out, please add it to the article.</ref>


===Mapping non-uniqueness===
===Mapping non-uniqueness===


To be clear, a mapping matrix does ''not'' uniquely represent temperament information. Multiple mappings can be found that describe the same temperament, in the sense that the same set of [[commas]] are [[Tempering_out|vanished]]. This non-uniqueness is the reason why a [[canonical form]] for mappings was developed, which can be understood as a function which takes any equivalent mapping and converts it to the same exact mapping.  
To be clear, a mapping matrix does ''not'' uniquely represent approximation information. Multiple mappings can be found that describe the same temperament, in the sense that the same set of [[commas]] are [[Tempering_out|vanished]]. This non-uniqueness is the reason why a [[canonical form]] for mappings was developed, which can be understood as a function which takes any equivalent mapping and converts it to the same exact mapping.  


What distinguishes these equivalent mappings from each other is the sizes of the generators they use.  
What distinguishes these equivalent mappings from each other is the sizes of the generators they use.  
Line 174: Line 174:




which technically vanishes the [[meantone comma]] <math>\frac{81}{80}</math> — the main requirement of being a meantone temperament — but it has a period of 76 ¢ and generator of 41 ¢, which is pretty strange indeed.  
which technically vanishes the [[meantone comma]] <math>\frac{81}{80}</math> — the main requirement of being a meantone temperament — but it has a period of about 76 ¢ and generator of about 41 ¢, which is pretty strange indeed.  


What we can say is that generator-size information differentiates these forms of the meantone mapping.<ref>There is a way to represent temperament information without generator-size information, which therefore means a data structure which inherently uniquely represents temperaments, and that is a [[multimap]] (at this time, however, this author is not aware if there is an equivalent structure for uniquely representing tuning information independent of generator-size information, or of representing generator-size information independent of either tuning or temperament information).</ref>
What we can say is that generator form information differentiates these forms of the meantone mapping.<ref>There is a way to represent approximation information without generator form information, which therefore means a data structure which inherently uniquely represents temperaments, and that is a [[multimap]].</ref>


===Matching generator bases===
===Matching generator embeddings===


For a given temperament tuning, such as [[quarter-comma meantone]], each possible form of the mapping will be matched with a generator embedding which it multiplies together with to find the unique quarter-comma meantone projection matrix. For example, for the {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} version we gave above which describes meantone in terms of an octave and a fifth, the matching generator embedding is:
For a given temperament tuning, such as [[quarter-comma meantone]], each possible form of the mapping will be matched with a generator embedding which it multiplies together with to find the unique quarter-comma meantone projection matrix. For example, for the {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} version we gave above which describes meantone in terms of an octave and a fifth, the matching generator embedding is:
Line 284: Line 284:
The way to transform from one mapping form <math>M_1</math> to another equivalent mapping form <math>M_2</math> is to perform elementary row operations, the most common of which is to add some multiple of one row to another (or subtract some multiple of one row from another). For more information on this, please see [[Dave Keenan & Douglas Blumeyer's guide to RTT: mappings#Adding and subtracting rows|the detailed explanation here]]. Similarly, we can transform from one generator embedding <math>G_1</math> to another equivalent generator embedding <math>G_2</math> by performing elementary ''column'' operations.  
The way to transform from one mapping form <math>M_1</math> to another equivalent mapping form <math>M_2</math> is to perform elementary row operations, the most common of which is to add some multiple of one row to another (or subtract some multiple of one row from another). For more information on this, please see [[Dave Keenan & Douglas Blumeyer's guide to RTT: mappings#Adding and subtracting rows|the detailed explanation here]]. Similarly, we can transform from one generator embedding <math>G_1</math> to another equivalent generator embedding <math>G_2</math> by performing elementary ''column'' operations.  


Supposing one desires to transform from a pair of <math>M_1</math> and <math>G_1</math> to another pair of <math>M_2</math> and <math>G_2</math> where both pairs multiply to the same <math>P</math>, or — said another way — you wish to keep your <math>M</math> and <math>G</math> ''in sync'', the simplest approach would be to — for each elementary row operation you apply to <math>M</math> you must apply the opposite elementary column operation to <math>G</math>, e.g. if you add three times the second row to the first row of <math>M</math>, then you must ''subtract'' three times the second ''column'' from the first ''column'' of <math>G</math>. This is along the same lines as the explanations provided for manipulating generator-size by changing forms of <math>M</math>, which you can find here: [[Generator form manipulation]].
Supposing one desires to transform from a pair of <math>M_1</math> and <math>G_1</math> to another pair of <math>M_2</math> and <math>G_2</math> where both pairs multiply to the same <math>P</math>, or — said another way — you wish to keep your <math>M</math> and <math>G</math> ''in sync'', the simplest approach would be to — for each elementary row operation you apply to <math>M</math> you must apply the opposite elementary column operation to <math>G</math>, e.g. if you add three times the second row to the first row of <math>M</math>, then you must ''subtract'' three times the second ''column'' from the first ''column'' of <math>G</math>. This is along the same lines as the explanations provided for manipulating generator form by changing forms of <math>M</math>, which you can find here: [[Generator form manipulation]].


For example, if we have <math>M_1</math> = {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} and <math>G_1</math> = {{bra|{{ket|1 0 0}} {{ket|0 0 <math>\frac14</math>}}}}, then <math>M_1</math> and <math>G_1</math> are in sync because they're both in the form where <math>g_1</math> is ~2 and <math>g_2</math> is ~3/2. Or if we have <math>M_2</math> = {{ket|{{bra|1 0 -4}} {{bra|0 1 4}}}} and <math>G_2</math> = {{bra|{{ket|1 0 0}} {{ket|1 0 <math>\frac14</math>}}}} then they're still in sync because they're both <math>g_1</math> ~2 and <math>g_2</math> ~3 here. But if we mismatched those, they'd be out of sync. Those are both <math>M</math>'s for meantone, and both <math>G</math>'s that can work for quarter-comma meantone, but if you mismatch them with respect to the generator-size information, you won't find the same <math>P</math> by matrix multiplication <math>GM</math>.  
For example, if we have <math>M_1</math> = {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} and <math>G_1</math> = {{bra|{{ket|1 0 0}} {{ket|0 0 <math>\frac14</math>}}}}, then <math>M_1</math> and <math>G_1</math> are in sync because they're both in the form where <math>g_1</math> is ~2 and <math>g_2</math> is ~3/2. Or if we have <math>M_2</math> = {{ket|{{bra|1 0 -4}} {{bra|0 1 4}}}} and <math>G_2</math> = {{bra|{{ket|1 0 0}} {{ket|1 0 <math>\frac14</math>}}}} then they're still in sync because they're both <math>g_1</math> ~2 and <math>g_2</math> ~3 here. But if we mismatched those, they'd be out of sync. Those are both <math>M</math>'s for meantone, and both <math>G</math>'s that can work for quarter-comma meantone, but if you mismatch them with respect to the generator form information, you won't find the same <math>P</math> by matrix multiplication <math>GM</math>.  


(This notion of "sync" is the same idea pointed out in the diagram at the start of the "Obtaining objects from the projection" section below, with the note on <math>G</math> reading "(the one matching M)". And for more information on generator-size information, see the "Information types" below.)
(This notion of "sync" is the same idea pointed out in the diagram at the start of the "Obtaining objects from the projection" section below, with the note on <math>G</math> reading "(the one matching M)". And for more information on generator form information, see the "Generator information types" below.)


We note in particular that putting <math>M</math> and <math>G</math> into their canonical forms independently is not a guarantee that they will remain in sync; canonicalization will not necessarily arrive at the same generator-size information in <math>G</math> as it does in <math>M</math>.
We note in particular that putting <math>M</math> and <math>G</math> into their canonical forms independently is not a guarantee that they will remain in sync; canonicalization will not necessarily arrive at the same generator form information in <math>G</math> as it does in <math>M</math>.


===Form matrix===
===Form matrix===
Line 517: Line 517:
The injection of these <math>F</math> matrices doesn't affect the temperament or tuning in any way. Think about it this way. 9/8 always goes to 193.157 cents in quarter comma meantone, whether you're using the octave-and-fifth form or the octave-and-fourth form or any other form. All the form does is tell you what your generator sizes themselves are. They generate (span) the same space regardless. <math>F</math> is only good for keeping the embedding and approximating parts of your projection in sync when you're changing the basis, that's all. The point is for it to have no effect on the general intervals.
The injection of these <math>F</math> matrices doesn't affect the temperament or tuning in any way. Think about it this way. 9/8 always goes to 193.157 cents in quarter comma meantone, whether you're using the octave-and-fifth form or the octave-and-fourth form or any other form. All the form does is tell you what your generator sizes themselves are. They generate (span) the same space regardless. <math>F</math> is only good for keeping the embedding and approximating parts of your projection in sync when you're changing the basis, that's all. The point is for it to have no effect on the general intervals.


In other words, the service it provides is rather to ''give us a way to speak of the generator form of a temperament with respect to a particular mapping basis and a particular generator embedding.'' In other words, if we possess a scheme for unambiguously determining a "home base" <math>M</math> — such as a [[canonical form]], which we ''do'' have — and we possess a scheme for unambiguously determining a particular embedding — such as any tuning scheme which gives tunings expressible as embeddings (e.g. minimean, miniRMS) — then we now also have a way to describe with cold, hard matrices (i.e. not fuzzier instructions like "octave-fifth") what exact form we wish our generators to be in. We can speak of a pair of a linked bases — the generator embedding treated as a basis, and the mapping treated as a mapping-row basis — as the (generator) '''form''' of a temperament. And so a tuning system can be more fully specified than it could previously, leveraging this conceit.
In other words, the service it provides is rather to ''give us a way to speak of the generator form of a temperament with respect to a particular mapping and a particular generator embedding.'' In other words, if we possess a scheme for unambiguously determining a "home base" <math>M</math> — such as a [[canonical form]], which we ''do'' have — and we possess a scheme for unambiguously determining a particular embedding — such as any tuning scheme which gives tunings expressible as embeddings (e.g. minimean, miniRMS) — then we now also have a way to describe with cold, hard matrices (i.e. not fuzzier instructions like "octave-fifth") what exact form we wish our generators to be in. We can speak of a pair of a linked bases — the generator embedding treated as a basis, and the mapping treated as a mapping-row basis — as the (generator) '''form''' of a temperament. And so a tuning system can be more fully specified than it could previously, leveraging this conceit.


It may be helpful to define <math>M_{\text{c}}</math> as the canonical mapping, the one in canonical form, and <math>G_{\text{c}}</math> as the one in "corresponding form" form to the canonical form of the mapping, i.e. per whichever tuning scheme is being used, it's the <math>G</math> you get from <math>M_{\text{c}}</math>. In this case, then with respect to <math>P_{\text{c}} = G_{\text{c}}M_{\text{c}}</math>, any <math>M_{\text{x}}</math> and <math>G_{\text{x}}</math> are viable so long as <math>M_{\text{c}} = F_{\text{x}}M_{\text{x}}</math> and <math>G_{\text{c}} = G_{\text{x}}F_{\text{x}}^{-1}</math> for some generator form <math>F_{\text{x}}</math>.
It may be helpful to define <math>M_{\text{c}}</math> as the canonical mapping, the one in canonical form, and <math>G_{\text{c}}</math> as the one in "corresponding form" form to the canonical form of the mapping, i.e. per whichever tuning scheme is being used, it's the <math>G</math> you get from <math>M_{\text{c}}</math>. In this case, then with respect to <math>P_{\text{c}} = G_{\text{c}}M_{\text{c}}</math>, any <math>M_{\text{x}}</math> and <math>G_{\text{x}}</math> are viable so long as <math>M_{\text{c}} = F_{\text{x}}M_{\text{x}}</math> and <math>G_{\text{c}} = G_{\text{x}}F_{\text{x}}^{-1}</math> for some generator form <math>F_{\text{x}}</math>.
Line 654: Line 654:
===Unrotated vectors and scaling factors===
===Unrotated vectors and scaling factors===


A <math>(d, d)</math>-shaped projection matrix represents both all of the [[comma]]s of a temperament as well as all of the [[unchanged interval]]s of the tuning. It does so via <math>d</math> '''unrotated vectors''', which is to say, this projection only ''scales'' the vector. Each one of these unrotated vectors, then, is paired with a corresponding '''scaling factor''', which tells us by how much the projection scales it. Each of these scaling factors — which we'll represent with the Greek letter lambda <math>λ</math> — is equal to either 1 or 0, and no other value is possible (more on this in the next section).
A <math>(d, d)</math>-shaped projection matrix represents both all of the [[comma]]s of a temperament as well as all of the [[unchanged-interval]]s of the tuning. It does so via <math>d</math> '''unrotated vectors''', which is to say, this projection only ''scales'' the vector. Each one of these unrotated vectors, then, is paired with a corresponding '''scaling factor''', which tells us by how much the projection scales it. Each of these scaling factors — which we'll represent with the Greek letter lambda <math>λ</math> — is equal to either 1 or 0, and no other value is possible (more on this in the next section).


* When a scaling factor is equal to 1, this essentially means "no scaling", since multiplying something by 1 has no effect; so, these unrotated vectors are ''also'' unscaled vectors, which means they are completely unchanged. In other words, these are the unchanged intervals of this tuning of this temperament.
* When a scaling factor is equal to 1, this essentially means "no scaling", since multiplying something by 1 has no effect; so, these unrotated vectors are ''also'' unscaled vectors, which means they are completely unchanged. In other words, these are the unchanged-intervals of this tuning of this temperament.
* When a scaling factor is equal to 0, this means the projection scales it down to nothing. These, then, are the commas of the temperament. These are technically unrotated vectors, in the sense that rotation is no longer meaningful for something that has been vanished.
* When a scaling factor is equal to 0, this means the projection scales it down to nothing. These, then, are the commas of the temperament. These are technically unrotated vectors, in the sense that rotation is no longer meaningful for something that has been vanished.


Line 763: Line 763:




In general, it is an <math>r × d</math> matrix where <math>r = d</math>, or in other words, a <math>d × d</math> matrix. Whereas a rank-2 temperament in 5-limit still boasts three columns (those correspond to the 3 basis primes of the 5-limit), but only has two rows, corresponding to how it has reduced the three generators of pure JI down to two generators approximating JI:
In general, it is an <math>r × d</math> matrix where <math>r = d</math>, or in other words, a <math>d × d</math> matrix. Whereas a rank-2 temperament in 5-limit still boasts three columns (those correspond to the 3 primes of the 5-limit), but only has two rows, corresponding to how it has reduced the three generators of pure JI down to two generators approximating JI:




Line 790: Line 790:
projects all the vectors of the 3-dimensional space of 5-limit JI onto a 2-dimensional plane. On one hand, how could it not — it is, after all, an object representing a tuning of meantone, which is definitely a rank-2 temperament. But on the other hand, this projection matrix has three rows. So how can we reconcile this situation?  
projects all the vectors of the 3-dimensional space of 5-limit JI onto a 2-dimensional plane. On one hand, how could it not — it is, after all, an object representing a tuning of meantone, which is definitely a rank-2 temperament. But on the other hand, this projection matrix has three rows. So how can we reconcile this situation?  


Here's one way to think about it. When we look at a mapping matrix like meantone's {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} above, we're basically plotting vectors in a brand-new 2D space, that is, one completely distinct from the 3D space we started with in JI. So while the <math>x</math>, <math>y</math>, and <math>z</math> axes for JI corresponded to our basis primes <math>\text{p}_1</math>, <math>\text{p}_2</math>, and <math>\text{p}_3</math>, our <math>x</math> and <math>y</math> axes (no <math>z</math> here!) of our new meantone space correspond to its generators <math>\text{g}_1</math> and <math>\text{p}_2</math>. That's how ''its'' 2D plane exists. However, as for a tuning of meantone's projection matrix, such as quarter-comma's, it remains in the original 3D space with the <math>\text{p}_1</math>, <math>\text{p}_2</math>, and <math>\text{p}_3</math> axes. What this means is that everything in that space gets projected — or smooshed down, you could think of it — into a single plane. So this plane is 2D, certainly, but importantly, it still requires three coordinates to describe ''because it exists titled at some angle through the original JI space''. It is a 2D object occupying 3D space, just like any 2D document you might have in your real-life 3D physical space sitting up on a bookshelf at some slight angle.  
Here's one way to think about it. When we look at a mapping matrix like meantone's {{ket|{{bra|1 1 0}} {{bra|0 1 4}}}} above, we're basically plotting vectors in a brand-new 2D space, that is, one completely distinct from the 3D space we started with in JI. So while the <math>x</math>, <math>y</math>, and <math>z</math> axes for JI corresponded to our primes <math>\text{p}_1</math>, <math>\text{p}_2</math>, and <math>\text{p}_3</math>, our <math>x</math> and <math>y</math> axes (no <math>z</math> here!) of our new meantone space correspond to its generators <math>\text{g}_1</math> and <math>\text{p}_2</math>. That's how ''its'' 2D plane exists. However, as for a tuning of meantone's projection matrix, such as quarter-comma's, it remains in the original 3D space with the <math>\text{p}_1</math>, <math>\text{p}_2</math>, and <math>\text{p}_3</math> axes. What this means is that everything in that space gets projected — or smooshed down, you could think of it — into a single plane. So this plane is 2D, certainly, but importantly, it still requires three coordinates to describe ''because it exists titled at some angle through the original JI space''. It is a 2D object occupying 3D space, just like any 2D document you might have in your real-life 3D physical space sitting up on a bookshelf at some slight angle.  


  TODO: diagram, at least one diagram here would be really valuable; perhaps this will help https://app.asana.com/0/1200134195404323/1201659347245292. also plane always flat at bottom projection diagram - might be easier to discern how least-squares points straight up and others are at an angle - as opposed to having the x/y/z axes always in the same position and then try to figure out what angle is this plane oriented through the space. this could help too: https://stackoverflow.com/questions/42893410/how-to-get-the-tilt-angle-of-a-plane-defined-by-three-coordinates-in-python
  TODO: diagram, at least one diagram here would be really valuable; perhaps this will help https://app.asana.com/0/1200134195404323/1201659347245292. also plane always flat at bottom projection diagram - might be easier to discern how least-squares points straight up and others are at an angle - as opposed to having the x/y/z axes always in the same position and then try to figure out what angle is this plane oriented through the space. this could help too: https://stackoverflow.com/questions/42893410/how-to-get-the-tilt-angle-of-a-plane-defined-by-three-coordinates-in-python
Line 816: Line 816:
===Tunings and commas===
===Tunings and commas===


Any projection will occupy some line/plane/space/etc. that is perpendicular to all of the temperaments commas' vectors, no matter what the tuning happens to be. What differentiates one tuning from another is what path all the other intervals take onto the projection. Remember how we described projections earlier as distortion fields with curvy vortices something like how we might see warm and cold fronts on a weather map, and among those waves of distortion one will occasionally find paths or spots where the distortion works out perfectly straight or perfectly still. So any tuning of a temperament will have the same such straight paths for the commas mapping to the origin (the point with all zeros). But the tunings will all be set aside from each other by which unchanged intervals they have, that is, the "eyes of the storm" if you will, the points in space that don't budge at all by the distortion. And whatever these are will be part of the complicated distortion field that leads to all the other non-eigenvector intervals landing somewhere or another on that set projection line/plane/space (its dimensionality depends on the rank of the temperament).
Any projection will occupy some line/plane/space/etc. that is perpendicular to all of the temperaments commas' vectors, no matter what the tuning happens to be. What differentiates one tuning from another is what path all the other intervals take onto the projection. Remember how we described projections earlier as distortion fields with curvy vortices something like how we might see warm and cold fronts on a weather map, and among those waves of distortion one will occasionally find paths or spots where the distortion works out perfectly straight or perfectly still. So any tuning of a temperament will have the same such straight paths for the commas mapping to the origin (the point with all zeros). But the tunings will all be set aside from each other by which unchanged-intervals they have, that is, the "eyes of the storm" if you will, the points in space that don't budge at all by the distortion. And whatever these are will be part of the complicated distortion field that leads to all the other non-eigenvector intervals landing somewhere or another on that set projection line/plane/space (its dimensionality depends on the rank of the temperament).


==Obtaining objects from the projection==
==Obtaining objects from the projection==
Line 837: Line 837:
To obtain the comma basis from <math>P</math>, simply take the nullspace as you would take it of the mapping (see [[Dave Keenan & Douglas Blumeyer's guide to RTT: exploring temperaments#Nullspace]] for more information).  
To obtain the comma basis from <math>P</math>, simply take the nullspace as you would take it of the mapping (see [[Dave Keenan & Douglas Blumeyer's guide to RTT: exploring temperaments#Nullspace]] for more information).  


Remember, the mapping represents the temperament, and the projection represents a particular tuning of this temperament, so no matter which projection we use, while they will each have their own unchanged intervals, they will share the same commas: the commas of the temperament.
Remember, the mapping represents the temperament, and the projection represents a particular tuning of this temperament, so no matter which projection we use, while they will each have their own unchanged-intervals, they will share the same commas: the commas of the temperament.




Line 843: Line 843:




An alternative method for finding <math>\textrm{C}</math> is discussed in the "Alternative method for the comma and unchanged interval bases" section below.
An alternative method for finding <math>\textrm{C}</math> is discussed in the "Alternative method for the comma and unchanged-interval bases" section below.


===The unchanged interval basis===
===The unchanged-interval basis===


Obtaining the unchanged interval basis <math>\textrm{U}</math> means to obtain the unchanged intervals <math>\textbf{u}_1, \textbf{u}_2, …</math> of <math>P</math> or in other words any <math>\textbf{u}_i</math> for which <math>P\textbf{u}_i = \textbf{u}_i</math>. There are many ways to find these, but one way stands out for its clarity. We can rewrite this equation by subtracting <math>\textbf{u}_i</math> from both sides to get:
Obtaining the unchanged-interval basis <math>\textrm{U}</math> means to obtain the unchanged-intervals <math>\textbf{u}_1, \textbf{u}_2, …</math> of <math>P</math> or in other words any <math>\textbf{u}_i</math> for which <math>P\textbf{u}_i = \textbf{u}_i</math>. There are many ways to find these, but one way stands out for its clarity. We can rewrite this equation by subtracting <math>\textbf{u}_i</math> from both sides to get:




Line 875: Line 875:




An alternative method for finding <math>\textrm{U}</math> is discussed in the "Alternative method for the comma and unchanged interval bases" section below.
An alternative method for finding <math>\textrm{U}</math> is discussed in the "Alternative method for the comma and unchanged-interval bases" section below.


===The mapping===
===The mapping===
Line 889: Line 889:
===The generator embedding===
===The generator embedding===


To obtain (some form of) a generator embedding for a projection, find the unchanged interval basis per the above, and then use <math>G = \textrm{U}(M\textrm{U})^{-1}</math>. For more information, see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Solving for the generators]].
To obtain (some form of) a generator embedding for a projection, find the unchanged-interval basis per the above, and then use <math>G = \textrm{U}(M\textrm{U})^{-1}</math>. For more information, see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Solving for the generators]].


===The unrotated vectors and scaling factors===
===The unrotated vectors and scaling factors===
Line 901: Line 901:




The answer comes in the form of a tuple. The first element is a list of our scaling factors (eigenvalues), and the second element is a list of our unrotated vectors (eigenvectors). So, this result is telling us that for scaling factors 1, 1, and 0, respectively, we have corresponding unrotated vectors {{vector|0 0 1}}, {{vector|1 0 0}}, and {{vector|4 -4 1}}. The set of eigenvectors with eigenvalue 0 constitute a comma basis, while the set of eigenvectors with eigenvalue 1 constitute an unchanged interval basis (so, quarter-comma meantone is characterized by an unchanged <math>\frac21</math> and <math>\frac51</math>).
The answer comes in the form of a tuple. The first element is a list of our scaling factors (eigenvalues), and the second element is a list of our unrotated vectors (eigenvectors). So, this result is telling us that for scaling factors 1, 1, and 0, respectively, we have corresponding unrotated vectors {{vector|0 0 1}}, {{vector|1 0 0}}, and {{vector|4 -4 1}}. The set of eigenvectors with eigenvalue 0 constitute a comma basis, while the set of eigenvectors with eigenvalue 1 constitute an unchanged-interval basis (so, quarter-comma meantone is characterized by an unchanged <math>\frac21</math> and <math>\frac51</math>).


The list of unrotated vectors may be treated as a matrix <math>\mathrm{V}</math>, and the list of scaling factors may be diagonalized (placed along the main diagonal of an otherwise all-zeros matrix) as a matrix <math>\textit{Λ}</math> (that's a capital lambda, the same Greek letter we use the lowercase version of for the individual scaling factors).  
The list of unrotated vectors may be treated as a matrix <math>\mathrm{V}</math>, and the list of scaling factors may be diagonalized (placed along the main diagonal of an otherwise all-zeros matrix) as a matrix <math>\textit{Λ}</math> (that's a capital lambda, the same Greek letter we use the lowercase version of for the individual scaling factors).  
Line 909: Line 909:
By the way, the general method to find scaling factors is to solve the "characteristic equation" <math>\det(P - λI) = 0</math> for <math>λ</math>; that's lamdba times an identity matrix, or in other words, subtract lambda from each entry along <math>P</math>'s diagonal. But this shouldn't be necessary if one follows the other suggestions provided here.
By the way, the general method to find scaling factors is to solve the "characteristic equation" <math>\det(P - λI) = 0</math> for <math>λ</math>; that's lamdba times an identity matrix, or in other words, subtract lambda from each entry along <math>P</math>'s diagonal. But this shouldn't be necessary if one follows the other suggestions provided here.


===Alternative method for the comma and unchanged interval bases===
===Alternative method for the comma and unchanged-interval bases===


This section assumes you've reviewed the immediately previous section.
This section assumes you've reviewed the immediately previous section.
Line 962: Line 962:




On the left, we've highlighted the diagonalized scaling factors with green if they are for unchanged intervals, and with red if they are for vanished commas. Then on the right, we've colored the entire corresponding vector columns, and placed a vertical line between the two green columns corresponding to the two green scaling factors of 1 and the one red column corresponding to the one red scaling factor of 0. And so we can see that the green-colored part of <math>\mathrm{V}</math> is <math>\textrm{U}</math>, and the red-colored part of <math>V</math> is <math>\textrm{C}</math>.
On the left, we've highlighted the diagonalized scaling factors with green if they are for unchanged-intervals, and with red if they are for vanished commas. Then on the right, we've colored the entire corresponding vector columns, and placed a vertical line between the two green columns corresponding to the two green scaling factors of 1 and the one red column corresponding to the one red scaling factor of 0. And so we can see that the green-colored part of <math>\mathrm{V}</math> is <math>\textrm{U}</math>, and the red-colored part of <math>V</math> is <math>\textrm{C}</math>.


==Information types==
==Generator information types==


One way to think about what's happening in this vicinity of RTT is that we have three different information types:  
One way to think about what's happening in this vicinity of RTT is that we have three different generator information types:  
# approximation
# approximation
# embedding
# embedding
# form
# form


Mappings combine types (1) and (3). Generator bases combine types (2) and (3). Projections combine types (1) and (2). So each possible subset of two of these pieces of information is accounted for by these three objects.
Mappings combine types (1) and (3). Generator embeddings combine types (2) and (3). Projections combine types (1) and (2). So each possible subset of two of these pieces of information is accounted for by these three objects.


One advantage of using exterior algebra for RTT, i.e. representing a temperament with a multimap rather than a mapping matrix, is that it isolates the temperament info (1) from the generator-size info (3), i.e. that any equivalent mapping is sent to the same multimap (largest minors list). For more information, see: [[https://en.xen.wiki/w/Douglas_Blumeyer_and_Dave_Keenan%27s_Intro_to_exterior_algebra_for_RTT#Pure_representation_of_temperament_information]]
One advantage of using exterior algebra for RTT, i.e. representing a temperament with a multimap rather than a mapping matrix, is that it isolates the approximation information (1) from the form information (3), i.e. that any equivalent mapping is sent to the same multimap (largest minors list). For more information, see: [[https://en.xen.wiki/w/Douglas_Blumeyer_and_Dave_Keenan%27s_Intro_to_exterior_algebra_for_RTT#Pure_representation_of_temperament_information]]


In a similar way, when you combine a mapping with a generator embedding into a projection, the generator-size info goes away from both, and you're left with just pure temperament and tuning information. We've used color to help convey this idea in the following diagram, with type (1) red, type (2) blue, type (3) green:
In a similar way, when you combine a mapping with a generator embedding into a projection, the generator form information goes away from both, and you're left with just pure approximation and embedding information. We've used color to help convey this idea in the following diagram, with type (1) red, type (2) blue, type (3) green:


  TODO: diagram (but add a j to the arrow on the right, and generally label these arrows because they each mean different things, and italicize the t, and double-struck the m, and rename generator-size information probably), and also show the green stuff splitting out of the G and M into F in the middle
  TODO: diagram (but add a j to the arrow on the right, and generally label these arrows because they each mean different things, and italicize the t, and double-struck the m, and rename to form information), and also show the green stuff splitting out of the G and M into F in the middle


So, when you compress the multi-row projection matrix into a single-row tuning map by multiplying it by the just tuning map <math>𝒋</math>, the two types of information are still there, but blended together such that they are unrecoverable, or in other words, it's now ambiguous how we arrived at this <math>𝒕</math> and could have arrived to it from a different combination of <math>M</math> and <math>G</math>.
So, when you compress the multi-row projection matrix into a single-row tuning map by multiplying it by the just tuning map <math>𝒋</math>, the two types of information are still there, but blended together such that they are unrecoverable, or in other words, it's now ambiguous how we arrived at this <math>𝒕</math> and could have arrived to it from a different combination of <math>M</math> and <math>G</math>.


So again, while the mapping represents temperament information abstracted from any tuning, and the generator embedding represents tuning information that could be applied to any suitable temperament, they are each impure in the sense that they bind their respective informations to a particular size of generator. This is the nature of how they must match to multiply together to give a certain projection. But no matter which two <math>G</math> and <math>M</math> you choose, as long as they do match, then their generator-size information cancels out and we end up with just the temperament and tuning infos.  
So again, while the mapping represents approximation information abstracted from any embedding, and the generator embedding represents embedding information that could be applied to any suitable approximation, they are each impure in the sense that they bind their respective generator information types to a particular form. This is the nature of how they must match to multiply together to give a certain projection. But no matter which two <math>G</math> and <math>M</math> you choose, as long as they do match, then their form information cancels out and we end up with just the approximation and embedding information.  


(The top-left object is something no one has ever spoken about, as far as we know, and we see no use for it. We can't even say what "pure tuning information" would mean, independent of a temperament, or what it would mean to explore that space, in the way theorists have explored multimap space using temperament addition, etc. So we can see that the "multituning", perhaps we could call it, of quarter-comma meantone, is {{multivector|0 ¼ 0}})
(The top-left object is something no one has ever spoken about, as far as we know, and we see no use for it. We can't even say what "pure embedding information" would mean, independent of a temperament, or what it would mean to explore that space, in the way theorists have explored multimap space using temperament addition, etc. So we can see that the "multituning", perhaps we could call it, of quarter-comma meantone, is {{multivector|0 ¼ 0}})


And here's a series of tables that show various parts of the tempering process color-coded according to the above diagram:
And here's a series of tables that show various parts of the tempering process color-coded according to the above diagram:
Line 1,010: Line 1,010:
# those that use the pseudoinverse, such as miniRMS and minimax-ES tunings: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Pseudoinverse method for a miniRMS tuning]] and [[Dave Keenan & Douglas Blumeyer's guide to RTT: all-interval tuning schemes#Minimax-ES]].
# those that use the pseudoinverse, such as miniRMS and minimax-ES tunings: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Pseudoinverse method for a miniRMS tuning]] and [[Dave Keenan & Douglas Blumeyer's guide to RTT: all-interval tuning schemes#Minimax-ES]].
# those that use the sum polytope, such as minimean tunings: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Sum polytope method for a minimean tuning scheme]].
# those that use the sum polytope, such as minimean tunings: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Sum polytope method for a minimean tuning scheme]].
# tunings based on unchanged intervals: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Unchanged interval method]].
# tunings based on unchanged-intervals: see [[Dave Keenan & Douglas Blumeyer's guide to RTT: tuning computation#Unchanged-interval method]].


==See also==
==See also==