POTE tuning: Difference between revisions

X31eq (talk | contribs)
Links for the side issue of pitch inflation. I think we're allowed to link to Wikipedia. I couldn't find a citation for the specific issue of pianos driving the pitch up although I believe this is the case. It doesn't matter either way for the usefulness of POTE
Computation: perhaps a more modular approach
Line 43: Line 43:
The tuning of the POTE [[generator]] corresponding to the mapping ''V'' is therefore 0.31696 octaves, or 380.352 cents. Naturally, this only gives the single POTE generator in the rank-2 case, but the POTE tuning can still be found in this way for mappings defining higher-rank temperaments. The method can be generalized to subgroup temperaments, treating the formal prime represented by the first column as the [[equave]].  
The tuning of the POTE [[generator]] corresponding to the mapping ''V'' is therefore 0.31696 octaves, or 380.352 cents. Naturally, this only gives the single POTE generator in the rank-2 case, but the POTE tuning can still be found in this way for mappings defining higher-rank temperaments. The method can be generalized to subgroup temperaments, treating the formal prime represented by the first column as the [[equave]].  


=== Computer program for TE and POTE ===
=== Computer program ===
Below is a [https://www.python.org/ Python] script that takes a mapping and gives TE and POTE generators, using [https://scipy.org/ Scipy].  
Based on the [https://www.python.org/ Python] script in [[Tenney–Euclidean tuning #Computer program]], here is a variant that takes a mapping and gives POTE generators, using [https://scipy.org/ Scipy].  


<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
Line 50: Line 50:
from scipy import linalg
from scipy import linalg


def find_te (mapping, subgroup):
def te (mapping, subgroup_basis):
     just_tuning_map = np.log2 (subgroup)
     just_tuning_map = 1200*np.log2 (subgroup_basis)
     te_weight = np.diag (1/np.log2 (subgroup))
     te_weight = np.diag (1/np.log2 (subgroup_basis))
     mapping = mapping @ te_weight
     mapping_w = mapping @ te_weight
     just_tuning_map = just_tuning_map @ te_weight
     just_tuning_map_w = just_tuning_map @ te_weight


     te_generators = linalg.lstsq (np.transpose (mapping), just_tuning_map)[0]
     te_generators = linalg.lstsq (np.transpose (mapping_w), just_tuning_map_w)[0]
     te_tuning_map = te_generators @ mapping
     te_tuning_map = te_generators @ mapping
     print (1200*te_generators)
     return te_generators, te_tuning_map
    pote_generators = te_generators/te_tuning_map[0]
    print (1200*pote_generators)


def pote (mapping, subgroup_basis):
    te_generators, te_tuning_map = te (mapping, subgroup_basis)
    pote_generators = te_generators/(te_tuning_map[0]/1200)
    pote_tuning_map = te_tuning_map/(te_tuning_map[0]/1200)
    return pote_generators, pote_tuning_map
</syntaxhighlight>
<syntaxhighlight lang="python">
# taking 7-limit magic as an example ...
# taking 7-limit magic as an example ...
seven_limit = [2, 3, 5, 7]
mapping = np.array ([[1, 0, 2, -1], [0, 5, 1, 12]])
mapping_magic = [[1, 0, 2, -1], [0, 5, 1, 12]]
subgroup_basis = np.array ([2, 3, 5, 7])


# to find TE and POTE you enter
# to find the POTE tuning you enter
find_te (mapping_magic, seven_limit)
pote (mapping, subgroup_basis)
</syntaxhighlight>
</syntaxhighlight>


Output:  
Output:  
<pre>
<pre>
[1201.08240941 380.695113  ]
[1200.       , 380.35203249]
[1200.         380.35203249]
[1200.       , 1901.76016243, 2780.35203249, 3364.22438984]
</pre>
</pre>