利用Director制作歌曲学习课件

2015-04-29 06:04:46韩建彬
计算机时代 2015年11期

韩建彬

摘 要: 利用Director的媒体集成和脚本编程能力,开发了学习歌曲演唱的多媒体课件。通过声音文件中的线索点及其事件处理过程,实现了任意播放某一句演唱的功能;将定时器与蒙版相结合,创造了动态蒙版,实现了歌词同步提示功能。

关键词: Director; 线索点; 动态蒙版; 定时器

中图分类号:TP317 文献标志码:A 文章编号:1006-8228(2015)11-54-04

Abstract: Director has the comprehensive capabilities in multi-media integration and script programming, the courseware for learning songs can be developed with this platform. By the cue points in an audio file and the process of cue passed, any section of the song can be played. By the timer, the sprite mask can be changed in a specific rhythm synchronously, and the lyrics can be prompted thereby.

Key words: director; cue point; dynamic mask; timer

0 引言

多媒体课件在计算机辅助教学(CAI)中有着广泛应用,它能通过丰富的信息传递手段和灵活的人机交互方法,使原本机械、重复、枯燥的教学过程变成双向互动的信息交流,极大地改变人们的学习方式和过程[1]。Director作为专业级的多媒体制作软件,使我们在复杂交互课件的开发中如虎添翼。无论是对文、图、声、像的处理,还是在交互控制方面,Director都有着卓越的性能,其内部集成的Lingo语言和对JavaScript的支持更使深度开发成为可能[2]。

歌曲学习课件就是充分利用Director的媒体集成和交互控制优势,实现原唱欣赏、逐句教唱、重点教唱和整曲练习等功能,并能进行歌词的同步提示。课件充分发挥了多媒体的作用,为歌曲学习提供了完善的教学功能,既可辅助教师授课,也可用于个人自学。

1 系统总体结构

利用Director制作的多媒体作品称为电影(Movie),舞台是显示电影内容的窗口,帧是组织电影内容的基本单位。在电影中,通过设置多媒体素材的属性来控制内容的显示效果,通过调整所占的帧数来控制显示的时间,而复杂的交互功能则主要通过编写Lingo或JavaScript脚本来实现。

在课件的主界面中,以图片的形式显示词曲,并在界面下部放置主要的功能按钮,具体如图1所示。“原唱欣赏”用于完整播放歌曲的原唱,供学习者欣赏。“逐句教唱”主要是模仿老师的教学过程,当课件在播放完一句原唱之后,会根据内容长短留出一定的时间,供学习者跟唱,然后再按顺序播放下一句。进入“重点教唱”功能后,界面上的每一句歌词都会成为一个独立的交互热点,通过鼠标点击界面上的某一句歌词,可以进行该句的反复教唱。“整曲练习”用于播放歌曲的伴奏音乐,同时进行歌词的同步提示,供学习者进行练习。

该课件的逻辑结构如图2所示。在Director中,电影默认为按照时间轴从第一帧顺序向后播放,为了实现课件中的逻辑功能,需要应用脚本语言控制电影的播放顺序,并实现与使用者的有效交互。

在电影编排表(Score)中,将歌曲图片和按钮分别放置于精灵通道中,均从通道的第一帧开始,使课件一打开就展示出完整的界面。双击脚本通道的第一帧,打开帧脚本编辑窗口,在“on exitFrame me”行为中写入“go to the frame”语句,使课件一开始就暂停于第一帧,等待用户的鼠标点击,以转入相应的功能模块。

从图2中可以看出,在课件的各模块中,声音播放和歌词的同步提示都是其核心功能,也是课件制作中的难点,下面重点说明两者的实现方法。

2 声音的分句播放

在Director中,声音播放有两种方式。一是利用编排表中的声音通道,如课件中背景音乐的播放一般就采用此种方式。先将声音文件导入演员表,然后再拖放到编排表的声音通道中,通过调整声音精灵的位置和所占帧数来控制声音的播放时机和时长。但这种方式只能从开头顺序播放,不能灵活播放其中的某一片段,因此只适用于声音的简单播放。二是通过Lingo脚本播放,通过声音的木偶化,使声音的播放不再受编排表的制约,而完全由Lingo语句来控制。通过Director中声音演员的属性和方法,可以以毫秒为单位,精确设定播放的开始和结束点,从而灵活播放歌曲中的某一片段。在“逐句教唱”和“重点教唱”模块中,正是利用这一功能实现了分句教学和练习。

2.1 用线索点标记时间

在Director中,线索点(Cue Point)是指在声音或视频文件中人为添加的时间标记信息[3]。线索点信息与媒体数据保存在同一文件中,通过声音文件中的线索点,可以精确定位到音视频文件中的某一位置。为了实现分句播放,要在歌曲中每一句的开始和结束位置都添加线索点。

音频文件中的线索点一般通过GoldWave、CoolEdit或Adobe Audition等音频编辑软件进行设定。在这些软件中,线索点被称为提示点、标记点等,但能起到同样的作用。以GoldWave为例,“编辑”菜单中的“提示点”命令组用于添加和编辑提示点。在GoldWave中打开歌曲,在每一句的开头和结尾添加提示点,分别命名为Head1、Head2、……和End1、End2、……。因为MP3格式不支持线索点,所以添加后要保存为WAV格式。

