1790 字
9 分钟

记第一个对我有实际作用的程序(逃)

问题的起因(挖坑原因):#

  1. 玩乐器的同学知道,简谱上的不同调之间的转换不如五线谱上方便,我原来最先是参照转调表一个一个人工查找 😥 太累,后来就想写个程序完成了。
  2. ———关于调,不懂的可以百毒一下。。。就是与起始音 do 的位置,或者末音 la 的位置(这不是小调了吗,不管,乐理也不太精通,如有大神求指出)

问题的实现:#

  1. 脑洞昨天太大 😓,明明只是一个会 C 调的,你干嘛要写个转换任意调的。。。。 原始目的只是想任意调转成 C,后来写着写着觉得这样这程序太弱了(虽然本来就不强),就临时想转成任意调了。。。。于是有琢磨了一会就有了实现。。。

  2. 实现思路:当初第一目的——任意调到 C,最初是想通过 if 一句一句判断进行实现。。。。后来想写任意调后发现不现实,因为会有 C(6,2),15 种可能,每个 if 下还要再进行判断是否是 1,2,3,4,这类的简谱名,这样会造成程序的冗长与无用。。。于是就放弃了

  3. 于是想到了 Python 的 dict 数据结构,使用 key-value 对,便可以便捷的实现调之间转换,只需提前输入好 dict

实现过程中的问题:#

  1. 我就不应该用 command line(命令行)来获取输入数据 🙈

  2. 命令行输入的数据我要考虑各种间隔,因为 input()函数获取的输入是“**“中的所有字符,其中考虑如何实现区分,b7,7 ,8 这类输入都头疼了我好久。。

    b7 在 input()中会当成 b 和 7 两个单独的字符,而我想表示的是低音 7,

    cmd

    7,8 在 input()中也会傻不拉唧的把逗号(,)也识别进入,我要想办法去除符号后才能进行数据操作

问题的解决#

  1. input()的问题,假设用户配合,全用空格分开,便可利用.split(” “)方法进行去除,之后便可传入列表就行操作
  2. 函数中局部变量和函数定义好后,不会自行调用真是够了

一些感想#

  1. 变量名要取好,我这么一点我都有时忘记了这个变量是干嘛(水平太差)

  2. 函数中的变量尽量与函数外的变量不要重名,我这个就是重名的,有时搞不懂为何会没有输出,就是因为函数中变量是局部的

  3. 写什么要先写好第一目的,不要想我这样,写着写着又想写其他目的了,也不要想我一样边写边调试,大部分时间都废在找 bug 和纠错上了。。。。当然因为我是写着写着就想别的目的了,所以边写边调试还是没什么问题的。。。(我觉得)

垃圾代码#

