用Flash模拟机械节拍器

6
回复
968
查看
[复制链接]
发表于 2004-12-6 10:42:00 | 显示全部楼层 |阅读模式
 

用Flash模拟机械的节拍器,我觉得很好当我不知道如何把它荡下来,所以大家只能上网去看了。http://www.yesky.com/SoftChannel/72351185184489472/20020708/1619520.shtml

我觉得很好用,你们试试看对学生有没有用。^_^

 
发表于 2006-4-24 09:30:00 | 显示全部楼层
 

 我把它下了,不知如何上传

 
发表于 2006-4-24 10:16:00 | 显示全部楼层
 
作为一个吉他爱好者,盗匪一直想拥有一个节拍器,可苦于银子太少,节拍器又太贵,所以……但是一个有头脑的闪虫是不会被这点小困难吓倒的,今天我们就用Flash来DIY一个机械节拍器。

  在制作之前,我想还是先解释一下什么是节拍和节拍器。
  节拍是指强拍和弱拍的组合规律。有很多有强有弱的音,在长度相同的时间内,按照一定的次序反复出现,形成有规律的强弱变化,例如:每隔一个弱拍出现一个强拍,这是一种节拍;而每两个弱拍再出现一个强拍时,又是另外一种节拍。同时节拍也是有一定频率的,如果在乐曲中追求的速度是每分钟60拍,那么每秒就是一拍(半拍是1/2秒),如果要求的是每分钟120拍,那么每拍就是1/2秒(半拍为1/4秒)以此类推,这个被称为拍子的时值。
  节拍器就是通过不同的声音来反映强拍和弱拍的一种辅助工具,在乐器的练习中被广泛的使用,今天我们模拟的这种机械节拍器是通过调节摆的重心(摆锤高度)来改变节拍的频率(时值)的,使用起来非常方便。

 

点击play按钮开始运行,拖拽摆锤改变摆的重心,在右下角的文本框中可以观察频率的变化,修改左下角的数字可以改变每小节的节拍数。

  一、制作原理和思路

  从上面的介绍中我们可以看出节拍器有两个重要参数:时值(或者说是摆的频率)和节拍(每小节的节拍数)。时值可以通过调节摆的重心来改变,节拍我们可以在场景中安排一个输入文本框(input text),通过向文本框中添入数值的方式来获得节拍值。

  改变摆锤的高度可以用拖拽(startDrag)来实现,然后将摆锤的高度值简单地转化为一个合适的角度值(就是我们后面将会提到的_root.tr),按下开始按钮后,利用帧的循环使摆的旋转角度(_rotation)不断地与_root.tr进行相加运算以达到增大摆的偏角的目的,同时判断摆的角度是否满足了我们规定的最大角度,如果是,那么播放声音同时改变_root.tr的正负值,使摆向相反的方向摆动,这样不断地循环下去,直到按下了停止按钮;摆动的同时还要计算摆动的次数,用以判断是该播放强拍的声音还是应该播放弱拍的声音,这就需要在当摆达到了最大角度,我们在播放声音,改变角度的正负值的同时,使变量累计次数(_root.sum)进行自加运算,并判断是否与场景中的输入文本——节拍 的数值相等,如果不相等则播放弱拍并继续累加,如果相等就播放强拍并使累计变量复位以开始新计数好。

  二、制作中用到的几个Action Script(AS)语句解释

  ① movieClip.startDrag([lock ,left ,top ,right,bottom])
  使电影剪辑(MC)允许拖拽;
  lock可以是true或false,代表是否在拖拽时将MC的中心锁定到鼠标指针上;
  left ,top ,right,bottom可以是任意数值,代表拖拽的范围,应该注意的是顺序不能改变并缺一不可,但如果不需要拖拽范围可以集体被省略。
  ②movieClip.stopDrag()
  禁止电影剪辑的拖拽行为。
  ③Math.round(Number)
  对数值进行取整运算。

 
