基本乐理知识

音的四种性质

音乐是由音构成的,而音作为一种物理现象,是由于物体的振动而产生的。物体振动产生音波,音波通过空气作用于我们的听觉器官并传送至大脑,我们就产生音的感觉。在自然界中存在着各种各样许许多多种声音,这些声音我们有的能听到,有的则听不到。我们人耳所能听到的声音,大致在每秒钟振动11—20000次的范围之内,而在音乐中所使用的音,一般只限于每秒振动27—4100次这个范围之内,而且大都是易于分辨的有限的一些音。根据音的物理属性,音有四种性质,即:

  • 音高(Pitch)
  • 时值(Note value)
  • 强弱(Dynamics)
  • 音色(Timbre)

音的四种性质,在音乐表现中,都有着充分的体现,如由于音色的不同,我们才能区分各种不同的乐器和人声。由于音有高有低,有长有短,有强有弱,我们才能写出丰富多彩、多种多样优美的旋律和动听的和声。但在音的四种性质中,音的高低和长短却有着更加突出的重要作用。比如,一支旋律无论大声唱或小声哼,用小提琴拉或用小号吹,它的基本形象并不会有什么大的改变,若将音高或长短稍加变动,音乐形象立刻就会不同程度地被破坏。

音乐的三要素

  • 节奏(rhythm)
  • 旋律(melody)
  • 和声(harmony)

节拍与节奏

在说节奏之前,先来聊一聊节拍(beat)。有强有弱的相同的时间片断,按照一定的次序循环重复,就叫做节拍;节拍中的每一时间片断,叫做单位拍,也就是我们通常说的“一拍”,它是描述音乐的时间单位。

在节拍的每一循环中,只有一个强音时,带强音的单位拍,就叫做“强拍”。不带强音的单位拍,就叫做“弱拍”。

在节拍的每一循环中,不只一个强音时,第一个带强音的单位拍叫做“强拍”;其他带强音的单位拍,叫“次强拍”;不带强音的单位拍,叫做“弱拍”。

单位拍可以用各种基本音符来代表,而表示拍子的记号,叫做“拍号”。拍号用分数的形式来标记:分子表示节拍的每一循环中有几拍,分母表示以什么音符为一拍。如:每一循环有两拍,以四分音符为一拍,这就叫做“四二拍子”。

在音乐进行中,音与音之间长短关系与强弱关系所组成的序列叫做节奏,它是一个较高级的概念。换句话说,音乐中的“节奏”实际上涵盖了除音高与音色之外的一切因素。比如:音的时值长短,音的强弱,音乐的拍子、重音,小节,节奏音型等等这诸多因素,都包含在节奏这一概念之中。在介绍节奏的同时,还有一个值得一提的概念就是节奏型。在音乐作品中,具有典型意义和特定性格的节奏称做节奏型。比如下图中,四分音符+两个八分音符+两个四分音符构成了一个节奏型,这个节奏型连续出现了两次。

舞蹈就是一门建立在音乐的节奏之上的一门艺术。许多与舞蹈同名的音乐风格在节奏上都有鲜明的特征,他们都有各自的速度、拍型和节奏型。拉丁舞蹈和音乐的风格有伦巴,桑巴,恰恰等等,大多都是偶数拍子(如二拍子,四拍子)的舞蹈。恰恰舞在练习时有“踏恰恰恰!”的口诀帮助初学者踩对节奏,这便是节奏型的体现。伦巴是表现男女爱情的舞蹈,速度因此相对舒缓以承托柔美的舞蹈。而一提起桑巴,我们则会想起穿着如孔雀般鲜艳的巴西妹子热情洋溢的快节奏舞蹈,桑巴是二拍子的。

音符与旋律

音乐中的单词就叫做音符(Note),而音符在时间轴上有序地连接在一起时就出现了旋律(Melody)。下图是一段简化了的五线谱。旋律中的音符随着时间的推移,先是维持在一个固定的音高,接着突然上升了一个较大的音程,接着缓缓下行直到又出现一个向上的跳渡,最后维持在一个固定的音高结束。每一个音符都是由两个元素构成的:音高时值。音高决定了音符自身频率的高低也决定了音符之间互相的音高关系(即音程),而时值则是指音符的持续时间,时长越长的音符时值就越大。

旋律是能给听众带来意义感的。大脑喜欢探究事物的意义和规则,而我们的听觉又非常灵敏,它能够辨识出音符走向。这使得我们具备了一个神奇的能力,能够像玩连线游戏一样,将分散的音符串联起来,听出有意义的旋律。所以,我们也习惯把旋律叫做“旋律线”。一段旋律必定包含其节奏,永远不会存在只有旋律线而没有任何节奏的音乐作品。

