动机

打谱软件,大家都知道,用来生成五线谱。

以我个人的角度来说,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能够识别的形式,比如cces等。

那么接下来就能够玩出花了,以音程题为例,其实就是生成两个音,再配上一个计算的模块,同时计算出答案。节奏型的编写也是,可以轻松的编写节奏,甚至旋律的编写也不是问题。

而且lilypond这玩意还能自动生成midi文件。这样子一来,视唱练耳的教学也会方便很多。以我们最常做的单音听辨为例,一般都是上课的时候可以练一下,老师帮忙弹。但是课后一般都是自己弹自己录然后自己听,或者同学之间互相弹。当然借助一些app也可以,不过相对来说这个难度控制就没有这么准确了。

而现在能生成midi文件之后,通过一些编曲软件打开略作调整,选定音色。那么一堆音频就可以方便的制作成功。

大致就是这样啦!!希望自己早点把大致的功能给做出来,封装成一个软件或者是python的模块,然后开个源。如果有变成app的可能就更好了~

最后修改:2021 年 11 月 12 日
如果觉得我的文章对你有用,请随意赞赏