ActionScript 3.0 , AIR , FLEXからCocoa, OpenGL
29 Nov
本当にものすごく久々の投稿になってしまいました。
先日、11/26に行われた、Spark勉強会で、Dynamic Sound Generationの発表をしてきたので、その資料をアップします。
(※再生には音楽ファイルを必要なので、各自用意して下さい。)
「フーリエ変換を使わない、エフェクトのかけかた」というタイトル通り、信号処理には本来フーリエ変換は欠かせないものですが、フーリエ変換の話しになると一気に敷居が高くなる(というか自分が今勉強している状態なので、この様な発表になりました。
ただ、やはりフーリエ変換を使えていない&勉強途中での発表になってしまったので、波形が途切れてしまっているところがあるようで、ぷつぷつと途切れる音が結構聴こえてしまいます。。。
あくまでご参考程度にしていただければと思います。
[ファイル構成について]
SoundGeneration.mxml:ラジオボタンやスライダーがついているView + 実際に音を鳴らすファイル
model/SoundObj.as:Dynamic Sound Generationを使って音楽を再生したり、エフェクトをかけたりするスクリプトを記述しているファイル。
SoundObj.asに関しては、mxmlでも使いやすいように、IMXMLObjectインターフェイスを実装しています。
[SoundObj.asの仕組み]
_currentEffectというプロパティを切り替えて、どのエフェクトをかけるのかを選択します。
extractメソッドを呼び出すたびに、bufferプロパティにデータを蓄えています。
これを使って、ディレイや逆再生を実現しています。
なお、逆再生に関しては、こちらが大変参考になります。
26 Jun
いやーすごいですね!astro!
ローカルへのファイル保存が可能だなんて!
実際は、FileReferenceはローカルファイルを読み込んで直接操作できるみたいですが、ひとまず今回は保存です。
サンプルはこちら。
(Flashサンプル。赤丸をクリックすると、保存ダイアログが現れて、適当な名前を入力してボタンを押すと、保存。)
注意点としては、同じファイル名で上書き保存しようとすると例外をはくらしいです。
(これはもしかすると僕のサンプルが悪いだけかもです。。)
corelibのJPGEncoderを使って、stageを画像として保存しています。
ようは、FileReferenceにsaveというメソッドができて、それを使うと保存できるよ、ということです。
ちなみに、保存できる形式は、
String, XML, ByteArrayらしいです。
今回のサンプルは、ByteArrayを使って保存しています。
ちなみにソースはこんなのです。
25 Jun
またまたDynamic Sound Generationです。
これは、mouseXの値をもとに、音程を変えるというサンプルです。
ちなみに、音のもとになるのはぜんかいのと同じ矩形波を使っています。
ソースは後ほど。
23 Jun
今回は色々とサンプルをつくってみながら書いてみます。
波形には色々とあるようですが、今回は、矩形波をいじってみました。
基本的なのは、これ。
ちなみに、512ってのはおまじないと思って下さい。
※サンプルFlash(音がなります。しかも制御できません。)

で、矩形の周期を半分にすると、こうなります。
※サンプルFlash(こちらも音がなります。もちろん制御はできないです。)

二つを聴き比べると、二つ目(周期が短い方)が音が高いですよね。
どうやら、周期が短いほど音が高くなる、という仕組みらしいです。
と、いうことは、この周期を徐々に短くしていくと、どうなるんでしょう?
※サンプルFlash(音がなり、制御不能。今までと同様ですね。)
うんうん。
ということは、これらをうにょうにょすると、宇宙っぽくできるかな?Perfumeっぽい音が出せるかな?○タヤスタカ的な音をasだけで出す事ができるのかな?
次は他のタイプの波形をいじってみようと思います。
あ、それぞれのサンプルASも.txtとしてリンク貼っておくのでよかったらいじって下さいね。(ごめんなさい。コメントつけれてないです)
13 Jun
またまたですが、Flash Player10 astroのDynamic Sound Generationです。
ボタンを押すと、音が流れます。
パルス波の長さを時間で変えています。
注意:音を止める方法がないので、音を消したい場合はリロードして下さい。
これがasだけでできるってのが素晴らしい!!
今、個人的にはこの辺の機能が楽しいなあ。
コードはこんなです。
main.as
<code>
</code>
10 Jun
えっと、ほんとは今日はパラグライダーで空を飛ぶ予定でしたが、天候により中止。
で、代わりにastroのdynamic sound generationやってました。
参考サイトはこちら:
http://www.kaourantin.net/2008/05/adobe-is-making-some-noise-part-3.html
http://memo.kappa-lab.com/2008/06/astroflash10_singing_do-re-mi–.html
取りあえずソースは後ほどということで、サンプルだけ。
http://www.hi-farm.net/astro/dynamicsound1.swf
つまらないやつですが、マウスを押している間、音が高くなっていきます。
マウスを放すと、音が低くなります。
これをasのみでできるのは楽しいですね。
デジタルシンセとか作れそう。
もうちょっとソース整理したら改めて書きます!
あー、デジタルシンセってか、サイン波の音とか、色々勉強したい事がふえるなあ。
2008年6月9日00:53
10 Jun
取りあえず、flash player10 astroの練習をしてみました。
標準で3Dの機能がついたので、ひとまずちょっとしたサンプルを作成しました.
http://www.hi-farm.net/astro/main.swf
処理がかるくなるのかな?と思ってたのですが、Macのアクティビティモニタで見てみると、
今までの様にPapervision3Dを作った時と、重さがあまりかわらない気がしたんですけど、どうなんでしょう?
ソースはこれ。
main.as—————————————-
package
{
import flash.events.*;
import flash.display.*;
import flash.ui.*;
[SWF(backgroundColor="0x000000", frameRate="50")]
public class main extends MovieClip
{
private var container:Sprite;
private var rect_vc:Vector.<Rect>;
private var len:uint = 6;
private var radius:Number = 100;
private var container_vc:Vector.<Sprite>;
private var innerLen:uint=15;
public function main ()
{
init();
}
private function init():void
{
container_vc = new Vector.<Sprite>();
container = new Sprite();
container.x = 150;
container.y = 10;
addChild(container);
rect_vc = new Vector.<Rect>();
for( var i:uint=0; i < innerLen; i++ )
{
container_vc[i] = genCircle(0, 30*i+10,15*i);
container_vc[i].rotationY = 30 * i;
}
addEventListener(Event.ENTER_FRAME, enterframeHandler);
}
private function genCircle(cX:Number, cY:Number, ra:Number):Sprite
{
var innerContainer:Sprite = new Sprite();
for( var i:uint=0; i < len; i++ )
{
var rect:Rect = new Rect(0xffffff, 10, 10);
innerContainer.addChild(rect);
var rad:Number = (Math.PI/180) * ( (360/len)*i);
rect.x = (Math.cos(rad) – Math.sin(rad)) * ra;
rect.y = 0;
rect.z = (Math.sin(rad) + Math.cos(rad)) * ra;
rect_vc[i] = rect;
}
innerContainer.x = 0;
innerContainer.y = 0;
innerContainer.x = cX;
innerContainer.y = cY;
container.addChild(innerContainer);
return innerContainer;
}
private function enterframeHandler(e:Event):void
{
for( var i:uint=0; i < innerLen; i++ )
{
container_vc[i].rotationY++;
}
}
}
}
Rect.as—————————————-
package
{
import flash.display.*;
import flash.events.*;
public class Rect extends Sprite
{
function Rect(col:uint, w:Number, h:Number)
{
this.graphics.beginFill( 0xffffff, 1);
this.graphics.drawRect( 0, 0, w, h);
this.graphics.endFill();
}
}
}
2008年6月1日02:36