关于节拍节奏和旋律之前的区别,下图解说得很不错:

和弦与和声

音阶中的音横向发展得到旋律,而纵向发展就得到了和声(Harmony)。现代音乐概念里面,由多个不同的音高同时发声就叫和声。如果说旋律是音乐中的语句,那么和声就是多个人同时在讲话,或者是某人在表演一嘴多舌的口技了。和声可以扮演音乐中的形容词副词,为旋律线增添五彩缤纷的色彩。

三个或三个音以上的和声就叫做和弦(Chord)。一般来讲,和声的音符数量越多,其色彩就会越丰富。和弦的音程关系远比双音复杂,多个音之间互相都会构成音程,音程组合的可能性随音高数量呈指数增长。在过去的民谣和早期的古典乐中,和弦往往会用到最基础的由三个音组成的和弦,叫做三和弦。而在现代流行音乐中,和声的色彩随着音乐的进化已经更为丰富,和声中往往会在三和弦的架构上再加入一到两个色彩音。爵士乐则更进一步,这个风格的音乐中由五个六个组成音的和弦是家常便饭,即使是钢琴也需要两只手才能把和弦的音按全。

和弦中的音不仅可以同时弹奏形成和声,也可以先后连续奏出,这个过程叫做和弦的分解,或分解和弦。在弹奏分解和弦时,我们依旧能隐约或强烈地感受到和声。由于大脑的短期记忆可以储存前几秒之前的音符并将这些音符拼接在一起,我们能够感受到分解音之间的音程关系,还原出和声的色彩。同样,我们对旋律的感受也少不了大脑对相邻几个音之间的音程关系的处理。如果没有了短期记忆的帮助,我们恐怕就无法听懂音乐了。

单调音乐、复调音乐与主调音乐

音乐三要素之间的结合方式叫做织体(Texture)。就像织布有粗细薄厚之分,我们也可以感受到音乐织体的粗细与薄厚。虽然织体在乐曲中会不断变化,不过还是可以归纳出以3种基本的模式:

  • 单调音乐(Monophony)
  • 复调音乐(Polyphony)
  • 主调音乐(Homophony)

像下图中由一根旋律线单独进行地音乐织体叫做单调音乐。

由多个独立的旋律线并行构成的织体叫做复调音乐。一个乐器即可以演奏复调音乐,但并不是多个乐器或多个声部演奏的音乐就一定是复调音乐。比如,如果所有乐器声部都在演奏和模仿同一个旋律,这种织体被叫做支音音乐。

以上这些织体并不是流行乐中最常见的,我们最常见的织体叫做主调音乐。主调音乐织体是由一条旋律线配以和声进行来构成的。旋律中的音符既是和弦中的某个音,同时又可以构成一条独立的旋律。旋律音常常是和声中的高音,但这并不是绝对的,旋律也可以在低音或中音发展。

与复调音乐不同的是,主调音乐和声中的非旋律音是用来衬托旋律并为其增色的,它们并不独立构成新的旋律线。而在复调音乐中,多条独立的旋律弦之间却可以互相构成和声关系,同时起到和声与旋律功能,这样的写作手法叫做对位法。由于对乐理知识要求较高,对位法一般是音乐专业学习者才会接触的功课,却也是严肃音乐中必不可少的技能和训练。

计算机音乐创作与标准MIDI文件

在计算机音乐创作中,计算机声音合成与计算机作曲是两个最重要的领域,二者既有相似之处,也有本质上的区别。前者提供了声音合成的取舍方法,后者是在作曲过程中由计算机做出相应的决定;前者可看作传统电子音乐技术手段和思维的延续和发展,后者则可看做对人类纸笔谱曲方式的拓展;前者中由计算机输出的主要是声音,如WAV文件或者AIFF文件,而后者中由计算机输出的结果则主要是乐谱或者可由制谱软件读取的文件,如MIDI文件或者MusicXML文件。最近,基于MIDI的计算机音乐自动生成研究已成为主流。

乐器数字接口(Musical Instrument Digital Interface,简称MIDI)是一个工业标准的电子通信协议,为电子乐器等演奏设备(如合成器)定义各种音符或弹奏码,容许电子乐器、电脑、手机或其它的舞台演出配备彼此连接,调整和同步,得以即时交换演奏数据。MIDI不发送声音,只发送像是音调和音乐强度的数据,音量,颤音和相位等参数的控制信号,还有设置节奏的时钟信号。在不同的电脑上,输出的声音也因音源器不同而有差异。可以说MIDI文件就是电子乐器在看的电子乐谱,所以通常一个文件只需几十KB,就能够让电子乐器演奏出一首很完整的音乐。

