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

使用EarSketch与Python制铃声遇'int'不支持索引错误求助

EarSketch自动化铃声函数修复:解决'int' does not support indexing错误

问题背景

我是一名学生,正在使用EarSketch(一款支持用Python编程制作音乐的工具)完成作业,要求实现一个自动化制作铃声的函数。我编写了自定义函数parallel_tracks(),意图让多个音频片段按指定时长和偏移同时播放,但运行代码时出现错误:第33行“'int' does not support indexing”。

原代码如下:

from earsketch import *

init()
setTempo(120)

starts = 7

tracklist = []
track_number = int(0)

tracklist.append("gorp") # 0

tracklist.append(COMMON_LOVE_DRUMBEAT_1) # 1
tracklist.append(HIPHOP_DUSTYGROOVEPART_001) # 2
tracklist.append(AK_UNDOG_PERC_HATS_1) # 3

tracklist.append(AK_UNDOG_PAD_1) # 4
tracklist.append(AK_UNDOG_PAD_1) # 5

tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_003) # 6
tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_001) # 7
tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_002) # 8

def parallel_tracks(sounds = [], sounds_length = [], sound_offsets = []):
    sound_num = 0
    
    points = []
    points.append("gorp")
    
    for measure in range(1, starts):
        for i in range(1, len(sounds)):
            sound_num += 1
            points.append(measure + sound_offsets[sound_num])
            points.append(points[sound_num - 1] + sound_offsets[sound_nums])
            fitMedia(sounds[sound_num], sound_num, points[sound_num - 1], points[sound_num])
        
           

parallel_tracks(tracklist[4], 4, 0)

finish()

函数设计参数为sounds[]、sounds_length[]、sound_offsets[],意图为每个sound[]元素生成播放的起始和结束位置,通过fitMedia()实现音频按偏移和时长播放,但循环和列表逻辑存在问题,导致报错。

错误原因分析

  • 函数调用参数类型错误:调用parallel_tracks(tracklist[4], 4, 0)时,tracklist[4]是单个音频字符串,不是列表,但函数定义中sounds预期是列表。后续尝试访问sounds[sound_num]时,会因为单个元素/数字无法索引触发错误。
  • 变量拼写错误:代码中sound_offsets[sound_nums]里的sound_nums是笔误,应为sound_num。
  • 循环逻辑混乱:嵌套循环会导致音频重复播放多次,sound_num的递增方式极易引发索引越界。
  • 无用的初始值:points.append("gorp")完全没必要,反而干扰索引计算。
  • 未使用sounds_length参数:函数设计中该参数用于指定音频时长,但原代码误用sound_offsets计算结束位置,逻辑错误。

修复步骤

  1. 修正函数调用:传入列表类型的参数,确保sounds、sounds_length、sound_offsets长度匹配。
  2. 修复拼写错误:把sound_nums改为sound_num。
  3. 重构循环逻辑:直接遍历sounds的索引,每个音频对应独立轨道,避免重复播放。
  4. 移除无用占位符:删除points列表的初始无效值,直接计算播放位置。
  5. 正确计算播放区间:start = 起始小节 + 偏移量,end = start + 音频时长,符合EarSketch的fitMedia()参数要求。
  6. 添加参数校验:检查三个核心参数的长度一致性,提前规避错误。

修复后的完整代码

from earsketch import *

init()
setTempo(120)

starts = 7  # 起始小节

tracklist = []
tracklist.append("gorp")  # 0,无用占位符可移除

tracklist.append(COMMON_LOVE_DRUMBEAT_1)  # 1
tracklist.append(HIPHOP_DUSTYGROOVEPART_001)  # 2
tracklist.append(AK_UNDOG_PERC_HATS_1)  # 3

tracklist.append(AK_UNDOG_PAD_1)  # 4
tracklist.append(AK_UNDOG_PAD_1)  # 5

tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_003)  # 6
tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_001)  # 7
tracklist.append(ELECTRO_ANALOGUE_PHASERBASS_002)  # 8

def parallel_tracks(sounds, sounds_length, sound_offsets, start_measure=1, start_track=1):
    # 参数长度校验
    if not (len(sounds) == len(sounds_length) == len(sound_offsets)):
        print("参数错误:sounds、sounds_length、sound_offsets必须长度一致")
        return
    
    for idx in range(len(sounds)):
        sound = sounds[idx]
        length = sounds_length[idx]
        offset = sound_offsets[idx]
        track = start_track + idx
        start = start_measure + offset
        end = start + length
        fitMedia(sound, track, start, end)

# 调用示例:播放tracklist中4-6号音频,时长4小节,偏移0,从第1小节、第4轨道开始
parallel_tracks(
    sounds=tracklist[4:7],
    sounds_length=[4, 4, 4],
    sound_offsets=[0, 0, 0],
    start_measure=1,
    start_track=4
)

finish()

优化说明

修复后的函数新增了参数校验机制,支持自定义起始小节和轨道,逻辑更清晰,能够精准控制每个音频的播放区间,满足多个音频并行播放的需求。

内容的提问来源于stack exchange,提问作者AIDAN GOODRICH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:05:13