新浪博客

音乐编程拾趣

2022-11-30 09:09阅读:
乐趣一 基础概念

  计算机编程,需要十分严谨的逻辑。因而,音乐编程、需要一套逻辑自洽的概念体系、适应计算机的逻辑运算和运算逻辑。
  基于这样的自洽概念,才有了音乐编程的所谓“东归技术体系”。

一、音乐概念

  东归技术体系,对于十二平均律的运用,采用了相对音调的唱名体系。在概念表述中,以全部的英文字母大写符号、表示低音,如DOREMI;以先大写后小写、表示中音,如DoReMi;以全部的小写、表示高音,如doremi
  具体来说:由于音乐播放及播放效果的技术,对接了现有MIDI技术的标准化音调,东归技术体系的音乐概念类似于简谱的记谱与首调唱名,在编程中专注于“音程关系”。只是为了播放音乐,才需要确定具体的音调、与MIDI技术对接。
  以下,将通过系列化的编程实例,详细表述东归技术体系的音乐概念:

  首先,确定一个音序:Do-Re-Mi-So
  熟悉现有音乐理论的爱好者能够明白,这个音序既不是五声音阶、也不是自然音阶或布鲁
斯音阶。
  在编程中,东归技术体系“允许”编程代码、对这类的音序进行定义,翻译为通常的说法、犹如“五度内的四声音阶”。
  电脑程序、很容易计算出,与Do-Re-Mi-So“音程关系”完全吻合的“五度四声音阶”还有Fa-So-La-doSo-La-Ti-re等等。但,若在十二平均律中、把FaLaTi三个音纳入最初确定的音序之后,这个音序就不再是“五度四声音阶”,而成为了自然音阶。

  鉴于编程者本人所追求的是音乐创作式的电脑程序,探寻的是“以有限创造无限”的生命奥秘和音乐奥秘。因而,在东归技术体系中,不允许电脑程序“偷换概念”,从而建立了“坐标音序”与“和声音序”的概念体系,使程序得以明确区分音阶、音序、和弦的各自不同运用,同时,也就不必沿用现有的相关音乐理论、而尝试建立“纯粹数学意义”的音乐数理体系。
  那么,回到此番系列化的编程实例、所选定的音序:Do-Re-Mi-So
  这个音序在东归技术体系中,属于“坐标音序”,其相应的“和声音序”则分别以坐标中的四个音为“根音”而形成,排列如下:
  Do为根音:Do-Re-Mi-So-do……
  Re为根音:Re-Mi-So-do-re……
  Mi为根音:Mi-So-do-re-mi……
  So为根音:So-do-re-mi-so……

  至此,熟悉现有音乐理论的爱好者很容易发现,这样的音乐数理、完全不是通常所说的“五度内的音阶”、而仅仅是“四声音阶”罢了。
  确实,坐标音序Do-Re-Mi-So仅仅是四声音阶,恰如五声音阶仅仅是五声音阶。编程者本人,起初正是由于无法在现有音乐理论的启发下、破解本土传统五声音阶的和声奥秘,才想到借助计算机技术、来探寻音乐的奥秘。
  况且,五声音阶的音乐也很精彩、不乏美妙动人的经典曲目,有理由期待Do-Re-Mi-So所组合而成的类似“音序体系”、同样也能带来精彩与美妙。
  由于编程者本人的音乐编曲“习惯已经养成”,无法“趋向于”无限、去“故意创作”相关的乐曲,这件枯燥乏味的探寻任务、就交给了电脑。在此,有请音乐爱好者和计算机编程爱好者一起,来“听证”(而非“见证”)计算机技术对Do-Re-Mi-So这个四声音阶的音乐潜质的展现。

  想必,听证之后,人们不得不承认:东归技术体系的“坐标音序”与“和声音序”概念,至少,在电脑的音乐编程领域中、是“适用”的概念。
  编程者本人十分志愿同所有人分享探寻与发现的乐趣,东归技术体系永远都志愿成为免费共享的、非商业化非赢利的技术体系。运用这项技术的爱好者、包括编程者本人,可以用这项技术所“生成”的乐曲来谋生;但恳请今后的人们,不要以专利之类的形式、去垄断这项技术、阻碍其他人探寻音乐的奥秘。这项技术也并非“唯一”可行的探寻方式、更非成熟完美的方式,只是编程者个人的某种尝试、意义也仅限于抛砖引玉;请饶了这块砖,把精力用于雕琢美玉!
  有关Do-Re-Mi-So四声音阶“音乐潜质”的展现程序,编程设计如下——
