对《用手绘波形制作声音的软件》的研究
北京八中 曹建秋
自然界中的声音多种多样、千变万化,但当我们要用到时,它们往往满足不了需
要,许多时候需要对其进行加工,有时甚至要制作人工声音。这时我们用到的工具经
常是电脑。我观察了现在电脑里面的多媒体软件。各种声音加工软件大都有一个基本
功能:将声波显示在屏幕上,并可以在时间横轴上任意放大,显示声波曲线图上的细
节。在此基础上,还有一些很有用的功能。以Cool Edit软件为例:
1.手工修改声音:可以将原有的声音波形放大后,用鼠标修改声波上面任何一
个样本点的振幅。(图1)
图1,Cool Edit声音软件放大声波后可直接修改声波曲线
2.制作新声音:可以生成以数学函数图像为波形的声音(方波、正弦波、三角
波„„)。
现有软件的功能大都停留在有限修改声音和创建固定波形的声音上。而如果能够
自由绘制声波曲线,然后用计算机将其转换成声音播放出来,将是十分方便的。可惜
没有这样的软件。我又考察了一些现有的其他技术:
1. 任意波形信号发生器。它可以利用示波器和一些电路生成任意的波形。使
用时,用黑纸切割出需要的波形,覆盖在示波器上,用对示波器上的亮点
感光的方法扫描出波形。(详见附录)
2. 2001年全国大学生电子设计竞赛的一道题目:波形发生器。要求是用键盘
24088860.doc Page 1 of 11 9/5/2009
编辑生成一定频率的正弦波、三角波、方波和由用户编辑的特定形状波形。
选手可以利用各种电子元件以及单片机完成题目。(详见附录)
以上两个技术虽然没有生成声音,但都涉及到了生成任意的波形,对我有参
考价值。前者利用模拟电路和示波器,扫描纸上的波形;后者利用单片机,用键
盘输入波形。他们有共同的弱点,就是方法复杂,并且它们都是单独的电路,难
于扩展。于是,我便有了在电脑中编一个可以把手绘的声波曲线转化成声音的软
件的想法。设想中的软件基本功能是:
1.将任意的手绘的波形转化为指定频率的声音。
2.将已有的声音的波形进行绘图式的修改。
1. 研究声音文件结构,为以后的工作铺平道路。
2. 编制一个初级的程序,可以把从文件载入的声波曲线转化为声音文件。
3. 实现直接在电脑上用手绘制声波曲线,并即时转化成声音播放出来。
4. 增加绘图式修改声音波形的功能。
5. 参照现有声音软件,增加一些声音的辅助功能(编辑、转化等)。
6. 将软件发布测试,征求使用者的意见,再进行优化。
以上研究、开发、设计均在个人电脑上完成,使用WINDOWS操作系统。
硬件:多媒体电脑
软件:Cool Edit声音软件、Office软件、Visual Basic程序设计语言。
1. 研究电脑中声音文件的结构
我开始打算用播放WAV文件的方式进行发音,所以首先研究它的结构。
我用记事本打开一个WAV文件,发现它有一个可认读的文件头(“RIFF6 WAVEfmt”的字样),后边不可认读,是一些中西文字符。改用Word打开,选择文字编码为西欧,看到它们是ASCII码为0~255的字符。我猜想WAV文件中采样点的坐标数是用其对应的ASCII码的字符表示的。于是我修改了这个文件中的ASCII码,比如,用一个英文字母T,连续复制几百个,保存后再用声音软件打开,果然发现声波
的曲线增加了一段直线。初次尝试就取得了进展:不但了解了WAV文件的结构,还实现了在文本中修改和制作一段声音的功能。
我的创建声音文件的方法试验成功了,而这个文件便是一个“伪WAV文件”。之所以有这样的称呼,是因为它在形式上与WAV文件相同,可以被某些声音软件当作
WAV文件处理,却没有文件头。
2. 制作把波形转化为声音文件的程序
24088860.doc Page 2 of 11 9/5/2009
我首先用Windows“画笔”绘制一个波形并保存为BMP文件。然后用VB编制了程序。程序中用图片框载入BMP文件,在波形上每n个点取一个采样,n的公式为:
n = 波形上点的总数/(采样率/预期声音频率) (采样率=22050Hz)
采样精度是8bit,坐标取值范围0~255,其中128表示零电平,记录下采样点的
坐标。然后,用上面所述的方法,把坐标数制作成文件,就得到具有一个周期声波的
“伪WAV文件”。用Cool Edit打开这个文件,按预期的声音频率数复制多遍后,就
制作成可以播放的声音文件了。
以上的方法可以概括为下面的几个步骤:
绘制图片(画笔)?取采样点(我的程序)?制作声音文件(Word)?复制、
播放(Cool Edit)
我取得了初步的成功,能够在电脑上听到自己“绘制”的声音了。但是,这种方
法存在明显的缺点:
? 需要很多的手工操作,前后用到4个程序,不能做到自动化,并且兼容性
差。
? 声音的长度全靠复制的次数来调整,一则不准确,二则当频率高时工作量
很大。
3. 改进声音文件
针对以上的缺点,我准备改进程序,使它能够进行文件操作,一次性地完成声音
文件。
一天偶然发现Cool Edit软件可以把声音保存成一种文本文件,我用记事本打开它,
看到其中的声音样本都是从0~255之间的数字,中间用回车符分隔。如果能把声音文
件保存为这样的形式,再用Cool Edit读入,则能省去把数字转化成字符的工作,比原
来要方便。原来还有一个问题,ASCII码在32以下的字符都是特殊控制符,无法使用,
所以采样点的坐标数也不能小于32,现在没有这个问题了,采样点的坐标可以是0~255之间任意的整数。
这样,我在程序中,增加了一段代码,使它可以生成表示一个周期声音的这种格
式的字符串,根据用户输入的频率数,重复写入到文件中,制作成指定频率的声音文
本文件。
改进后的优点有:
? 省掉了用Word宏命令的步骤,减为三步。
? 声音文件在Cool Edit中可以直接播放,不用再进行复制
仍然存在的不足:
? 还需要在别的程序中绘图。
? 生成的声音文本文件只能被Cool Edit打开播放,兼容性仍然不强。 24088860.doc Page 3 of 11 9/5/2009
4. 增加绘图功能
我对WAV文件结构的了解还不充分,还不能创建可以在其他程序中打开的真的
WAV文件。曾经在网上下载了一个英文版的WAV文件结构介绍,但在阅读时遇到了
很大困难。所以我打算在寻找好办法的同时,先进行下一步,制作绘图的功能。
在采集声音样本后,程序将在采样点上绘制指示线,而绘图时又要把指示线擦去。
所以我选择的办法是,绘图后先把图片保存起来,采集样本后画上指示线,再次绘图
时把原来的图片恢复。现在遇到的问题就是如何保存图片。我想在VB中寻找一种可以把图片框里的图片暂时储存起来的控件,在查找资料之后却没有发现理想的。于是
想到了用API函数,但是函数手册总是看不太明白。我又请教了中科院软件所的同志,
而他们对VB的了解也不太多。只得又退回来,重新研究VB中的功能。这次细致地看了一下资料,终于发现图片框中有一个表示里面图片的属性,而VB中也有一种可以接收这个属性赋值的变量。这样,费了很大的周折,终于解决了保存图片的问题。
绘出的方式我设置有3种:铅笔、画直线、橡皮。这是仿造Windows里的“画图”设置的。“铅笔”是随着鼠标的移动画出任意的曲线,“画直线”时鼠标可以拉出直线,
“橡皮”是擦除。这项工作完成想来倒相对比较简单,只用到了图片框的鼠标事件和
绘图方法。
下面要为绘图时的鼠标选取图标。我从网上下载了一些,没有如意的。后来从VB自带的图形库里找到了一个铅笔的图标,橡皮的图标则是自己绘制的。
这样,绘图的功能被制作到了程序里,由声波曲线制作声音的过程减少到了两步:
?画曲线,程序自动找坐标,保存成TXT声音文件;?用Cool Edit软件打开后将制作的声音播放出来。
程序里载入BMP文件的功能仍然保留。以方便载入现成的声波曲线。
5. 把ActiveX声音控件加入程序里
到这时,对于保存声音文件和声音播放的问题,已经有了解决办法。我在网上发
现了一个声音控件——NCTWavPlayer(图2)。它十分强大,具有一般的声音处理软
件的所有功能。我打算在程序中引用这个控件。这样,我便不必研究
中的声音文
件的创建和播放的问题,控件都可以代劳了。而且在里面声音波形也可以显示出来。
并且再加入其它的功能也是易如反掌了。
图2,声音控件——NCTWavPlayer的界面
但是,我编程序时遇到了大问题。程序需要把采样点加入到声音控件中,但是,
24088860.doc Page 4 of 11 9/5/2009
在控件中建立新文件后,按照帮助文件上的方法加入采样点并不能成功。我便到NCT公司的网站上询问,但没有得到满意的答复。问题只得自己解决。我试验在各种情况
下进行采样点的加入,最后终于发现,只有当控件载入一个现有的声音文件后,才可
以加入采样点。这很令人费解,现在仍未找到原因。但是我想出了把采样点加入控件
的办法:先载入一个声音文件,再把全部定义成块,这时加入采样点,便可以把原来
载入了的声音覆盖成新的声音。
我在程序中加入播放的功能,这调用了NCTWavPlayer的函数。
现在,我的程序大体成型,它终于实现了自动地完成把用手绘制的声波曲线即时
转化成声音的目标。
6. 制作其他功能
我首先把程序界面重新制作,加上了菜单和工具栏,提高了易用性。
我增加了把选定的声音画在图片框里的功能,这调用了NCTWavPlayer的函数。这样我们就可以把波形进行绘图式的修改了,然后再把波形重新制作成声音。
我还加入了一个很新颖的功能:在设置音高时,不仅可以设置频率数,而且能用
点击琴键的方式,选择它在音乐上对应的音名,并加上了音名、音分、频率的换算功
能。当需要制作特定音高的声音时,这就给我们带来许多方便。
然后又增加了声音的辅助功能,如下,这基本上是调用了NCTWavPlayer的功能。
打开、保存声音文件
播放、暂停、停止
录音
剪切、复制、粘贴、删除
撤消、重复
放大、缩小
增加振幅、减小振幅
调节音量
到此为止,软件的第一个版本的最终完成了。
本软件实现了预期中的两个基本功能:
1. 将任意的手绘的波形转换为指定频率的声音。
2. 将已有的声音波形进行绘图式的修改。
此外,软件中还具有一些有用的其他功能:载入、保存声音,编辑声音,放大、
缩小波形,选择音名以设置频率,调节音量等。这样本软件也具有了一般声音处理软
件的功能。
本软件的最大特点就在于可以用手随意在电脑上画声波曲线。只需要一只鼠标作
24088860.doc Page 5 of 11 9/5/2009
为画笔,就可以随心所欲地制作、修改声音。不止是进行声音的一些处理,而是“画”
声音,这是其他声音软件所办不到的。本软件也不失严密性,可以将严密绘制的声波
曲线文件载入到程序中进行声音制作。所以可以满足不同人群的需要。
我初步设想,它有以下用途:
1.创造新声音:用户可以用画笔绘制出自己的波形,来创造希望的声音。也可
以在观察其他声音的波形特点之后,取长补短,绘制出理想的声音。本软件以后
还将设置一些声音波形的
,供用户载入,在此基础上修改后制作声音。
2.加工、修改已有的声音:用户可以观察现有声音的波形,然后进行修改,重
新制作,以改变他的音色;也能截取现有声音的一个周期,重新选择频率后进行
制作,以修改它的音调。
3.教学作用:本软件也可以作为一个物理声学的教具。它可以向学生演示采样
率与采样点疏密的关系,振幅与响度的关系,声音频率与音高的关系,微观波形
与宏观音色的关系。
4.科普宣传:适用于从儿童到成人各个年龄段。例如,对少年儿童,可以让他
们体验跨越美术与声音之间的鸿沟,用耳朵听自己的手绘制出的奇妙声音;从而
体验到数字化时代的实质。
以后,我将本着“随意性”的特点,继续开发其它的功能:
声音频率的手绘调节
采样点振幅的手绘调节
然后,我会将软件发布,征求使用者的意见,再进行优化,最终完成。
本软件属多媒体技术,据网上调查,本软件的功能填补了现有声音软件的空白。
软件的界面见图3。
本软件实现了预期中的两个基本功能:
1.任意的手绘的波形转换为指定频率的声音。
2.已有的声音波形进行绘图式的修改。
软件第1版的基本功能:
1.菜单及工具栏功能:
?文件:建立、载入、保存声音文件和图片文件
?绘图:铅笔、画直线、橡皮
?声音:把波形制作成声音、把声音波形绘制图片框
声音的播放、暂停、停止、录制
声音的剪切、复制、粘贴、删除
波形的放大、缩小
24088860.doc Page 6 of 11 9/5/2009
增加振幅、减小振幅
?操作:重复、撤消
2.面板上的功能:
NCTWavPlayer:当前位置调整、选取一段声音
图片框:绘图
调整零电平线位置、采样左右边界位置
音调设置:频率或音名
音长设置
音量设置
设置自动寻找左右边界
图3,“把手绘制的声波曲线即时转化成声音的软件”界面
北京八中 李岗老师
中科院软件研究所 多媒体通信与网络工程研究中心 俄罗斯 NCT Company
王栋 《Visual Basic程序设计实用教程》 清华大学出版社
24088860.doc Page 7 of 11 9/5/2009
James.D.Foxall 《Visual Basic编程标准》 机械工业出版社 Microsoft 《Visual Basic 6.0中文版语言参考手册(电子版)》 北京希望电脑公司
黄淼云等 《Visual Basic控件高手》 北京希望电子出版社 《无线电》杂志
《电子制作》杂志
网上下载资料 《VB函数速查》
Cool Edit帮助文件
陈正生 《音高标识与音律计算》
24088860.doc Page 8 of 11 9/5/2009
20015
在实验和科研中,有时我们需要一些波形较为复杂的信号,并且信号的波形还能根据实际需要进行改变。本文向大家介绍一种利用光敏电阻和负反馈原理制作的任意
波形信号发生器。
如图1所示,把光敏电阻固定于铝罩的中心,以保证可以接受示波器任何位置的光
点,再将黑纸切割成所需的波形铺在示波器屏幕上。铝罩应根据示波器的形状和大小
制作,以避免外界杂散光的干扰。要求光敏电阻的光照特性具有良好的线性,可选用硫化铅(PbS)光敏电阻。
图1
图2为屏幕亮度监示与光点垂直移动的驱动电路。假设光点原处于Pl点,由于较强的人射光使光敏电阻的阻值减小到几百欧姆,这时运算放大器(F007)的同相输入端为负电位,输出端也是负电位。运放的输出(也是本函数发生器的输出)驱动示波
器的垂直输入端,使光点的位置垂直下降到P2点,这就导致对光敏电阻的光照变弱,阻值升高,使运放同相输入端的电位变正,输出也变正,光点上升,在P2点上下波动。
图2
24088860.doc Page 9 of 11 9/5/2009
由于负反馈的结果,光点就会收敛停留在使R1=R2的P点,当然,光点同时还在水平方向从左向右移动着,由于电路使光点沿着掩膜的上边缘移动,故而能产生按照掩膜切割的函数波形输出(见图3(a))。为了获得平滑的输出电压(图3(b)),电路中加了由R4、C组成的低通滤波器。输出电压幅度可以通过调节示波器的垂直幅度旋钮在
一定范围内进行调整。如果要使输出电压幅度较大,可以在图2所示的驱动电路中增加放大电路进行级联,但不能破坏负反馈链。
用以上方法可以得到50OHz以下的任意波形的信号。
图2
(2001)
1、任务
(1)设计制作一个波形发生器,该波形发生器能产生正弦波、方波、三角波和
由用户编辑的特定形状波形。示意图如下:
24088860.doc Page 10 of 11 9/5/2009
(2)用键盘输入编辑生成上述三种波形(同周期)的线性组合波形,以及由基波及
其谐波(5次以下)线性组合的波形。
(3)具有波形存储功能。
(4)输出波形的频率范围为100Hz~20kHz(非正弦波频率按10次谐波计算);重复频率可调,频率步进间隔?100Hz。
(5)输出波形幅度范围0~5V(峰-峰值),可按步进0.1V(峰—峰值)调整。
(6)具有显示输出波形的类型、重复频率(周期)和幅度的功能。 2、发挥部分
(1)输出波形频率范围扩展至100Hz~200kHz。
(2)用键盘或其他输入装置产生任意波形。
(3)增加稳幅输出功能,当负载变化时,输出电压幅度变化不大于?3%(负载电阻变化范围:100Ω~?)。
(4)具有掉电存储功能,可存储掉电前用户编辑的波形和设置。
(5)可产生单次或多次(1000次以下)特定波形(如产生1个半周期三角波)输出。
(6)其它(如增加频谱分析、失真度分析、频率扩展>200kHz、扫频输出等功能)。
24088860.doc Page 11 of 11 9/5/2009