此外,还要制作两个特殊的音频文件,第一个是包含口令“唱”的声音文件,用于提示学习者跟唱,并在靠近结尾处添加名为“BeginMark”的线索点;第二个是一小段静音的音频文件,并在其中设置一个名为“EndMark”的线索点。这两个文件中的线索点主要用作关闭和恢复原唱声音的标记。

2.2 分句播放的实现

分句播放是利用声音通道的queue()方法来实现,该方法用于为声音通道建立播放队列,通过member、startTime和endTime参数,可以指定播放音频文件的特定片段。其中的startTime、endTime参数来自于声音演员的cuePointTimes属性,该属性返回音频文件中所有线索点的列表。

在此以“逐句教唱”功能的实现来对主要代码进行说明。为了在不同代码段中共享音频的线索点数量和当前音量设置,需要在电影脚本中声明两个全局变量,cuePassedCount用于保存歌曲中索引点的总数,currentVol用于保存当前声音通道的音量。在startMovie事件中,对两个变量进行初始化,分别赋值为0和Sound(1).volume。

在“逐句教唱”按钮的脚本中,通过循环结构建立逐句播放队列。在演员表中,将导入的歌曲命名为Song,包含“BeginMark”线索点的音频命名为Sing,包含“EndMark”线索点的音频命名为Over。

3 动态字幕的实现

所谓动态字幕,就是与演唱同步,将歌词的文字由黑色变为红色,用于提示演唱的进度。这一效果主要通过精灵蒙版(Mask)来实现。在Director中,蒙版功能还不够完善,最突出的一点就是,不能在编排表中直接对蒙版的属性进行改变。因此,需要通过Lingo脚本对蒙版进行控制。

3.1 制作歌词演员和蒙版

根据主界面中的歌曲图片,为每句歌词制作一个红色文字的JPG图片,第一句的图片如图3所示。然后再制作一个与该图片相同大小的纯白色图片,保存成BMP格式,作为歌词的蒙版。

将制作的歌词和蒙版图片导入演员表中,分别命名为lyric1、lyric2……和mask1、mask2……,每个蒙版都必须紧跟在相应的歌词图片之后,这是Director对蒙版的特定要求。把歌词演员加入到编排表的第一帧,并与背景上的相应文字对齐。最后将歌词精灵的墨水效果设为“Mask”,使其变为完全透明。

3.2 与演唱同步填充蒙版

在on cuePassed过程中,通过IF语句进行判断,当经过每一句开始处的线索点时,就创建一个间隔为0.1秒的定时器。

--如果线索点是以Head开头,就创建定时器

if name starts "Head" then

--获取刚经过的线索点在列表中的序号

currentPos=cuePointNameList.getPos(name)

--计算出当前正在演唱第几句

sentenceOrder=(currentPos+1)/2

--计算当前句的时间长度

persistedTime=cuePointTimeList[currentPos+1]

-cuePointTimeList[currentPos]

--计算需要填充的蒙版的名称

currentMask="mask" & sentenceOrder

--获得蒙版的宽度和高度

maskWidth=member(currentMask).image.width

maskHeight=member(currentMask).image.height

--计算每次填充的宽度增量

fillIncremant=maskWidth/(persistedTime/100)

--启动定时器

myTimer=timeOut().new("fillTimer", 100, #fillProc)

--将记录定时器触发次数的变量归零

timeOutCount=0

end if

在定时器过程中,与演唱相同步,自左向右逐渐用黑色填充蒙版,使红色的歌词显示出来。

on fillProc

--如果蒙版已完全填充为黑色,

if (maskWidth-timeOutCount*fillIncremant)<=0 then

--将记录定时器触发次数的变量归零

timeOutCount=0

--关闭定时器

forget(timeout("fillTimer"))

end if

--计算本次需要填充的区域

fillArea=rect(0, 0, timeOutCount*fillIncremant,

maskHeight)

--用黑色填充该区域

member(currentMask).image.fill(fillArea,rgb(0, 0, 0))

--定时器触发次数加1

timeOutCount=timeOutCount+1

end timeout

通过以上方法,就能在播放过程中逐步显示红色的歌词,从而产生同步动态提示的效果。

4 结束语

该课件充分利用Director中的音频线索点和动态蒙版技术,实现了对歌曲演唱学习的有效支持,提高了学习效率和灵活性,体现了CAI的重要作用。但是该课件只是完成了教与学的功能,还需增加学习效果评价功能,通过将学生的声音与原唱进行对比,给出具体评价,以帮助学生更好地检验和改进自己的学习。

参考文献(References):

[1] 张豪,何方.Director交互式多媒体开发从新手到高手[M].清

华大学出版社,2008.

[2] 古成中,吴新跃.基于Director的交互式虚拟仿真系统[J].工

程设计学报,2007.14(4):282-285

[3] 顾焕国,欧汉彬.Director中Cue Point声音同步控制技术[J].

中国医学教育技术,2003.17(5):291-294