动机
打谱软件,大家都知道,用来生成五线谱。
以我个人的角度来说,lilypond可视化没有其他软件那么直观,音色就更不用说了,而且学习成本非常高。假设我英语非常好,可能找到某一个记号啥的,也需要查文档半天。主要是我不太在意排版这方面事,一般也是打什么谱子用于排练,不需要到出版级的准确程度。
可是为什么我还要来使用lilypond?
主要是在于乐理教学的时候。以音程题为例,市面上的乐理书基本上都配了音程题的练习,我见过最多的可能也不过100道题?
而我平常以乐理教学为主,需要大量的这种类型的题目。而且最好是我能精准的控制题目的难度。以音程题为例,如果学生在练习这个转位音程
时不熟练,那我可以专门生成6度、7度的练习。如果对重升重降记号
不知道怎么变化,我也可以专门生成会出现重升重降的题目...
那么在python里编写好程序后,设定难度,按下去就能生成成百上千甚至上万道题目,而且还带答案。放在以前简直是天方夜谭,而现在可以轻松达成。
关于ly文件
上一篇正好介绍lilypond。这是一个靠代码生成五线谱的项目。我们自行编写一个后缀为ly
之后,lilypond便可以根据这个文件生成对应的五线谱。
我们以下面一个ly文件为例。
\version "2.22.1"
\paper {
#(set-paper-size "a4") %设定页面大小
indent = 0 %首行无缩进
system-system-spacing = #'((padding . 8)) %谱子之间的距离
top-margin = 20 %页面上边距
print-page-number = ##f %去掉页码
}
\header {
tagline = ##f %去掉默认的页脚
}
note = { \skip1 a' 4 4 4 4 }
\score{
\layout{
\context {
\Score
%\omit BarNumber %去掉小节号
}
\context {
\Staff
\remove "Time_signature_engraver" %去掉拍号
}
}
\midi{}
<<
{
\set Staff.printKeyCancellation = ##f
\tempo 4 = 150
\time 2/2
\override Staff.KeySignature.break-visibility = ##(#f #f #f)%换行后调号不再重写
\override Score.Clef.break-visibility = ##(#f #f #t)%换行后谱号不再重写
\note
}
>>
}
很明显这里分成了好几个板块,有点像HTML的逻辑,比如有控制页面元素的\paper
,控制谱子的\score
等。所以其实只需要修改note
里的音符就可以达到控制谱子的目的了。
用python的目的也在于这里,首先设定一些规则,然后批量的生成一些音符,接着拉起一个ly文件。这个流程就打通了。
关于Python
我之前没有编程基础,大概是10月的时候开始看看python的书尝试去做,水平还停留在"自然语言"的水平,不会的就只能靠if else来堆砌,变量名起的稀里糊涂。。。让各位见笑了~
比如说我现在想要生成一些音符,以下面的代码为例:
def createNote_1 (low_note,low_vavb,high_note,high_vavb):
# 主要元素
note = ('r','c','d','e','f','g','a','b')
vavb = ('',"'","''","'''",",,,",",,",",")
sharpFlat = ("","is","isis","eses","es")
# 音域转换
high_note = note.index(high_note)
high_vavb = int(high_vavb)*7
high = high_note + high_vavb
low_note = note.index(low_note)
low_vavb = int(low_vavb)*7
low = low_note + low_vavb
# 升降记号生成
sharpFlat_num = random.randint(-2,2)
sharpFlat1 = sharpFlat[sharpFlat_num]
# 生成音名
note_num = high+1
while note_num > high or note_num < low :
## 音名与八度变化
note = ('r','c','d','e','f','g','a','b')
vavb = ('',"'","''","'''",",,,",",,",",")
## 数值计算
num1_1 = random.randint(1,7)
num1_21 = random.randint(-3,3)
num1_2 = num1_21*7
note_num = num1_1 + num1_2 # 这个音的数值
## 音的名称
note1 = note [num1_1]
vavb1 = vavb[num1_21]
return [note_num,note1,vavb1,sharpFlat_num,sharpFlat1]
通过上面的流程就可以自由的生成一些音名,并且是lilypond能够识别的形式,比如c
、ces
等。
那么接下来就能够玩出花了,以音程题为例,其实就是生成两个音,再配上一个计算的模块,同时计算出答案。节奏型的编写也是,可以轻松的编写节奏,甚至旋律的编写也不是问题。
而且lilypond这玩意还能自动生成midi文件。这样子一来,视唱练耳的教学也会方便很多。以我们最常做的单音听辨为例,一般都是上课的时候可以练一下,老师帮忙弹。但是课后一般都是自己弹自己录然后自己听,或者同学之间互相弹。当然借助一些app也可以,不过相对来说这个难度控制就没有这么准确了。
而现在能生成midi文件之后,通过一些编曲软件打开略作调整,选定音色。那么一堆音频就可以方便的制作成功。
大致就是这样啦!!希望自己早点把大致的功能给做出来,封装成一个软件或者是python的模块,然后开个源。如果有变成app的可能就更好了~
3 条评论
好文
谢谢V宝
谢谢V宝