#一时兴起想写的转换简谱调的代码,可以实现任意调之间的转换,啪啪啪,如果在字典中
#有的话。。。字典还没填完备,暂时只有其他调的全音,还无半音
#因为字典还不完备,任意调之间的转换可能会出问题,转c调是没问题的
#(啪啪,打脸,@_@,原本只是想任意调转c,后来脑洞又开,写任意调了)
#命令行版本。。command line version。我觉得还是函数版本好写,不管了以后有空再补
#输入
print("Please enter the original an'dand ambition tune(use space splite)")
tuneer = input("The default is to C:")
'''#b表示低音,#表示升(半音阶),g表示高音,用b#表示低半音,用g#表示高半音'''
putin = input("please enter number:")
first1 = ""
listin1 = []
listin2 = []
listout1 = []
listout2 = []
listoutTemp = []
listTemp = []
changekey = {}
changekey2 = {}
# #如有空格去除后再操作
# first1 =""
# listin1 = []
# listin2 = []
# listout1 = []
# first1 = putin.strip()
# final1 = first1.split(" ")
# for i in final1:
# listin1.append(i)
# print(listin1)
# #对tune去除
# first2 =""
# first2 = tuneer.strip()
# final2 = first2.split(" ")
# for i in final2:
# listin2.append(i)
# print(listin2)
#清除空格和转换大小写,默认到c调
def checkspace(listin):
'''#b表示低音,#表示升(半音阶),g表示高音,用b#表示低半音,用g#表示高半音'''
listTemp = ""
listTemp = listin.strip()
listlow = listTemp.lower()
listOut = listlow.split(" ")
if len(listOut) == 1:
listOut.append("c")
return listOut
#获取原始输入
listin1 = checkspace(putin)
formtuneer = checkspace(tuneer)
tuneerin = formtuneer[0]
tuneerout = formtuneer[1]
#b表示低音,#表示升(半音阶),g表示高音,用b#表示低升半音,用g#表示高半音
#keys
GtoC = {"1" : "b5", "2" : "b6", "3" : "b7", "4" : "1", "5" : "2", "6": "3",
"7" : "#4", "g1" : "5", "g2":"6","g3":"7","g4":"g1","g5":"g2","g6":"3",
"g7":"g#4","gg1":"g5"}
AtoC = {"b7" : "#5", "1" : "b6", "2" : "b7", "3" : "#1", "4" : "2", "5" : "3",
"6" : "#4", "7" : "#5", "g1" : "6", "g2" : "7", "g3" : "g#1", "g4" : "g2",
"g5" : "g3", "g6" : "g#4" }
BtoC = {"b6" : "b#5", "b7":"b#6", "1" : "b7", "2" : "#1", "3" : "#2", "4" : "3",
"5" : "#4", "6" : "#5", "7" : "#6", "g1" : "7", "g2" : "g#1", "g3" : "g#2",
"g4" : "g3", "g5" : "g#4"}
DtoC = {"b4" : "b5", "b5" : "b6", "b6" : "b7", "b7" : "#1", "1" : "2",
"2" : "3", "3" : "#4", "4" : "5", "5" : "6", "6" : "7", "7" : "g#1",
"g1" : "g2", "g3" : "g#4", "g4" : "g5"}
EtoC = {"b3" : "b#5", "b4" : "b6", "b5" : "b7", "b6" : "#1", "b7" : "#2",
"1" : "3", "2" : "#4", "3" : "#5", "4" : "6", "5" : "7", "6" : "g#1",
"7" : "g#2", "g1" : "g3", "g2" : "g#4"}
FtoC = {"b2" : "b5", "b3" : "b6", "b4" : "b#6", "b5" : "1", "b6" : "2",
"b7" : "3", "1" : "4", "2" : "5", "3" : "6", "4" : "#6", "5" : "g1", "6" : "g2",
"7" : "g3", "g1" : "g4", "g2" : "g5"}
Fulltunekey = {"g":GtoC, "a" : AtoC, "b" : BtoC, "d" : DtoC,
"e" : EtoC, "f" : FtoC}
#Anykeys,key转换
def inverse(dict):
dictout = {v : k for k,v in dict.items()}
return dictout
CtoG = inverse(GtoC)
CtoA = inverse(AtoC)
CtoB = inverse(BtoC)
CtoD = inverse(DtoC)
CtoE = inverse(EtoC)
CtoF = inverse(FtoC)
Fulltuneanykey = {"g" : CtoG, "a" : CtoA, "b" : CtoB, "d" : CtoD,
"e" : CtoE, "f" : CtoF}
#转换key-values对 (first 全到C)
def dictoc(tuneerin,tuneerout):
if tuneerin == "a":
changekey = Fulltunekey["a"]
elif tuneerin == "g":
changekey = Fulltunekey["g"]
elif tuneerin == "b":
changekey = Fulltunekey["b"]
elif tuneerin == "d":
changekey = Fulltunekey["d"]
elif tuneerin == "e":
changekey = Fulltunekey["e"]
elif tuneerin == "f":
changekey = Fulltunekey["f"]
return changekey
# def dicany(tuneerin,tuneerout):
# if tuneerin != "c":
# changekey = Fulltunekey[tuneerin]
#判断输出,如不是C,再进行转换
def dictoany(tuneerout):
if tuneerout == "a":
changekey2 = Fulltuneanykey["a"]
elif tuneerout == "g":
changekey2 = Fulltuneanykey["g"]
elif tuneerout == "b":
changekey2 = Fulltuneanykey["b"]
elif tuneerout == "d":
changekey2 = Fulltuneanykey["d"]
elif tuneerout == "e":
changekey2 = Fulltuneanykey["e"]
elif tuneerout == "f":
changekey2 = Fulltuneanykey["f"]
return changekey2
#强制全部到c调
def alltoC(tuneerin):
changekey = dictoc(tuneerin, tuneerout)
for i in listin1:
listout1.append(changekey[i])
#print(listout1)
return listout1
# print(listout1)
def ctoall(tuneerout):
if tuneerout != "c":
changekey2 = dictoany(tuneerout)
listout1 = alltoC(tuneerin)
for i in listout1:
listout2.append(changekey2[i])
return listout2
# ctoall(tuneerout)
# print(listout2)
# if tuneerout != "c":
# dicany(tuneerout)
# for i in listoutTemp:
# listout1.append(changekey[i])
# print(listout1)
#最后输出
def checkout(tuneerin,tuneerout):
if tuneerout == "c":
alltoC(tuneerin)
print(tuneerin,listin1)
print("->")
print("c",listout1)
else:
listout2 = ctoall(tuneerout)
print(tuneerin,listin1)
print("->")
print(tuneerout,listout2)
return
checkout(tuneerin,tuneerout)
#AtoC = {"b7" : "#5", "1" : "b6", "2" : "b7", "3" : "#1", "4" : "2",
"5" : "3", "6" : "#4", "7" : "#5", "g1" : "6", "g2" : "7", "g3" : "g#1",
"g4" : "g2", "g5" : "g3", "g6" : "g#4" }
# if tuneerout == "c":
# for i in listin1:
# listout1.append(changekey[i])
# print(listout1)

如有大神愿意改良或者提出修改的话。。。求到 Github 地址

感激不尽。。。。(半路出家,最近更快期末了,压力山大 )

记第一个对我有实际作用的程序(逃)
https://blog.dccif.top/2015/12/13/记第一个对我有实际作用的程序(逃)/
作者
Barry He
发布于
2015-12-14
许可协议
CC BY-NC-SA 4.0