Dim zbyx(36),hsyx(13672) '以数组的形式,定义坐标音序及和声音序,请注意和声音序的数组以五位数字标记、有利于今后对根音的运用
zbyx(0) = 0: zbyx(1) = 2: zbyx(2) = 4: zbyx(3) = 7 '赋值数组确定四声音阶,
zbdzsh = 4 告诉程序:坐标音序中的音符数量是4个,以免程序运行时发生错误
m = 0 以下,应用坐标音序的设置,采用循环语句、自动计算“和声音序”,和声音序的取值范围是6个“八度音程”zbdzsh * 6
Do While m < zbdzsh
k = 0: hx = m: hsx = 10000 + m * 100: xk = 0
Do While k < zbdzsh * 6
hsyx(hsx + k) = zbyx(hx) + 12 * xk: k = k + 1: hx = hx + 1
if hx = zbdzsh then
hx = 0: xk = xk + 1
end if
Loop
m = m + 1
Loop
  有了音序,如何编织“趋向于无限”的不同曲目呢?
  历史知识可以帮助我们想办法。人类最早的音乐,往往只是有节奏的敲击或发声;可见,音乐之所以成为音乐,就在于不同于噪音,是某种“可加深印象的”音响体系、具备“加深印象的”某些“天然与人文”法则。而音乐的节奏,表现出显著的加深印象的作用。所以,接下来就是对节奏的程序设计:
Dim pzx(48), pzq(48) 用于表现节拍的乐器序号、节拍的力度变化
Dim zxx(48), zxq(48), zxc(48) 用于表现节奏的乐器序号、节奏的力度变化、以及相对应的时长,需要三个数组、来存取数据
Dim pxchn(3), zxchn(3) 由于节拍与节奏,可以进行繁多的设计,在编程中采用“字符串”提供相关数据、较为轻松
Dim ppqm(9), zpqm(9) 打击乐的配器设置,对应于节拍与节奏的乐器序号
  此番系列化的编程实例中、特意隐去了打击乐的音响效果,是为了突出节拍与节奏对构建乐曲的“编程意义”,随后将具体解释。在此需要说明:不必设置节拍音符的时长,是因为节拍始终稳固、表现出均匀的时长,只需在编程中统一采用16分音符之类的时长、即可。
pxchn(0) = '109100108100109100108100109100108106109100108100' 常见的四二拍,以三个连续的字符为一组:第一个字符赋值乐器序号
zxchn(0) = '109100100100109100108100109100108106109100100100' 对应于四二拍的某种节奏,由于对应了节拍、而无需设置时长
pxchn(1) = '109100108100107100108100107100106100' 常见的四三拍,每组字符的后两位数、赋值节奏音符的力度
zxchn(1) = '109100100100106100108100100100106100' 对应于四三拍的某种节奏
ppqm(1) = 54 节拍打击乐器的序号1配置为MIDI软波表的54号乐器(视窗操作系统默认的Roland波表中设置为铃鼓音色)
zpqm(1) = 35 节奏打击乐器的序号1配置为MIDI软波表的35号乐器(视窗操作系统默认的Roland波表中设置为底鼓音色)
n = 0: mchn = pxchn(0) 以下采用循环语句,对四二拍及相应节奏的“字符串代码”进行解码、赋值到相应的数组,以便编程时的应用
Do While n < Len(mchn) / 3
vzhi = Mid(mchn, 3 * n + 1, 1): pzx(n) = ppqm(vzhi + 0)
vzhi = Mid(mchn, 3 * n + 2, 2): pzq(n) = vzhi + 0
n = n + 1
Loop
pxdzsh = n: n = 0: mchn = zxchn(0)
Do While n < Len(mchn) / 3
vzhi = Mid(mchn, 3 * n + 1, 1): zxx(n) = zpqm(vzhi + 0)
vzhi = Mid(mchn, 3 * n + 2, 2): zxq(n) = vzhi + 0: n = n + 1
Loop
zxdzsh = n 记录节拍及节奏“单次循环中”所使用的音符数量,以免程序运行时出错
  至此,编曲程序获得了所需的音序与节拍及节奏,但要表现出更为丰富的音乐效果,还需要“旋律感”。坐标音序,相当于提供了和弦或和声的根音,在此只有四个音调;和声音序,虽有六个八度的取值范围,却呈现出固定的顺序、无法“直接”让电脑程序应用。因此,需要设置“音程关系的变化”,通过具体的“程序指令”,告诉电脑如何把节拍、节奏与音序“编织成为一体化的曲目”。
  现有的大多数音乐播放器,都能以波动的形式、呈现音乐中的音调(也就是声音的频率)变化,这种波动在音乐数理中、就是音程的变化。此番系列化的实例中,暂且以和声音序的“序号变化”作为指令,为程序设置音程的变化;这种设置方式,可以用“旋律线”的概念、进行表述,并在编程中灵活应用。
Dim xvxn(96) 提供一个数组,用于存取旋律线数据,最多可支持96次变化
mchn = '100101102103104105104103102101' 以三个字符为一组,设置序号的变化——实际上,一组数据未必需要三个字符,此处纯属个人偏好
n = 0以下,解码旋律线的字符串
Do While n < Len(mchn) / 3
vzhi = Mid(mchn, 3 * n + 1, 3): xvxn(n) = vzhi - 100
n = n + 1
Loop
xndzsh = n记录旋律线中的变化次数
  现在,才拥有了“必要的”音乐素材(数据),可以对接MIDI技术、用电脑程序“编织”曲目。
(乐趣一 待续)

我的更多文章

下载客户端阅读体验更佳

APP专享