APP下载

Excel在音律学习方面的应用

2020-10-09王维涛

科技风 2020年24期

王维涛

摘 要:对于音乐爱好者来说,学习音律学的内容是件非常有意义的事情,音律的学习必须以声音音响作为基础,转换分析计算的数据为人耳可感知的音高(pitch),从内心深处理解不同律制(temperament)的差异。

关键词:Excel VBA;音律学;律制

微软办公软件Microsoft Office中的Excel,是人们广为熟知的处理数据的工具。我们用这款数据处理软件,计算生成所需律制的数据,使用Excel VBA编写代码,调用Windows API函数,产生所需律制的音高音响。

音分(cent)是计量音程(interval)的对数单位,以等律(十二平均律Twelve-tone equal temperament)八度(octave)等分为十二个半音(semitone),每半音为100音分计。此方法由英国数学家、语言学家、语音学家亚历山大J.埃利斯(Alexander J.Ellis 1814-1890)所倡导使用,埃利斯选择半音(semitone)的百分之一,为计量基础值,即12002,音分值(cent value)是当今普遍使用测量计算音高和音程的标准方法。

音分值从0至1200,音高频率从261.6256Hz至523.2513Hz,涵盖钢琴小字一组范围。

我们使用Windows API中的硬件与系统类函数Beep或APIBeep生成简单的声音。在Excel VBA编程调用Beep或APIBeep函数声明如下:

Declare Function Beep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long

参数:dwFreq 声音频率(从37Hz到32767Hz)。

dwDuration 声音的持续时间,以毫秒为单位。

我们给出十二平均律C大调音阶示例。

在已打开计算好的音分值与音高频率的Excel工作簿(sheet1)中,选择“开发工具”选项卡(可通过“文件”菜单中“选项”菜单的“自定义功能区”添加),点击代码功能区的Visual Basic图标,打开Microsoft Visual Basic for Applications窗口,点击窗口中“插入”菜单,选择“模块”菜单,打开代码窗格,键入代码:

Declare Function APIBeep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long

Public Sub array_get_value()

Dim cent_frequ(1201,2)As Single '数组

Dim i,j As Integer '循環变量

Sheets(1).Activate

For i=0 To 1200 '数组赋值

For j=0 To 1

cent_frequ(i,j)=Sheets(1).Cells(i+1,j+1).Value

Next

Next

APIBeep cent_frequ(0,1),2000 '生成声音

APIBeep cent_frequ(200,1),2000

APIBeep cent_frequ(400,1),2000

APIBeep cent_frequ(500,1),2000

APIBeep cent_frequ(700,1),2000

APIBeep cent_frequ(900,1),2000

APIBeep cent_frequ(1100,1),2000

APIBeep cent_frequ(1200,1),2000

End Sub切换窗口,在音分值与音高频率的Excel工作簿(sheet1)中,选择“开发工具”选项卡,点击“控件”功能区“插入”图标,添加“按钮”控件,窗口会自动弹出“指定宏”对话框,选择键入代码的子过程名array_get_value,编辑“按钮”名称“十二平均律C大调音阶”。

点击“十二平均律C大调音阶”按钮可听到每个音符持续2秒钟声音序列。

代码中,以读取音分值与频率二维表组成的数组元素发出音响,使数组下标值与音分值一致,是为方便初学者修改代码产生其他律制音响序列,也可以直接使用音分值与频率二维表单元格数值,因为表中值以0音分值开始,所以在引用音分值时,需做加1处理,例如APIBeep Cells(901,2).Value,2000,括号中的值,为音分值与频率二维表中的行、列值,901行、2列,对应音分值900,频率为440Hz的值。键入代码:

Declare Function APIBeep Lib "kernel32" Alias "Beep"(ByVal dwFreq As Long,ByVal dwDuration As Long)As Long

Public Subcell_get_value()

Sheets(1).Activate

APIBeepCells(1,2).Value,2000 '生成声音

APIBeep Cells(201,2).Value,2000

APIBeep Cells(401,2).Value,2000

APIBeep Cells(501,2).Value,2000

APIBeep Cells(701,2).Value,2000

APIBeep Cells(901,2).Value,2000

APIBeep Cells(1001,2).Value,2000

APIBeep Cells(1201,2).Value,2000

End Sub

可产生相同效果。下面我们做分析,都使用音分值与频率二维表组成的数组元素的值。

五度相生律(Pythagorean temperament)由基础律(音)开始,以频率比3∶2(完美五度)产生新律(音),每律(音)相隔五度的律制。

以音分值与音高频率表中的0,204,408,498,702,906,1110,1200,音分值可生成五度相生律大调音阶。以音分值与音高频率表中的0,204,294,498,702,792,996,1200,音分值可生成五度相生律小调音阶。

纯律(Pure temperament)由基础律(音)开始,以频率比3∶2,频率比5∶4产生新律(音)的律制。

以音分值与音高频率表中的0,204,386,498,702,884,1088,1200,音分值可生成纯律大调音阶。以音分值与音高频率表中的0,204,316,498,702,814,1018,1200,音分值可生成纯律小调音阶。

中庸全音律(Meantone temperament)是在歐洲应用数百年,兼有五度相生律和纯律优点的律制。

以音分值与音高频率表中的0,193,386,504,697,890,1083,1200,音分值可生成中庸全音律大调音阶。以音分值与音高频率表中的0,193,311,504,697,814,1007,1200,音分值可生成中庸全音律小调音阶。

比照前述十二平均律C大调音阶示例,在音分值与音高频率的Excel工作簿(sheet1)中,选择“开发工具”选项卡,打开Microsoft Visual Basic for Applications窗口,点击窗口中“插入”菜单,选择“模块”菜单,在代码窗格,键入代码(各律制代码,可输入在单模块中,也可输入在各自独立模块中;各律制代码输入在单模块中,最好做代码优化,输入在多模块中,模块名称,按序号自动增加),切换至“开发工具”选项卡,选择“控件”功能区“插入”图标,添加“按钮”控件,在自动弹出的“指定宏”对话框中,选择键入代码相关的子过程名,编辑按钮名称为对应律制名称。

此方法也可应用在民族律制的学习中。

参考文献:

[1]缪天瑞.律学[M].北京:人民音乐出版社,1996.

[2]王光祈.中國音樂史[M].上海:三联书店,2014.