Python 3.x 我这样做是否正确?

Python 3.x 我这样做是否正确?,python-3.x,Python 3.x,我试图在赫兹的刻度上画出十二音等音律的对数 这是在中间中断的循环来迭代音阶中所有可听音符的最好方法吗?我可以更准确地做同样的事情,还是用更少的代码 我不想使用for循环,因为那样的话,范围将被任意定义,而不是由声音范围来定义 当我尝试使用“note>highest或note最高或注释最高或注释浮点: 参考音=440 参考号=49 频率比=2**(1/12) 返回参考音*频率比**(键号-参考号) 然后你可以做如下事情: print(钢琴频率(40))#C4=261.625565305985 打

我试图在赫兹的刻度上画出十二音等音律的对数

这是在中间中断的循环来迭代音阶中所有可听音符的最好方法吗?我可以更准确地做同样的事情,还是用更少的代码

我不想使用for循环,因为那样的话,范围将被任意定义,而不是由声音范围来定义

当我尝试使用“note>highest或note
highest = 20000
lowest = 20

key = 440
TET = 12

equal_temper = [key]

i = 1
while True:
  note = key * (2**(1/TET))**i
  if note > highest or note < lowest:
    break
  equal_temper.append(note)
  i += 1

i = 1
while True:
  note = key * (2**(1/TET))**-i
  if note > highest or note < lowest:
    break
  equal_temper.append(note)
  i += 1

equal_tempered = sorted(equal_temper)
for i in range(len(equal_temper)):
  print(equal_tempered[i])
最高值=20000
最低=20
密钥=440
TET=12
相等的状态=[键]
i=1
尽管如此:
注=键*(2**(1/TET))**i
如果注释>最高或注释<最低:
打破
相等的状态。附加(注)
i+=1
i=1
尽管如此:
注=键*(2**(1/TET))**-i
如果注释>最高或注释<最低:
打破
相等的状态。附加(注)
i+=1
相等回火=已排序(相等回火)
对于范围内的i(len(等温)):
打印(等分[i])

代码返回的音高列表(以赫兹为单位)与我所查看的其他表格非常接近,但更高的数字相差更远。将while循环无限期地设置为loop似乎有效,但我认为可能有一种更优雅的方式来编写循环。

您可以使用钢琴键公式:

freq_n = freq_ref * sqrt(2, 12) ** (n − a)
参考音符为A4、440 Hz和钢琴上的第49个键:

def piano\u freq(键号:int)->浮点:
参考音=440
参考号=49
频率比=2**(1/12)
返回参考音*频率比**(键号-参考号)
然后你可以做如下事情:

print(钢琴频率(40))#C4=261.625565305985
打印([piano_freq(no)表示范围(49,49+12)内的no)]#A4。。G#5

基于:

事实证明,您实际上知道迭代次数!至少你可以做一些简单的数学计算。然后,您可以使用列表理解来构建您的列表:

import math 
min_I = math.ceil(TET*math.log2(lowest/key))
max_I = math.floor(TET*math.log2(highest/key))
equal_tempered = [key * 2 ** (i / TET) for i in range(min_I, max_I + 1)]

((2**(1/TET))**i)
可以简化为
2**(i/TET)
。使用
而True
循环几乎总是不正确的。“它不起作用”是什么意思?@RayButterworth,我得到了一个“NameError”@DYZ,这里有什么更好的选择?在什么情况下,这是正确的做法?是的,这看起来像是我正在使用的同一个数学。然而,我不明白这将如何使代码变得更好。太棒了!我不能马上理解这里的数学,但我会仔细看一下代码,看看我是否能理解它足够使用它。谢谢你@DYZ!!