什么是存储音符名称的最佳Python数据类型



什么是存储注释名称的最佳Python数据类型?

我希望它是可见的,但是有些笔记有其他名称。例如,c#(c锐利)与db(d flat)相同。如果我使用列表或元组,那么输入替代名称将"打破"迭代过程,而我将无法找到一个音符,例如,只需查找从初始注释即可提高位置3个步骤,例如上面的3个半音。(我已经锻炼了%12,以"圆形"的方式行事)

理想情况下,我希望两个替代音符名称在"列表"(或任何日期类型最好)中占据相同的位置,并能够指定我想要以我称呼的方式返回的名称。例如notes.flats。例如。

实际上有一个数据类型支持这样的东西,还是我看完全错误的方式?我的下一个想法是上课。

列表列表呢:

notes = [['F','F#','G','G#','A','A#','B','C','C#','D','D#','E'],['F','F#','G','G#','A','A#','B','C','C#','D','D#','E']]
print(notes[0][1], notes[1][1])

都将返回f#

将您的内部表示形式分开 - 您的代码与用户所看到的内容合作 - 从外部形式开始。注意名称非常适合人们,而不是程序。

内部表示:八度音符有十二个音符,因此将笔记作为数字0到11的存储。

现在,您需要功能才能在内部和外部表示之间转换。一个将注释名称转换为注释,另一个可以进行反向。

def parse_note_name(note_name):
    ...
    return note_number
def to_note_name(note_number, symbol='#'):
    ...
    return note_name

这些可能是两种方法的签名。第一个解析了诸如c♯或d♭之类的注释,并返回0到11之间的数字。第二个将数字0-11转换为注释名称。由于音符有多个reharmonic名称,因此您可以具有symbol之类的参数来控制清尖或平地。

您可以通过列出所有21个注释名称(七个天然,七个尖锐,七个平面)来实现解析名称。更聪明的实现将首先处理该字母,然后将其符号:将字母转换为音符号,然后如果有一个♯添加1;如果有一个♭减1。

字典听起来很适合您。

您可以将字典的每个元素与允许您访问的密钥相关联。

看起来像这样:

{ "C#":"Db", ... }

您可以像这样迭代字典:

for key in dictionary:
    print key                # will access the element to the left of :
    print dictionary[key]    # will access the element to the right of :

希望有帮助!

最新更新