You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:46:22