65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (17投票s)

2004年5月22日

CPOL

4分钟阅读

viewsIcon

120860

downloadIcon

1883

通过.NET驱动PC扬声器。

Sample Image - SongBuilder.png

引言

在我浏览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定义了音符的时值和音高,尽管音高实际上是通过使用PitchOctave属性来计算的。

关于音乐音符的一个有趣之处在于,每个八度音程的增加,频率都会翻倍。这意味着存储所有频率的枚举只需要存储一个八度音程的频率即可。在这种情况下,使用了第七个八度音程的频率,因为程序可以对其进行除法运算以获得正确的频率,并且不会因为舍入误差的累积而产生失真的音符。

用户界面

为了方便演示,我准备了一个简单的用户界面,以便您创建自己的歌曲。您可以使用工具栏按钮或菜单来创作您的杰作。

“文件”菜单是标准的打开/保存/退出组合。程序接受扩展名为.song的文件。实际上,只要内容符合预期的XML模式,它就能接受任何文件。

“音符”菜单允许您定义每个音符以及音符的序列。

最后一个菜单“播放”允许您播放声音。请记住,声音将从PC扬声器发出,并且在应用程序运行时您将无法与之交互。

窗口底部有一个滑块,您可以用来设置歌曲的节奏。左侧是每分钟30拍,右侧是每分钟180拍。

最后,在窗口中央是播放的音符列表。第一列是音符的时值,第二列包含音高。

有快捷键可以帮助您更快地操作应用程序,这些快捷键可以在菜单中找到。

更多信息

类文档可在源zip文件中找到。这是使用NDoc[^] 1.3 beta 1生成的。

演示zip文件中提供了一些示例歌曲文件。其中包括C大调音阶和《欢乐颂》。

有关此项目元素的更多详细信息,以下链接可能会有所帮助

历史

  • 版本1.0:一点点乐趣。
  • 版本1.01:一些错误修复和NDoc帮助文件已包含。
© . All rights reserved.