DynamicSoundをTweenerで変化

今度はAstroにチャルメラを謳わせてみた。 charumera.png
(要Flash10beta)

作曲方法はTweenerで音階を変化させていくちょっとヘンテコな手法です。
こんな感じ↓↓↓
Tweener.addTween(oto, 
    {frequency:OTO.RE, time:0, delay:.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:1,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:2,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:2.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MUTE, time:0, delay:3,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:3.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:4,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:4.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:5.5, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:6,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MI, time:0, delay:7.5,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.RE, time:0, delay:7.7,transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.DO, time:0, delay:7.9, transition:"linear"});
Tweener.addTween(oto,
    {frequency:OTO.MUTE, time:0, delay:8.3, transition:"linear"});


実際にシーケンスを組んだり楽曲を組んだりするのはMIDI言語とかを使うのが一番イイと思う。 FlMMLの人とかが作ってくれるんじゃ無いかと激しく期待しています。

Tweenerを使ったやり方は、とりあえずパラメーターを直接いじくって音が変化するのを楽しむことが出来るので、自分のようなサウンドプログラミングとか信号処理をしたことがない人間にとってはやりやすいです。

音の実態をわしづかみにするような、プリミティブな体験と言えばいいすぎだろうか。

ともかくそんなわけで、サンプル周波数をプロパティとして保持するSoundクラスの拡張を作りました。その名も「OTO(音)クラス」
ゆくゆくはOTOライブラリとしてPopforgeに並ぶサウンドライブラリとして確固たる地位を築き、FLARION(cf:tenorion)を開発する所存です。

まあワタシの生産性だと一生、いや二生かけても無理かもしれないけど。


ソースはこちら
OTO.as package  {
    
    import flash.media.Sound;
    import flash.events.SamplesCallbackEvent;
    import flash.media.SoundChannel;
    import flash.media.SoundTransform;

    
    public class OTO extends Sound{
        
        static public const TWELEVE_TONE_SCALE:Array =[220,
                                                    233.08,
                                                    246.94,
                                                    261.63,
                                                    277.18,
                                                    293.67,
                                                    311.13,
                                                    329.63,
                                                    349.23,
                                                    369.99,
                                                    392,
                                                    415.31,
                                                    ]
 
        
        static public const MUTE:Number    = 0;
        
        static public const DO:Number    = TWELEVE_TONE_SCALE[0];
        static public const DOs:Number    = TWELEVE_TONE_SCALE[1];
        static public const RE:Number    = TWELEVE_TONE_SCALE[2];
        static public const REs:Number    = TWELEVE_TONE_SCALE[3];
        static public const MI:Number    = TWELEVE_TONE_SCALE[4];
        static public const FA:Number    = TWELEVE_TONE_SCALE[5];
        static public const FAs:Number    = TWELEVE_TONE_SCALE[6];
        static public const SO:Number    = TWELEVE_TONE_SCALE[7];
        static public const SOs:Number    = TWELEVE_TONE_SCALE[8];
        static public const RA:Number    = TWELEVE_TONE_SCALE[9];
        static public const RAs:Number    = TWELEVE_TONE_SCALE[10];
        static public const SI:Number    = TWELEVE_TONE_SCALE[11];

        static public const A:Number    = TWELEVE_TONE_SCALE[0];
        static public const B:Number    = TWELEVE_TONE_SCALE[1];
        static public const H:Number    = TWELEVE_TONE_SCALE[2];
        static public const C:Number    = TWELEVE_TONE_SCALE[3];
        static public const Cs:Number    = TWELEVE_TONE_SCALE[4];
        static public const D:Number    = TWELEVE_TONE_SCALE[5];
        static public const Ds:Number    = TWELEVE_TONE_SCALE[6];
        static public const E:Number    = TWELEVE_TONE_SCALE[7];
        static public const F:Number    = TWELEVE_TONE_SCALE[8];
        static public const Fs:Number    = TWELEVE_TONE_SCALE[9];
        static public const G:Number    = TWELEVE_TONE_SCALE[10];
        static public const Gs:Number    = TWELEVE_TONE_SCALE[11];
        

        
        private const SAMPLEING_RATE:Number = 44100
        
        private var refreshRate:uint = 4410
        private var herts:Number = 220
        private var _frequency:Number = 220
        private var _volume:Number = .5
        
        private var ampEnd:Number =0
        
        public function OTO() {
            init()    
        }
        
        private function init():void{
                    
            this.addEventListener("samplesCallback",sineWavGenerator);  
            
        }
        public function start(toneScale:Number = 220):SoundChannel{
            this.frequency = toneScale
            return this.play()
        }
        private    function sineWavGenerator(event:SamplesCallbackEvent):void {  
                
            var rate:Number = SAMPLEING_RATE
            var refreshRate:Number = this.refreshRate
            
            var amp:Number
            var freq:Number = (Math.PI * 2) * frequency / 44100;
            
            var volume:Number = this.volume
                                            
            for ( var c:int=1; c <= refreshRate; c++ ) {  
                    
                amp = (c * freq) + ampEnd 
                
                var sample:Number = Math.sin(amp) * volume
                   
                this.samplesCallbackData.writeFloat(sample);      
                this.samplesCallbackData.writeFloat(sample);    
                
            }
            ampEnd = amp
        }  
        
        public function get frequency():Number { return _frequency; }
        public function set frequency(value:Number):void {
            _frequency = value;
        }
        
        public function get volume():Number { return _volume; }        
        public function set volume(value:Number):void {
            _volume = value;
        }


        
    }
    
}

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/226

Comment (4)

はじめまして。いつも拝見しております。
完成したら面白そうですね。応援しています。

一点、周波数が440Hzは一般的にドではなく、「ラ」=Aの音として使われています。(最近のオーケストラなどでは442Hzが一般的ですが)

こちらのサイトが参考になります。
http://flawtips.ami.amigasa.jp/blog/060315.html

>feb19 さん

コメントありがとうございます!

>一点、周波数が440Hzは一般的にドではなく、「ラ」=Aの
>音として使われています。(最近のオーケストラなどでは
>442Hzが一般的ですが)
なるほど~勉強になります。
というかひょっとしてバッドティプスを書いちゃったかな?

ここらへんもう少しアカデミックに調べないとヤバいっすね

反省

はじめまして。FlMMLのひとです。
tweenerでサウンドを制御っていう発想が面白いですね。
これ、いまはtime0のlinearを使ってますが、timeを増やしてeaseoutbounceとかを使えば、妙な感じのポルタメントになったりするんでしょうか?
音色変化に使ってみたりしても面白そうですね。
期待してます!
#自分でtweenerを使ったことがないので、勘違いだったらごめんなさい。

FIMMLさん
コメントあざっす!

easingを色々変えてみたところ、結構フツーでした。
スラーとかタイみたいな感じでビブラートに及ばない、ってとこでした。

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.