首先让我说我是编码的完整初学者,而我修复此问题的尝试受到限制,请首先开始。我正在尝试跟随这个由Arduino控制的钢琴机器人https://www.hackster.io/MoKo/arduino-controlled-piano-robot-pibot-641a06。它需要一个文本化的midi文件,并使用python将其转换为8位。该代码附在链接底部附近,在将其放在此处时遇到一些格式问题。
https://drive.google.com/file/d/1L4I_PMUsozEScWa7koNAMLhHtN5BsDTu/view?usp=sharing是所使用的文本化midi文件的链接。在运行代码之前,我将input_file = open更改为文本文件路径,例如,input_file = open(“ C:\ Users \ nby20 \ Downloads \ megalovania.txt”)
运行代码后,我得到了预期的文本输出文件,但是它为空,并且出现了一些错误:
回溯(最近通话):
文件“ C:\ Users \ nby20 \ Downloads \ python_code_for_translation.py”,第184行,在main()
文件“ C:\ Users \ nby20 \ Downloads \ python_code_for_translation.py”,主行中的第23行结果[-1] = str(temp_time)+“,” + set_bit_prev(on_off_finder(a),note_finder(a),-1)
文件“ C:\ Users \ nby20 \ Downloads \ python_code_for_translation.py”,第178行,位于on_off_finder中结束= in_string.index(“ ch =”)-1
ValueError:找不到子字符串
关于解决此问题的任何建议将不胜感激。
Traceback
就像调试信息,您可以用来跟踪引发错误时调用了哪些函数。在执行main
函数的条件逻辑的这一行(第22-23行)时,似乎发生了错误:
elif time_finder_comm(result[-1]) == temp_time:
result[-1] = str(temp_time) + "," + set_bit_prev(on_off_finder(a), note_finder(a), -1)
称为on_off_finder
函数,它只是试图确定该行显示的是“开”还是“关”。
似乎文件阅读器只期望像这样的行:
55248 Off ch=10 n=40 v=64
但是,在您上传的文件中,也有这样的行:
55248 Meta TrkEnd
TrkEnd
如果传递的子字符串在字符串中不存在,则index
函数将抛出ValueError: substring not found
,在这种情况下(下面的第178行)为字符串"ch"
:
end = in_string.index("ch=") - 1
尝试删除此类行并重新运行脚本?找到所有带有“ Trk”的行并将其删除,或制作3个单独的文件,因为“ megalovania.txt”中似乎有3行行会触发脚本:
(starting at line 2469):
55248 Meta TrkEnd
TrkEnd
MTrk
...
(starting at line 4071):
58368 Meta TrkEnd
TrkEnd
MTrk
...
(starting at line 6431):
55296 Meta TrkEnd
TrkEnd