type
Post
status
Published
date
Nov 12, 2021
slug
summary
解放教学生产力
tags
python
lilypond
category
探索新世界
icon
password
Python+lilypond?——流程化生成五线谱
动机
打谱软件,大家都知道,用来生成五线谱。
以我个人的角度来说,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的可能就更好了~
- 作者:xhhdd
- 链接:https://blog.xhhdd.cc/article/c3e7b0ed-f636-4e4b-b980-ef85aca27e10
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章



