popforge

2008/06/17

popforgeってご存知でしょうか?
この間買った本に紹介されていたライブラリです。
※脱線しますが、この本の後半のサンプルはすごかったです。
それで、このライブラリが何かというと、Flashで音楽をいじり倒せるものなんです。って、私はまだ何もできませんが。
popforgeのサイト
ASdocがついてなかったんで、慣れないながらもつくってみました。そんでアップしました。
あとダウンロードもできるようにしました。
見本で、とりあえず「チューリップ」を作ってみました。

※参考です。ありがとうございます。
POPFORGEでドレミをならすテスト
平均律、自然倍音、ピタゴラス音階の比較

以下ソースコードです。(要popforge)

package
{
  import de.popforge.audio.output.Audio;
  import de.popforge.audio.output.Sample;
  import de.popforge.audio.output.SoundFactory;
  import de.popforge.audio.processor.fl909.voices.Voice;

  import flash.display.Sprite;
  import flash.events.MouseEvent;
  import flash.events.TimerEvent;
  import flash.media.Sound;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;
  import flash.text.TextFormat;
  import flash.text.TextFormatAlign;
  import flash.utils.Timer;

  [SWF(width="200", height="50", frameRate="30", backgroundColor="#ffffff")]
  public class CreateASound extends Sprite
  {
    private var music:Array;
    private var tf:TextField;

    public function CreateASound()
    {
      setStartBtn();
    }

    private function init(): void
    {
      music = new Array();

      //set music
      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("N", .5);
      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("N", .5);

      setMusic("G", .5);
      setMusic("E", .5);
      setMusic("D", .5);
      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("D", .5);
      setMusic("N", .5);

      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("N", .5);
      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("N", .5);

      setMusic("G", .5);
      setMusic("E", .5);
      setMusic("D", .5);
      setMusic("C", .5);
      setMusic("D", .5);
      setMusic("E", .5);
      setMusic("C", .5);
      setMusic("N", .5);

      setMusic("G", .5);
      setMusic("G", .5);
      setMusic("E", .5);
      setMusic("G", .5);
      setMusic("A", .49);
      setMusic("N", .01);
      setMusic("A", .5);
      setMusic("G", .5);
      setMusic("N", .5);

      setMusic("E", .5);
      setMusic("E", .5);
      setMusic("D", .5);
      setMusic("D", .5);
      setMusic("C", 1);


      SoundFactory.fromArray( music, Audio.STEREO, Audio.BIT16, Audio.RATE44100, onSoundGenerated );
    }

    private function setStartBtn():void
    {
      var sp:Sprite = new Sprite();
      sp.graphics.beginFill(0x00ff00, 1);
      sp.graphics.drawRect(0,0,200,50);
      sp.graphics.endFill();

      var tff:TextFormat = new TextFormat();
      tff.align = TextFormatAlign.CENTER;
      tff.size = 14;
      tf = new TextField();
      tf.autoSize = TextFieldAutoSize.LEFT;
      tf.selectable = false;
      tf.text = "スタート";
      tf.setTextFormat(tff);
      sp.addChild(tf);
      tf.x = 20;
      tf.y = 15;
      addChild(sp);
      sp.x = 0;
      sp.y = 0;
      sp.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
    }

    private function onDown(e:MouseEvent):void
    {
      e.target.removeEventListener(e.type, arguments.callee);
      tf.text = "しばらくお待ちください";
      var tm:Timer = new Timer(100, 1);
      tm.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void{
        e.target.removeEventListener(e.type, arguments.callee);
        init();
      });
      tm.start();
    }

    private function setMusic(musicalScale:String, time:Number = 1):void
    {
      var i:int;
      var freq:Number;
      var phase: Number = 0;
      var amplitude: Number;
      var sample: Sample;
      var setTime:int = Math.floor(time * 44100);

      switch(musicalScale)
      {
        case "C":  freq = 220;     break;
        case "C#": freq = 233.082; break;
        case "D":  freq = 246.942; break;
        case "D#": freq = 261.626; break;
        case "E":  freq = 277.183; break;
        case "F":  freq = 293.665; break;
        case "F#": freq = 311.127; break;
        case "G":  freq = 329.628; break;
        case "G#": freq = 349.228; break;
        case "A":  freq = 369.994; break;
        case "A#": freq = 391.995; break;
        case "B":  freq = 415.305; break;
        case "C+": freq = 440.000; break;
        case "N": freq = 0; break;
      }


      for( i = 0 ; i < setTime ; i++ )
      {
        //-- create an amplitude [-1,1]
        amplitude = Math.sin( phase * Math.PI * 2 );

        //-- create a sample
        sample = new Sample( amplitude, amplitude );

        //-- push in array
        music.push( sample );

        //-- increase phase
        phase += freq / Audio.RATE44100;
      }
    }

    private function onSoundGenerated( sound: Sound ): void
    {

      //-- play the shit
      sound.play();
      tf.text = "再生中";
    }
  }
}
LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る