Flash(); - [AS3]SoundSpectrum


(内容)
「play」で音再生。
マウスを左右に持っていくとパンできる。
RCAのオーディオケーブルと一緒でRed(右)、White(左)となってます。
ステージの真ん中にマウス持ってくると音が小さくなる。
ステージクリックすると丸と線の切り替えができる。

(メモ)
試してる人はちょこちょこ見るけど覚えたかったのでやってみました。
Last.fmのサンプルにも絡めたかったし。
参考にしたのはActionScript3 Cookbookのチャプター15のサンプル
ここのExampleを触ってみる。ただこれこのままだと動かない。
import忘れとかいきなりエラーでる。
いきなり出だし不調で初心者に厳しい本だ。
他のサンプルもしかり、この本なんなんだろ。

SoundMixerクラスのcomputeSpectrum()メソッド、
ヘルプ見つつ勉強。

■第一引数_outputArray:ByteArray
ByteArray オブジェクト。
ByteArray オブジェクトのサイズは 512 に固定され (値は浮動小数値)、
最初の 256 個は左チャンネル、次の 256 個は右チャンネル。

■第二引数_FFTMode:Boolean
デフォルトはfalseでtrueにするとフーリエ変換をする。
サンプルはフーリエ変換はしてません。
正直これ見てもよくわからない。
この変換の中身は複雑過ぎる、
ブラックボックス的なところとスルーして実装。

フーリエ変換すると、
周波数スペクトルを返す。低周波数は左、高周波数は右。
ByteArrayのreadFloatをtraceすると 0.0〜1.0の値が返ってくる。
※追記
0 〜 およそ1.414 (2 の平方根) までみたいです。
http://faces.jp/2008/08/soundmixercomputespectrum10.html


フーリエ変換しないと、
未処理のサウンド波形。周波数は謎(?)。
ByteArrayのreadFloatをtraceすると -1.0〜1.0の値が返ってくる。

■第三引数_stretchFactor:int
サンプリング解像度。
値が0の場合 、サンプリングレートは44.1 KHz
1の場合は22.05KHz
2の場合は11.025KHz
3の場合は5.5125KHz...

44.1KHzは、1秒間を44100個に区切り振幅の値を取得する
(この中では一番正確に表示)。
値を大きくしていくとサンプリングレートが下がるみたいで
結果どうなるのかよくわからないので試してみた。
フーリエ変換して値を大きくしたら波形の振幅が大きくなる。
フーリエ変換しないで値を大きくしたら波形の振幅が小さくなる。
値を大きくすると振幅が大雑把になってくる。
でもなんでフーリエ変換で振幅が変わるんだ。。なんだかいまいち腑に落ちない。
これASの知識とか別の知識になってきてる。


(音系参考)
■「AS3で扱うサウンド」
FlashOOPのサイト、バスキュールの方の解説。すごい丁寧にまとまっています。
留意点のところかなり致命的だなぁ。試したけど音は鳴ったままで描画が止まった。
※下記の音鳴らすとswfの音は再生されたままで動きが止まる。
Go to Beatport.comGet These TracksAdd This Player


■trick7さんのブログもとても参考になります。
http://www.trick7.com/blog/2007/12/12-093919.php
http://www.trick7.com/blog/2006/06/30-101506.php

こちらのブログに「音程 と ビート しか (多分) とってない」と書かれている。
音ファイルは解析できないっぽい。Flight404はXMLに最初吐き出してたのを知りました。
てことはダイナミックレンジがでかい方が単純におもしろい絵になる。
それとブレイクビーツみたいのとかビートが複雑なもの。
と考えたけどサンプル音源は適当な4つ打ちを作ってテスト。

■ドイツ人Andre MichelleさんのLab。
この人TB303、TR909、TR808とかFlashで作ってる。すごすぎる。


こちらのブログの方がPlayer10で音生成をやっていました。
そのうちカオスパッドとかFlashで出てきそう。。
それと
AS3のSoundMixer.computeSpectrumの問題点と対処法
という記事も書かれていました。try/catchで回避。

■音のループに関してはこちらのブログに書かれてました。


(Processing版)

ProcessingSample

ついでにプロセッシングも超軽く触る。
プロセッシングの基本的な事も知らないので
かなり手探り状態でサンプルみながら動かしてみた。

ESSというサウンドライブラリを使用して、
Flashと同じような音に反応する簡単な波形を生成するサンプル。

読み込むファイルは[data]フォルダ作ってそこに入れる。
mp3ファイルも読めるみたい。
FlashとProcessingの音を一緒に鳴らしたら止まらなかった。
プレイヤー自体が違うからかな。

