一个简单的蜂鸣声 - 回味 ZX Spectrum 音效






4.57/5 (17投票s)
通过.NET驱动PC扬声器。
引言
在我浏览PInvoke.net[^]寻找某个API时,我注意到了一个名为Beep
的函数,这让我突然怀旧起1983年刚开始在ZX Spectrum上编程的时光。
我决定创建一个程序,使用Beep
API函数,并以类似ZX Spectrum的方式播放音乐。然而,由于.NET Framework的强大功能,我也决定同时玩玩XML序列化。
这篇文章的目的纯粹是为了好玩,这也解释了文中那些糟糕的笑话。我并不是想解释XML序列化(尽管如果你刚接触它,可能会从中获得一些想法)或者Beep
函数,尤其是因为它本身很简单。
Beep
首先,Beep
API函数在Windows 95、98或ME上不会播放美妙的音乐,它只会单调地响一声,持续预设的时间,或者,如果存在声卡,它会播放默认声音。就这样。¡Nada más! 如果你运行的是这些操作系统中的任何一个,参数都会被忽略,这篇文章将毫无用处,你可以安全地将其打印出来,放进碎纸机,然后用作宠物仓鼠的垫料。
该函数不会在后台发出哔哔声,因为它像我旧的ZX Spectrum一样是同步操作的。所以,如果你调用它并将持续时间设置为30000毫秒,那么你将不得不等待半分钟才能让应用程序再次响应。
它将从PC扬声器输出37Hz到32767Hz的频率范围,所以你也许可以编写一个应用程序,利用其中的高频率来呼唤你的宠物狗。不幸的是,我的宠物狗差不多三年前就去世了,所以我无法测试这个假设。当时它差不多15岁,而且已经聋了好一阵子了,所以我想即使它现在还活着,我也无法测试。
Beep
方法目前在.NET中不可用,但据称将在.NET 2.0中提供。在此之前,要使用API函数,需要一点P/Invoke(平台调用)。
[DllImport("kernel32.dll")]
private static extern bool Beep(uint dwFreq, uint dwDuration);
歌曲的表示
示例应用程序非常简单。它打开一个包含歌曲的XML文件。模式非常简单,任何对音乐有基本了解的人都可以轻松创建一个包含歌曲的XML文件。
C大调音阶文件的示例。
<Song Tempo="60">
<Notes>
<Note Duration="Quarter" Pitch="C" Octave="4" />
<Note Duration="Quarter" Pitch="D" Octave="4" />
<Note Duration="Quarter" Pitch="E" Octave="4" />
<Note Duration="Quarter" Pitch="F" Octave="4" />
<Note Duration="Quarter" Pitch="G" Octave="4" />
<Note Duration="Quarter" Pitch="A" Octave="4" />
<Note Duration="Quarter" Pitch="B" Octave="4" />
<Note Duration="Quarter" Pitch="C" Octave="5" />
</Notes>
</Song>
Song
元素包含一个属性,定义了以每分钟节拍数(BPM)表示的Tempo
。四分音符等于一拍。
Song
包含一个Notes
元素,该元素又包含各个Note
元素。每个Note
定义了音符的时值和音高,尽管音高实际上是通过使用Pitch
和Octave
属性来计算的。
关于音乐音符的一个有趣之处在于,每个八度音程的增加,频率都会翻倍。这意味着存储所有频率的枚举只需要存储一个八度音程的频率即可。在这种情况下,使用了第七个八度音程的频率,因为程序可以对其进行除法运算以获得正确的频率,并且不会因为舍入误差的累积而产生失真的音符。
用户界面
为了方便演示,我准备了一个简单的用户界面,以便您创建自己的歌曲。您可以使用工具栏按钮或菜单来创作您的杰作。
“文件”菜单是标准的打开/保存/退出组合。程序接受扩展名为.song的文件。实际上,只要内容符合预期的XML模式,它就能接受任何文件。
“音符”菜单允许您定义每个音符以及音符的序列。
最后一个菜单“播放”允许您播放声音。请记住,声音将从PC扬声器发出,并且在应用程序运行时您将无法与之交互。
窗口底部有一个滑块,您可以用来设置歌曲的节奏。左侧是每分钟30拍,右侧是每分钟180拍。
最后,在窗口中央是播放的音符列表。第一列是音符的时值,第二列包含音高。
有快捷键可以帮助您更快地操作应用程序,这些快捷键可以在菜单中找到。
更多信息
类文档可在源zip文件中找到。这是使用NDoc[^] 1.3 beta 1生成的。
演示zip文件中提供了一些示例歌曲文件。其中包括C大调音阶和《欢乐颂》。
有关此项目元素的更多详细信息,以下链接可能会有所帮助
- 指南
- 密歇根理工大学:音乐音符的频率
- 维基百科:乐谱
- MSDN:控制XML序列化的属性
- API
- MSDN:Beep
- MSDN:XmlArrayAttribute 类
- MSDN:XmlArrayItemAttribute 类
- MSDN:XmlAttributeAttribute 类
- MSDN:XmlIgnoreAttribute 类
历史
- 版本1.0:一点点乐趣。
- 版本1.01:一些错误修复和NDoc帮助文件已包含。