一、任务

用python实现将指定旋律从某调转到某调的功能。

二、原理

将X调转到Y调,即将X升(X-Y)个半音
注:这里X-Y代表半音关系,对应下面的trans_map字典;
注:传入的音阶应可以表示大于一个八度的音域。这里采用的策略是,若音符前面有.(点)则表示第一个八度,若在音符后面有.则表示高一个八度。

三、代码

#trans_map:定义音名间的半音关系,每个半音之间的差为1
trans_map = {'C':0,'bD':1,'D':2,'bE':3,'E':4,'F':5,'bG':6,'G':7,'bA':8,'A':9,'bB':10,'B':11}
#C_scale:C大调半音阶
C_scale = ['1','#1','2','#2','3','4','#4','5','#5','6','#6','7']#函数说明:需传入旋律,原调性,目标调性
def trans_tonality(Tune,Tune_Tonality,Aim_Tonality):tune = []                                                   #转调后的旋律minus = trans_map[Tune_Tonality]-trans_map[Aim_Tonality]        #半音关系at = C_scale[minus:]+C_scale[:minus]      #利用半音关系推出转调后的参考音阶for t in list(Tune.split(',')):                         #按照逗号分割音符position = [i.start() for i in re.finditer('\.', t)] #找到所有.的位置if position == []:                #如果音符旁没有.low_num = 0high_num = 0elif position[0]==0:              #如果音符前有.low_num = len(position)high_num = 0else:                             #如果音符后有.high_num = len(position)low_num = 0if minus>0:high_num += 1low_num -= 1t = t.translate(str.maketrans('','','.')) #.的信息已经统计好了,把它们删掉if len(t)==1:                     #没有升降号ori = int(t)if int(t)<4:                  #do re minew_tune = at[int(t)*2-2]elif int(t)<8:                #fa sol la tinew_tune = at[int(t)*2-3]else:new_tune = 'Error'elif len(t)==2:                   #有升降号ori = int(t[1])               #记录原音名if 'b' in t:                  #如果是降号b,变成升号#,之后再统一处理;如b6变成#5t = '#'+str(int(t[1])-1)if int(t[1])<3:               # #do #reprint(t[1])new_tune = str(at[int(t[1])*2-1])elif int(t[1])<7:             # #fa #sol #lanew_tune = str(at[int(t[1])*2-2])else:new_tune = 'Error'else:new_tune = 'Error'try:                              #根据原来记录的.的信息恢复音高信息,即加上.if int(new_tune[-1]) > ori:if high_num > 0:high_num -= 1else:low_num += 1for i in range(low_num):new_tune = '.' + new_tunefor i in range(high_num):new_tune = new_tune + '.'tune.append(new_tune)except:tune.append('Error')print(tune)#函数说明:trans_tonality(Tune,Tune_Tonality,Aim_Tonality)旋律,原调性,目标调性
trans_tonality('1,1,5,5,6,6,5,4,4,3,3,2,2,1','C','D')
trans_tonality('1,1,5,5,6,6,5,4,4,3,3,2,2,1','D','C')
#返回值:
#['.#6', '.#6', '4', '4', '5', '5', '4', '#2', '#2', '2', '2', '1', '1', '.#6']
#['2', '2', '6', '6', '7', '7', '6', '5', '5', '#4', '#4', '3', '3', '2']

【python】【转调】用python程序实现简谱转调相关推荐

  1. 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试

    原文地址:http://www.cnblogs.com/joyeecheung/p/3757915.html 相关随笔:  点击打开链接 Hadoop-1.0.4集群搭建笔记 用python + ha ...

  2. python 线程池_老程序员的经验分享:Python 从业十年是种什么体验?

    出于某些原因,想记录一下我过去数年使用 Python 的经验和一些感悟.毕竟算是一门把我带入互联网行业的语言,而我近期已经几乎不再写 Py 代码, 做一个记录,也许会对他人起到些微的帮助,也算是纪念与 ...

  3. 绝对干货!Python 从业十年的程序员,写的万字经验分享

    " 阅读本文大概需要 9 分钟. " 作者:laisky(基于 CC BY 4.0 授权许可) 原题:Python之路(内容略有调整) 来源:https://laisky.com/ ...

  4. 搭上Python号小火箭,程序运行越来越快!

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Some memories, are doomed to be unable ...

  5. pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行

    pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 目录 pyinstaller打包生成的exe文件并使用python终止后台的exe程序运行 #pyinstalle ...

  6. python开发pc软件_程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  7. 56岁潘石屹下定决心学Python,60多岁程序语言之父们还在敲代码,你还敢懈怠吗?...

    十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 比你成功的人,比你还努力. 上周,SOHO中国董事长.地产大亨潘石屹,56岁生日当天发布微博宣布进军编程语言Python. 紧接着第二天,又 ...

  8. python快速编程入门课后程序题答案-Python编程从零基础到项目实战 完整PPT+习题答案...

    Python编程从零基础到项目实战是一本介绍Python相关知识的Python基础教程,内容涉及算法.Python数据分析.图形处理.Web开发.科学计算.项目管理.人工智能.Python爬虫等.其中 ...

  9. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

最新文章

  1. leetcode 399. 除法求值(bfs)
  2. BZOJ 1613: [Usaco2007 Jan]Running贝茜的晨练计划
  3. 内核常见锁的机制与实现分析1
  4. 对数频率特性曲线的绘制
  5. 啥叫全国统一大市场?
  6. 高含盐废水处理资源化——双极膜电渗析
  7. tensorflow2系类知识-4 :RNN
  8. wireshark出现rst的原因_多次RST以及不同场景下的RST报文的差异
  9. WINVNC源码阅读(四)
  10. 买服务器需要看哪些参数,如何看服务器配置
  11. 【云原生之Docker实战】使用Docker部署Navidrome家庭个人音乐库
  12. 事业单位计算机岗位考公基吗,2017长治市直事业单位综合类岗位考公基和...
  13. 飞得更高(五)下马威
  14. Android的一些开源项目集锦 以备以后研究
  15. 第22期状元简讯:支付宝母公司斥资11.8亿元控股天弘基金
  16. 【周赛】第一周周赛——欢迎16级的新同学题解(题目出自codeforces 318A,546A,431C,665E,HDU 4104)
  17. 百度网盘全速下载破解工具
  18. linux下处理视频为flv格式
  19. 机动车 科目一 之 标识标志(指示标志 [蓝色])
  20. 二极管IN4001~IN4007参数

热门文章

  1. npm关闭端口的方法
  2. Generator——简介
  3. 使用vue+zrender绘制体温单 三测单(1)
  4. 【Python网络爬虫】Python网络爬虫案例:知乎Live
  5. 样本均值和方差对总体均值和方差的无偏估计证明、样本方差的方差
  6. Java自动生成数据库设计文档(Word)
  7. python信号降噪_EEG(P300)信号数据滤波降噪
  8. Linux在vi/vim编辑文件时(104键)键盘右边数字键输入异常解决方法
  9. 基于javaweb+mysql的网上图书商城网上书店(java+SSM+Jsp+MySQL+Redis+JWT+Shiro+RabbitMQ+EasyUI)
  10. 第十一章 会打电话 天涯变咫尺 不会打电话 咫尺变天涯