使用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计算结束位置,逻辑错误。
修复步骤
- 修正函数调用:传入列表类型的参数,确保
sounds、sounds_length、sound_offsets长度匹配。 - 修复拼写错误:把
sound_nums改为sound_num。 - 重构循环逻辑:直接遍历
sounds的索引,每个音频对应独立轨道,避免重复播放。 - 移除无用占位符:删除
points列表的初始无效值,直接计算播放位置。 - 正确计算播放区间:
start = 起始小节 + 偏移量,end = start + 音频时长,符合EarSketch的fitMedia()参数要求。 - 添加参数校验:检查三个核心参数的长度一致性,提前规避错误。
修复后的完整代码
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
相关产品推荐
相关产品推荐

