一个简单的简谱转调程序

老版本的问题

《记第一个对我有实际作用的程序》之后已经过了602天。终于我更新了第二个版本😂

尴尬…其实我也只是为了练习前几天新学的新方法(不然谁还挖以前的坑)🤣

回想我上一个版本的程序,只能转换全音,还没法识别半音。。。。现在来看就是因为那时我用了键值对的方法来转换的。。。我没功夫把所有的音阶都记录下键值对。。。

同时感谢贴吧 DverysGetime 的贴,让我理解的转调原理,原文 【申精】DG教你看简谱音阶转调图,转调翻译再也不求人

我的参照表也是原贴中的:

jp1

这样一看下来

如果全部写成键值对的话就要

12312=43212*3*12=432

一共这么多对,当然理论上也不是不行,但是当写成这么傻的方法时,应该要考虑换一下方法了。。。。

各位这时不妨也思考一下怎么转换好了,这篇文章我是不会贴代码了(反正我知道也没人会看)我只分享我的思路

新思路

怎么样,思考好了吗?(多半也没人认真想吧!😝)

那么我分享一下我的思路

首先原来的音阶表上的音名。。。ABC 这些对我干扰太大了😥,老的版本上我就傻傻地把简谱的1,2,3还先转换成音名CDE

然后利用CDE在我提前输入的转换表中查找来进行音调转换

因为原来我天真地认为是

不管输入什么简谱的1,2,3对应到表上第一排的音名是不变的,再利用音名转换到目标简谱上就行了。。。

看过我原先的程序的就知道了,很傻很天真的方法表情

所以我就参考了转调的定义:不同调的Do位置不同,在上面的图上中间灰色的矩形很好的表示了这一点,也就是说不同的调的转换只需要移动Do的位置就行了,并不用原先的我用的那种还需要音名CDE来当两个不同简谱间桥梁的转换方法。

那么发现了转调的定义后,如何实现的这个所谓的“移动的Do的位置”呢?

用户的输入都是各自调的1,2,3,4… 程序要做的是移动他们输入调的Do到目标调上。

换一个角度看问题

jp2

怎么样?有答案了吗?这样建立坐标后,就不用管什么音调,音名了,要做的只有坐标之间的转换。

jp3

是不是一下觉得很简单了?

要做的就是把输入转换成一个坐标,然后再转到目标调所在的坐标就行了。这样就能实现“移动D的位置

根本不用考虑如何把1,2,3与C D E 对上,我们要考虑的问题又从“移动D的位置”变成了如何获取输入的“坐标”位置。

再仔细看这个2位坐标的转换问题;我原先旧的程序就是已知一个调转换到另一个调,也就是在上图的两行之间转换,

提前选择的要转换的调就是告诉我们初始X坐标了,要转换的目标调也就是告诉我们另一个点的X值了

也就是程序提前就能知道两个坐标(X,Y)中的X值,实际上的计算只要在Y上计算不同行之间的差了。也就是说这样就实现了“移动Do的位置

怎么样,思路有了,剩下就是实现了吧!

既然我已经写了这篇文章

就是我个人已经实现了😀

上次我的做的是(没人会再用的)命令行程序

这次我打包成exe文件了,顺带还做了图形界面,毕竟隔了那么久了(这602天不能白过啊)

如果还是做是命令行,再做一次就没什么意思了

程序地址

Version 0.1

个人画的GUI,有点丑,这就不要在意了

jp4

简单明了(一堆Bug)

jp5

现在的版本也就是简单的“坐标转换”,输入格式不对的话就不能转换了

这次的版本使用因为使用了上面说的方法,核心的“坐标转换”就用了一个键值对表和4行代码就实现了,当然这是Python的版本。。。。用其他麻烦一点的语言可能就不止了。

后续会不会再升级或者修Bug什么的(多半是不可能了,看看和上次隔了多久),倒是我可能会顺带尝试一下Android端,因为做以上这个程序只是顺带的

实际是练习前面文章第二行说的新方法:一种和面向对象编程(OOP)不同但是又同样强大的方法——函数式编程

项目地址