ViewSoundWaveLR
初wonderflです、普段はFlashを使って制作しています。
コードの書き方は我流なので見辛かったらすみません。
wonderflにはいつもお世話になっています。
動くサンプルのコードが見れるなんて素晴らしいの一言です。
最近仕事で音関係をFlashで弄る機会があり、皆さんのコードを参考に作ってみました。
本当はボタンとか置いて色々弄れるようにしたいけど、コードだけだど色々大変ですね(笑)
何か良いライブラリやswc等があれば教えて頂けると助かります。
追記:ちょっと修正して、コメント増し増しにしてみた。
追記:波形を描く所で間違っていた箇所を修正しました。
追記:WAVE_STEPを修正しました。
追記:バージョンUP版→http://wonderfl.net/c/uYmx
/**
* Copyright snowsunny ( http://wonderfl.net/user/snowsunny )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/l6gF
*/
package
{
import flash.media.Sound;
import flash.display.Sprite;
import flash.utils.ByteArray;
import flash.net.URLRequest;
import flash.events.Event;
public class SoundWave extends Sprite
{
public function SoundWave()
{
//必要データ作成&設定&イベント登録---------------------------------------------↓
//~.mp3へのパス
var SoundPass:String = "http://sunny-experience.com/wonderfl/BGM_House.mp3";
//mp3をロードするSound
var TargetSound:Sound = new Sound();
TargetSound.addEventListener(Event.COMPLETE, COMP_SoundLoad);
TargetSound.load(new URLRequest(SoundPass));
//左音源の波形生成用Sprite
var LineSpriteL:Sprite = new Sprite();
LineSpriteL.x = 0;
LineSpriteL.y = stage.stageHeight / 4;
LineSpriteL.graphics.lineStyle(1, 0x6666cc);
addChild(LineSpriteL);
//右音源の波形生成用Sprite
var LineSpriteR:Sprite = new Sprite();
LineSpriteR.x = 0;
LineSpriteR.y = stage.stageHeight - stage.stageHeight / 4;
LineSpriteR.graphics.lineStyle(1, 0xcc6666);
addChild(LineSpriteR);
//TargetSoundから抽出した生の音データを格納するByteArray
var SoundArray:ByteArray = new ByteArray();
//必要データ作成&設定&イベント登録---------------------------------------------↑
//Soundのロードが終わった後、データを抽出&ラインデータ作成&10回ループで再生する関数
function COMP_SoundLoad(e:Event):void
{
//TargetSoundから秒数*44100(Hz)の音データを抽出、SoundArrayに格納
TargetSound.extract(SoundArray, TargetSound.length/1000 * 44100);
CreateLineData();
TargetSound.play(0, 10);
}
//DrawLineに送るラインデータを作成する関数
function CreateLineData():void
{
//波形の高さ(最大値):x(px) / 2(±補正用計算)
var WAVE_HEIGHT:Number = 128 / 2;
//波形の刻み:x(sec) * 8(左右の音データ一つ分) * 44100(Hz)
var WAVE_STEP:int = Math.round(0.01 * 8 * 44100);
//左右の波形データを保存するArray
var LineData_L:Array = [], LineData_R:Array = [];
for(var i:Number = 0; i < SoundArray.length; i += WAVE_STEP)
{
SoundArray.position = i;
//SoundArrayから左右の音データをreadFloatを使って4Byteずつ取得
LineData_L.push(SoundArray.readFloat() * WAVE_HEIGHT);
LineData_R.push(SoundArray.readFloat() * WAVE_HEIGHT);
}
//最後の音データを挿入
SoundArray.position = SoundArray.length - 8;
LineData_L.push(SoundArray.readFloat() * WAVE_HEIGHT);
LineData_R.push(SoundArray.readFloat() * WAVE_HEIGHT);
//DrawLineに左右のLineDataと、ステージの横幅ぴったりになる様な値を渡す
DrawLine(LineData_L, LineData_R, stage.stageWidth / (SoundArray.length/WAVE_STEP));
}
//引数で受け取ったデータを使ってラインを描く関数
function DrawLine(LD:Array, RD:Array, X_STEP:Number):void
{
//ラインを描くX,Y用変数
var MoveX:Number = 0, MoveY:Number = 0;
//受け取ったデータの数だけラインを描く
for (var i:int = 0; i < LD.length; i++)
{
MoveY = LD[i];
LineSpriteL.graphics.lineTo(MoveX, MoveY);
MoveY = RD[i];
LineSpriteR.graphics.lineTo(MoveX, MoveY);
MoveX += X_STEP;
}
}
}
}
}