使用Python mingus库与for循环编写旋律时遇TypeError报错求解
解决mingus中
TypeError: 'Note' object is not subscriptable的问题 错误原因
- 参数顺序错误:你调用
itv.interval("A", melody[i], 1)时,参数顺序不符合mingus的interval函数定义。该函数第一个参数是起始音,第二个是音程度数,你把Note对象(melody[i])传给了第二个参数,函数内部尝试对其做下标访问,而Note对象不支持该操作,因此抛出错误。 - 逻辑不符合需求:你需要以列表最后一个音符为起始音,但循环中用
melody[i]会依次取第0、1、2个元素,无法实现“每次基于最后一个音符计算”的逻辑。
修正后的代码
首先明确mingus.core.intervals.interval的正确用法:
itv.interval(root, interval_number, direction=1)
root:起始音,可传入字符串(如"A")或Note对象interval_number:音程度数(1=同度,2=大二度,3=大三度等)direction:可选参数,1表示向上,-1表示向下,默认值为1
修正后的代码如下:
import mingus.core.intervals as itv from mingus.containers import Note melody = [] note1 = Note("A", 4) melody.append(note1) for i in range(3): # 获取列表最后一个音符作为起始音 last_note = melody[-1] # 计算向上1度的音符,若要大二度可将1改为2 next_note = itv.interval(last_note, 1) melody.append(next_note) print(melody)
如果需要每次生成大二度的音符(比如A→B→C#→D#),只需将interval(last_note, 1)改为interval(last_note, 2)即可。
内容的提问来源于stack exchange,提问作者Umberto Boldarin
相关产品推荐
相关产品推荐

