一个简单的简谱转调程序
老版本的问题
从《记第一个对我有实际作用的程序》之后已经过了602天。终于我更新了第二个版本😂
尴尬…其实我也只是为了练习前几天新学的新方法(不然谁还挖以前的坑)🤣
回想我上一个版本的程序,只能转换全音,还没法识别半音。。。。现在来看就是因为那时我用了键值对的方法来转换的。。。我没功夫把所有的音阶都记录下键值对。。。
同时感谢贴吧 DverysGetime 的贴,让我理解的转调原理,原文 【申精】DG教你看简谱音阶转调图,转调翻译再也不求人
我的参照表也是原贴中的:
这样一看下来
如果全部写成键值对的话就要
一共这么多对,当然理论上也不是不行,但是当写成这么傻的方法时,应该要考虑换一下方法了。。。。
各位这时不妨也思考一下怎么转换好了,这篇文章我是不会贴代码了(反正我知道也没人会看)我只分享我的思路
新思路
怎么样,思考好了吗?(多半也没人认真想吧!😝)
那么我分享一下我的思路
首先原来的音阶表上的音名。。。ABC 这些对我干扰太大了😥,老的版本上我就傻傻地把简谱的1,2,3还先转换成音名CDE
然后利用CDE在我提前输入的转换表中查找来进行音调转换
因为原来我天真地认为是
不管输入什么简谱的1,2,3对应到表上第一排的音名是不变的,再利用音名转换到目标简谱上就行了。。。
看过我原先的程序的就知道了,很傻很天真的方法表情
所以我就参考了转调的定义:不同调的Do位置不同,在上面的图上中间灰色的矩形很好的表示了这一点,也就是说不同的调的转换只需要移动Do的位置就行了,并不用原先的我用的那种还需要音名CDE来当两个不同简谱间桥梁的转换方法。
那么发现了转调的定义后,如何实现的这个所谓的“移动的Do的位置”呢?
用户的输入都是各自调的1,2,3,4… 程序要做的是移动他们输入调的Do到目标调上。
换一个角度看问题
怎么样?有答案了吗?这样建立坐标后,就不用管什么音调,音名了,要做的只有坐标之间的转换。
是不是一下觉得很简单了?
要做的就是把输入转换成一个坐标,然后再转到目标调所在的坐标就行了。这样就能实现“移动D的位置”
根本不用考虑如何把1,2,3与C D E 对上,我们要考虑的问题又从“移动D的位置”变成了如何获取输入的“坐标”位置。
再仔细看这个2位坐标的转换问题;我原先旧的程序就是已知一个调转换到另一个调,也就是在上图的两行之间转换,
提前选择的要转换的调就是告诉我们初始X坐标了,要转换的目标调也就是告诉我们另一个点的X值了
也就是程序提前就能知道两个坐标(X,Y)中的X值,实际上的计算只要在Y上计算不同行之间的差了。也就是说这样就实现了“移动Do的位置”
怎么样,思路有了,剩下就是实现了吧!
既然我已经写了这篇文章
就是我个人已经实现了😀
上次我的做的是(没人会再用的)命令行程序
这次我打包成exe文件了,顺带还做了图形界面,毕竟隔了那么久了(这602天不能白过啊)
如果还是做是命令行,再做一次就没什么意思了
程序地址
Version 0.1
个人画的GUI,有点丑,这就不要在意了
简单明了(一堆Bug)
现在的版本也就是简单的“坐标转换”,输入格式不对的话就不能转换了
这次的版本使用因为使用了上面说的方法,核心的“坐标转换”就用了一个键值对表和4行代码就实现了,当然这是Python的版本。。。。用其他麻烦一点的语言可能就不止了。
后续会不会再升级或者修Bug什么的(多半是不可能了,看看和上次隔了多久),倒是我可能会顺带尝试一下Android端,因为做以上这个程序只是顺带的
实际是练习前面文章第二行说的新方法:一种和面向对象编程(OOP)不同但是又同样强大的方法——函数式编程
项目地址