| 1 |
package samples |
|---|
| 2 |
{ |
|---|
| 3 |
import flash.display.DisplayObject; |
|---|
| 4 |
import flash.display.Sprite; |
|---|
| 5 |
import flash.display.StageAlign; |
|---|
| 6 |
import flash.display.StageScaleMode; |
|---|
| 7 |
import flash.events.Event; |
|---|
| 8 |
import flash.events.SampleDataEvent; |
|---|
| 9 |
import flash.media.Sound; |
|---|
| 10 |
import flash.sampler.Sample; |
|---|
| 11 |
import flash.utils.ByteArray; |
|---|
| 12 |
import org.sazameki.audio.core.AudioSamples; |
|---|
| 13 |
import org.sazameki.audio.core.AudioSetting; |
|---|
| 14 |
import org.sazameki.audio.ctrlEvent.events.NoteOff; |
|---|
| 15 |
import org.sazameki.audio.ctrlEvent.events.NoteOn; |
|---|
| 16 |
import org.sazameki.audio.engine.MultiSamplePlayer.Instrument; |
|---|
| 17 |
import org.sazameki.audio.engine.MultiSamplePlayer.MultiSamplePlayer; |
|---|
| 18 |
import org.sazameki.audio.engine.MultiSamplePlayer.NoteRange; |
|---|
| 19 |
import org.sazameki.audio.engine.MultiSamplePlayer.ProcessData; |
|---|
| 20 |
import org.sazameki.audio.format.wav.Wav; |
|---|
| 21 |
import org.sazameki.events.NoteEvent; |
|---|
| 22 |
import org.sazameki.ui.KeyboardKeyboard; |
|---|
| 23 |
|
|---|
| 24 |
/** |
|---|
| 25 |
* ... |
|---|
| 26 |
* @author Takaaki Yamazaki(zk design) |
|---|
| 27 |
*/ |
|---|
| 28 |
public class SamplerSample extends Sprite |
|---|
| 29 |
{ |
|---|
| 30 |
[Embed(source = "asset/bass_c2_9836_10510.wav", mimeType = "application/octet-stream")] |
|---|
| 31 |
public const Bass:Class; |
|---|
| 32 |
|
|---|
| 33 |
[Embed(source = "asset/Clap.wav", mimeType = "application/octet-stream")] |
|---|
| 34 |
public const Clap:Class; |
|---|
| 35 |
[Embed(source = "asset/Hat.wav", mimeType = "application/octet-stream")] |
|---|
| 36 |
public const Hat:Class; |
|---|
| 37 |
[Embed(source = "asset/Kick.wav", mimeType = "application/octet-stream")] |
|---|
| 38 |
public const Kick:Class; |
|---|
| 39 |
[Embed(source = "asset/Snare.wav", mimeType = "application/octet-stream")] |
|---|
| 40 |
public const Snare:Class; |
|---|
| 41 |
|
|---|
| 42 |
[Embed(source = "asset/synth.png")] |
|---|
| 43 |
public const Img:Class; |
|---|
| 44 |
|
|---|
| 45 |
private var sampler:MultiSamplePlayer; |
|---|
| 46 |
private var sound:Sound; |
|---|
| 47 |
private var procData:ProcessData; |
|---|
| 48 |
public function SamplerSample() |
|---|
| 49 |
{ |
|---|
| 50 |
stage.scaleMode = StageScaleMode.NO_SCALE; |
|---|
| 51 |
|
|---|
| 52 |
var img:DisplayObject = new Img(); |
|---|
| 53 |
addChild(img); |
|---|
| 54 |
|
|---|
| 55 |
var keyboard:KeyboardKeyboard = new KeyboardKeyboard(stage,1); |
|---|
| 56 |
keyboard.addEventListener(NoteEvent.NOTE_ON, onNoteOn); |
|---|
| 57 |
keyboard.addEventListener(NoteEvent.NOTE_OFF, onNoteOff); |
|---|
| 58 |
|
|---|
| 59 |
var decoder:Wav = new Wav(); |
|---|
| 60 |
|
|---|
| 61 |
var bassSamples:AudioSamples = decoder.decode(new Bass() as ByteArray); |
|---|
| 62 |
var bassInst:Instrument = new Instrument(bassSamples, 9836, 10509, 24); |
|---|
| 63 |
|
|---|
| 64 |
var clapSamples:AudioSamples = decoder.decode(new Clap() as ByteArray); |
|---|
| 65 |
var clapInst:Instrument = new Instrument(clapSamples); |
|---|
| 66 |
|
|---|
| 67 |
var hatSamples:AudioSamples = decoder.decode(new Hat() as ByteArray); |
|---|
| 68 |
var hatInst:Instrument = new Instrument(hatSamples); |
|---|
| 69 |
|
|---|
| 70 |
var kickSamples:AudioSamples = decoder.decode(new Kick() as ByteArray); |
|---|
| 71 |
var kickInst:Instrument = new Instrument(kickSamples); |
|---|
| 72 |
|
|---|
| 73 |
var snareSamples:AudioSamples = decoder.decode(new Snare() as ByteArray); |
|---|
| 74 |
var snareInst:Instrument = new Instrument(snareSamples); |
|---|
| 75 |
|
|---|
| 76 |
sampler = new MultiSamplePlayer(); |
|---|
| 77 |
sampler.addInstrument(bassInst, new NoteRange(24)); |
|---|
| 78 |
sampler.addInstrument(kickInst, new NoteRange(0, 13)); |
|---|
| 79 |
sampler.addInstrument(hatInst, new NoteRange(18, 23)); |
|---|
| 80 |
sampler.addInstrument(clapInst, new NoteRange(14, 15)); |
|---|
| 81 |
sampler.addInstrument(snareInst, new NoteRange(16, 17)); |
|---|
| 82 |
//prepare processData(sample buffer & event list) |
|---|
| 83 |
procData = new ProcessData(2048); |
|---|
| 84 |
|
|---|
| 85 |
//prepare sound |
|---|
| 86 |
sound = new Sound(); |
|---|
| 87 |
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSamplesCallback); |
|---|
| 88 |
sound.play(); |
|---|
| 89 |
} |
|---|
| 90 |
private function onNoteOn(e:NoteEvent):void |
|---|
| 91 |
{ |
|---|
| 92 |
procData.events.addEvent(new NoteOn(e.note), 0); |
|---|
| 93 |
} |
|---|
| 94 |
private function onNoteOff(e:NoteEvent):void |
|---|
| 95 |
{ |
|---|
| 96 |
procData.events.addEvent(new NoteOff(e.note), 0); |
|---|
| 97 |
} |
|---|
| 98 |
private function onSamplesCallback(e:SampleDataEvent):void |
|---|
| 99 |
{ |
|---|
| 100 |
|
|---|
| 101 |
|
|---|
| 102 |
var left:Vector.<Number>; |
|---|
| 103 |
var right:Vector.<Number>; |
|---|
| 104 |
|
|---|
| 105 |
var audios:AudioSamples = procData.samples; |
|---|
| 106 |
|
|---|
| 107 |
var len:int = procData.length; |
|---|
| 108 |
|
|---|
| 109 |
var i:int = 0; |
|---|
| 110 |
var sig:Number; |
|---|
| 111 |
|
|---|
| 112 |
sampler.process(procData); |
|---|
| 113 |
|
|---|
| 114 |
if (audios.setting.channels == 2) |
|---|
| 115 |
{ |
|---|
| 116 |
left = audios.left; |
|---|
| 117 |
right = audios.right; |
|---|
| 118 |
for (; i < len; ++i) |
|---|
| 119 |
{ |
|---|
| 120 |
e.data.writeFloat(left[i]); |
|---|
| 121 |
e.data.writeFloat(right[i]); |
|---|
| 122 |
|
|---|
| 123 |
} |
|---|
| 124 |
}else |
|---|
| 125 |
{ |
|---|
| 126 |
left = audios.left; |
|---|
| 127 |
for (; i < len; ++i) |
|---|
| 128 |
{ |
|---|
| 129 |
sig = left[i]; |
|---|
| 130 |
e.data.writeFloat(sig); |
|---|
| 131 |
e.data.writeFloat(sig); |
|---|
| 132 |
} |
|---|
| 133 |
|
|---|
| 134 |
} |
|---|
| 135 |
} |
|---|
| 136 |
|
|---|
| 137 |
} |
|---|
| 138 |
|
|---|
| 139 |
} |
|---|