Godtone (talk | contribs)
m unfinished sentence
Godtone (talk | contribs)
 
(9 intermediate revisions by the same user not shown)
Line 9: Line 9:
* [[User:Godtone/zeta]]
* [[User:Godtone/zeta]]
Whose significance is backed up by the more psychoacoustically-informed tuning metrics I've designed (<code>optimal_edo_sequence</code>s from [[#My Python 3 code]]):
Whose significance is backed up by the more psychoacoustically-informed tuning metrics I've designed (<code>optimal_edo_sequence</code>s from [[#My Python 3 code]]):
* [[User:Godtone/optimal edo sequences]]
* [[User:Godtone/optimal edo sequences]] (and [[User:Godtone/strict_optimal_edo_sequences]])
...as well as by my own knowledge of tuning theory.
...as well as by my own knowledge of tuning theory.


Line 466: Line 466:


== My Python 3 code ==
== My Python 3 code ==
IMPORTANT NOTE: there seems to be a bug for subgroup mappings at the moment, pending investigation, but ideally usage of subgroups should be made far easier too:
IMPORTANT NOTE: there seems to be bugs for subgroup mappings at the moment, pending investigation, but ideally usage of subgroups should be made far easier too:
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
>>> sg = [2, 3, 7, 11, 13, 17, 19]
>>> sg = [2, 3, 7, 11, 13, 17, 19]
Line 1,518: Line 1,518:
return result
return result


# the length of the mediant path of whichever octave-revoicing gives the interval x the least length
def mediant_complexity(x,revoicing_octs=7):
def mediant_complexity(x,revoicing_octs=7):
mincomplexity = 2**30
mincomplexity = 2**30
Line 1,550: Line 1,551:
print()
print()
return spaces
return spaces
# there is only finitely many EDOs which provide some simplification of a set of intervals as contrasted to all-distinct
def efficient_edos( n, inconsistencies=0, min_simplifications=1, edos=range(1,1000) ):
if type(n)==int:
n = odd_lim(n)
elif type(n)==list and type(n[0])==int:
n = odd_lim(1,[],n)
results = []
for edo in edos:
v = edo
if type(v)==int:
v = val( lim(max([ prime_idx(len(fact(x))-1) for x in n ])), ed(edo) )
# else v is assumed to be a mapping
m = dict()
for x in n: # collect mappings of intervals
sedo = map_iv(v,x)
if sedo in m:
m[sedo].append(x)
else:
m[sedo] = [x]
if len(inconsistent_ivs_by_val(n,v)) <= inconsistencies:
if len(n) - len([ sedo for sedo in m ]) >= min_simplifications:
results.append(edo)
return results
# the following definitions are equivalent in the set of commas considered 7-limit dieses:
# dieses(4,odd_lim(9),odd_lim(9)) == dieses(4,odd_lim(9),odd_lim(7)) == dieses(5,odd_lim(9),odd_lim(7))
def dieses( max_n=4, gs=odd_lim(9), targets=None, show=False, minerr=steps(20000/19683,1)/4 ):
if not targets:
targets = gs
dieses_found = dict()
for g in gs:
for target in targets+[(2,1)]:
for n in range(2,max_n+1):
candidate = reduce(div_iv( target, mul_iv(*[g]*n) ))
if steps(candidate,1)>1/2:
candidate = div_iv((2,1),(candidate))
if steps(candidate,1)/n >= steps(20000/19683,1)/4 and steps(250/243,1) >= steps(candidate,1):
if candidate not in dieses_found:
dieses_found[candidate] = []
dieses_found[candidate].append(( n, g, target, steps(candidate,ed(1200))/n ))
if show:
for diesis in dieses_found:
mindamage = min([ dieses_found[diesis][k][3] for k in range(len( dieses_found[diesis] )) ])
if mindamage >= minerr:
def equiv(d):
return ', '.join([ '('+striv(eq[1])+')^'+str(eq[0])+' ~ '+striv(eq[2])+' (~'+
str( int(eq[3]*100+.5)/100 )[:5]+'c)' for eq in dieses_found[d] ])
print(
pad( striv(diesis), 12 ),
pad( str( int(mindamage*100+.5)/100 )[:6]+'c', 7, '.' ),
equiv(diesis)
)
results = [diesis for diesis in dieses_found]
results.sort(key=lambda x: as_float(x))
return results
</syntaxhighlight>
</syntaxhighlight>


Line 1,629: Line 1,686:
=== Installation issues/troubleshooting strategies/recommendations ===
=== Installation issues/troubleshooting strategies/recommendations ===
The most potentially difficult part is that depending on what OS you are using, how you have Python installed, what version, etc. there can be complications so that running <code>pip install rtmidi</code> and <code>pip install mido</code> in a terminal does not work, or only appears to work so that there's issues when the code tries to use mido. I list potential issues below, so please read carefully for something applicable to your case if it isn't going smoothly.
The most potentially difficult part is that depending on what OS you are using, how you have Python installed, what version, etc. there can be complications so that running <code>pip install rtmidi</code> and <code>pip install mido</code> in a terminal does not work, or only appears to work so that there's issues when the code tries to use mido. I list potential issues below, so please read carefully for something applicable to your case if it isn't going smoothly.
'''IMPORTANT: A strange error has been found: Python 3.14 and later versions have removed a functionality used by mido internally, so downgrading to Python 3.12 is required if nothing here works.'''


'''IMPORTANT:''' Before deeming an installation of mido/rtmidi to "not be working", make sure that the issue is not just one of what MIDI ports are being autoselected; see (6.) onwards for details.
'''IMPORTANT:''' Before deeming an installation of mido/rtmidi to "not be working", make sure that the issue is not just one of what MIDI ports are being autoselected; see (6.) onwards for details.