计算机工程
COMPUTER ENGINEERING
1999年 第25卷 第8期 Vol.25 No.8 1999



音乐喷泉系统的可视化设计及实时仿真
陈一民，刘云超，陈琳，李元
摘要：介绍音乐喷泉系统的结构及设计思路，针对传统的音乐喷泉系统的缺点和实际存在的问题，提出了分级控制的思想和实现方法，详细论述了音乐喷泉的控制码（造型码）的可视化编程以及音乐喷泉徒刑的实时仿真，并用当前流行的编程工具VB加以实现。系统集声音动画于一体，充分展现了多媒体技术和音乐喷泉的魅力。
关键词：音乐喷泉；造型码；分级控制；实时仿真
The Visual Design and Real-time Emulation of Music Spring System
Chen Yimin,Liu Yunchao,Chen Lin,Li Yuan
(School of Computer Engineering & Science,Shanghai University,Shanghai 200072)
【Abstract】In this paper the constructions of music spring system are introduced and the designing thought of music spring system is also introduced.The theory of grade control and the way of bringing it about are introduced in accordance with the shortcomings of the traditional music spring systems together with the problems in actual situations.the visual programming of control code of the music spring and realtime emulation of its model is explained in details.And VB,the popular programming tool,is used to bring them about.In this system,sound and animation is used to present the multimedia technology and the charm of music spring.
【Key words】Music spring;Control code;grade control;Real-time emulation
　　纵观目前的音乐喷泉系统，由于只采用单片机作为核心部件进行控制，因此都存在音乐节奏和喷泉动作同步困难，控制效果不佳。另外由于采用软件和一定硬件电路配合将存放的乐曲代码有节奏地进行演奏来控制音乐喷泉，因而存在音乐喷泉的控制码 ( 造型码 ) 编程困难，并且控制码一经编辑形成，没有一个好的人机界面预以观察其效果，无法对喷泉现场进行实时仿真。针对上述这些情况，用个人计算机和 Windows 应用程序的高级开发工具 VB ，采用二级控制方案设计并研制开发了音乐喷泉系统，以解决音乐喷泉控制码编程的可视化及喷泉造型的实时仿真问题。 
1 音乐喷泉系统的结构 
　　系统由上下两级微机组成，通过 RS232 进行上下两级微机的通讯。上微机负责对音乐的控制码编辑及喷泉造型的实时仿真；下微机接受上微机送到的代码，通过变频调速器控制喷泉系统的水泵，使喷泉水柱高低随音乐的节奏而变化。 
　　音乐喷泉系统的结构如图 1 所示。 

图1 音乐喷泉系统
　　为解决水泵滞后问题，在每一首歌曲之前应加上一个提前量，以保证乐曲节拍与喷泉水柱的同步。为了解决节拍的同步问题，在音乐结束时，记下造型码当前的编号，将滞后的几拍造型码删除。由于采用了个人计算机，可以通过创立的人机界面解决水泵滞后问题和节拍同步问题。 
　　为了使编辑造型码可视化，利用 VB 提供的控件较为客观地描述了现实中的喷泉，如图 2 所示。这样可对乐曲的控制码编辑效果进行观察，实现喷泉现场的实时仿真。 

