2010/09/26(日) [n年前の日記]
#1 [sound] SSRCでリサンプリングできないときがあるような
どうも特定のwavがリサンプリング(今回はダウンサンプリング)できない時がある。モノラルだからなのか、時間がやたらと短いからなのか、原因が分からんけど。
foobar2000 + SoX でリサンプリングした場合は、それっぽく変換できているように見える。これで変換するか…。
foobar2000 + SoX でリサンプリングした場合は、それっぽく変換できているように見える。これで変換するか…。
[ ツッコむ ]
#2 [flash] Flashでサウンドデータを鳴らすべく実験中
- Flash CS* で wav をライブラリに登録。ActionScript用に書き出す設定にしておく。
- Flash CS* でパブリッシュ。wav は Flash CS* 上でmp3変換される。本来鳴らすべき範囲も情報として保存されているのであろう、サウンドデータを含んだだけのswfができる。
- swfmill で、Flash CS*が吐き出した swf を内部リンケージ。
- FlashDevelop上で記述したスクリプトの中で、内部リンケージした外部swfの中にあるサウンドデータを呼び出す。
swfmill.xml は以下のような感じになった。
<?xml version="1.0" encoding="UTF-8" ?>
<movie width="800" height="600" framerate="30" version="7">
<background color="#ffffff"/>
<frame name="first">
<library>
<clip id="SNDRES" import="sndres.swf" />
<clip id="IMG_BG" import="img/bg.jpg" />
</library>
</frame>
</movie>
ID名=SNDRES、sndres.swf というのが、Flash CS* で吐き出した、サウンドデータを内部リンケージしている swf。ActionScript側は、以下のような感じ。
class Main
{
public static function main(swfRoot:MovieClip):Void
{
// ----------------------------------------
// サウンド関係初期化
var sn:Number = 0; // サウンド番号管理用
var svol:Number = 80; // サウンド音量記録用 (0-100)
// サウンドデータのリンケージID名一覧
var sndid:Array = [
"bell_kan.wav", // 0
"bell_kin.wav", // 1
"bell_kon.wav", // 2
"bgm02.wav", // 3
"bgm03.wav", // 4
"bgm05.wav" // 5
];
// サウンドデータを内部リンケージしたswfを呼び出す
var sndres:MovieClip = _root.attachMovie("SNDRES", "sound_res", _root.getNextHighestDepth());
sndres._visible = false; // 念のために非表示にしておく
// Soundオブジェクト生成
var sd:Array = new Array();
for (var i:Number = 0; i < sndid.length; i++) {
sd[i] = new Sound(sndres);
sd[i].attachSound(sndid[i]);
}
// ※ 各サウンドに対して、個別に Volume や Pan 等を設定したい場合は、
// それぞれを MovieClip として生成(?)しなければならないらしいが、
// 今回そこまではやっていない。
// サウンド関係初期化はここまで
// ----------------------------------------
// 表示関係の初期化
// (省略)
// ----------------------------------------
// 各ボタンの処理
// サウンドを鳴らすボタンの処理
playbtn.onPress = function () {
if ( (sn >= 3) && ( sn <= 5) ) {
// BGM
sd[sn].setVolume(svol); // (これから鳴らすサウンドの)音量を指定
// ループ回数として指定できる最大数が不明なので、ひとまず大きめの値を仮で指定。
sd[sn].start(0, 9999999);
} else {
// SE
sd[sn].setVolume(svol);
// SEはワンショットだけ鳴らせばいいはずなので、ループ回数には1を指定。
sd[sn].start(0, 1);
}
}
// サウンドを停止するボタンの処理
stopbtn.onPress = function () {
if ( (sn >= 3) && ( sn <= 5) ) {
// BGM
// stop(リンケージID名) として呼ばないと、他の音も停止してしまう。
sd[sn].stop(sndid[sn]);
} else {
// SE (SEは勝手に停止するはずなので何もしない)
}
}
// サウンドを全停止するボタンの処理
stopallbtn.onPress = function () {
// MTASC利用時は、stopAllSounds() を記述できない模様。未実装、もしくはバグかもしれず。
// stopAllSounds();
// stop() にID名を渡さずにを呼ぶことで、
// 動的に鳴らした全てのサウンドが停止するらしいので、これで代用する。
sd[sn].stop();
}
// サウンド番号を増減するボタンの処理
// (省略)
// 音量を設定するボタンの処理
// (省略)
// 毎フレームの処理
_root.onEnterFrame = function () {
// (省略)
}
}
}
[ ツッコむ ]
以上、1 日分です。