POTE tuning: Difference between revisions
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 | === Computer program === | ||
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 | def te (mapping, subgroup_basis): | ||
just_tuning_map = np.log2 ( | just_tuning_map = 1200*np.log2 (subgroup_basis) | ||
te_weight = np.diag (1/np.log2 ( | te_weight = np.diag (1/np.log2 (subgroup_basis)) | ||
mapping_w = mapping @ te_weight | |||
just_tuning_map_w = just_tuning_map @ te_weight | |||
te_generators = linalg.lstsq (np.transpose ( | 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 | ||
return te_generators, te_tuning_map | |||
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 ... | ||
mapping = np.array ([[1, 0, 2, -1], [0, 5, 1, 12]]) | |||
subgroup_basis = np.array ([2, 3, 5, 7]) | |||
# to find | # to find the POTE tuning you enter | ||
pote (mapping, subgroup_basis) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Output: | Output: | ||
<pre> | <pre> | ||
[ | [1200. , 380.35203249] | ||
[1200. | [1200. , 1901.76016243, 2780.35203249, 3364.22438984] | ||
</pre> | </pre> | ||