图2 喷泉效果介面
　　图 2 中十号泵到零号泵喷头的名称分别为半球、旋转、树冰、外环、内环、主喷、花柱、斜喷、花篮、双环、雪松，分别与喷泉池中的实物一一对应。 
　　喷泉效果界面使得在编程控制码的同时实时观察喷泉的造型，以确保良好的同步性能和音乐喷泉的节奏感及动感。 
2 音乐喷泉系统的设计思想及特点 
　　通过上微机用户可方便地按音乐节拍进行控制码编辑。在播放音乐 CD 的同时，上微机通过串行通信口把控制码发送给控制喷泉水泵的单片机 (下微机) ，使喷泉的造型和喷泉的水柱高低随音乐一起变化。上微机系统主要完成下列功能： 
　　(1) 节拍时间的确定 ( 以 ms 为单位 ) 对整个乐曲节拍数进行统计，计算节拍时间，对乐曲总时间进行一致性检验。 
　　(2) 人工编辑造型界面 屏幕上设计有人工编辑界面， CD 播放器及喷泉效果图。人工编辑界面以行列形式表单顺序表示各个节拍，每行表示一个节拍，编辑者随乐曲逐格填入相应的乐曲控制码，在进行控制码编辑时，允许编辑者播放 / 停播乐曲以利于构思。若播放乐曲则喷泉随音乐的进展进行造型，相应的音节会变化，编程者仅需向相应的位置填入控制码即可。控制码中包括泵号，喷泉水柱高度，高度变化的间隔时间，以及控制彩灯的代码。泵的数据格式为 NXY ， N ：泵号， X ：水柱高度 (0 － F ， 0 － 15 档高度 ) ， Y ： 高度变化的间隔时间；彩灯的数据格式为 AMN ， A ：灯号， M: 0-7 是二路环灯， 8-15 是一般彩灯。对于一般彩灯用开关控制， 1 表示亮， 0 表示关，占 8 位 , 用十六进制数表示，二路环灯分两组 (0 － 3,4 － 7) ，占 4 位 , 用 Ⅰ、Ⅱ、Ⅲ、Ⅳ分别表示 I － IV 个灯亮； N ：移位时间， 100ms × N 值。把一首乐曲各个节拍的控制全部编完，就算完成一首乐曲的编辑工作，可在以后提供给使用者进行单乐曲循环播放。如此逐曲编辑直至整个 CD 盘上全部乐曲编完，这些内容存入磁盘中，与原来的 CD 盘配套成为专门的音乐喷泉盘片。 
　　(3) 预览 把编辑完成的配套盘片在 PC 机中播放但不送出控制信号至单片机的过程称预览。通过在 PC 机屏幕上编制一个二维图象来实时仿真喷泉实现预览，以检验控制码编辑的合理性，并对需要处作适当修改 ( 也可反复修改 ) ，最后形成音乐喷泉控制软件，与 CD 盘配套使用。 
　　(4) 回放 把上述配套盘插入 PC 机，在中文 Windows 95 环境下进入本软件工作界面，此时屏幕显示编辑界面， CD 播放器，喷泉动画和相应按钮。当操作者按启动键后， PC 机启动 CD 播放乐曲，并按节拍通过串行口发出相应的控制码送给下微机，以控制喷泉和灯光，同时，在显示屏上显示音乐喷泉的效果。 
3 系统中主要模快的编程原理 
3.1 喷泉色彩封面 
　　如何创建多种色彩的文本，并能够移动和改变它们的尺寸呢？通过建立的 APIFont 类，并与计时器结合在一起就可以实现独具特色的文本效果。类的 SetColor 函数将调用 API 的 Set Text Color 函数来改变设备描述表的字体颜色，使用计时器就可以实现多种色彩文本效果，创建出一种动画效果。通过使用图片框控件的 TextWidth 和 TextHeight 属性，能够对文本在图片上的移动进行准确的计算。 
　　另外，使用图形创建热点技术，即利用 Image 控件作为工具，为图形增加矩形热点区，具体就是将 spring.bmp 图形装入名为 DispPict 的 Picture 控件中，然后在 Spring 图画上画 3 个 Image 控件。每个矩形覆盖相应的区域，使用点击事件执行各自的代码，产生不同的效果，显示 " 音乐喷泉 " 。 
3.2 CD 播放器 
　　通过 MCI 控件，可以非常方便地在程序中访问各种媒体设备。在设计时，将 Multimedia MCI 控件加到窗体 FrmMusicSpring 上，其按钮被分别定义为 Play 、 Pause 、 Back 、 Stop 和 Eject 。在允许用户从 Multimedia MCI 控件选取按钮之前，程序先将 MCI 设备打开，并在 Multimedia MCI 控件上启用适当的按钮。在 Visual Basic 中，应将 MCI Open 命令放到 Form_Load 事件中 ( 执行 MCI.Command="Open") 。 
　　如果想使用 Multimedia MCI 控件中的按钮，要将 Visible 和 Enabled 属性设置为 True 。如果不想使用控件中的按钮，而只是想用 Multimedia MCI 控件的多媒体功能，可将 Visible 和 Enabled 属性设置为 False 。无论有无用户交互，应用程序均可控制 MCI 设备。 Multimedia MCI 控件的事件 ( 按钮定义 ) 是可编程的。通过开发按钮事件代码，可以增加甚至完全重新定义按钮的功能。 
　　根据实际要求设计的 CD 播放器较为复杂，同常规 CD 播放器有所不同，需要进行说明的是，在 MCI 控件上击播放按钮播放所选音轨，可用暂停和停止按钮。如果需要重听一段音轨按字母键 "S" 就确定了音轨的开始时间，按字母键 "X" 确定了音轨的结束时间，这时重放按钮自动使能，单击重放然后击播放，该段音轨开始重播。但仅仅按字母键 "X" 时，有两种情况： 
　　(1) 若是初次按字母键 "X" 而没有按过字母键 "S" ，则重听该段音轨的开始时间为 0 ： 0 ，结束时间为按字母键 "X" 时的时间。 
　　(2) 若已经按过字母键 "S" 和字母键 "X" ，在这种情况仅仅按字母键 "X" ，则重听该段音轨的开始时间为上次所按字母键 "S" ，结束时间为所按字母键 "X" 时的时间。听过重播后再按字母键 "X" 还有连续重播的功能。 
3.3 造型码编辑界面 
　　创建 MSFlexGrid 数据显示造型码的步骤如下： 
　　(1) 屏幕状态变化和所接受字母 
　　按字母键 "R", 使编辑界面放大至整个屏幕，可在全屏幕状态下编辑造型码，按字母键 "Q", 使编辑界面缩小至原来的状态 , 可使用编辑键或鼠标点击移动焦点到相应单元格。 
　　编辑界面接受的字符为数字字母 "0".."9", 小写英文字母 "a".."f", 大写英文字母 "A".."F" 和字母 "*" 等为合法字符 , 其它字符不予接受，以确定造型编码的简洁与正确。 
　　(2) 创建控件和设置属性 
　　在 FrmMusicSpring 窗体上添加一个 MsFlexGrid 控件并在其内部添加一个 TextBox 控件，由此创建父子关系。其属性设置见表 1 。 
　　(3) 编辑造型码模块程序功能 
　　具体分为添加行列表头，使它在外观上与工作表相象。添加单元内部编辑功能目的是移动和选择一组单元。向文本框 (" 编辑 " 框 ) 添加更新数据的功能，将数据从文本框复制到 MsFlexGrid 的功能。 
表1 属性设置表
对象属性设置值
MSFlexGridcols15
rows51
fillstyle1-repeat
focusrect2-heavy
TexiBoxNametxtEdit
borderstyle0-none
visiblefalse

