Spark 勉強会 #5で話して来ました。

LINEで送る
Pocket

本当にものすごく久々の投稿になってしまいました。

先日、11/26に行われた、Spark勉強会で、Dynamic Sound Generationの発表をしてきたので、その資料をアップします。

(※再生には音楽ファイルを必要なので、各自用意して下さい。)

ソース一式

PDF

「フーリエ変換を使わない、エフェクトのかけかた」というタイトル通り、信号処理には本来フーリエ変換は欠かせないものですが、フーリエ変換の話しになると一気に敷居が高くなる(というか自分が今勉強している状態なので、この様な発表になりました。

 

ただ、やはりフーリエ変換を使えていない&勉強途中での発表になってしまったので、波形が途切れてしまっているところがあるようで、ぷつぷつと途切れる音が結構聴こえてしまいます。。。

あくまでご参考程度にしていただければと思います。

 

 

[ファイル構成について]

 

SoundGeneration.mxml:ラジオボタンやスライダーがついているView + 実際に音を鳴らすファイル

model/SoundObj.as:Dynamic Sound Generationを使って音楽を再生したり、エフェクトをかけたりするスクリプトを記述しているファイル。

 

SoundObj.asに関しては、mxmlでも使いやすいように、IMXMLObjectインターフェイスを実装しています。

 

[SoundObj.asの仕組み]

_currentEffectというプロパティを切り替えて、どのエフェクトをかけるのかを選択します。

 

extractメソッドを呼び出すたびに、bufferプロパティにデータを蓄えています。

これを使って、ディレイや逆再生を実現しています。

 

なお、逆再生に関しては、こちらが大変参考になります。

次は、フーリエ変換からめてしっかりとエフェクトをかけられるようになりたいなあ。
フーリエ変換とエフェクトの掛け方を勉強できる機会があれば、是非参加したいです。

[astro Dynamic Sound Generation] マウスで音程を変えるサンプル

LINEで送る
Pocket

またまたDynamic Sound Generationです。

これは、mouseXの値をもとに、音程を変えるというサンプルです。

ちなみに、音のもとになるのはぜんかいのと同じ矩形波を使っています。

ソースは後ほど。

サンプル(音が鳴り、そしてボリューム等の調整はできないです)。

[astro Dynamic Sound Genration] 矩形波で遊んでみた。

LINEで送る
Pocket

今回は色々とサンプルをつくってみながら書いてみます。

波形には色々とあるようですが、今回は、矩形波をいじってみました。

基本的なのは、これ。

ちなみに、512ってのはおまじないと思って下さい。

※サンプルFlash(音がなります。しかも制御できません。)

基本的な矩形波

 

で、矩形の周期を半分にすると、こうなります。

※サンプルFlash(こちらも音がなります。もちろん制御はできないです。)

半分周期の矩形波

 

二つを聴き比べると、二つ目(周期が短い方)が音が高いですよね。

どうやら、周期が短いほど音が高くなる、という仕組みらしいです。

 

と、いうことは、この周期を徐々に短くしていくと、どうなるんでしょう?

※サンプルFlash(音がなり、制御不能。今までと同様ですね。)

一応、「徐々に音が高く」なりましたよね?

 

うんうん。

ということは、これらをうにょうにょすると、宇宙っぽくできるかな?Perfumeっぽい音が出せるかな?○タヤスタカ的な音をasだけで出す事ができるのかな?

 

次は他のタイプの波形をいじってみようと思います。

 

あ、それぞれのサンプルASも.txtとしてリンク貼っておくのでよかったらいじって下さいね。(ごめんなさい。コメントつけれてないです)

  1. サンプル1(普通の矩形波)
  2. サンプル2(半分の矩形波)
  3. サンプル3(周期を動かしたやつ)

[flash astro]Dynamic Sound Generation 2.

LINEで送る
Pocket

またまたですが、Flash Player10 astroのDynamic Sound Generationです。

ボタンを押すと、音が流れます。

パルス波の長さを時間で変えています。

注意:音を止める方法がないので、音を消したい場合はリロードして下さい。

 

これがasだけでできるってのが素晴らしい!!

今、個人的にはこの辺の機能が楽しいなあ。

 

コードはこんなです。

main.as

<code>

package
{
import flash.net.*;
import flash.display.*;
import flash.media.*;
import flash.events.*;
[SWF(backgroundColor=”0xeeeeee”, frameRate=”50″, stageHeight=”200″)]
public class main extends Sprite
{
private var snd:Sound;
private var square:Sprite;
private var sh:Number = 200;
private var btn1:Sprite;
private var btn2:Sprite;
private var btn3:Sprite;
private var btn4:Sprite;
private var btn5:Sprite;
private var btn6:Sprite;
public function main()
{
initBtn();
}
private function initBtn():void
{
btn = new Sprite();
drawBtn(btn);
btn.buttonMode = true;
addChild(btn);
btn.width = btn.height = 20;
btn.x = 0;
btn.y = 0;
btn.addEventListener(MouseEvent.CLICK, click1);
}
private function drawBtn(sp:Sprite):void
{
sp.graphics.beginFill(0xff0000,1);
sp.graphics.drawRect(0, 0, 20, 20);
sp.graphics.endFill();
}
private function click1(e:MouseEvent):void
{
init();
doSamplesCallbackHandler(1);
}
private function init():void
{
snd = new Sound();
if( snd.hasEventListener(“samplesCallback”)) snd.removeEventListener(“samplesCallback”, samplesCallbackHandler);
snd.addEventListener(“samplesCallback”, samplesCallbackHandler);
snd.play();
}
private function samplesCallbackHandler(e:SamplesCallbackEvent):void
{
doSamplesCallbackHandler(1);
}
private var rate:Number = 44100;
private var freq:Number = 440;
private var phase:Number = 0;
private var count:Number = 1;
/**
* generate wave data.
*/
private function doSamplesCallbackHandler(type:int):void
{
//Voice.beep1();
var freq:Number = 220;
for( var i:uint=0; i < 512; i++ )
{
phase += freq/(rate);
var arrange:Number = 1;
var a:Number = 1;
if( i%2==0 ) a = 1;
arrange = a*count;
var phaseAngle:Number = phase * arrange;
var sample:Number = Math.sin(phaseAngle);
//ここで波形をつくってます。
sample = beep1(i);
//左右チャンネルともに同じ波形。
snd.samplesCallbackData.writeFloat(sample);
snd.samplesCallbackData.writeFloat(sample);
}
delim++;
if( delim > 256 ) delim = 0;
}
private var delim:Number = 0;
/**
* generate beep1
* @param i:uint wave counter.
* @return Number
*/
private function beep1(i:uint):Number
{
var res:Number =0;
//delim++;
//if( delim > 256 ) delim = 0;
//if( i < 256 ) res = 50;
//else res = 0;
if( i < delim ) res = 50;
else res = 0;
return res;
}
}
}

</code>