root/as3/SiOPM/trunk/samples/SiONKaosillator/Kaosillator.as

リビジョン 3013, 7.0 kB (コミッタ: keim, コミット時期: 2 年 前)

サウンドライブラリ SiON ver0.5.6 更新 スペルミス修正,サンプル追加

Line 
1 // SiON KAOSCILLATOR
2 package {
3     import flash.display.Sprite;
4     import flash.events.*;
5     import flash.text.TextField;
6     import org.si.sion.*;
7     import org.si.sion.events.*;
8     import org.si.sion.sequencer.SiMMLTrack;
9     import org.si.sion.utils.SiONPresetVoice;
10     import org.si.sion.utils.Scale;
11    
12     import org.si.sound.Arpeggiator;
13    
14    
15     public class Kaosillator extends Sprite {
16         // driver
17         public var driver:SiONDriver = new SiONDriver();
18        
19         // preset voice
20         public var presetVoice:SiONPresetVoice = new SiONPresetVoice();
21        
22         // MML data
23         public var rythmLoop:SiONData;
24        
25         // control pad
26         public var controlPad:ControlPad;
27        
28         // text
29         public var startPortamentHere:TextField = new TextField();
30        
31         // arpeggiator
32         public var arpeggiator:Arpeggiator;
33        
34        
35         // constructor
36         function Kaosillator() {
37             // compile mml.
38             var mml:String = "t132;";
39             mml += "%6@0o3l8$c2cc.c.; %6@1o3$rcrc; %6@2v8l16$[crccrrcc]; %6@3v8o3$[rc8r8];";
40             mml += "%6@4v8l16o3$aa<a8>a<ga>ararara<e8>;";
41             rythmLoop = driver.compile(mml);
42            
43             // set voices of "%6@0-4" from preset
44             var percusVoices:Array = presetVoice["valsound.percus"];
45             rythmLoop.setVoice(0, percusVoices[0]);  // bass drum
46             rythmLoop.setVoice(1, percusVoices[27]); // snare drum
47             rythmLoop.setVoice(2, percusVoices[16]); // close hihat
48             rythmLoop.setVoice(3, percusVoices[21]); // open hihat
49             rythmLoop.setVoice(4, presetVoice["valsound.bass3"]); // bass
50            
51             // listen click
52             driver.addEventListener(SiONEvent.STREAM,    _onStream);
53             driver.addEventListener(SiONTrackEvent.BEAT, _onBeat);
54             stage.addEventListener("mouseDown", _onMouseDown);
55             stage.addEventListener("mouseUp",   _onMouseUp);
56            
57             // arpeggiator setting
58             arpeggiator = new Arpeggiator(new Scale("o1Ajap"), 1, [0,1,2,5,4,3]);
59             arpeggiator.voice = presetVoice["valsound.lead32"];
60             arpeggiator.quantize = 4;
61             arpeggiator.volume = 0.3;
62             arpeggiator.noteQuantize = 8;
63            
64             // control pad
65             controlPad = new ControlPad(stage, 320, 320, 0.5, 0.5, 0x101030);
66             addChild(controlPad);
67            
68             startPortamentHere.htmlText = "<font color='#808080'>Start Portament Here</font>";
69             startPortamentHere.selectable = false;
70             startPortamentHere.x = 24;
71             startPortamentHere.y = 24;
72             startPortamentHere.width = 320;
73             addChild(startPortamentHere);
74
75             // play with an argument of resetEffector = false.
76             driver.play(rythmLoop, false);
77         }
78        
79        
80         private function _onMouseDown(e:MouseEvent) : void
81         {
82             // set portament if mouseY < 40
83             if (mouseY < 40) arpeggiator.portament = 4;
84             else arpeggiator.portament = 0;
85            
86             // set pitch
87             arpeggiator.scaleIndex = controlPad.controlX * 32;
88            
89             // start arpeggio
90             arpeggiator.play();
91            
92             // update setup
93             arpeggiator.track.channel.setFilterResonance(3);
94             arpeggiator.track.channel.activateFilter(true);
95         }
96        
97        
98         private function _onMouseUp(e:MouseEvent) : void
99         {
100             // stop arpeggio
101             arpeggiator.stop();
102         }
103        
104        
105         private function _onStream(e:SiONEvent) : void
106         {
107             // update arpeggiators track parameters
108             var track:SiMMLTrack = arpeggiator.track;
109             if (track) {
110                 // update arpeggiator pitch
111                 arpeggiator.scaleIndex = controlPad.controlX * 32;
112                 // update filter
113                 var cutoff:int = (controlPad.controlY - 0.1) * 192;
114                 if (cutoff > 128) cutoff = 128;
115                 else if (cutoff < 16) cutoff = 16;
116                 track.channel.setFilterOffset(cutoff);
117             }
118         }
119        
120        
121         private function _onBeat(e:SiONTrackEvent) : void
122         {
123             controlPad.beat(32);
124         }
125     }
126 }
127
128
129
130 import flash.display.*;
131 import flash.events.*;
132 import flash.filters.BlurFilter;
133
134 class ControlPad extends Bitmap {
135     public var controlX:Number;
136     public var controlY:Number;
137     public var isDragging:Boolean;
138     public var color:int;
139    
140     private var buffer:BitmapData;
141     private var ratX:Number,  ratY:Number;
142     private var prevX:Number, prevY:Number;
143     private var clsDrawer:Shape = new Shape();
144     private var canvas:Shape = new Shape();
145     private var blur:BlurFilter = new BlurFilter(5, 5);
146     private var pointerSize:Number = 8;
147    
148    
149     function ControlPad(stage:Stage, width:int, height:int, initialX:Number=0, initialY:Number=0, color:int=0x101030) {
150         super(new BitmapData(width+32, height+32, false, 0));
151         buffer = new BitmapData(width+32, height+32, false, 0);
152        
153         clsDrawer.graphics.clear();
154         clsDrawer.graphics.lineStyle(1, 0xffffff);
155         clsDrawer.graphics.drawRect(16, 16, width, height);
156        
157         bitmapData.draw(clsDrawer);
158         buffer.fillRect(buffer.rect, 0);
159        
160         this.color = color;
161         controlX = initialX;
162         controlY = initialY;
163         ratX = 1 / width;
164         ratY = 1 / height;
165         prevX = buffer.width * controlX;
166         prevY = buffer.height * controlY;
167         addEventListener("enterFrame", _onEnterFrame);
168         stage.addEventListener("mouseMove",  _onMouseMove);
169         stage.addEventListener("mouseDown",  function(e:Event):void { isDragging = true; } );
170         stage.addEventListener("mouseUp",    function(e:Event):void { isDragging = false; });
171     }
172    
173    
174     private function _onEnterFrame(e:Event) : void {
175         var x:Number = (buffer.width-32) * controlX + 16;
176         var y:Number = (buffer.height-32) * (1-controlY) + 16;
177         canvas.graphics.clear();
178         canvas.graphics.lineStyle(pointerSize, color);
179         canvas.graphics.moveTo(prevX, prevY);
180         canvas.graphics.lineTo(x, y);
181         buffer.applyFilter(buffer, buffer.rect, buffer.rect.topLeft, blur);
182         buffer.draw(canvas, null, null, "add");
183         bitmapData.copyPixels(buffer, buffer.rect, buffer.rect.topLeft);
184         bitmapData.draw(clsDrawer);
185         prevX = x+Math.random();
186         prevY = y;
187         pointerSize *= 0.96;
188     }
189    
190    
191     private function _onMouseMove(e:MouseEvent) : void {
192         if (isDragging) {
193             controlX = (mouseX - 16) * ratX;
194             controlY = 1 - (mouseY - 16) * ratY;
195             if (controlX < 0) controlX = 0;
196             else if (controlX > 1) controlX = 1;
197             if (controlY < 0) controlY = 0;
198             else if (controlY > 1) controlY = 1;
199         }
200     }
201    
202    
203     public function beat(size:int) : void {
204         pointerSize = size;
205     }
206 }
207
208
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。