| 1 |
// Control software synth by primitive operations |
|---|
| 2 |
package { |
|---|
| 3 |
import flash.display.Sprite; |
|---|
| 4 |
import flash.events.*; |
|---|
| 5 |
import org.si.sion.*; |
|---|
| 6 |
import org.si.sion.events.*; |
|---|
| 7 |
import org.si.sion.sequencer.SiMMLTrack; |
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
public class TimerInteruption extends Sprite { |
|---|
| 11 |
// driver |
|---|
| 12 |
public var driver:SiONDriver = new SiONDriver(); |
|---|
| 13 |
|
|---|
| 14 |
// voice |
|---|
| 15 |
public var voice:SiONVoice = new SiONVoice(5, 0, 40, 24); |
|---|
| 16 |
|
|---|
| 17 |
// tracks |
|---|
| 18 |
public var tracks:Vector.<SiMMLTrack> = new Vector.<SiMMLTrack>(2); |
|---|
| 19 |
|
|---|
| 20 |
// sequence |
|---|
| 21 |
public var sequences:Array = [Vector.<int>([60,60,67,67,69,69,67,0,65,65,64,64,62,62,60,0]), |
|---|
| 22 |
Vector.<int>([48,55,52,55,48,55,52,55,47,55,50,55,47,55,50,55])]; |
|---|
| 23 |
// sequence pointer |
|---|
| 24 |
public var sequencePointer:int; |
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
// constructor |
|---|
| 28 |
function TimerInteruption() { |
|---|
| 29 |
// listen STREAM_START event to initialize tracks |
|---|
| 30 |
driver.addEventListener(SiONEvent.STREAM_START, _onStreamStart) |
|---|
| 31 |
// set timer interuption for each 16th beat on bpm=120. |
|---|
| 32 |
driver.bpm = 120; |
|---|
| 33 |
driver.setTimerInteruption(1, _onTimerInteruption); |
|---|
| 34 |
// start streaming |
|---|
| 35 |
driver.play(); |
|---|
| 36 |
} |
|---|
| 37 |
|
|---|
| 38 |
|
|---|
| 39 |
// initialize tracks in STREAM_START event handler. |
|---|
| 40 |
private function _onStreamStart(event:SiONEvent) : void { |
|---|
| 41 |
// initialize pointer |
|---|
| 42 |
sequencePointer = 0; |
|---|
| 43 |
// SiMMLSequencer.newControlableTrack allocates new tracks in the sound module. |
|---|
| 44 |
tracks[0] = driver.sequencer.newControlableTrack(0); |
|---|
| 45 |
tracks[1] = driver.sequencer.newControlableTrack(0); |
|---|
| 46 |
// SiONVoice.setTrackVoice sets tracks voice |
|---|
| 47 |
voice.setTrackVoice(tracks[0]); |
|---|
| 48 |
voice.setTrackVoice(tracks[1]); |
|---|
| 49 |
} |
|---|
| 50 |
|
|---|
| 51 |
|
|---|
| 52 |
// timer interuption |
|---|
| 53 |
private function _onTimerInteruption() : void { |
|---|
| 54 |
if (sequencePointer & 1) { |
|---|
| 55 |
var index:int = (sequencePointer >> 1) & 15; |
|---|
| 56 |
for (var trackNumber:int=0; trackNumber<2; trackNumber++) { |
|---|
| 57 |
var key:int = sequences[trackNumber][index]; |
|---|
| 58 |
// SiMMLTrack.keyOn sets track key on. the 2nd argument sets key on length by sampling count (4410=100ms). |
|---|
| 59 |
if (key > 0) tracks[trackNumber].keyOn(key, 4410); |
|---|
| 60 |
} |
|---|
| 61 |
} |
|---|
| 62 |
++sequencePointer; |
|---|
| 63 |
} |
|---|
| 64 |
} |
|---|
| 65 |
} |
|---|
| 66 |
|
|---|