参考
http://hysysk.blogspot.com/2007/08/ess-vs-minim_09.html
http://d.hatena.ne.jp/tokobayashi/20080506

(ソース)
package {
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.display.StageScaleMode;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.media.SoundTransform;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class Spectrum extends Sprite {
private var channel:SoundChannel;
private var sndTransform:SoundTransform;
private var bmd:BitmapData;
private var moveMode:int = -1;
private var vol:Number;
private var kBtn:MovieClip;
private var sBtn:MovieClip;
private var showVol:MovieClip;
private var snd = new Sound(new URLRequest("http://www.spiraldelight.com/blog_file/flash/as3/mp3/soundTest2.mp3"));
private var SW:int = stage.stageWidth;
private var SH:int = stage.stageHeight;
public function Spectrum() {
stage.scaleMode = StageScaleMode.NO_SCALE;
kBtn = new killBtn();
sBtn = new startBtn();
showVol = new vols();
addChild(kBtn);
addChild(sBtn);
addChild(showVol);
setProp();
sBtn.addEventListener(MouseEvent.CLICK,sndStart);
kBtn.addEventListener(MouseEvent.CLICK,sndKill);
stage.addEventListener(MouseEvent.CLICK,modeChangeHandler);
sndTransform = new SoundTransform();
bmd = new BitmapData(SW, SH,true,0x00FFFFFF);
var bitmap:Bitmap = new Bitmap(bmd);
addChild(bitmap);
}
private function setProp():void {
sBtn.x = kBtn.x = SW/2-kBtn.width/2;
sBtn.y = kBtn.y = SH-kBtn.height;
kBtn.buttonMode = sBtn.buttonMode = true;
showVol.x = SW-showVol.width;
kBtn.visible = false;
}
private function sndStart(e:MouseEvent):void {
kBtn.visible = true;
sBtn.visible = false;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, loop);
channel.addEventListener( Event.SOUND_COMPLETE, soundComplete);
}
private function sndKill(e:MouseEvent=null):void {
sBtn.visible = true;
kBtn.visible = false;
removeEventListener(Event.ENTER_FRAME, loop);
channel.stop();
}
private function modeChangeHandler(e:MouseEvent):void {
moveMode*=-1;
}
private function loop(e:Event):void {
var spectrum:ByteArray = new ByteArray();
SoundMixer.computeSpectrum(spectrum);
bmd.fillRect(bmd.rect,0x00000000);
if (sndTransform.volume >1 || mouseY >SH || mouseY <0) {
sndTransform.volume = 1;
} else {
sndTransform.volume = Math.abs((SH/2-mouseY)/SH*2);
}
if (mouseX>SW) {
sndTransform.pan = 1;
} else if (mouseX<0) {
sndTransform.pan = -1;
} else {
sndTransform.pan = ((SW/2-mouseX)/SW*2)*-1;
}
channel.soundTransform = sndTransform;
SoundMixer.soundTransform = sndTransform;
//
if (moveMode==1) {
for (var i:int=0; i<256; i++) {
bmd.setPixel32(i/0.5, SH/2-60 + spectrum.readFloat() * 150,0xffffffff);
}
for (i=0; i<256; i++) {
bmd.setPixel32(i/0.5,SH/2+60 + spectrum.readFloat() * 150,0xffff0033);
}
} else {
for (i=0; i<256; i++) {
bmd.setPixel32(60*Math.cos(i*5)+SW/2-100,60*Math.sin(i*5) +SH/2+ spectrum.readFloat() * 150,0xffffffff);
}


for (i=0; i<256; i++) {
bmd.setPixel32(60*Math.cos(i*5)+SW/2+100,60*Math.sin(i*5) +SH/2+ spectrum.readFloat() * 150,0xffff0033);
}
}
}

private function soundComplete( eventObject:Event = null ):void {
channel= snd.play();
channel.addEventListener( Event.SOUND_COMPLETE, soundComplete );
}
}
}

コメント
管理者の承認待ちコメントです。
  • -
  • 2018/06/09 10:48 AM
管理者の承認待ちコメントです。
  • -
  • 2019/03/08 4:39 AM
管理者の承認待ちコメントです。
  • -
  • 2019/03/22 8:44 PM
コメントする








   
この記事のトラックバックURL
トラックバック
About
spiraldelight

Category
Flash(12);
Movie(14);
Sound(17);
Event(22);
Life(8);



RSS





ナウでヤングなレンタルサーバー!ロリポップ!
ソフトバンクBB my BBコミュニケーター // チカッパ! // ファーストサーバ // Speever