发表于 2006-4-24 10:21:00 | 显示全部楼层
 
 好,现在进入制作阶段。打开flash了,按Ctrl+J(盗匪用的是Flash MX,你也快升升级吧,不过我们文章末尾的原文件可以用flash 5打开)打开属性(document properties)面板,将动画大小改为320*450,速度20帧/秒。注:动画的速度是个重要的因素,在计算时值时要用到它,公式会在后面的介绍中提到。

  三、符号的制作

  最重要的符号只有两个:一个是“”(包括摆锤和摆柄,图1),一个是含有声音的MC,其中包含两个不同的声音文件,分别用来反映强拍和弱拍,都可以在flash自带的库(library)中找到,后面有具体的制作方法。下面就先来制作摆:

  (1)制作摆柄:
  Ctrl+F8新建一个图形(graphic)符号,用画圆工具(O)画一个圆:约40*40px、坐标(0,0)(坐标很重要,这决定了摆动的轴心);用矩形工具(R)画一个矩形:320*18、横坐标0,底部以与圆完整结合为准,稍加修饰;

  (2)制作按钮摆锤:

  新建一个按钮(button)符号,可以做成自己喜欢的任何形状,大小约80*30,值得注意的是它是一个按钮;

  (3)制作电影剪辑摆锤:

  新建一电影剪辑(Movice Clip)符号,从库(library Ctrl+L)中拖入按钮摆锤并选中,按F9打开动作(action)面板,copy下面的代码:

  on (press) {
   this.startDrag(false, 0, -300, 0, -50);
   //规定摆锤的拖拽范围,顺序为left,top,right,bottom
  }
  on (release, dragOut) {
   this.stopDrag();
   //鼠标释放,停止拖拽
   _root.tr = (-600)/this._y;
   _root.pps = (20*_root.tr/40)*60;
   //计算公式(在下面有对公式的解释)
   _root.pps = Math.round(_root.pps);
   // _root.pps是场景中的一个文本框,后面的制作会提到它的

  }

  (注:对时值计算公式和AS语句的一些解释)
  我们先给出拍子频率(pps)的计算公式:

  ①20帧/秒是动画的速度;
  ②tr度/帧是摆每帧摆过的角度,它是通过摆锤的高度计算得到的,由于摆柄的长度是我们自己规定的,而且是个负值,所以摆锤的高度(this._y)的范围在-300~-50之间,为了使拍子的时值在我们常用的范围内,所以要通过_root.tr=(-600)/this._y语句转化一下,使_root.tr的范围在2~12之间,这样计算的结果在60~360拍/秒之间;
  ③40度/拍是在场景的AS中规定的,摆的左右最大角度都不超过20度,这样从左侧摆动到右侧(一拍)正好是40度;
  ④最后乘以60秒得到X拍/分。
  ⑤_root.pps=Math.round(_root.pps)这句是对pps进行取整运算

  (4)组装摆:
  新建一电影剪辑,将刚才制作的电影剪辑摆锤和摆柄拖入,摆柄坐标(0,0);摆锤坐标(0,-300)。(以上三个符号分别参照图1的摆锤、摆柄和摆)

  四、制作声音的电影剪辑:

  新建电影剪辑,插入两个关键帧,通过菜单window-->common librarys-->sounds打开flash自带的声音库,选中第二帧,找到Latch Metal Metal Jingle并拖入场景中,选中第三帧,找到Keyboard Type Sngl也拖入场景,回到第二帧,点击properties面板中的edit按钮,弹出edit envelope面板(图2),单击显示帧按钮,调节控制柄,使声音的播放时间保持在一帧左右,点击ok按钮确定;选中第三帧,重复上面的操作,这个电影剪辑就做好了。

  最后再制作一个节拍器的背景和两个用来控制节拍器开始和结束的按钮,至此所有准备工作就完成了。下面就是元素的组装和控制代码的编写了。

 
发表于 2006-4-24 10:24:00 | 显示全部楼层
 
  五、布置场景,增加控制

  回到场景,新建一层命名为“控制”,按F6添加一关键帧(现在共两帧),在第一帧中拖入控制开始的按钮,第二帧中拖入控制停止的按钮,均放在场景的中下方,再新建一层命名为“摆”,将摆拖入,将实例名(instance name)命名为waver,坐标(160,360)。在第三帧处按F5添加内容帧,新建一层名为“其他”,并将其拖到“摆”层下面,将节拍器的背景拖入到合适位置,然后选择文字工具(T),在properties面板中将属性改为输入文本(input text),在场景左下方单击,出现一文本框,添入4后拖拽宽度到大约一个字符宽,点击properties面板中(显示边框)按钮,将最大字符数(maximum characters)改为1,点击特性(character)按钮,弹出character option面板,选中only单选项,勾选numerals(0-9)复选项,点击done按钮确定,在var中添入pp;保持文字工具,在右下方单击,填入1后拖拽至大约三个字符宽度,将属性修改为动态文本(dynamic text),var中添入pps;将声音的电影剪辑拖入,命名为snd。

  再新建一层命名为“脚本”,选中第一帧,copy下面的代码到action面板中:

  stop()
  snd.gotoAndStop(1)
  _root.sum=0

  按F6添加两个关键帧(现在共三帧),在第二帧中捆绑下面的AS:

  waver._rotation += _root.tr;
  if (waver._rotation>=20 || waver._rotation<=-20) {
    _root.tr = -(_root.tr);
    //摆到一定角度后向另一侧摆动
    if (_root.sum>=pp || _root.sum == null) {
    //计算拍节
      _root.sum = 1;
    } else {
      _root.sum++
    }
    if (_root.sum<>1) {
      snd.gotoAndStop(2);
      snd.gotoAndStop(1);
    } else {
      snd.gotoAndStop(3);
      snd.gotoAndStop(1);
    }//根据拍节播放相应的声音
  }

  第三帧

  gotoAndPlay(2)

  选择按钮层第一帧中的按钮,捆绑下面的AS:

  on (release) {
    if (_root.tr == null) {
      _root.tr = 2;
      //初始化摆动角度
    }
    if (_root.pp == null) {
      _root.pp = 4;
      //初始化每小节的节拍数
    }
    gotoAndPlay(2);
  }

  选择第二帧的按钮,添加AS

  on(release){
    gotoAndStop(1)
    waver._rotation=0
    //将摆复位
  }

  最终的时间线(timeline)如图3所示。

  下面再添加一些小细节工作就可以结束了:选择文本工具,将属性修改为静态文本(static text),在刚才添加的pp(就是那个带边框的4)后面写上“拍/小节”字,在另外一个后面写上“拍/分”。

  节拍器制作完成,Ctrl+Enter测试一下,拖拽摆锤改变摆的重心,在右下角的文本框中观察频率的变化,修改左下角的数字可以改变每小节的节拍数,点击按钮开始运行……怎么样,够high吧

 
发表于 2006-4-24 16:03:00 | 显示全部楼层
 

DALAI 很棒啊。

 
 楼主| 发表于 2007-11-5 09:01:00 | 显示全部楼层
 
谢谢!
 
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

产品推荐

关注

关注我们可获取更多免费资讯,获得更多学习资料
公众号
公众号
咨询热线:027-88881234
CopyRight © www.hongxiao.com. 武汉火笛文化发展有限公司鄂ICP备2022013670号-1
Powered by Discuz! X3.4