Godtone (talk | contribs)
Godtone (talk | contribs)
 
(7 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>