﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>火柴工作坊</title>
	<atom:link href="http://www.hcxmflash.cn/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.hcxmflash.cn/blog</link>
	<description>走上新的起点-走Flash、Flex、Air、Fms的应用开发路线</description>
	<lastBuildDate>Fri, 03 Sep 2010 06:06:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>面向Microsoft Visual Studio的Flex IDE Amethyst发布</title>
		<link>http://www.hcxmflash.cn/blog/?p=1235</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1235#comments</comments>
		<pubDate>Fri, 03 Sep 2010 06:02:08 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[生活杂谈]]></category>
		<category><![CDATA[Amethyst]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1235</guid>
		<description><![CDATA[面向Microsoft Visual Studio的Flex IDE Amethyst发布
]]></description>
			<content:encoded><![CDATA[<h3><a href="http://www.infoq.com/cn/news/2010/09/amethyst-released">面向Microsoft Visual Studio的Flex IDE Amethyst发布</a></h3>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1235</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化 Flash 平台的性能 PDF</title>
		<link>http://www.hcxmflash.cn/blog/?p=1234</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1234#comments</comments>
		<pubDate>Mon, 30 Aug 2010 01:50:15 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[内存]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1234</guid>
		<description><![CDATA[http://help.adobe.com/zh_CN/as3/mobile/flashplatform_optimizing_content.pdf
]]></description>
			<content:encoded><![CDATA[<p><a title="http://help.adobe.com/zh_CN/as3/mobile/flashplatform_optimizing_content.pdf" href="http://help.adobe.com/zh_CN/as3/mobile/flashplatform_optimizing_content.pdf">http://help.adobe.com/zh_CN/as3/mobile/flashplatform_optimizing_content.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1234</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS2005 安装包制作</title>
		<link>http://www.hcxmflash.cn/blog/?p=1233</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1233#comments</comments>
		<pubDate>Fri, 27 Aug 2010 03:46:42 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[软件相关]]></category>
		<category><![CDATA[vs]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[安装包制作]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1233</guid>
		<description><![CDATA[(一)，安装程序
以前用vs制作过安装程序，现在把步骤写出来，有帮助的大家一定要顶哦
第一步:建立工程   1.打开vs，新建项目-&#62;其他项目类型-&#62;安装和部署(這個子项下面有安装项目和Web安装项目等,安装项目就是普通的桌面程序安装,Web安装就是安装网站,通常安装到IIS下,这里以普通桌面程序安装为例),新建安装项目，命名为SetupTest。
2.新建工程后，可以在“解决方案资源管理器”里面看到子项：文件系统编辑器，注册表编辑器，文件类型编辑器，用户界面编辑器，自定义操作编辑器，启动条件编辑器。下面将会举例来说明各个地方怎么使用。
3.最简单的一个安装程序：点击“文件类型编辑器”，找到“应用程序文件夹”，添加-&#62;文件，选择你要打包的程序文件（譬如我的程序有 run.exe和lib.dll组成），确定。在项目“SetupTest”上点击生成，一个简单的安装包就做好了。生成后，点击安装，如果没有错误的话，你现在可以看到你的安装包的效果了。
4.如何自定义代码？在制作过程中，这些简单的功能不能满足你的要求，那么就自己写代码来完成吧。
解决方案-&#62;添加-&#62;新建项目-&#62;类库,命名为Library，在项目Library下面，删除Class1.cs，添加 -&#62;新建项目-&#62;安装程序类（名称为InstallerTest.cs），打开InstallerTest.cs，你会发现这个class InstallerTest继承自Installer，里面就一个构造函数。好了，现在安装程序不能完成的功能，你可以在这个类写代码来自己实现了。   &#160;&#160;&#160; 举例：在构造函数里面添上this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall)，实现方法 InstallerTest_BeforeInstall(object sender, InstallEventArgs e)，就可以完成程序在安装之前要做的事情了，Installer主要要用到的事件不外乎这几个：BeforeInstall，AfterInstall，AfterRollback，AfterUninstall，BeforeRollback，BeforeUninstall，很明显的意义，就不用解释了吧    5.完成了4中的InstallerTest_BeforeInstall方法，是不是在安装之前就要执行 InstallerTest_BeforeInstall中的代码呢，答案是不行。还要用到“自定义操作编辑器”。项目SetupTest-&#62;添加 -&#62;项目输出-&#62;选择Library后确定，你会发现，在项目SetupTest下面多了一项“主输出来自Library(活动)”的字样。好，到正题了，来到“自定义操作”处，可以看到四个子项：安装，提交，回滚，卸载。在安装上面点击右键-&#62;添加自定义操作-&#62;选择“主输出来自Library(活动)”。这样，重新生成后，安装之前就会执行InstallerTest_BeforeInstall代码了。（当然，如果你在要在卸载前后做一些事情，就必须在“卸载”处也把自定义操作添加进去，否则即使监听了事件AfterUninstall，也不会执行的，完全之策是在安装，提交，回滚，卸载里面都把主输出来自Library(活动)添加进去就不怕了，嘿嘿）    6.如何得到用户所选安装路径？在实现代码的时候，用户所选安装路径大多数情况下都要用到，怎么得到他的值呢？在自定义操作-&#62;安装-&#62;“主输出来自Library(活动)”上面右键属性，在CustomActionData中填入/targetdir=&#34;[TARGETDIR]\&#34;， 然后在类InstallerTest中用这句话this.Context.Parameters[&#34;targetdir&#34;] 就可以取得安装的目录了。    7. 如何得到用户在安装的时候输入的更多的信息？用户在安装的时候，还有可能塡很多其他的信息，比如我以前做的一个安装文件中包含安装数据库，安装的时候用户就要填写数据库密码，用户名等信息。实现如下：用户界面-&#62;安装-&#62;启动-&#62;右键-&#62;添加对话框-&#62;选择&#34;文本框 (A)&#34;,可以看到文本框(A)有很多属性，如：Edit1Label，Edit1Property，Edit1Value，Edit1Visible 等，Edit1Label就是這個输入框所要输入的内容的提示语，Edit1Value就是所输入的内容。    例如：将Edit1Label内容填上 “请输入数据库用户名:”，将Edit1Property内容填上DBUSER,Edit1Visible选问true，另外在6中所提到的 CustomActionData中，添加上 /dbuser=&#34;[DBUSER]&#34;,再在InstallerTest中用这句话this.Context.Parameters[&#34;dbuser&#34;] 就可以或得用户在安装的时候所填写的用户名了（其他的单选框，复选框，button按钮框都差不多获取值的方法，不再累赘）.总之，添加了一些对话框后，把属性好，还要在CustomActionData添加一个/parm=&#34;[属性值]&#34;,才能在代码中获取改值。    8.其他:创建快捷方式,你可能在程序中要创建多个快捷方式，这里展示一种写代码的方式来创建快方式（各个选项意义就不说了，其中有些选项是可以不需要的，读者可自己测试选择使用）    添加引用：com名称为Windows Script Host [...]]]></description>
			<content:encoded><![CDATA[<p><strong>(一)，安装程序</strong></p>
<p>以前用vs制作过安装程序，现在把步骤写出来，有帮助的大家一定要顶哦</p>
<p>第一步:建立工程   <br />1.打开vs，新建项目-&gt;其他项目类型-&gt;安装和部署(這個子项下面有安装项目和Web安装项目等,安装项目就是普通的桌面程序安装,Web安装就是安装网站,通常安装到IIS下,这里以普通桌面程序安装为例),新建安装项目，命名为SetupTest。</p>
<p>2.新建工程后，可以在“解决方案资源管理器”里面看到子项：文件系统编辑器，注册表编辑器，文件类型编辑器，用户界面编辑器，自定义操作编辑器，启动条件编辑器。下面将会举例来说明各个地方怎么使用。</p>
<p>3.最简单的一个安装程序：点击“文件类型编辑器”，找到“应用程序文件夹”，添加-&gt;文件，选择你要打包的程序文件（譬如我的程序有 run.exe和lib.dll组成），确定。在项目“SetupTest”上点击生成，一个简单的安装包就做好了。生成后，点击安装，如果没有错误的话，你现在可以看到你的安装包的效果了。</p>
<p>4.如何自定义代码？在制作过程中，这些简单的功能不能满足你的要求，那么就自己写代码来完成吧。</p>
<p>解决方案-&gt;添加-&gt;新建项目-&gt;类库,命名为Library，在项目Library下面，删除Class1.cs，添加 -&gt;新建项目-&gt;安装程序类（名称为InstallerTest.cs），打开InstallerTest.cs，你会发现这个class InstallerTest继承自Installer，里面就一个构造函数。好了，现在安装程序不能完成的功能，你可以在这个类写代码来自己实现了。   <br />&#160;&#160;&#160; 举例：在构造函数里面添上this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall)，实现方法 InstallerTest_BeforeInstall(object sender, InstallEventArgs e)，就可以完成程序在安装之前要做的事情了，Installer主要要用到的事件不外乎这几个：BeforeInstall，AfterInstall，AfterRollback，AfterUninstall，BeforeRollback，BeforeUninstall，很明显的意义，就不用解释了吧    <br />5.完成了4中的InstallerTest_BeforeInstall方法，是不是在安装之前就要执行 InstallerTest_BeforeInstall中的代码呢，答案是不行。还要用到“自定义操作编辑器”。项目SetupTest-&gt;添加 -&gt;项目输出-&gt;选择Library后确定，你会发现，在项目SetupTest下面多了一项“主输出来自Library(活动)”的字样。好，到正题了，来到“自定义操作”处，可以看到四个子项：安装，提交，回滚，卸载。在安装上面点击右键-&gt;添加自定义操作-&gt;选择“主输出来自Library(活动)”。这样，重新生成后，安装之前就会执行InstallerTest_BeforeInstall代码了。（当然，如果你在要在卸载前后做一些事情，就必须在“卸载”处也把自定义操作添加进去，否则即使监听了事件AfterUninstall，也不会执行的，完全之策是在安装，提交，回滚，卸载里面都把主输出来自Library(活动)添加进去就不怕了，嘿嘿）    <br />6.如何得到用户所选安装路径？在实现代码的时候，用户所选安装路径大多数情况下都要用到，怎么得到他的值呢？在自定义操作-&gt;安装-&gt;“主输出来自Library(活动)”上面右键属性，在CustomActionData中填入/targetdir=&quot;[TARGETDIR]\&quot;， 然后在类InstallerTest中用这句话this.Context.Parameters[&quot;targetdir&quot;] 就可以取得安装的目录了。    <br />7. 如何得到用户在安装的时候输入的更多的信息？用户在安装的时候，还有可能塡很多其他的信息，比如我以前做的一个安装文件中包含安装数据库，安装的时候用户就要填写数据库密码，用户名等信息。实现如下：用户界面-&gt;安装-&gt;启动-&gt;右键-&gt;添加对话框-&gt;选择&quot;文本框 (A)&quot;,可以看到文本框(A)有很多属性，如：Edit1Label，Edit1Property，Edit1Value，Edit1Visible 等，Edit1Label就是這個输入框所要输入的内容的提示语，Edit1Value就是所输入的内容。    <br />例如：将Edit1Label内容填上 “请输入数据库用户名:”，将Edit1Property内容填上DBUSER,Edit1Visible选问true，另外在6中所提到的 CustomActionData中，添加上 /dbuser=&quot;[DBUSER]&quot;,再在InstallerTest中用这句话this.Context.Parameters[&quot;dbuser&quot;] 就可以或得用户在安装的时候所填写的用户名了（其他的单选框，复选框，button按钮框都差不多获取值的方法，不再累赘）.总之，添加了一些对话框后，把属性好，还要在CustomActionData添加一个/parm=&quot;[属性值]&quot;,才能在代码中获取改值。    <br />8.其他:创建快捷方式,你可能在程序中要创建多个快捷方式，这里展示一种写代码的方式来创建快方式（各个选项意义就不说了，其中有些选项是可以不需要的，读者可自己测试选择使用）    <br />添加引用：com名称为Windows Script Host Object Model</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; using IWshRuntimeLibrary;    <br />string dk = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);// 得到桌面文件夹     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShellClass();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(@dk + &quot;\\快捷方式到数据中心SiteDataCenter.lnk&quot;);     <br />shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(@dk + &quot;\\互联网公共上网服务场所信息安全管理系统.lnk&quot;);     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.TargetPath = @&quot;%HOMEDRIVE%/Program Files\Internet Explorer\IEXPLORE.EXE&quot;;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.Arguments = &quot;<a href="http://localhost/web/Main.html%22;//">http://localhost/web/Main.html&quot;;//</a>参数     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.Description = &quot;火星网络安全有限责任公司&quot;;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.WorkingDirectory = pathWeb;//程序所在文件夹，在快捷方式图标点击右键可以看到此属性     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.IconLocation = &quot;notepad.exe, 0&quot;;//图标     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.Hotkey = &quot;CTRL+SHIFT+N&quot;;//热键     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.WindowStyle = 1;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; shortcut.Save();     <br />9.如何在安装完成后自动运行某个程序呢（如run.exe）？    <br />将这句代码写在AfterInstall里面：    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Diagnostics.ProcessStartInfo psiConfig = new System.Diagnostics.ProcessStartInfo(path + &quot;<a href="http://www.cnblogs.com/lmjob/admin/file://run.exe%22%29;//path">http://www.cnblogs.com/lmjob/admin/file://run.exe&quot;);//path</a>即是安装的目录    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.Diagnostics.Process pConfig = System.Diagnostics.Process.Start(psiConfig);</p>
<p><strong>(二)卸载（以下是转的，看客自己提取有用信息）</strong></p>
<p>1.新建一C# Windows From项目，完成项目的工作</p>
<p>2.菜单-》文件-》添加项目-》新建项-》安装部署项目-》安装向导</p>
<p>选择上面那个项目的主输出。</p>
<p>在安装项目的属性栏中会显示出&quot;XXX部署项目属性&quot;，在第一个AddRemoveProgramsIcon属性后&quot;浏览&quot;到你的ICO图标，接着在下面Author输入作者名，也就是你的名字，其他Localization是语言属性，Manufacturer,ProductName的属性将是用户在安装时默认设置的文件夹路径一部分了，设置Title为你的应用程序标题名称。</p>
<p>3.右击&quot;安装项目&quot;上，选择文件系统视图</p>
<p>在应用程序文件夹，添加一个文件，如果是WIN98下的安装，请选择WIN98操作系统目录下的msiexec.exe文件（一般在 c:\windows\system目录下）；如果是其他，比如WIN2K系列，请选择该操作系统目录下的msiexec.exe文件(一般在 \winnt\system32目录下)。</p>
<p>4.在文件系统视图的&quot;用户程序菜单&quot;里，添加一个目录，命名为项目的名字，</p>
<p>并且，在这个目录里，添加一个快捷方式，指向项目的主输出，</p>
<p>再添加一个快捷方式，指向加入的文件Msiexec.exe，命名为：&quot;卸载&quot;，</p>
<p>5.在解决方案里，选择安装项目，再打开属性视图，打开安装项目的属性面板，里面有一项：</p>
<p>ProductCode {5284694C-24C1-4FCF-A705-D4B9A0081274}</p>
<p>把后面的{5284694C-24C1-4FCF-A705-D4B9A0081274}，复制一下。</p>
<p>6.在&quot;卸载&quot;快捷方式的属性里，有一个叫Arguments的属性栏，在属性栏中首先填入&quot;/x&quot;后加一个空格，再&quot;粘贴&quot;，将 ProductCode的属性值COPY至此。</p>
<p>7、再在VS.Net的顶部菜单栏中&quot;生成&quot;-&quot;生成 XXXX&quot;(XXXX为你的项目名称)</p>
<p><strong>补充：合并模块项目的使用</strong></p>
<p>若在某个大型的安装程序中，模块飞分为模块1，模块2等，每次都把模块N的文件加进来重新编译就很麻烦，这是就可用“合并模块项目 (MergeModule)”。   <br />1.新建一个合并模块项目，名字为MergeModule1，添加需要的文件，生成后，将看到 MergeModule1.msm    <br />2.在這個大型的安装程序中，添加“合并模块”，将MergeModule1.msm添加进去    <br />3.生成，安装，你会发现MergeModule1的内容也被安装到了安装目录下</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1233</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>11个以上的手把手游戏开发教程</title>
		<link>http://www.hcxmflash.cn/blog/?p=1232</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1232#comments</comments>
		<pubDate>Fri, 27 Aug 2010 02:23:45 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1232</guid>
		<description><![CDATA[Flash是个非常灵活的游戏建立工具，大多数时候我们从网上可以找到flash游戏AS3资源比如Zuma-like Flash Game With AS3 Source Code，对于想建立自己游戏的初学者来说，手把手教程是个好的选择。很多网站都提供了免费或付费的 flash教程，这儿收集了十一个以上的flash游戏开发手把手教程。慢用！     Flash 里的高等数学函数     许多flash用户想利用自然运动法则做些真正酷的东西。能在屏幕上基于几何运算来移动物件不是很不错吗？不幸的是，flash 4能提供的高等数学函数只有Int()和Random()。两个都很有用不过我们真正需要的是Exp(), Sqrt(), Sin(), and Cos()，对不？不过，你很幸运。这个教程教你如何做出这东西并附带一段简单的代码。不用担心，即使你不懂泰勒级数，你也仍能够拷贝对的代码过去自己的flash影片中。      
下载 (195.96 KB)
昨天 19:26
AS3特色运动：小行星360度运动     如果我们要谈特色运动的话，最重要的莫过于基于旋转的360度运动。我不知道它是不是有特别的名字，我所知的就有360度运动，旋转运动，定向运动到小行星风格运动。从任何角度来看，它都属于游戏史上由来已久的运动风格，也必然是如今flash游戏工业的有益选择。那么做这种基于角度的运动有多难呢？一点也不难。     基地保卫者     游戏目标是通过射击来袭的飞机和它们扔下的炸弹来保卫埋在草丛下的TNT。如果有炸弹落到草地上，就会留下一个坑。当炸弹接触到TNT的时候游戏失败。飞机将会越来越快的出现，扔炸弹的速度也一样。击中一架飞机或者炸弹得一分。      
下载 (69.92 [...]]]></description>
			<content:encoded><![CDATA[<p>Flash是个非常灵活的游戏建立工具，大多数时候我们从网上可以找到flash游戏AS3资源比如<a href="http://ntt.cc/2010/05/07/zuma-like-flash-game-with-as3-source-code.html">Zuma-like Flash Game With AS3 Source Code</a>，对于想建立自己游戏的初学者来说，手把手教程是个好的选择。很多网站都提供了免费或付费的 flash教程，这儿收集了十一个以上的flash游戏开发手把手教程。慢用！     <br /><a href="http://www.dontletgo.com/planets/math.html">Flash 里的高等数学函数</a>     <br />许多flash用户想利用自然运动法则做些真正酷的东西。能在屏幕上基于几何运算来移动物件不是很不错吗？不幸的是，flash 4能提供的高等数学函数只有Int()和Random()。两个都很有用不过我们真正需要的是Exp(), Sqrt(), Sin(), and Cos()，对不？不过，你很幸运。这个教程教你如何做出这东西并附带一段简单的代码。不用担心，即使你不懂泰勒级数，你也仍能够拷贝对的代码过去自己的flash影片中。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image011.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjJ8Y2Y2YWM1MWV8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjJ8Y2Y2YWM1MWV8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (195.96 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://asgamer.com/2009/as3-character-movement-asteroids-style-360-degree-movement">AS3特色运动：小行星360度运动</a>     <br />如果我们要谈特色运动的话，最重要的莫过于基于旋转的360度运动。我不知道它是不是有特别的名字，我所知的就有360度运动，旋转运动，定向运动到小行星风格运动。从任何角度来看，它都属于游戏史上由来已久的运动风格，也必然是如今flash游戏工业的有益选择。那么做这种基于角度的运动有多难呢？一点也不难。     <br /><a href="http://www.bezzmedia.com/swfspot/samples/flash8/Base_Defender">基地保卫者</a>     <br />游戏目标是通过射击来袭的飞机和它们扔下的炸弹来保卫埋在草丛下的TNT。如果有炸弹落到草地上，就会留下一个坑。当炸弹接触到TNT的时候游戏失败。飞机将会越来越快的出现，扔炸弹的速度也一样。击中一架飞机或者炸弹得一分。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image014.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjN8ZmUyMTdjNjl8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjN8ZmUyMTdjNjl8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (69.92 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://www.kirupa.com/developer/actionscript/vertical_shooter.htm">创建一个纵向射击手</a>     <br />我们将创建一个让我们的超级英雄Pawel射杀穿屏而过飞龙的游戏。我提供了所有FLA所需的图片，不过你需要把图片摆到对的地方。相对于其他面面俱到的垂直射击游戏教程，这个教程更多的是在解释某些设计工作的代码。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image017.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjR8YzMwMzZmYWJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="340" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjR8YzMwMzZmYWJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (44.26 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://www.emanueleferonato.com/2007/05/15/create-a-flash-racing-game-tutorial/">Flash竞速游戏教程</a>     <br />这个教程将是其他一系列此类教程的开始。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image020.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjV8NGU5MmVlNDN8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjV8NGU5MmVlNDN8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (27.8 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://www.gotoandplay.it/_articles/2007/02/game_tutorial_part1.php?PHPSESSID=ec82faadbef6cd6671cca99a4c0e6ab8">游戏创建教程</a>     <br />这个教程是一篇手把手的长篇文章的第一部分，它将指导你经历创建Flash游戏的全过程，包括输入管理，基本物理，碰撞检测还有更多。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image023.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjZ8YmE4MDRjODZ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="409" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjZ8YmE4MDRjODZ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (9.73 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://flashexplained.com/actionscript/how-to-make-a-dynamic-hangman-game-in-flash-8-with-xml-and-actionscript/">如何用XML和ActionScript在Flash 8里做一个动态杀人游戏？</a>     <br />在这个针对Flash8和AS2的详细课程里，我将向你展示如何创建一个完整的动态杀人游戏。这个课程本来准备给中高级As用户的。如果你完全是新手，我建议你了解多点ActionScript再回到这里来学习。作为该课程的延续，你需要知道基本的As概念，比如变量，if/else条件逻辑，for循环，函数基础，路径，动态文本域和影片剪辑事件。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image026.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4Njd8ZWU2YzVlYTF8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4Njd8ZWU2YzVlYTF8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (49.17 KB)</p>
<p>昨天 19:26</p>
<p><a href="http://gamedev.michaeljameswilliams.com/2008/09/17/avoider-game-tutorial-1/">通过简单的避让游戏教程学习AS3</a>     <br />很多Flash开发者发现从AS2到AS3的跳跃是非常令人畏缩的，相反很多其他语言的程序员却发现AS3很直观，而很讨厌AS2。这个教程不需要你知道AS2，甚至不需要你用过Flash。如果已经有某些语言的编程基础的话你将会发现很简单，像变量，if声明体，循环，和函数，没有基础也不用担心。我将指出AS2和AS3之间的主要不同，以便Flash开发者做好转换，不过我不会集中精力讲这些。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image029.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4Njh8MDY1NzlkMWJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="423" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4Njh8MDY1NzlkMWJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (30.08 KB)</p>
<p>昨天 19:27</p>
<p><a href="http://www.emanueleferonato.com/2007/10/06/make-a-flash-game-like-flash-element-tower-defense-part-1/">做一个基础塔防的Flash游戏</a>     <br />游戏概念很简单：有条路，路上走着些奴隶。你必须在他们到达路端前杀掉所有奴隶。你可以建立设施来杀奴隶，并赚钱升级武器，同时奴隶也会变得更强大移动更快。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image032.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4Njl8YzIzOTk2OTl8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4Njl8YzIzOTk2OTl8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (195.34 KB)</p>
<p>昨天 19:27</p>
<p><a href="http://www.flash-game-design.com/flash-tutorials/shootObject-flash-tutorial.html">Flash游戏里的射击目标</a>     <br />这是基础空间射击游戏教程的续篇，就是用导弹摧毁小行星的那个。如果你没有跟过这个教程，可以下载FLA。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image035.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NzB8NjRlOTEwM2V8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NzB8NjRlOTEwM2V8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (50.56 KB)</p>
<p>昨天 19:27</p>
<p><a href="http://www.flashkit.com/tutorials/Games/Simple_G-Peter_Br-2/index.php">As的简单猜拳游戏</a>     <br />我们都玩过这样的游戏：标记0到1000之间的数，让其他人猜。简单的反馈高了还是低了的信息最后指向答案。     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="image038.png" src="http://bbs.9ria.com/attachment.php?aid=MzI4NjB8ZDRiZjJjZjJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;noupdate=yes" width="450" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzI4NjB8ZDRiZjJjZjJ8MTI4Mjg3NTczOHxhNTk1SGVyTHBHY29KcnE4V0NtdXFwbTFkNFFtdHhEUXNyNkt1b1JhRVo3ZGNMWQ%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (23.27 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1232</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS程序员实用工具类</title>
		<link>http://www.hcxmflash.cn/blog/?p=1231</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1231#comments</comments>
		<pubDate>Sat, 21 Aug 2010 03:22:02 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[AS3.0]]></category>
		<category><![CDATA[常用]]></category>
		<category><![CDATA[类]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1231</guid>
		<description><![CDATA[字符串：
QueueLoader    QueueLoader是一个顺序载入资源并监控的as类库。还能加载图片，SWF，MP3,XML……QueueLoader是为AS3设计的，并且开源了。
URL-Prioritization Class    Url prioritization class它支持Loader，URLLoader以及Sound对象（也许有一天能支持NetStream对象）。它允许你设置请求的优先级以便这些对象能正确的顺序执行，还能查看当前的执行请求和载入请求。
MusicBuilder &#38; SoundObject    这是一组类，包括MusicBuilder，SoundObject，SOCollection，Timer。这些类允许你使用multiple streaming mp3声音文件建立自己的音乐。它使用了一个新的Timer类，能够精确计算到毫秒，现在你能无缝的循环播放你的MP3文件。
SoundController Class    SoundController class管理声道。当当前声道达到最大值的时候，SoundController类会停止最早的声音，因此你可以播放新的声音。这类似“队列”的结构。当你添加新的声音，最早的声音被删除。
Sound Manager Class    这是个单例，可以在你的游戏/项目的任何地方被使用。只需要将你所有的声音文件注册到这个单例中，然后通过ID使用它们。
Using the Sound, SoundChannel, SoundTransform classes    正如你所见，这篇东东谈的是如何使用Sound, SoundChannel, SoundTransform类
声音类：
As 3 Inflector    这个转换器支持单/复数转换，驼峰，下划线，人性化（首字母大写等）
AS3 StringTokenizer    在java.util包内有一个非常有用的工具，就是StringTokenizer类。AS的StringTokenizer类是一个很方便的类，它提供一个简单的机制，使用特定的个人标记来分割字符串。
ActionScript 3 [...]]]></description>
			<content:encoded><![CDATA[<p>字符串：</p>
<p><a href="http://wiki.github.com/hydrotik/QueueLoader/">QueueLoader</a>    <br />QueueLoader是一个顺序载入资源并监控的as类库。还能加载图片，SWF，MP3,XML……QueueLoader是为AS3设计的，并且开源了。</p>
<p><a href="http://www.danielhai.com/blog/?p=60">URL-Prioritization Class</a>    <br />Url prioritization class它支持Loader，URLLoader以及Sound对象（也许有一天能支持NetStream对象）。它允许你设置请求的优先级以便这些对象能正确的顺序执行，还能查看当前的执行请求和载入请求。</p>
<p><a href="http://lab.daroost.ca/?p=15">MusicBuilder &amp; SoundObject</a>    <br />这是一组类，包括MusicBuilder，SoundObject，SOCollection，Timer。这些类允许你使用multiple streaming mp3声音文件建立自己的音乐。它使用了一个新的Timer类，能够精确计算到毫秒，现在你能无缝的循环播放你的MP3文件。</p>
<p><a href="http://www.actionscript.org/resources/articles/203/1/Controlling-Multi-channel-Sound-using-ActionScript/Page1.html">SoundController Class</a>    <br />SoundController class管理声道。当当前声道达到最大值的时候，SoundController类会停止最早的声音，因此你可以播放新的声音。这类似“队列”的结构。当你添加新的声音，最早的声音被删除。</p>
<p><a href="http://cheezeworld.com/managing-sounds-and-music-in-actionscript-3/">Sound Manager Class</a>    <br />这是个单例，可以在你的游戏/项目的任何地方被使用。只需要将你所有的声音文件注册到这个单例中，然后通过ID使用它们。</p>
<p><a href="http://www.zedia.net/2008/a-little-bit-about-sound-using-the-sound-soundchannel-soundtransform-classes/">Using the Sound, SoundChannel, SoundTransform classes</a>    <br />正如你所见，这篇东东谈的是如何使用Sound, SoundChannel, SoundTransform类</p>
<p>声音类：</p>
<p><a href="http://ak33m.com/?p=43">As 3 Inflector</a>    <br />这个转换器支持单/复数转换，驼峰，下划线，人性化（首字母大写等）</p>
<p><a href="http://www.ericfeminella.com/blog/2007/11/01/as3-stringtokenizer/">AS3 StringTokenizer</a>    <br />在java.util包内有一个非常有用的工具，就是StringTokenizer类。AS的StringTokenizer类是一个很方便的类，它提供一个简单的机制，使用特定的个人标记来分割字符串。</p>
<p><a href="http://flexonrails.net/?p=101">ActionScript 3 Inflector class for pluralizing and singularizing words</a>    <br />这个转换器支持大多数的单词的单复数转换。它本质上是Rails inflector类的端口</p>
<p><a href="http://labs.zeh.com.br/blog/?page_id=97#lzw">zeh.compression.LZW (AS2)</a>    <br />LZW是一个静态类，它允许使用Lempel-Ziv-Welch – or LZW – algorithm进行字符串压缩。它提供了一个快速引擎进行良好的压缩。这个引擎能够循环分割，很利于发送大量可压缩数据到服务器。比如说一张图片的点阵。</p>
<p><a href="http://natecook.com/downloads/sprintf.html">Sprintf.as</a>    <br />格式化字符串是一个很便利的功能，但杯具的是Flash AS库中没有。这个类增加了sprintf（把格式数据写成串）功能</p>
<p>文本类：</p>
<p><a href="http://blog.greensock.com/textmetrics/">TextMetrics–寻找子串坐标，行宽等</a>    <br />你是否需要在动态TextField中找出换行？是否需要精确定位x/y，宽/高进行高亮显示。或者需要知道每行的宽度？gs.utils.text.TextMetrics类可以帮到你。</p>
<p><a href="http://www.rubenswieringa.com/blog/htmlstyle">HTMLStyle</a>    <br />这是为了简化Flex中的html-text开发的组件。HTMLStyle使用几乎相同的标签，也使用与ActionScript代码。</p>
<p><a href="http://www.asserttrue.com/articles/2006/04/09/actionscript-projects-in-flex-builder-2-0">AS3 AutoComplete class</a>    <br />ActionScript工程中的AS3 AutoComplete类。</p>
<p><a href="http://www.pippoflash.com/index.php/2006/07/10/downaload-flash-text-search-engine-class/">Flash Text Search Engine Class</a>    <br />一个轻量级的多功能ActionScript文本搜索引擎。你可以简单的使用它，或者使用专家功能例如排除字符，大小写等。</p>
<p><a href="http://www.republicofcode.com/tutorials/flash/as3text/">Playing with Text in AS3</a>    <br />这篇教程将教你AS3中基本的文本格式处理。你应该会创建Textfield，改变它的颜色和属性，定位，嵌入字体。我们将使用TextField类和 TextFormat类去完成这些任务。</p>
<p><a href="http://apdevblog.com/actionscript-spellchecker-for-flash-textfields-with-source-code-and-example/">ActionScript Spellchecker for Flash Textfields</a>    <br />这个类允许你使用TextField中的拼写检查功能。现在，你能右键单击拼错的单词并且从字典中加载上下文的建议。</p>
<p><a href="http://code.google.com/p/textanim/">TextAnim</a>    <br />TextAnim是一个可扩展的，用来创建文本动画的类。思路是将文字打散成序列块，然后就可以自由的做你想要的动画。至于选择哪种补间引擎就无所谓了：Tweener，BTween，GTween，Tweensy，TweenLite……</p>
<p>颜色类：</p>
<p><a href="http://yourpalmark.com/2008/06/20/color-name-class-svg-10-x11-and-vga/">Color Name Class</a>    <br />它根据SVG1.0定义颜色名和16进制的值。</p>
<p><a href="http://www.quasimondo.com/archives/000671.php">ColorMatrix Class for AS3</a>    <br />和as2版本相比，作者增加了一些新的方法并尽可能的做了优化。</p>
<p><a href="http://www.greensock.com/tweenmax/">TweenMax</a>    <br />TweenMax扩展至快速轻便的TweenLite引擎。这次又增加了许多有用的功能像timeScale，AS#事件调用，终点设置，yoyo（tween动作 不停地往复循环&#160; 指示补间动画按与其补间属性最后一次增加的方向相反的方向播放），重复，延迟重复，四舍五入等。（我想这可能可以用来做颜色的过渡动画）。</p>
<p><a href="http://somerandomdude.com/blog/flash/actionscript-3-color-sampler-class-download/">Actionscript 3 Color Sampler Class</a>    <br />显示对象的颜色取样引擎。定义一个BitmapData的取样区（宽，高，x，y）并计算该区域的平均值。能够在该区域内取得RGB的红绿蓝通道，色调，饱和度和亮度的数值。</p>
<p><a href="http://natecook.com/downloads/color.html">AdvancedColor</a>    <br />AdvancedColor对象主要是扩展了内置的颜色对像，它还提供了静态的方法，能够让颜色的值在色彩模式之间转换。</p>
<p><a href="http://www.senocular.com/flash/actionscript/?file=ActionScript_2.0/ColorFader.as">ColorFader：     <br /></a>在指定的时间内渐变到一个指定的16进制颜色。</p>
<p><a href="http://www.pippoflash.com/index.php/2006/02/01/download-designer-class/">Designer Class</a>    <br />用这个易使用的类去控制flash中的绘图API。用简单的AS命令就能绘制圆形，方形或者比较复杂的梯形。</p>
<p>Bitmap类：</p>
<p>Bitmap在我们的开发中使用率很高，这意味着掌握它很重要.实际上，有很多现成的类可以帮助我们更简单的操作Bitmap对象。接下来我们收集了8个关于Bitmap的类供大家参考，希望大家会喜欢。</p>
<p><a href="http://www.uza.lt/codex/as3-scale9-bitmap/">AS3 Scale9 Bitmap</a>    <br />一个创建9宫的类。</p>
<p><a href="http://juliankussman.com/blog/2008/10/01/as3-bitmap-mosaic-class/">AS3 bitmap mosaic class</a>    <br />很有趣的类，将图片进行马赛克处理</p>
<p><a href="http://blog.onebyonedesign.com/?p=81">Active Window Blur</a>    <br />这个有点像flex中Alert后模糊的背景。</p>
<p><a href="http://blog.hexagonstar.com/animatedbitmapclass/">Animated Bitmap Class</a>    <br />这是一个动画播放类</p>
<p><a href="http://www.gskinner.com/blog/archives/2005/10/source_code_sha.html">CollisionDetection Class</a>    <br />这是一个用来检测碰撞的类</p>
<p><a href="http://www.rubenswieringa.com/blog/distortimage">DistortImage Class</a>    <br />用来进行图像扭曲变形的类</p>
<p><a href="http://labs.zeh.com.br/blog/?page_id=97#imageloader">ImageLoader</a>    <br />图片的加载管理类，有点像对象池的概念。</p>
<p><a href="http://weblog.cahlan.com/2007/01/reflection-class.html">Reflection class</a>    <br />倒影类</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1231</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)AS3声音合成（4）－音调类</title>
		<link>http://www.hcxmflash.cn/blog/?p=1230</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1230#comments</comments>
		<pubDate>Sat, 07 Aug 2010 03:37:05 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[声音]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1230</guid>
		<description><![CDATA[为了让代码可重用性更深入些，我把它移到自己的类里，叫做 Tone。我也做了些优化和其他小伎俩。最重要的是我并非在每一个SAMPLE_DATA事件里计算下一批伴随封套的样本，而是在前一个封套里预先计算所有样本，并储存在一个矢量数列里。下面是这个类： 

01&#160;&#160;&#160;&#160;&#160;&#160;&#160; package
02&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 
03&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; 
04&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; 
05&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.Event; 
06&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
07&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public class Tone 
08&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 
09&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected const RATE:Number = 44100; 
10&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _position:int = 0; 
11&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _sound:Sound; 
12&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _numSamples:int = 2048; 
13&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _samples:Vector.&#60;number&#62;; 
14&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _isPlaying:Boolean = false; 
15&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
16&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>为了让代码可重用性更深入些，我把它移到自己的类里，叫做 Tone。我也做了些优化和其他小伎俩。最重要的是我并非在每一个SAMPLE_DATA事件里计算下一批伴随封套的样本，而是在前一个封套里预先计算所有样本，并储存在一个矢量数列里。下面是这个类： </p>
<ol>
<li>01&#160;&#160;&#160;&#160;&#160;&#160;&#160; package</li>
<li>02&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>03&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; </li>
<li>04&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; </li>
<li>05&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.Event; </li>
<li>06&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>07&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public class Tone </li>
<li>08&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>09&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected const RATE:Number = 44100; </li>
<li>10&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _position:int = 0; </li>
<li>11&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _sound:Sound; </li>
<li>12&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _numSamples:int = 2048; </li>
<li>13&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _samples:Vector.&lt;number&gt;; </li>
<li>14&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _isPlaying:Boolean = false; </li>
<li>15&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>16&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected var _frequency:Number; </li>
<li>17&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>18&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public function Tone(frequency:Number) </li>
<li>19&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>20&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _frequency = frequency; </li>
<li>21&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _sound = new Sound(); </li>
<li>22&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>23&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _samples = new Vector.&lt;number&gt;(); </li>
<li>24&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; createSamples(); </li>
<li>25&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>26&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>27&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected function createSamples():void</li>
<li>28&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>29&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var amp:Number = 1.0; </li>
<li>30&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var i:int = 0; </li>
<li>31&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var mult:Number = frequency / RATE * Math.PI * 2; </li>
<li>32&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while(amp &gt; 0.01) </li>
<li>33&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>34&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _samples[i] = Math.sin(i * mult) * amp; </li>
<li>35&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; amp *= 0.9998; </li>
<li>36&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i++; </li>
<li>37&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>38&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _samples.length = i; </li>
<li>39&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>40&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>41&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public function play():void</li>
<li>42&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>43&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(!_isPlaying) </li>
<li>44&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>45&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _position = 0; </li>
<li>46&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _sound.play(); </li>
<li>47&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _isPlaying = true; </li>
<li>48&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>49&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>50&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>51&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected function onSampleData(event:SampleDataEvent):void</li>
<li>52&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>53&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var i:int = 0; i &lt; _numSamples; i++) </li>
<li>54&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>55&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(_position &gt;= _samples.length) </li>
<li>56&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>57&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _isPlaying = false; </li>
<li>58&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return; </li>
<li>59&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>60&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(_samples[_position]); </li>
<li>61&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(_samples[_position]); </li>
<li>62&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _position++; </li>
<li>63&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>64&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>65&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>66&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public function set frequency(value:Number):void</li>
<li>67&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>68&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _frequency = value; </li>
<li>69&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; createSamples(); </li>
<li>70&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>71&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public function get frequency():Number</li>
<li>72&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>73&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return _frequency; </li>
<li>74&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>75&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>76&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</li>
</ol>
<p><em>复制代码</em></p>
<p>留意我在构造函数里调用createSamples()。这就创建了乐曲所有所需样本的矢量版本，包括了假封套的振幅。在频率setter里，样本被重建，结果就是在onSampleData掌控方法中，我只是拿_samples矢量里的这么多值赋予了字节数组，直到矢量末尾。   <br />也要注意到振幅也随着样本——不是随着SAMPLE_DATA事件——而减少，因此它需要每次需要减少的数值越来越小。这将给出一个更平滑的封套，虽然我也不觉得这有多引人注意。    <br />这儿有个短代码展示它如何工作： </p>
<ol>
<li>1&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.MouseEvent; </li>
<li>2&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>3&#160;&#160;&#160;&#160;&#160;&#160;&#160; var tone:Tone = new Tone(800); </li>
<li>4&#160;&#160;&#160;&#160;&#160;&#160;&#160; stage.addEventListener(MouseEvent.CLICK, onClick); </li>
<li>5&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onClick(event:MouseEvent):void</li>
<li>6&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>7&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tone.frequency = 300 + mouseY; </li>
<li>8&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tone.play(); </li>
<li>9&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</li>
</ol>
<p><em>复制代码</em></p>
<p>它创建了一个音调。每当你点击舞台，它会根据y轴坐标计算出一个心的音调频率给鼠标并播放出来。够简单了吧。   <br />不过这个类还太不完善了。只是某个进化的开局。我想增加对更灵活或者说更复杂的封套的支持，增加一个stop方法，还有其他参数来改变声音。尽管如此，愚以为，这已经相当有用了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1230</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)AS3声音合成（3）&#8212;&#8212;视觉化和封套</title>
		<link>http://www.hcxmflash.cn/blog/?p=1229</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1229#comments</comments>
		<pubDate>Sat, 07 Aug 2010 03:36:21 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[声音]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1229</guid>
		<description><![CDATA[在第一和第二部分里，我们学习了如何利用Sound对象来合成声音，还有如何创建不同频率的声音。本贴将只是绕到一些你可以玩的小花样上讲讲。    第一个就是让你播放的声波可视化。在SAMPLE_DATA事件掌控器里，你已经可以通过生成2048个样本来创建波形。当你可以做到那些的时候，继续深入绘制一些以其为基础的线条也不成其为难事。看这儿： 

01&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; 

02&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; 

03&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.MouseEvent; 

04&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.utils.Timer; 

05&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.TimerEvent; 

06&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 

07&#160;&#160;&#160;&#160;&#160;&#160;&#160; var position:int = 0; 

08&#160;&#160;&#160;&#160;&#160;&#160;&#160; var n:Number = 0; 

09&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); 

10&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 

11&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); 

12&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 

13&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void

14&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 

15&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.clear(); 

16&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.lineStyle(0, 0&#215;999999); 

17&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.moveTo(0, stage.stageHeight [...]]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://bbs.9ria.com/thread-59672-1-1.html">第一</a>和<a href="http://bbs.9ria.com/thread-59966-1-1.html">第二部分</a>里，我们学习了如何利用Sound对象来合成声音，还有如何创建不同频率的声音。本贴将只是绕到一些你可以玩的小花样上讲讲。    <br />第一个就是让你播放的声波可视化。在SAMPLE_DATA事件掌控器里，你已经可以通过生成2048个样本来创建波形。当你可以做到那些的时候，继续深入绘制一些以其为基础的线条也不成其为难事。看这儿： </p>
<ol>
<li>01&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; </li>
<li></li>
<li>02&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; </li>
<li></li>
<li>03&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.MouseEvent; </li>
<li></li>
<li>04&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.utils.Timer; </li>
<li></li>
<li>05&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.TimerEvent; </li>
<li></li>
<li>06&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>07&#160;&#160;&#160;&#160;&#160;&#160;&#160; var position:int = 0; </li>
<li></li>
<li>08&#160;&#160;&#160;&#160;&#160;&#160;&#160; var n:Number = 0; </li>
<li></li>
<li>09&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); </li>
<li></li>
<li>10&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li></li>
<li>11&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); </li>
<li></li>
<li>12&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>13&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void</li>
<li></li>
<li>14&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>15&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.clear(); </li>
<li></li>
<li>16&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.lineStyle(0, 0&#215;999999); </li>
<li></li>
<li>17&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.moveTo(0, stage.stageHeight / 2); </li>
<li></li>
<li>18&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; I &lt; 2048; i++) </li>
<li></li>
<li>19&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>20&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var phase:Number = position / 44100 * Math.PI * 2; </li>
<li></li>
<li>21&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; position ++; </li>
<li></li>
<li>22&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sample:Number = Math.sin(phase * 440 * Math.pow(2, n / 12)); </li>
<li></li>
<li>23&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // left </li>
<li></li>
<li>24&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // right </li>
<li></li>
<li>25&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.lineTo(I / 2048 * stage.stageWidth, stage.stageHeight / 2 – sample * stage.stageHeight / 8); </li>
<li></li>
<li>26&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li></li>
<li>27&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li></li>
<li>28&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>29&#160;&#160;&#160;&#160;&#160;&#160;&#160; var timer:Timer = new Timer(500); </li>
<li></li>
<li>30&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.addEventListener(TimerEvent.TIMER, onTimer); </li>
<li></li>
<li>31&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.start(); </li>
<li></li>
<li>32&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onTimer(event:TimerEvent):void</li>
<li></li>
<li>33&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>34&#160;&#160;&#160;&#160;&#160;&#160;&#160; n = Math.floor(Math.random() * 20 – 5); </li>
<li></li>
<li>35&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.delay = 125 * (1 + Math.floor(Math.random() * 7)); </li>
<li></li>
<li>36&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</li>
</ol>
<p><em>复制代码</em></p>
<p>我所做的，不过是清空了 graphics，设置了线条风格，并把它移到了屏幕中央左边的位置。然后让它随着样本值起伏着穿过屏幕。这让你看到以下图片：   <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="wave_vis.png" src="http://bbs.9ria.com/attachment.php?aid=MzE2MDZ8NGIzZjlmMTN8MTI4MTE1MjI2MXw3ODliS0xoMWgvUDk4cS9tNGlSS255RnVBMkJsQ2tyWGRGWi91UE1MQlFtbjFUZw%3D%3D&amp;noupdate=yes" width="550" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzE2MDZ8NGIzZjlmMTN8MTI4MTE1MjI2MXw3ODliS0xoMWgvUDk4cS9tNGlSS255RnVBMkJsQ2tyWGRGWi91UE1MQlFtbjFUZw%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (17.37 KB)</p>
<p>2010-7-30 21:50</p>
<p>你可以看到波随着每一个新的音符变化着它的频率。   <br />下一个把戏我是不久之前从Andre Michelle学到的。你会注意到那正弦波感觉非常平而苍白。很明显的电脑产物。这是因为波的振幅，或峰谷值，总是保持在：－1.0到1.0之间。和真实世界里的声音比起来显得不够自然。当你敲打一个钢琴键盘的时候，你会注意到声音开始会非常响亮，按住不放的话，它会调降到一个稳定的值，而当你放开它，声音会渐弱消失。这个音量变化就是所谓的声音封套。它一般具有四段描述，简称为ADSR。解释来自Wikipedia:    <br />击打时间是指初始时从无声到峰值的水平徒增时间。    <br />衰落时间是指从击打水平降到指定维持水平之间变化的时间。    <br />维持水平是指音阶在大部分时间里的振幅。    <br />释放时间是指当键被释放之后从维持水平到零的消亡时间。    <br />Andre Michelle’s的很多声音实验和玩具都配有非常好听悦耳的铃声，所以我知道他是用了某些封套，不过我清楚封套编码很复杂。于是我向他请教。他说了一两句话作为解答，而那些我以为都是废话。基本上，你所需要的就是用全振幅开始声音并随着时间减弱它。就是这么简单。你可以丢掉那些关于击打，衰落还有维持的概念，而只是编码释放期。    <br />在这个版本的项目里，我们只是设置了一个amp变量，值设成1.0。通过每一个SAMPLE_DATA事件，一点一点的改变振幅。并以其与样本值相乘。当新的音出现时，重设amp为1.0。 </p>
<ol>
<li>01&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; </li>
<li></li>
<li>02&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; </li>
<li></li>
<li>03&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.MouseEvent; </li>
<li></li>
<li>04&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.utils.Timer; </li>
<li></li>
<li>05&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.TimerEvent; </li>
<li></li>
<li>06&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>07&#160;&#160;&#160;&#160;&#160;&#160;&#160; var position:int = 0; </li>
<li></li>
<li>08&#160;&#160;&#160;&#160;&#160;&#160;&#160; var n:Number = 0; </li>
<li></li>
<li>09&#160;&#160;&#160;&#160;&#160;&#160;&#160; var amp:Number = 1.0; </li>
<li></li>
<li>10&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); </li>
<li></li>
<li>11&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li></li>
<li>12&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); </li>
<li></li>
<li>13&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>14&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void</li>
<li></li>
<li>15&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>16&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.clear(); </li>
<li></li>
<li>17&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.lineStyle(0, 0&#215;999999); </li>
<li></li>
<li>18&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.moveTo(0, stage.stageHeight / 2); </li>
<li></li>
<li>19&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var I:int = 0; I &lt; 2048; I++) </li>
<li></li>
<li>20&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>21&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var phase:Number = position / 44100 * Math.PI * 2; </li>
<li></li>
<li>22&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; position ++; </li>
<li></li>
<li>23&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sample:Number = Math.sin(phase * 440 * Math.pow(2, n / 12)) * amp; </li>
<li></li>
<li>24&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // left </li>
<li></li>
<li>25&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // right </li>
<li></li>
<li>26&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; graphics.lineTo(I / 2048 * stage.stageWidth, stage.stageHeight / 2 – sample * stage.stageHeight / 8); </li>
<li></li>
<li>27&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li></li>
<li>28&#160;&#160;&#160;&#160;&#160;&#160;&#160; amp *= 0.7; </li>
<li></li>
<li>29&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li></li>
<li>30&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li></li>
<li>31&#160;&#160;&#160;&#160;&#160;&#160;&#160; var timer:Timer = new Timer(500); </li>
<li></li>
<li>32&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.addEventListener(TimerEvent.TIMER, onTimer); </li>
<li></li>
<li>33&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.start(); </li>
<li></li>
<li>34&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onTimer(event:TimerEvent):void</li>
<li></li>
<li>35&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li></li>
<li>36&#160;&#160;&#160;&#160;&#160;&#160;&#160; amp = 1.0; </li>
<li></li>
<li>37&#160;&#160;&#160;&#160;&#160;&#160;&#160; n = Math.floor(Math.random() * 20 – 5); </li>
<li></li>
<li>38&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.delay = 125 * (1 + Math.floor(Math.random() * 7)); </li>
<li></li>
<li>39&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</li>
<li></li>
<li></li>
<li></li>
</ol>
<p><em>复制代码</em></p>
<p>这儿，我每次事件都将amp乘以0.7。这次给出了一个悦耳的铃声。小范围改动值以取得不同的曲风。或者你甚至可以做些有趣的颤音比如： </p>
<ol>
<li>1&#160;&#160;&#160;&#160;&#160;&#160;&#160; amp = 0.5 + Math.cos(position * 0.001) * 0.5;</li>
</ol>
<p><em>复制代码</em></p>
<p>以上，为本次全文。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1229</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)AS3里的声音合成(2)－波</title>
		<link>http://www.hcxmflash.cn/blog/?p=1228</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1228#comments</comments>
		<pubDate>Sat, 07 Aug 2010 03:35:19 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[声音]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1228</guid>
		<description><![CDATA[该贴将展示如何使用AS3 的Sound对象生成特殊频率的正弦波。这里假设你已经阅读，或者熟悉该系列里的第一篇文章的数据。    声音的基础     声音本身基本上是空气压力的改变。很粗糙的一种说法。空气由不同的分子组成。他们并不是平均分配的。在更多压力的地方他们会聚集得更紧密，而其他地方他们之间的距离就拉大了。当某些东西如吉他弦振动时，它迅速的向前向后以特定的速度运动。当向一个方向运动时，它推动空气里的分子向同方向的其他分子靠近。接着就造成了一股密集的空气。之后弦向相反方向运动，造成了一小点真空的范围。非完全真空，只是较少分子的区域而已。它又一次运动回来，造成了另一边的密集空气。密集与松垮的空气区域在房间里传播最终撞击到你的耳膜。耳膜随之起伏。结果就是你的耳膜开始无限接近于与吉他弦相同频率的振动。这导致一些骨头开始振动，接着是神经，接着有个信息进入你的大脑，你说：“哦，这是升C大调”。录音的时候，你使用一个麦克风作为某种电子耳朵。它有某种膜或者其他什么可动的部分来产生振动以产生电子信号，以便用某种方式记录下来。重播的时候，电子信号重生并让扬声器以相同频率振动。这就使得空气以相同的方式被推动挤压，产生和当初吉他弦一样的声音让你听到。     合成声音     但是，我们讲声音合成的时候，完全是很肤浅的事。Flash，你的电脑声卡，还有你的耳机或者扬声器将生成正确的电子信号并振动空气。但是你需要计算出振动的幅度还有速度。     在教程第一部分，我们生成了随机值让扬声器或者耳机毫无规律的振动，最终是呈现出类似无线电的噪音。生成一种实际的音频需要多一点的工作，最好多一点对此的了解。     数字声音     模拟声音的世界里，如树脂唱片或者八轨磁带（这里揭露了我的年龄），声音被平滑编码的方式，是通过唱片里撞击成的凹槽中或者通过改变磁带里的磁场来实现的。数字声音则是以一定的时间间隔采集声音压力样本值。     举个最简单的声音形式的例子来说，一个正弦波，这儿有个平滑的模拟版本：      
下载 (24.95 KB)
2010-7-28 23:31
这儿是同一个波，表现的是50个样本：     
下载 [...]]]></description>
			<content:encoded><![CDATA[<p>该贴将展示如何使用AS3 的Sound对象生成特殊频率的正弦波。这里假设你已经阅读，或者熟悉该系列里的第一篇文章的数据。    <br /><strong>声音的基础</strong>     <br />声音本身基本上是空气压力的改变。很粗糙的一种说法。空气由不同的分子组成。他们并不是平均分配的。在更多压力的地方他们会聚集得更紧密，而其他地方他们之间的距离就拉大了。当某些东西如吉他弦振动时，它迅速的向前向后以特定的速度运动。当向一个方向运动时，它推动空气里的分子向同方向的其他分子靠近。接着就造成了一股密集的空气。之后弦向相反方向运动，造成了一小点真空的范围。非完全真空，只是较少分子的区域而已。它又一次运动回来，造成了另一边的密集空气。密集与松垮的空气区域在房间里传播最终撞击到你的耳膜。耳膜随之起伏。结果就是你的耳膜开始无限接近于与吉他弦相同频率的振动。这导致一些骨头开始振动，接着是神经，接着有个信息进入你的大脑，你说：“哦，这是升C大调”。录音的时候，你使用一个麦克风作为某种电子耳朵。它有某种膜或者其他什么可动的部分来产生振动以产生电子信号，以便用某种方式记录下来。重播的时候，电子信号重生并让扬声器以相同频率振动。这就使得空气以相同的方式被推动挤压，产生和当初吉他弦一样的声音让你听到。     <br /><strong>合成声音</strong>     <br />但是，我们讲声音合成的时候，完全是很肤浅的事。Flash，你的电脑声卡，还有你的耳机或者扬声器将生成正确的电子信号并振动空气。但是你需要计算出振动的幅度还有速度。     <br />在教程<a href="http://bbs.9ria.com/thread-59672-1-1.html">第一部分</a>，我们生成了随机值让扬声器或者耳机毫无规律的振动，最终是呈现出类似无线电的噪音。生成一种实际的音频需要多一点的工作，最好多一点对此的了解。     <br /><strong>数字声音</strong>     <br />模拟声音的世界里，如树脂唱片或者八轨磁带（这里揭露了我的年龄），声音被平滑编码的方式，是通过唱片里撞击成的凹槽中或者通过改变磁带里的磁场来实现的。数字声音则是以一定的时间间隔采集声音压力样本值。     <br />举个最简单的声音形式的例子来说，一个正弦波，这儿有个平滑的模拟版本：     <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="sine_smooth_thumb.png" src="http://bbs.9ria.com/attachment.php?aid=MzEzOTZ8ZDIwYzA1Zjh8MTI4MTE1MjE0N3xjMjZkbEpGWEg4QWNuNEtsUFFCaFJoTVZsRlhsTXh0b2laVTRXNWV2em1pYnVPOA%3D%3D&amp;noupdate=yes" width="600" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzEzOTZ8ZDIwYzA1Zjh8MTI4MTE1MjE0N3xjMjZkbEpGWEg4QWNuNEtsUFFCaFJoTVZsRlhsTXh0b2laVTRXNWV2em1pYnVPOA%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (24.95 KB)</p>
<p>2010-7-28 23:31</p>
<p>这儿是同一个波，表现的是50个样本：    <br /><img border="0" src="http://bbs.9ria.com/images/default/attachimg.gif" /> <img alt="sine_sample_thumb.png" src="http://bbs.9ria.com/attachment.php?aid=MzEzOTd8ZjQ5MzFkYWF8MTI4MTE1MjE0N3xjMjZkbEpGWEg4QWNuNEtsUFFCaFJoTVZsRlhsTXh0b2laVTRXNWV2em1pYnVPOA%3D%3D&amp;noupdate=yes" width="600" /></p>
<p><a href="http://bbs.9ria.com/attachment.php?aid=MzEzOTd8ZjQ5MzFkYWF8MTI4MTE1MjE0N3xjMjZkbEpGWEg4QWNuNEtsUFFCaFJoTVZsRlhsTXh0b2laVTRXNWV2em1pYnVPOA%3D%3D&amp;nothumb=yes"><strong>下载</strong></a> (13.87 KB)</p>
<p>2010-7-28 23:31</p>
<p>你也看到了，采样版本不如平滑波精确。但是，在高质量的数字声音里，样本数多到已经不可能被普通大众分辨出有什么不同。当你在合成声音的时候，你将要每秒处理44,100个样本。记住这个数字，我们将用它做一些运算。    <br />现在，我们需要做的就是用一系列形成正弦波的值来生成样本点，就像你在上面所看到的。正弦波的最高峰是1.0，最低值是-1.0，中间值是0.0。为了便于上手，我们将生成一个完整秒的单独正弦波。为了记录我们的位置，我们使用一个叫做position变量。我们初始化它为0，随着它的每一次的增加而创建一个新的样本。因此在音频的第一秒里，position将从0到44100变化。     <br />如果我们如果我们将位值除以44100，我们将获得从一秒里0.0到1.0的变化。而如果我们把它乘以2PI，我们将得到从0到2PI的值，刚好是我们赋予函数Math.sin用于产生正弦波所需要的。这是到目前为止的代码：     <br />Actionscript: </p>
<ol>
<li>import flash.media.Sound; </li>
<li>import flash.events.SampleDataEvent; </li>
<li>import flash.events.MouseEvent; </li>
<li></li>
<li>var position:int = 0; </li>
<li>var sound:Sound = new Sound(); </li>
<li>sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>sound.play(); </li>
<li></li>
<li>function onSampleData(event:SampleDataEvent):void </li>
<li>{ </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; i &lt; 2048; i++) </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var phase:Number = position / 44100 * Math.PI * 2; </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; position ++; </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sample:Number = Math.sin(phase); </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // left </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // right </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>} </li>
</ol>
<p><em>复制代码</em></p>
<p>运行文件，你将每秒都生成一个完整周期的正弦波。当然，1赫兹的声波低于人类听力底线。为了得到特殊频率的声音，只需要乘以你想听到的倍数。人类大概可以听到25到25,000赫兹的声音。标准音阶里中央A是 440赫兹。我们试一下。改变计算样本的那一行为：    <br />Actionscript: </p>
<ol>
<li>var sample:Number = Math.sin(phase * 440); </li>
</ol>
<p><em>复制代码</em></p>
<p>那是A.。网上你可以找到以下的类似图表。 </p>
<ol>
<li>A 440 </li>
<li>B flat 466 </li>
<li>B 494 </li>
<li>C 523 </li>
<li>C sharp 554 </li>
<li>D 587 </li>
<li>D sharp 622 </li>
<li>E 659 </li>
<li>F 698 </li>
<li>F sharp 740 </li>
<li>G 784 </li>
<li>A flat 831 </li>
<li>A 880 </li>
</ol>
<p><em>复制代码</em></p>
<p>或者，如果你想得到更数学化的表示，那么高于或低于440的每一个音阶n的频率计算公式为： </p>
<ol>
<li>440 * 2^(n / 12) </li>
</ol>
<p><em>复制代码</em></p>
<p>我们可以通过设置变量n来呈现各音阶，通过上面的公式来按时提升频率。    <br />Actionscript: </p>
<ol>
<li>import flash.media.Sound; </li>
<li>import flash.events.SampleDataEvent; </li>
<li>import flash.events.MouseEvent; </li>
<li>import flash.utils.Timer; </li>
<li>import flash.events.TimerEvent; </li>
<li></li>
<li>var position:int = 0; </li>
<li>var n:Number = 0; </li>
<li>var sound:Sound = new Sound(); </li>
<li>sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>sound.play(); </li>
<li></li>
<li>function onSampleData(event:SampleDataEvent):void </li>
<li>{ </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; i &lt; 2048; i++) </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var phase:Number = position / 44100 * Math.PI * 2; </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; position ++; </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sample:Number = Math.sin(phase * 440 * Math.pow(2, n / 12)); </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // left </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // right </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>} </li>
<li></li>
<li>var timer:Timer = new Timer(500); </li>
<li>timer.addEventListener(TimerEvent.TIMER, onTimer); </li>
<li>timer.start(); </li>
<li>function onTimer(event:TimerEvent):void </li>
<li>{ </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; n++; </li>
<li>} </li>
</ol>
<p><em>复制代码</em></p>
<p>相应的，我们可以借助于Math.random做一个可怜的人造作曲家：    <br />Actionscript: </p>
<ol>
<li>function onTimer(event:TimerEvent):void </li>
<li>{ </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; n = Math.floor(Math.random() * 20 &#8211; 5); </li>
<li>&#160;&#160;&#160;&#160;&#160;&#160;&#160; timer.delay = 125 * (1 + Math.floor(Math.random() * 8)); </li>
<li>} </li>
</ol>
<p><em>复制代码</em></p>
<p>这就产生了不同音阶的音，还有每个音的不同的时长(从八分之一秒到一秒)。    <br />仅仅凭此，你就可以开始着手自己的音序器或者小型钢琴或者其他类型的乐器。稍后，我将尝试贴出关于其他波形的东东，集合波，封套，和其他话题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1228</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)AS3里的声音合成（1）&#8212;&#8212;基础，噪音</title>
		<link>http://www.hcxmflash.cn/blog/?p=1227</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1227#comments</comments>
		<pubDate>Sat, 07 Aug 2010 03:34:07 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[Flash Platform]]></category>
		<category><![CDATA[sound]]></category>
		<category><![CDATA[声音]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1227</guid>
		<description><![CDATA[我早就想就此话题写些东西了。最近我对于该领域仍然没有一整套的好资料而烦恼。我想要给点成套的东西出来。    我们将从了解声音对象的基本机制入手，如何写代码，制造些随机噪音。然后，我们开始生成实时的波形，并把他们混合在一起，等等。     开门见山     Flash 10 有合成声音的能力。Flash 9实际上也可以hack来用，不过10里面标准化了。     说说工作原理。创建一个新的Sound对象并增加一个针对SAMPLE_DATA事件的侦听器（SampleDataEvent.SAMPLE_DATA）事件发生的前提是没有更多声音数据传入。然后你可以开始播放了。     Actionscript: 


1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); 
2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); 
3.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); 

复制代码
此时此刻，你实际上并没有声音文件供装载播放——比如MP3，WAV等等，也没有附着任何声音流数据，所以没有任何东西可以放，而SAMPLE_DATA事件因此马上触发。所以我们需要个相关的掌控函数。    Actionscript: 

1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void 
2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 
3.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } 

复制代码
我们此时的目标是给这个Sound对象一些声音数据用来播放。该怎么做呢？首先，传递给函数的 SampleDataEvent是字节数组型的参数。我们要用一些代表声音的字节数组去填充它。写入数据用的是ByteArray.writeFloat 方法。一般值为-1到1  [...]]]></description>
			<content:encoded><![CDATA[<p>我早就想就此话题写些东西了。最近我对于该领域仍然没有一整套的好资料而烦恼。我想要给点成套的东西出来。    <br />我们将从了解声音对象的基本机制入手，如何写代码，制造些随机噪音。然后，我们开始生成实时的波形，并把他们混合在一起，等等。     <br />开门见山     <br />Flash 10 有合成声音的能力。Flash 9实际上也可以hack来用，不过10里面标准化了。     <br />说说工作原理。创建一个新的Sound对象并增加一个针对SAMPLE_DATA事件的侦听器（SampleDataEvent.SAMPLE_DATA）事件发生的前提是没有更多声音数据传入。然后你可以开始播放了。     <br />Actionscript: </p>
<ol>
<li></li>
<li>1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); </li>
<li>2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>3.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); </li>
</ol>
<p><em>复制代码</em></p>
<p>此时此刻，你实际上并没有声音文件供装载播放——比如MP3，WAV等等，也没有附着任何声音流数据，所以没有任何东西可以放，而SAMPLE_DATA事件因此马上触发。所以我们需要个相关的掌控函数。    <br />Actionscript: </p>
<ol>
<li>1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void </li>
<li>2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>3.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
</ol>
<p><em>复制代码</em></p>
<p>我们此时的目标是给这个Sound对象一些声音数据用来播放。该怎么做呢？首先，传递给函数的 SampleDataEvent是字节数组型的参数。我们要用一些代表声音的字节数组去填充它。写入数据用的是ByteArray.writeFloat 方法。一般值为-1到1    <br />每一个你写的浮点值都会成为一个众所周知的采样点。因此形成“SampleDataEvent”。你需要写多少个采样点呢？一般在2048到8192个之间。     <br />好了，那是一个大数目。怎么办好呢？如果你一直用低的数字如2048,声音就会在采样值之间快速的跳跃，另一方面，SAMPLE_DATA事件也会频繁触发，需要再次响应。而如果你用大的数字如8192，Sound将会用四倍于之前的时间间隔来采集那些值，因此你能执行的掌控函数的次数仅为之前的四分之一。     <br />所以更多采样点意味着更好的性能。不过，如果你的是动态产生的声音，多采样点就意味着更长的时延。所谓的时延就是指UI或者程序发生某些变化时相配合的实际音效和视觉变化之间的时间误差。比如，你想把一个400Hz的音频在用户点击按钮的时候改成800Hz。用户点击了按钮，但是 Sound在缓冲里还有属于400Hz的8000个采样点必须先播完。之后它才会调用SAMPLE_DATA事件掌控器来要求更多数据。这时你才能转变成 800Hz的音频。因此，用户会注意到轻微的延迟出现在按钮按下和音频改变之间。如果你使用低采样的2048，延迟将会变短而不易察觉。     <br />现在，我们只是生成一些噪音。我们将写2048个随机样本，值在－1.0到1.0之间。你需要知道的东西首先是你实际上将要写两次浮点数——一个左声道一个右声道。下面是全部程序：     <br />Actionscript: </p>
<ol>
<li>1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; </li>
<li>2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; </li>
<li>3.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>4.&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); </li>
<li>5.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>6.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); </li>
<li>7.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>8.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void </li>
<li>9.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>10.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; i &lt;2048; i++) </li>
<li>11.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>12.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sample:Number = Math.random() * 2.0 &#8211; 1.0; // -1 to 1 </li>
<li>13.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // left </li>
<li>14.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sample); // right </li>
<li>15.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>16.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
</ol>
<p><em>复制代码</em></p>
<p>运行之后，你应该可以听到一些类似电台频率之间的那种噪音。注意我们做出来的是左右声道同值的单独样本。因为两个声道都有精确相同的样本值，我们获得了单声部的声音。如果我们要立体声，我们可以做类似下面的东西：    <br />Actionscript: </p>
<ol>
<li>1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void </li>
<li>2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>3.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; i &lt;2048; i++) </li>
<li>4.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>5.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sampleA:Number = Math.random() * 2.0 &#8211; 1.0; // -1 to 1 </li>
<li>6.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sampleB:Number = Math.random() * 2.0 &#8211; 1.0; // -1 to 1 </li>
<li>7.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sampleA); // left </li>
<li>8.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sampleB); // right </li>
<li>9.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>10.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
</ol>
<p><em>复制代码</em></p>
<p>这里我们为每个声道的每一个采样点写上不同的随机值。带上headphones听这个，你应该注意到噪音里多了些“空间”。很微妙以至于在运行时很难分辨，我们更改以便可以进行快速调节。    <br />Actionscript: </p>
<ol>
<li>1.&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.media.Sound; </li>
<li>2.&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.SampleDataEvent; </li>
<li>3.&#160;&#160;&#160;&#160;&#160;&#160;&#160; import flash.events.MouseEvent; </li>
<li>4.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>5.&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sound:Sound = new Sound(); </li>
<li>6.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData); </li>
<li>7.&#160;&#160;&#160;&#160;&#160;&#160;&#160; sound.play(); </li>
<li>8.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>9.&#160;&#160;&#160;&#160;&#160;&#160;&#160; var mono:Boolean = true; </li>
<li>10.&#160;&#160;&#160;&#160;&#160;&#160;&#160; stage.addEventListener(MouseEvent.CLICK, onClick); </li>
<li>11.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onClick(event:MouseEvent):void </li>
<li>12.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>13.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mono = !mono; </li>
<li>14.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>15.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </li>
<li>16.&#160;&#160;&#160;&#160;&#160;&#160;&#160; function onSampleData(event:SampleDataEvent):void </li>
<li>17.&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>18.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i:int = 0; i &lt;2048; i++) </li>
<li>19.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>20.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sampleA:Number = Math.random() * 2.0 &#8211; 1.0; // -1 to 1 </li>
<li>21.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sampleB:Number = Math.random() * 2.0 &#8211; 1.0; // -1 to 1 </li>
<li>22.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sampleA); // left </li>
<li>23.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(mono) </li>
<li>24.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>25.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sampleA); // left again </li>
<li>26.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>27.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else </li>
<li>28.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { </li>
<li>29.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; event.data.writeFloat(sampleB); // right </li>
<li>30.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>31.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
<li>32.&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </li>
</ol>
<p><em>复制代码</em></p>
<p>我们有一个布尔值，mono，让 true/false 值紧连着一次鼠标点击。true的时候，sampleA写在左右声道。如果mono不是true，我们就把sampleA写在左声道，而sampleB写在右声道。运行并点击鼠标。改变依然细微，不过你应该可以分辨出来了。    <br />听听看，延迟的结果，改变2048到8192。点击的时候，你就可以注意到点击和单声道立体声转换之间的明显延后，反之亦然。     <br />关于这些样本的另一个注意事项。我说过，“一般”用2048到8192之间的值。事实上你想使用大过8192的值的话，就会得到一个实时错误说一个参数不可用。所以8192是个硬限制。你可以使用低于2048的值，不过这样的话Sound对象在经过这些样本之后就会认为声音已经结束。完成的时候不会再产生另一个SAMPLE_DATA事件。取而代之的是会产生一个COMPLETE时间。所以想让声音不停播放，需要不断提供至少2048的样本。     <br />下一部分，我们开始创作一些简单的波形</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1227</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>重新发布Bubble</title>
		<link>http://www.hcxmflash.cn/blog/?p=1226</link>
		<comments>http://www.hcxmflash.cn/blog/?p=1226#comments</comments>
		<pubDate>Thu, 05 Aug 2010 09:10:03 +0000</pubDate>
		<dc:creator>小火柴</dc:creator>
				<category><![CDATA[生活杂谈]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.hcxmflash.cn/blog/?p=1226</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><embed src="http://games.mochiads.com/c/g/bubble_v8/Bubble.swf" width="300" height="400"><P></P></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hcxmflash.cn/blog/?feed=rss2&amp;p=1226</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
