root/as3/sazameki/branches/fp10/src/samples/TenoranSample.as

リビジョン 1529, 7.8 kB (コミッタ: zk33, コミット時期: 4 年 前)

最新の書き方に合わせてサンプルをアップデート

Line 
1 package samples
2 {
3         import flash.display.Sprite;
4         import flash.display.StageAlign;
5         import flash.display.StageScaleMode;
6         import flash.events.Event;
7         import flash.events.IOErrorEvent;
8         import flash.events.MouseEvent;
9         import flash.events.SampleDataEvent;
10         import flash.media.Sound;
11         import flash.media.SoundChannel;
12         import flash.media.SoundTransform;
13         import flash.net.FileFilter;
14         import flash.net.FileReference;
15         import flash.utils.ByteArray;
16         import jp.zkdesign.utility.StageUtility;
17         import org.sazameki.audio.core.AudioSamples;
18         import org.sazameki.audio.engine.MultiSamplePlayer.Instrument;
19         import org.sazameki.audio.engine.MultiSamplePlayer.MultiSamplePlayer;
20         import org.sazameki.audio.engine.MultiSamplePlayer.NoteRange;
21         import org.sazameki.audio.engine.MultiSamplePlayer.ProcessData;
22         import org.sazameki.audio.engine.tenoran.Tenoran;
23         import org.sazameki.audio.engine.tenoran.TenoranCtrlBtn;
24         import org.sazameki.audio.engine.waveSlicer.algorithm.EvenIntervalSlice;
25         import org.sazameki.audio.engine.waveSlicer.Region;
26         import org.sazameki.audio.engine.waveSlicer.WaveSlicer;
27         import org.sazameki.audio.format.wav.Wav;
28         import org.sazameki.audio.processor.effects.Delay;
29         import org.sazameki.audio.processor.filter.MoogVCF;
30         import org.sazameki.audio.processor.filter.ResonatFilter;
31         import org.sazameki.audio.processor.IAudioProcessor;
32         import org.sazameki.ui.Knob;
33        
34         /**
35         * ...
36         * @author Takaaki Yamazaki(zk design)
37         */
38         public class TenoranSample extends Sprite
39         {
40                 [Embed(source = "asset/bass_c2_9836_10510.wav", mimeType = "application/octet-stream")]
41                 public const Bass:Class;
42
43                 [Embed(source = "asset/Clap.wav", mimeType = "application/octet-stream")]
44                 public const Clap:Class;
45                 [Embed(source = "asset/Hat.wav", mimeType = "application/octet-stream")]
46                 public const Hat:Class;
47                 [Embed(source = "asset/CHH01.wav", mimeType = "application/octet-stream")]
48                 public const HatClose:Class;
49                 [Embed(source = "asset/Kick.wav", mimeType = "application/octet-stream")]
50                 public const Kick:Class;
51                 [Embed(source = "asset/Snare.wav", mimeType = "application/octet-stream")]
52                 public const Snare:Class;
53                
54                 private var tenoran:Tenoran;
55                 private var sampler:MultiSamplePlayer;
56                 private var procData:ProcessData;
57                 private var sound:Sound;
58                 private var soundChannel:SoundChannel;
59                
60                 private var effects:Vector.<IAudioProcessor>;
61                
62                 private var ref:FileReference = new FileReference();
63                 private var decoder:Wav = new Wav();
64                
65                 public function TenoranSample()
66                 {
67                         StageUtility.initStageProp(stage,StageAlign.TOP);
68                        
69                         tenoran = new Tenoran();
70                         addChild(tenoran);
71
72                         var bassSamples:AudioSamples = decoder.decode(new Bass() as ByteArray);
73                         var bassInst:Instrument = new Instrument(bassSamples, 0, 0, 24);
74                        
75                         var clapSamples:AudioSamples = decoder.decode(new Clap() as ByteArray);
76                         var clapInst:Instrument = new Instrument(clapSamples);
77                        
78                         var hatSamples:AudioSamples = decoder.decode(new Hat() as ByteArray);
79                         var hatInst:Instrument = new Instrument(hatSamples);
80                        
81                         var hatCloseSamples:AudioSamples = decoder.decode(new HatClose() as ByteArray);
82                         var hatCloseInst:Instrument = new Instrument(hatCloseSamples);
83                        
84                         var kickSamples:AudioSamples = decoder.decode(new Kick() as ByteArray);
85                         var kickInst:Instrument = new Instrument(kickSamples);
86                        
87                         var snareSamples:AudioSamples = decoder.decode(new Snare() as ByteArray);
88                         var snareInst:Instrument = new Instrument(snareSamples);
89                        
90                                                
91                         //effects(temporary)
92                         effects = new Vector.<IAudioProcessor>();
93                         var delayEffect:Delay = new Delay(200,0.5,0);
94                         effects.push(delayEffect);
95
96                         var resonantFilter:ResonatFilter = new ResonatFilter(0,16000,0);
97                         effects.push(resonantFilter);
98                        
99                         var knobSize:int = 26;
100                         var knobColor:int = 0x333333;
101                         var knobY:int = 486;
102                         //create knob
103                         var knob:Knob = new Knob(knobSize,knobColor);
104                         knob.x = 350;
105                         knob.y = knobY;
106                         knob.valueNormalized = 1;
107                         knob.assignParameter(resonantFilter.cutoff);
108                         addChild(knob);
109                        
110                         var qKnob:Knob = new Knob(knobSize,knobColor);
111                         qKnob.x = 382;
112                         qKnob.y = knobY;
113                         qKnob.valueNormalized = 0;
114                         qKnob.assignParameter(resonantFilter.q);
115                         addChild(qKnob);
116                        
117                         var dmKnob:Knob = new Knob(knobSize,knobColor);
118                         dmKnob.x = 425;
119                         dmKnob.y = knobY;
120                         dmKnob.assignParameter(delayEffect.mix);
121                         dmKnob.valueNormalized = 0.0;
122                         addChild(dmKnob);
123
124                         var dtKnob:Knob = new Knob(knobSize,knobColor);
125                         dtKnob.x = 457;
126                         dtKnob.y = knobY;
127                         dtKnob.assignParameter(delayEffect.delayTime);
128                         dtKnob.valueNormalized = 0.2;
129                         addChild(dtKnob);
130                        
131                         //button for load local samples
132                         ref.addEventListener(Event.SELECT, onFileSelected);
133                         ref.addEventListener(Event.COMPLETE, onFileLoadComplete);
134                         ref.addEventListener(IOErrorEvent.IO_ERROR, onFileIoError);
135                        
136                        
137                         var loadBtn:TenoranCtrlBtn = new TenoranCtrlBtn();
138                         loadBtn.addEventListener(MouseEvent.CLICK, onLoadBtnClick);
139                         loadBtn.x = 23;
140                         loadBtn.y = 80;
141                         addChild(loadBtn);
142
143                         sampler = new MultiSamplePlayer();
144                         sampler.addInstrument(bassInst, new NoteRange(18));
145                         sampler.addInstrument(kickInst, new NoteRange(0, 13));
146                         sampler.addInstrument(hatInst, new NoteRange(16, 16));
147                         sampler.addInstrument(hatCloseInst, new NoteRange(17, 17));
148                         sampler.addInstrument(clapInst, new NoteRange(14, 14));
149                         sampler.addInstrument(snareInst, new NoteRange(15, 15));
150                         //prepare processData(sample buffer & event list)
151                         procData = new ProcessData(2048);
152                        
153                         //prepare sound
154                        
155                         sound = new Sound();
156                         sound.addEventListener(SampleDataEvent.SAMPLE_DATA,onSamplesCallback);
157                         soundChannel = sound.play();
158                         var trans:SoundTransform = soundChannel.soundTransform;
159                         trans.volume = 0.8;
160                         soundChannel.soundTransform = trans;
161                        
162                        
163                 }
164                
165                 private function onLoadBtnClick(e:MouseEvent):void
166                 {
167                         ref.browse([new FileFilter("wav","*.wav")]);
168                 }
169                
170                 private function onFileSelected(e:Event):void
171                 {
172                         var ref:FileReference = e.target as FileReference;
173                         ref.load()
174
175                 }
176                
177                 private function onFileIoError(e:IOErrorEvent):void
178                 {
179                         trace(e);
180                 }
181                
182                 private function onFileLoadComplete(e:Event):void
183                 {
184                         var ref:FileReference = e.target as FileReference;
185                         var smpls:AudioSamples = decoder.decode(ref.data);
186                         var slicer:WaveSlicer = new WaveSlicer(new EvenIntervalSlice(16));
187                         var regions:Vector.<Region>=slicer.slice(smpls);
188                         //instrument生成
189                         for (var i:int = 0; i < 16; ++i)
190                         {
191                                 var inst:Instrument = new Instrument(regions[i]);
192                                 sampler.addInstrument(inst, new NoteRange(50 + i, 50 + i));
193                         }
194                         //tenoranのmapを書き換え
195                         tenoran.map = Vector.<int>([65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50]);
196                         //
197                         tenoran.bpm = 135;
198                         tenoran.swing = 0;
199                        
200                 }
201                
202                 private function onSamplesCallback(e:SampleDataEvent):void
203                 {
204
205                         var left:Vector.<Number>;
206                         var right:Vector.<Number>;
207                        
208                         var audios:AudioSamples = procData.samples;
209                        
210                         var len:int = procData.length;
211                
212                         var i:int = 0;
213                         var sig:Number;
214                        
215                         try{
216                                 tenoran.latency = (e.position / 44.1) - soundChannel.position;
217                         }catch (er:Error)
218                         {
219                                
220                         }
221                        
222                         tenoran.processEvents(procData);
223                         sampler.process(procData);
224                         //apply effects
225                         var effectCount:int = effects.length;
226                         for (i = 0; i < effectCount; ++i)
227                         {
228                                 effects[i].process(procData.samples);
229                         }
230                        
231                         if (audios.setting.channels == 2)
232                         {
233                                 left = audios.left;
234                                 right = audios.right;
235                                 for (i=0; i < len; ++i)
236                                 {
237                                         e.data.writeFloat(left[i]);
238                                         e.data.writeFloat(right[i]);
239                                
240                                 }
241                         }else
242                         {
243                                 left = audios.left;
244                                 for (i=0; i < len; ++i)
245                                 {
246                                         sig = left[i];
247                                         e.data.writeFloat(sig);
248                                         e.data.writeFloat(sig);
249                                 }
250                                
251                         }
252                 }
253                
254         }
255        
256 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。