| 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 |
} |
|---|