« AIRでシステムトレイにアイコン表示 | トップページ | FlashPlayer10 読み込んだ音にエフェクトをかける »

2008年10月10日 (金)

FlashPlayer10 音にエフェクトをかける

音でいろいろ遊びたい・・・と、いつも思ってるんだけど難しい。。
player10で波形をいじれるようになったということで時々試してるけどなかなか進まず。

動的な音の生成方法というのはなんとなく分かったけども、それをどうやったら音を変化させることができるのか、というのが全然分からん。

そんな時に↓こちらを見つけて、便利なライブラリもあったのでちょっと使ってみました。
http://www.adobe.com/jp/devnet/flash/articles/flp10_sound.html

とりあえずやってみたいのは音にエフェクトをかけること。delayとかreverbとか。

上記の中で見つけたライブラリ「sazameki」の中を見てみると「org.sazameki.audio.processor.effects」以下にそれっぽいクラスが!
このライブラリの基本的な使い方も分からんのだけど、エフェクトのクラスを使いたいがために逆にたどっていってなんとか使うことができました。できた気がするだけかもしれないけども。。

一応、下記のように書いたらDistortionをかけることができました。
画面には何も表示されません。音が鳴るはずです。マウスクリックでDistortionのgain値が変わります。

ちなみにDistortion.as内の「processAudio()」の関数にDistortionをかけるための計算が書いてあるので、そこだけ持ってきてもできそうな感じがしないでもないです。

同様にReverbもやってみましたが、処理がすごく重かったです。パラメータがおかしかったのかも!?
DelayもReverb、Distortionとは少しやり方違ってましたが同じ感じでできました。

まずは波形の意味をちゃんと理解したい。

※Flash Player10対応です。

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.media.Sound;
	import flash.utils.ByteArray;
	import flash.events.SampleDataEvent;
	import org.sazameki.audio.engine.ssGenerator.SsAudioSetting;
	import org.sazameki.audio.processor.effects.Distortion;
	import org.sazameki.audio.core.Sample;
	public class Main5 extends Sprite {
		private const BUFFER_LENGTH:Number = 8192;
		private var dynamicSound:Sound;
		private var dist:Distortion;
		private var distNo:int = 0;
		private var ssaSetting:SsAudioSetting;
		
		public function Main5():void {
			if (stage) {
				init();
			} else {
				addEventListener(Event.ADDED_TO_STAGE, init);
			}
		}
		
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);
			//チャンネル数やサンプルレートなどの設定。通常は引数無しでOK?
			ssaSetting = new SsAudioSetting();
			//Distortionインスタンスの作成
			dist = new Distortion();
			//Distortionの設定
			//第一引数はさっきの設定(SsAudioSetting)、第二引数にgain値を渡す(配列で)
			//(Distortionはパラメータ1つだけど、他のReverbとかでパラメータが複数ある関係で配列になってるかと)
			dist.initialize(ssaSetting, [0.0]);
			
			//Soundオブジェクトの作成
			dynamicSound = new Sound();
			//sampleDataイベントを設定
			dynamicSound.addEventListener("sampleData", sampleData);
			//再生
			dynamicSound.play();
			
			//Distortionのgain値の切り替え用マウスイベント
			stage.addEventListener(MouseEvent.MOUSE_DOWN, changeDist);
		}
		private function changeDist(e:MouseEvent):void {
			//マウスクリックの度にgain値が0.0→0.3→0.6→0.0・・・と変わっていきます
			distNo++;
			if (distNo > 2) {
				distNo = 0;
			}
			//gain値を変えるためにinitializeで再設定。こんなやり方でいいのかな??
			//Distortion.asにgainのsetterを入れてしまうという手も。。
			if (distNo == 1) {
				dist.initialize(ssaSetting, [0.3]);
			} else if (distNo == 2) {
				dist.initialize(ssaSetting, [0.6]);
			} else {
				dist.initialize(ssaSetting, [0.0]);
			}
		}
		private function sampleData(event:SampleDataEvent):void {
			var sss:Array = [];
			var c:int;
			for (c = 0; c < BUFFER_LENGTH; c++) {
				//ピーっていう音を生成
				//この代わりにMP3とかの音から波形を取得するのも可能
				var rad:Number = Number(c + event.position)/Math.PI/2;
				var amp:Number = Math.sin(rad) / 4;
				//Sampleインスタンスの作成
				var sam:Sample = new Sample();
				//左右のチャンネルに値を設定
				sam.left = amp;
				sam.right = amp;
				//配列にSampleを入れていく
				sss.push(sam);
			}
			
			//Sampleの入った配列を渡してDistortionをかける
			dist.processAudio(sss);
			
			//波形を書き込む
			for (c = 0; c < BUFFER_LENGTH; c++) {
				event.data.writeFloat(sss[c].left / 5);	//音がでかいので5で割って小さくしてます
				event.data.writeFloat(sss[c].right / 5);
			}
		}
	}
}


|

« AIRでシステムトレイにアイコン表示 | トップページ | FlashPlayer10 読み込んだ音にエフェクトをかける »

コメント

はじめまして~
sazameki作ってADC記事書かせていただきましたzkと申します。以前からBlog拝見させていただいてました。
取り上げていただいてありがとうございます~。

すみません、ReverbとかDistortionとかはまだまだ全然ちゃんと作ってない途中のもので、特にリバーブは半端なく処理が重い上にあまりいい音しないと思いますorz

ので、何かお間違いとかそういうことではないのでその点はご安心(?)を。中途半端なコード公開しちゃっててすみません。

投稿: zk | 2008年10月10日 (金) 14時01分

> zkさん

コメント&すばらしいライブラリをありがとうございます~!
zkさんのブログも見させてもらってます。

エフェクトのとこはまだ途中なんですね。完成が楽しみです。
僕もそのへん勉強して自分で実装してみたいんですけどねー、難しいです。。このライブラリ使った面白い表現を探りたいです。

投稿: primevision | 2008年10月10日 (金) 14時41分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: FlashPlayer10 音にエフェクトをかける:

« AIRでシステムトレイにアイコン表示 | トップページ | FlashPlayer10 読み込んだ音にエフェクトをかける »