トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     [FP10]音の周波数を変化させた際にブツブツ鳴らないようにしたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
daniwell
Åê¹ÆNo.40810
投稿日時: 2008-11-20 20:24
新米
居住地: 東京
投稿: 6
使用環境:
WinXP
Flash8 Pro
FlashDevelop Bete9

InternetExplorer7
FireFox1.5
FlashPlayer10
[FP10]音の周波数を変化させた際にブツブツ鳴らないようにしたい
FlashPlayer10における音の生成に関してです。

マウスで描いた波形を再生し、マウスのy座標に応じて音の周波数が変わる、といったものなんですが、
うまく波形が繋げられていないため(だと思うんですが)、ブツブツ鳴ってしまいます。

以下、実際に音を生成してるSampleDataEventの部分になります。


private var n :int = 0;

private function sampleData ( evt :SampleDataEvent ) :void {
		
	var i:int;
	var c:int;
	var amp :Number;
	
	sff = mouseY + 50;
	
	for (i = 0; i < BUFFER_LENGTH; i++) {
		
		c = 800 / sff * (n % sff);
		amp = (ar[c] - 300) / 300;	// -1.0 ? 1.0
		
		evt.data.writeFloat(amp);
		evt.data.writeFloat(amp);
		
		n ++;
	}
}


配列arにはマウスで書いた波形の高さが入っています。
具体的には、ar[ x座標 ] = y座標 という感じで入ってます。
(スクリプト中の800はstageWidthであり配列の要素数になります)

周波数が高いほど波形を縮めてバッファに書き込むといった感じです。
(現在は平均とか採ってなくて単に飛び飛びで配列の値を取得しているというだけですが)

sound_butsubutsu.swf (要:FlashPlayer10)



あと、うまくいく方法として、
以下のように、バッファ長を割り切れる値に逐次調整することで、
うまく繋がることは繋がるのですが、できれば一回に書き出される音の長さを変えたくないので
これとは違う方法でおねがいします。


private function sampleData ( evt :SampleDataEvent ) :void {
			
	var i :int;
	var c :int;
	var amp :Number;
	
	sff = mouseY + 50;
	var len :int = sff - BUFFER_LENGTH % sff;
	
	for (i = 0; i < BUFFER_LENGTH+len; i++) {
		
		c = 800 / sff * (i % sff);
		amp = (ar[c] - 300) / 300;
		
		evt.data.writeFloat(amp);
		evt.data.writeFloat(amp);
	}
}


sound.swf (要:FlashPlayer10)


よろしくお願いします。
daniwell
Åê¹ÆNo.40812
投稿日時: 2008-11-20 21:40
新米
居住地: 東京
投稿: 6
使用環境:
WinXP
Flash8 Pro
FlashDevelop Bete9

InternetExplorer7
FireFox1.5
FlashPlayer10
Re: [FP10]音の周波数を変化させた際にブツブツ鳴らないようにしたい
自己レスです。解決しました。

周波数変えたときに、
n の値を変える前の位置に補正してやれば上手くいきました。

普通に考えればこれが必要でした^^


private var n :int;

private function sampleData ( evt :SampleDataEvent ) :void {
		
	var i:int;
	var c:int;
	var amp :Number;
	
	sff2 = sff;
	sff = mouseY + 50;

	if ( sff != sff2 )
		n = n % sff2 * sff / sff2;
	
	for (i = 0; i < BUFFER_LENGTH; i++) {
		
		c = 800 / sff * (n % sff);
		amp = (ar[c] - 300) / 300;
		
		evt.data.writeFloat(amp);
		evt.data.writeFloat(amp);

		n ++;
	}
}


お騒がせしました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops