Godtone
Joined 17 December 2020
→My Python 3 code: fix |
|||
| (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 | 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> | ||