问题来源,原本C调,根据翻唱歌曲音高,需要升或者降调,但是使用C把位,所以只有C调看起来是方便的。
所以将变调后的数字谱,统一改写C调,为方便使用数字谱的初学者们(包括自己),因此写下这个程序
如图,这是原C调谱这个是经过程序改写的降调小三度的C大调数字谱也是升A调
(非专业)初学者理解公示表(单位:一个半音)
附代码(python)
import re
# MAJOR=2
MAJOR=int(input("一个小二度为一个单位音程\n例如C转B输入-1\n请输入升降音程\n"))
f = open("input.txt",'r') #这是一般的使用形式
with open ("output.txt",'a')as f_input:
f_input.write('=================================MAJOR=%s=================================\n'%MAJOR)
arr=['1','#1','2','#2','3','4','#4','5','#5','6','#6','7']
# 0 1 2 3 4 5 6 7 8 9 10 11
for ss in f.readlines():
ss = re.sub(r"1=", "N=", ss)
for i in range(1,8):
ss = re.sub(r'%d'%(i),'z%d'%(i),ss)
for i in range(1,8):
if i < 4:
ss = re.sub(r"#z%d"%i, arr[(12*5+(i-1)*2+1 +MAJOR)%12], ss)
ss = re.sub(r"z%d"%i, arr[(12*5+(i-1)*2 +MAJOR)%12], ss)
if 3 < i < 7:
ss = re.sub(r"#z%d"%i, arr[(12*5+(i-1)*2 +MAJOR)%12], ss)
ss = re.sub(r"z%d"%i, arr[(12*5+(i-1)*2-1 +MAJOR)%12], ss)
if i==7:
ss = re.sub(r"#z%d"%i, arr[(12*5+0 +MAJOR)%12], ss)
ss = re.sub(r"z%d"%i, arr[(12*5+(i-1)*2-1 +MAJOR)%12], ss)
ss = re.sub(r"N=","1=", ss)
tt=ss
with open("output.txt", 'a')as f_input:
f_input.write(tt)
print(ss)
数据结构:循环队列
或者说是小学奥数余数规律
内容:
在input.txt文件写目标谱,利用音程变化规律满足一个数字列,通过移动数列实现转谱很简单
运行程序输入升降音程(单位:一个半音)
输出结果
这样就转好了
注意我没有做过滤处理,请确保您的输入完全是GBK字符
该程序没有涉及小调转谱,因为暂时没有用上
另外数字谱表示高音低音都不一样,我这里[ ]表示括号内高音,( )括号内低音,{ }合奏,所以该程序没有识别括号的功能,通过升高或者降低音调,比如7--> i,应该改为7->[1],但是没有改则输出这个7->1,需要手动改,同理降调"借位"一样。