标准MIDI文件结构

这份斯坦福大学课程讲义详细描述了标准MIDI文件(Standard MIDI File 简称SMF)的文件结构。SMF是由MIDI块(chunks)构成的。第一个MIDI块是Header块,接下来是一个或多个Track块。Header块包含整个MIDI文件的全局数据。每一个Track块都定义了一个逻辑音轨(track)。

1
SMF = <header_chunk> + <track_chunk> [+ <track_chunk> ...]

一个块由三部分构成,与微软的RIFF文件类似(不同之处在于SMF是使用大端法存储(Big-endian),而RIFF是使用小端法(little-endian)),这三部分定义如下:

  1. 前四个字节是块ID,Header块是”MThd”,Track块是”MTrk”;
  2. 下面四字节是无符号值,用来定义块中数据部分的长度;
  3. 最后则是块数据。

Header块

Header块包括块ID、长度、MIDI文件的格式信息、MIDI音轨(指逻辑音轨,即Track块个数)数量和MIDI最小时间单位长度信息。

1
header_chunk = "MThd" + <header_length> + <format> + <n> + <division>
  • MThd:4字节,标志Header块的字符,16进制表示为:0x4D546864。这4个字符出现在MIDI文件的开头,标志这是一个MIDI文件;
  • header_length:4字节,指示Header块中数据部分的长度(永远为6字节长,因为数据部分的三个字段均为2字节);
  • format:2字节,0表示单一音轨文件格式,1表示多音轨文件格式,2表示多歌曲文件格式(一组单一音轨的文件);
  • n:2字节,记录Header块后的Track块的数量;
  • division:2字节,间隔时间所对应的单位时间数(tick数)。如果这个值为正,那么它标志着每一拍所对应的单位时间数。比如说,+96表示每拍对应96 ticks。如果这个值为负,间隔时间则对应SMPTE单位。

Track块

Track块包括块ID、长度和事件信息(event data)。

1
track_chunk = "MTrk" + <length> + <track_event> [+ <track_event> ...]
  • MTrk:4字节,标志Track块开始;
  • length:4字节,标志数据部分的长度;
  • track_event:序列化的音轨事件。

音轨事件(Track Event)

一个音轨事件由与上一事件的间隔时间和三种事件之一构成:

1
track_event = <v_time> + <midi_event> | <meta_event> | <sysex_event>
  • v_time:一个变长值,用来表示与前一事件的间隔时间;
  • midi_event:MIDI的通道事件,比如说音符开始(note-on)与音符结束(note-off)。其播放方法在MIDI装置中都相同;
  • meta_event:元事件;
  • sysex_event:系统独有事件。

Python下的MIDI读写处理工具

工具包 支持的MIDI功能
pretty_midi 超好用的各种实用功能
mido 读、写
python-midi 读、写
pyMIDI 读、写
music21 读、写
pygame 读、写、播放
MMA 读、写、播放

更多可见Python音乐大礼包

MIDI转格式

由于大多播放器并不支持 MIDI 文件的播放(毕竟不是声音文件),有些时候需要将其转为其他音频格式。Google 了一下有几个工具可以选择:

首先本来使用midi2audio,因为它既支持命令行运行也支持 Python 脚本导入。但使用它的命令:

midi2audio input.mid output.wav

转出来的 WAV 文件不能使用,且也不会报错,就很奇怪。后来发现它是基于FluidSynth的,我使用 FluidSynth 转 MIDI,果然也不行:

fluidsynth -ni sound_font.sf2 input.mid -F output.wav -r 44100

转出来的 WAV 文件不能使用,遂放弃。。

然后换用了timidity。因为它的安装非常方便,可以直接使用Homebrew安装。然后可以使用命令行转 MIDI 为 WAV:

timidity input.mid -Ow -o out.wav

转出来的 WAV 可用,如果想再转成其他格式(如 MP3)的话,可以再使用ffmpeg完成。

参考文献

[1] 李重光. (2004). 基本乐理通用教材 (Vol. 43). 北京: 高等教育出版社.
[2] 乐理101-什么是音乐?. Retrieved March 12, 2018, from https://zhuanlan.zhihu.com/p/25057274.
[3] 倪朝晖. (2015). 算法作曲理论与实践. 西南师范大学出版社.