3.4 通信模块 
　　在这个模块中，采用了 Mscomm 控件，首先让用户选好通信端口，然后将值赋给 Mscomm 的 CommPort 属性，并将 settings 属性设置为 "4800 ， N ， 8 ， 1" ，即 4800 波特率，无奇偶校验， 8 位数据位， 1 位停止位。 OutBufferSize( 输出缓冲区大小 ) 属性设为 15 ， SThreshold 设为 15 ，即输出缓冲区中有 15 个字符时，就发送出去。握手协议采用 Xon/Xoff 协议，所以 Handshaking 属性设为 ComXonXoff 。 
　　程序运行中，用户点击 " 启动 " 按钮时，则在一拍开始的时候，把编辑表单中的相对应的一行造型码，先将 ASCII 码转换成十六进制，然后每两个合为一个 ASCII 码以缩短总代码的长度，提高传输效率，在此基础上再在前面加上同步字符，总共是 40 个字符一起读进传输缓冲区，然后发送出去。 
3.5 造型码及仿真画面 
　　系统中有 11 个喷泉泵，其中 0 、 5 、 7 号泵每个泵控制一个喷头，其它的泵每泵控制两个喷头，如图 2 所示。此外还有 3 组灯，其中 0-3 号和 4-7 号是二路环灯，即每组灯可以循环亮、灭。 8-15 号是一般彩灯。二路环灯的造型码为 XY ， X(1-4) 表示每组灯开的个数，Y(0-7) 表示循环的间隔时间，以 100 毫秒为单位。 8-15 号灯用一个字节控制，字节的每一位表示一个灯， 1 为开， 0 为关。 
　　仿真画面上喷泉用一组 Image 控件数组表示，灯用一组 Shape 控件来表示，这样可以用循环语句来进行控制。程序运行时，先把一拍的造型码发送给下微机，接下来按上面的思想对每拍的造型码进行分析，同时把表示喷泉的 Image 控件用它的 Move 方法进行相应的调整，并通过把 Shape 控件的 Fillcolor 属性置为它的 Bordercolor 和灰色来表示灯的亮、灭。在一拍时间到了之后，接下来继续下面的节拍。 
　　因计算出节拍的时间与实际节拍的时间有些误差，则节拍时间相加后可能与实际音乐播放时间不符，如提前于实际时间，则最后一拍适当延长。如拖后，则最后一拍的控制时间缩短此时间差，每拍的时间长度存于一个数组中，用户计算好节拍的时间后，填入从哪拍起至哪拍止，将所有节拍时间相加，与实际播放时间比较，再对最后一拍的时间长度进行调整。 
3.6 编辑模块 
　　该模块有 4 个功能，分别是插入一行、删除一行、复制、粘贴。插入、删除功能利用了线性表的插入、删除算法。但插入一行、删除一行同常规有所区别，这里的插入一行是插入后原造型码表单的最后一行自动失效，目的就是保证造型码节拍的一致；删除一行是删除后造型码表单的最后一行的每个单元格自动置两个空格。复制、粘贴功能主要利用了 MSFlexGrid 控件的 Clip 属性和 Clipboard 对象的 SetText 方法和 GetText 方法实现。 
4 结论
　　本系统采用两级控制方式，解决音乐喷泉的水泵滞后及节拍的同步问题。软件系统采用面向对象的程序设计方法，使用了可视化的编程工具 VB ，因 VB 的可视性和面向事件及对象等特征使 Windows 应用程序的开发变得简便，高效，它大大提高了基于 Windows 的实时仿真软件的开发效率，解决了音乐喷泉控制码编程的可视化及喷泉造型的实时仿真问题，缩短了开发周期，其高质量的人机界面倍受用户的赞誉，友好的操作环境使用户易于使用，目前该系统已通过厂商的验收并正式交付使用。 
作者单位：上海大学计算机工程与科学学院，上海 200072
参考文献 
1 孙兵 . 单片机在音乐喷泉控制中的应用 . 黑龙江自动化技术与应 用， 1997,16(2):40-42
2 徐子振 , 石冰心 . 使用 VB3.0 设计 Windows 环境下的异步通信程 序 . 微电脑世界， 1997(2):78-79 
3 焦纯 . Windows 3.x 下 VB3.0 两种通信方式 . 微电脑世界， 1997. (8):66-69 
4 Appleman D. Visual Basic Programmer's Guide To The Windows API. 北京：电子工业出版社， 1995 
5 Cornell G, Graw M. The Visual Basic 3 for Windows Handbook. Hill Publication,1993 
