※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


forked from : keim_at_Si's Simple keyboard [diff(581)]

TALK
SiON ver0.58 から SiONVoice.getMML() で,Voice設定のMML表現を取得可能になりました.
at 2009/11/08 14:36:35 by
In SiON ver0.58, you can get the MML of SiONVoice parameter setting by getMML() method.
at 2009/11/08 14:42:24 by
Thanks. I modify it.
at 2010/02/02 09:17:58 by
FAVORITE BY
:
sionsoundmidipianoSion Piano
:
参考にさせてもらいます。ありがとうございます。
:
pianno keyboard
:
:
音楽 シンセ
:
pianofortepianopianoforte
:
:
:
:
:
:
:
固まる・・・@linux
:
:
:
凄い
:
すすげえ
:
pianomusicsynthesizerVery nice implementation.
:
SiONsynthesizerおもわずライディーンやりたくなった
:
cooooool UNIONで連弾に期待
:
すごい
:
もうFlashじゃない気がするよ
:
:
うお。ここまで書き込むのにどれくらいかかったんだろう
:
:
書いてるのか、鍵盤
:
:
これ全部ASで描いてるのかー。すごいな。
:
AS3でこんなことまでできるとは・・・。
:
Oh my god...you've actually drawn that keyboard out by pure code!
:
SiONプリセット音の確認に最適。グラフィック描画部分にベーマガ世代がにじみ出てるw
:
鍵盤のカキコミ、すごい!
FORKED
  1. // forked from keim_at_Si's SiON FM Synthesizer WF-1
  2. // SiON Keyborad WF1 ver0.58
  3. package {
  4.     import flash.display.Sprite;
  5.     import flash.events.*;
  6.     import flash.system.System;
  7.     import com.bit101.components.*;
  8.     
  9.     public class main extends Sprite {
  10.         function main() {
  11.             graphics.beginFill(0);
  12.             graphics.drawRect(0,0,465,465);
  13.             graphics.endFill();
  14.             
  15.             addChild(keyboard = new Sprite());
  16.             keyboard.x = 0;
  17.             keyboard.y = 120;
  18.             
  19.             keys = new KeyDisplay(keyboard, 3254);
  20.             Style.BACKGROUND = 0x606060;
  21.             Style.BUTTON_FACE = 0x404040;
  22.             Style.LABEL_TEXT = 0xaaaaaa;
  23.             Style.DROPSHADOW = 0;
  24.             Style.PANEL = 0x202020;
  25.             Style.PROGRESS_BAR = 0x404040;
  26.             selector = new VoiceSelector(keyboard, 320);
  27.             volume = new VolumePanel(keyboard, 3278);
  28.             stage.addEventListener("keyDown", _onKeyDown);
  29.             stage.addEventListener("keyUp", _onKeyUp);
  30.             var disc:String = "[ UP / DOWN ] = Change Voice      ";
  31.             disc += "[ LEFT / RIGHT ] = Change Categoly      ";
  32.             disc += "[ Q / W ] = Octave Shift";
  33.             new Label(keyboard, 16204, disc);
  34.             
  35.             disc = "[ P ] = Send parameters to clipboard";
  36.             clipboard = new Text(keyboard, 16230, disc);
  37.             clipboard.setSize(43396);
  38.             
  39.             initializeSiON();
  40.         }
  41.         
  42.         private function _onKeyDown(e:KeyboardEvent) : void {
  43.             var i:int, c:String, mml:String;
  44.             switch (e.keyCode) {
  45.             case 40: updateVoice(voiceIndex-1); break;
  46.             case 38: updateVoice(voiceIndex+1); break;
  47.             case 37: updateCategoly(categolyIndex-1); break;
  48.             case 39: updateCategoly(categolyIndex+1); break;
  49.             default:
  50.                 switch (c = String.fromCharCode(e.charCode)) {
  51.                 case 'q': keys.octDown(); break;
  52.                 case 'w': keys.octUp();   break;
  53.                 case 'p'
  54.                     mml = voiceList[voiceIndex].getMML(voiceIndex);
  55.                     clipboard.text = "[ P ] = Send parameters to clipboard \n" + mml.replace(/\r/g, '');
  56.                     System.setClipboard(mml);
  57.                     break;
  58.                 default:  if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOn(i); break;
  59.                 }
  60.             }
  61.         }
  62.         
  63.         private function _onKeyUp(e:KeyboardEvent) : void {
  64.             var i:int, c:String = String.fromCharCode(e.charCode);
  65.             if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOff(i);
  66.         }
  67.     }
  68. }
  69. import flash.display.*;
  70. import flash.events.*;
  71. import flash.filters.*;
  72. import flash.text.*;
  73. import flash.geom.*;
  74. import com.bit101.components.*;
  75. import org.si.sion.*;
  76. import org.si.sion.effector.*;
  77. import org.si.sion.sequencer.SiMMLTrack;
  78. import org.si.sion.utils.SiONPresetVoice;
  79. // SiON variables
  80. var driver:SiONDriver = new SiONDriver();
  81. var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  82. var voiceList:Array = presetVoice.categolies[0];
  83. var voiceIndex:int = 0;
  84. var categolyIndex:int = 0;
  85. var delaySendLevel:Number = 0.2;
  86. var chorusSendLevel:Number = 0;
  87. var lpf:SiCtrlFilterLowPass = new SiCtrlFilterLowPass();
  88. var cutoff:Number = 1;
  89. var resonance:Number = 0;
  90. // UIs
  91. var keyboard:Sprite;
  92. var keys:KeyDisplay;
  93. var selector:VoiceSelector;
  94. var volume:VolumePanel;
  95. var keyFlag:int;
  96. var clipboard:Text;
  97. // Global Functions
  98. function initializeSiON() : void {
  99.     // effector setting
  100.     lpf.initialize();
  101.     lpf.control(10);
  102.     var dly:SiEffectStereoDelay  = new SiEffectStereoDelay();
  103.     dly.initialize();
  104.     dly.setParameters(200,0.2,false);
  105.     var cho:SiEffectStereoChorus = new SiEffectStereoChorus();
  106.     cho.initialize();
  107.     cho.setParameters(20,0.2,4,20);
  108.     
  109.     driver.effector.initialize();
  110.     driver.effector.connect(0, lpf);
  111.     driver.effector.connect(1, dly);
  112.     driver.effector.connect(2, cho);
  113.     
  114.     // start stream without initializing effectors
  115.     driver.play(nullfalse);
  116. }
  117. function updateCategoly(index:int) : void {
  118.     var imax:int = presetVoice.categolies.length;
  119.     if (index < 0) index = imax - 1;
  120.     else if (index >= imax) index = 0;
  121.     categolyIndex = index;
  122.     voiceList = presetVoice.categolies[index];
  123.     selector.onUpdateCategoly();
  124.     volume.onUpdateCategoly();
  125.     updateVoice(voiceIndex);
  126. }
  127. function updateVoice(index:int, callFromKnob:Boolean=false) : void {
  128.     if (voiceList) {
  129.         if (index < 0) index = 0;
  130.         else if (index >= voiceList.length) index = voiceList.length - 1;
  131.         voiceIndex = index;
  132.         selector.updateName();
  133.         if (!callFromKnob) volume.updateVoiceIndex();
  134.     }
  135. }
  136. function keyOn(index:int) : void {
  137.     if ((keyFlag & (1<<index)) == 0) {
  138.         keyFlag |= 1<<index;
  139.         var trk:SiMMLTrack = driver.noteOn(index + keys.octave*12, voiceList[voiceIndex], 0);
  140.         trk.channel.setStreamSend(1, delaySendLevel);
  141.         trk.channel.setStreamSend(2, chorusSendLevel);
  142.         keys.keyOn(index);
  143.     }
  144. }
  145. function keyOff(index:int) : void {
  146.     keyFlag &= ~(1<<index);
  147.     driver.noteOff(index + keys.octave*12);
  148.     keys.keyOff(index);
  149. }
  150. function allNoteOff() : void {
  151.     for each (var trk:SiMMLTrack in driver.sequencer.tracks) trk.keyOff();
  152. }
  153. class KeyDisplay extends Sprite {
  154.     private var _screenBitmap:Bitmap;
  155.     private var _screen:BitmapData = new BitmapData(400144false0);
  156.     private var _cls:BitmapData = new BitmapData(400144false, 0x202020);
  157.     private var _bkeyBase:BitmapData = new BitmapData(320120true0);
  158.     private var _wkeyPos:Array = [100,120,140,160,180,200,220,240,260,280];
  159.     private var _bkeyPos:Array = [112,136,172,194,216,252,276];
  160.     private var _wkeyIndex:Array = [0,2,4,5,7,9,11,12,14,16];
  161.     private var _bkeyIndex:Array = [1,3,6,8,10,13,15];
  162.     private var _wkeyPushed:BitmapData = new BitmapData(20120true, 0x808080ff);
  163.     private var _bkeyPushed:BitmapData = new BitmapData(1280true, 0x408080ff);
  164.     private var _light:BitmapData = new BitmapData(1212true0);
  165.     private var _keyFlag:int = 0, _newKeyFlag:int = 0x3000000, _padUpdated:Boolean = false;
  166.     
  167.     public function get octave() : int { return (_keyFlag>>24)+2; }
  168.     
  169.     function KeyDisplay(parent:DisplayObjectContainer, x:Number, y:Number) {
  170.         this.x = x;
  171.         this.y = y;
  172.         parent.addChild(this);
  173.         _createBitmap();
  174.         addEventListener("enterFrame", _onEnterFrame);
  175.         addChild(_screenBitmap = new Bitmap(_screen));
  176.         stage.addEventListener("mouseDown", _onMouseDown);
  177.         stage.addEventListener("mouseUp",   _onMouseUp);
  178.         stage.addEventListener("mouseMove", _onMouseMove);
  179.     }
  180.     
  181.     public function keyOn(index:int)  : void { _newKeyFlag = _newKeyFlag | (1<<index); }
  182.     public function keyOff(index:int) : void { _newKeyFlag = _newKeyFlag &~(1<<index); }
  183.     public function octUp() : void { 
  184.         var oct:int = _newKeyFlag >> 24;
  185.         if (++oct > 6) oct=6;
  186.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  187.         allNoteOff();
  188.     }
  189.     public function octDown() : void { 
  190.         var oct:int = _newKeyFlag >> 24;
  191.         if (--oct < 0) oct=0;
  192.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  193.         allNoteOff();
  194.     }
  195.     
  196.     private function _createBitmap() : void {
  197.         var canvas:Shape = new Shape(), g:Graphics = canvas.graphics, chars:String,
  198.             i:int, mat:Matrix = new Matrix(), rc:Rectangle = new Rectangle(0,8,8,4), label:Label;
  199.         parent.addChild(canvas);
  200.         // white keys
  201.         g.clear();
  202.         g.lineStyle(20);
  203.         mat.createGradientBox(88, Math.PI/2);
  204.         g.beginGradientFill("linear", [0x404040,0xf0f0f0], [1,1], [0,255], mat);
  205.         g.drawRoundRect(0,-4,20,124,8);
  206.         g.endFill();
  207.         g.lineStyle(4, 0x808080, 0.25);
  208.         g.drawPath(Vector.<int>([1,2]), Vector.<Number>([0,-40,120]));
  209.         Style.LABEL_TEXT = 0x666666;
  210.         label = new Label(null,0,0,"");
  211.         chars = "Q  ZXCVBNM,./  W";
  212.         for (i=0; i<16; i++) {
  213.             mat.identity();
  214.             mat.translate(i*20+4020);
  215.             _cls.draw(canvas, mat);
  216.             label.text = chars.charAt(i);
  217.             label.draw();
  218.             mat.translate(496);
  219.             _cls.draw(label, mat);
  220.         }
  221.         // board
  222.         g.clear();
  223.         mat.createGradientBox(2020, Math.PI/2);
  224.         g.beginGradientFill("linear", [0,0x404040,0x202020], [1,1,1], [0,192,255], mat);
  225.         g.drawRect(0,0,400,20);
  226.         g.endFill();
  227.         _cls.draw(canvas);
  228.         // octave
  229.         label.text = "oct.";
  230.         label.draw();
  231.         mat.identity();
  232.         mat.translate(40);
  233.         _cls.draw(label, mat);
  234.         for (rc.x=30; rc.x<136; rc.x+=16) _cls.fillRect(rc, 0);
  235.         g.clear();
  236.         mat.createGradientBox(880);
  237.         g.beginGradientFill("radial", [0xff8040,0x800000], [1,0], [0,255], mat);
  238.         g.drawCircle(668);
  239.         g.endFill();
  240.         _light.draw(canvas);
  241.         // logo
  242.         label.text = "SiON FM Synthesizer WF-1";
  243.         label.draw();
  244.         mat.identity();
  245.         mat.translate(280, -2);
  246.         _cls.draw(label, mat);
  247.         // black keys
  248.         g.clear();
  249.         g.beginFill(0x808080, 0.25);
  250.         g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([12,016,018,7512,82]));
  251.         g.endFill();
  252.         g.lineStyle(20);
  253.         g.beginFill(0x303030);
  254.         g.drawRoundRect(0,0,12,80,3);
  255.         g.endFill();
  256.         g.lineStyle(3, 0x606060, 0.5);
  257.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,738,73]));
  258.         g.lineStyle(1, 0xc0c0c0, 0.5);
  259.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,717,71]));
  260.         Style.LABEL_TEXT = 0xaaaaaa;
  261.         label = new Label(null,0,0,"");
  262.         var pos:Array = [-8,14,36,72,96,132,154,176,212,236,272,294,316];
  263.         chars = "   SDGHJL;   ";
  264.         for (i=0; i<pos.length; i++) {
  265.             mat.identity();
  266.             mat.translate(pos[i], 0);
  267.             _bkeyBase.draw(canvas, mat);
  268.             label.text = chars.charAt(i);
  269.             label.draw();
  270.             mat.translate(150);
  271.             _bkeyBase.draw(label, mat);
  272.         }
  273.         // Filter pad
  274.         label.text = "Filter";
  275.         label.draw();
  276.         mat.identity();
  277.         mat.translate(684);
  278.         _cls.draw(label, mat);
  279.         _cls.fillRect(new Rectangle(8,104,24,24), 0);
  280.         
  281.         parent.removeChild(canvas);
  282.     }
  283.     
  284.     private function _onEnterFrame(e:Event) : void {
  285.         if (_keyFlag != _newKeyFlag || _padUpdated) {
  286.             _keyFlag = _newKeyFlag;
  287.             _padUpdated = false;
  288.             _screen.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  289.             var i:int, mat:Matrix = new Matrix(1,0,0,1,0,20), pt:Point = new Point(4020);
  290.             for  (i=0; i<_wkeyIndex.length; i++) {
  291.                 if (_keyFlag & (1<<_wkeyIndex[i])) {
  292.                     mat.tx = _wkeyPos[i];
  293.                     _screen.draw(_wkeyPushed, mat);
  294.                 }
  295.             }
  296.             _screen.copyPixels(_bkeyBase, _bkeyBase.rect, pt);
  297.             for  (i=0; i<_bkeyIndex.length; i++) {
  298.                 if (_keyFlag & (1<<_bkeyIndex[i])) {
  299.                     mat.tx = _bkeyPos[i];
  300.                     _screen.draw(_bkeyPushed, mat);
  301.                 }
  302.             }
  303.             pt.x = octave*16-2;
  304.             pt.y = 6;
  305.             _screen.copyPixels(_light, _light.rect, pt);
  306.             pt.x = int(resonance*23) + 4;
  307.             pt.y = 123 - int(cutoff*23);
  308.             _screen.copyPixels(_light, _light.rect, pt);
  309.         }
  310.     }
  311.     
  312.     private var _draggingStart:Point;
  313.     private function _onMouseDown(e:MouseEvent) : void { 
  314.         if (mouseX>4 && mouseX<36 && mouseY>104 && mouseY<136) {
  315.             _draggingStart = new Point(mouseX-resonance*50, mouseY+cutoff*50);
  316.         }
  317.     }
  318.     private function _onMouseUp(e:MouseEvent) : void { _draggingStart = null; }
  319.     private function _onMouseMove(e:MouseEvent) : void {
  320.         if (_draggingStart) {
  321.             resonance = (mouseX - _draggingStart.x) * 0.02;
  322.             if (resonance < 0) resonance = 0;
  323.             else if (resonance > 0.9) resonance = 0.9;
  324.             cutoff = (_draggingStart.y - mouseY) * 0.02;
  325.             if (cutoff < 0) cutoff = 0;
  326.             else if (cutoff > 1) cutoff = 1;
  327.             _padUpdated = true;
  328.             lpf.control(cutoff, resonance);
  329.         }
  330.     }
  331. }
  332. class VoiceSelector extends Sprite {
  333.     private var _cursor:Bitmap = new Bitmap(new BitmapData(4814true, 0x408080ff));
  334.     private var _categolies:Sprite = new Sprite();
  335.     private var _voiceName:Label;
  336.     
  337.     function VoiceSelector(parent:DisplayObjectContainer, x:Number, y:Number) {
  338.         this.x = x;
  339.         this.y = y;
  340.         parent.addChild(this);
  341.         _categolies.x = 1;
  342.         _categolies.y = 18;
  343.         addChild(_categolies);
  344.         var imax:int = presetVoice.categolies.length, button:PushButton;
  345.         for (var i:int=0; i<imax; i++) {
  346.             var list:Array = presetVoice.categolies[i],
  347.                 label:String = (list.name.charAt() == "v") ? list.name.substr(9) : list.name;
  348.             button = new PushButton(_categolies, (i&7)*50, (i>>3)*16label, _onCategolyPushed);
  349.             button.setSize(4814);
  350.         }
  351.     
  352.         (new PushButton(this,  12"-"function(e:Event) : void { updateVoice(voiceIndex-1); })).setSize(1414);
  353.         (new PushButton(this172"+"function(e:Event) : void { updateVoice(voiceIndex+1); })).setSize(1414);
  354.         _categolies.addChild(_cursor);
  355.         _voiceName = new Label(this330"SiON preset voices are from VAL-SOUND");
  356.         _voiceName.setSize(20018);
  357.     }
  358.     
  359.     private function _onCategolyPushed(e:Event) : void {
  360.         _cursor.x = e.target.x;
  361.         _cursor.y = e.target.y;
  362.         updateCategoly(int((_cursor.x+10)*0.02) + (int(_cursor.y>8)<<3));
  363.     }
  364.     public function updateName() : void {
  365.         var str:String = ("00"+String(voiceIndex+1)).substr(-3,3) + "; ";
  366.         str += voiceList[voiceIndex].name;
  367.         _voiceName.text = str;
  368.     }
  369.     
  370.     public function onUpdateCategoly() : void {
  371.         _cursor.x = (categolyIndex&7)*50;
  372.         _cursor.y = (categolyIndex>>3)*16;
  373.     }
  374. }
  375. class VolumePanel extends Sprite {
  376.     private var _rev:Knob, _cho:Knob, _prg:Knob;
  377.     function VolumePanel(parent:DisplayObjectContainer, x:Number, y:Number) {
  378.         this.x = x;
  379.         this.y = y;
  380.         parent.addChild(this);
  381.         _prg = _newKnob(this12,   0"Voice",  _onChangeVoice);
  382.         _rev = _newKnob(this372,  0"Delay",  _onChangeEffect);
  383.         _cho = _newKnob(this37260"Chorus", _onChangeEffect);
  384.         _prg.showValue = false;
  385.         _rev.value = 20;
  386.         
  387.         function _newKnob(cont:DisplayObjectContainer, x:Number, y:Numberlabel:String, cb:Function) : Knob {
  388.             var ret:Knob = new Knob(cont, x, y, label, cb);
  389.             ret.setSize(1616);
  390.             return ret;
  391.         }
  392.     }
  393.     
  394.     public function onUpdateCategoly() : void {
  395.         _prg.minimum = 0;
  396.         _prg.maximum = voiceList.length;
  397.         _prg.value = voiceIndex;
  398.         _prg.mouseRange = (voiceList.length<20) ? 100 : 200;
  399.     }
  400.     
  401.     public function updateVoiceIndex() : void {
  402.         _prg.value = voiceIndex;
  403.     }
  404.     
  405.     private function _onChangeVoice(e:Event) : void {
  406.         updateVoice(int(_prg.value), true);
  407.     }
  408.     
  409.     private function _onChangeEffect(e:Event) : void {
  410.         delaySendLevel  = _rev.value * 0.01;
  411.         chorusSendLevel = _cho.value * 0.01;
  412.     }
  413. }
noswf
  1. // forked from keim_at_Si's SiON FM Synthesizer WF-1
  2. // SiON Keyborad WF1 ver0.58
  3. package {
  4.     import flash.display.Sprite;
  5.     import flash.events.*;
  6.     import flash.system.System;
  7.     import com.bit101.components.*;
  8.     
  9.     public class main extends Sprite {
  10.         function main() {
  11.             graphics.beginFill(0);
  12.             graphics.drawRect(0,0,465,465);
  13.             graphics.endFill();
  14.             
  15.             addChild(keyboard = new Sprite());
  16.             keyboard.x = 0;
  17.             keyboard.y = 120;
  18.             
  19.             keys = new KeyDisplay(keyboard, 3254);
  20.             Style.BACKGROUND = 0x606060;
  21.             Style.BUTTON_FACE = 0x404040;
  22.             Style.LABEL_TEXT = 0xaaaaaa;
  23.             Style.DROPSHADOW = 0;
  24.             Style.PANEL = 0x202020;
  25.             Style.PROGRESS_BAR = 0x404040;
  26.             selector = new VoiceSelector(keyboard, 320);
  27.             volume = new VolumePanel(keyboard, 3278);
  28.             stage.addEventListener("keyDown", _onKeyDown);
  29.             stage.addEventListener("keyUp", _onKeyUp);
  30.             var disc:String = "[ UP / DOWN ] = Change Voice      ";
  31.             disc += "[ LEFT / RIGHT ] = Change Categoly      ";
  32.             disc += "[ Q / W ] = Octave Shift";
  33.             new Label(keyboard, 16204, disc);
  34.             
  35.             disc = "[ P ] = Send parameters to clipboard";
  36.             clipboard = new Text(keyboard, 16230, disc);
  37.             clipboard.setSize(43396);
  38.             
  39.             initializeSiON();
  40.         }
  41.         
  42.         private function _onKeyDown(e:KeyboardEvent) : void {
  43.             var i:int, c:String, mml:String;
  44.             switch (e.keyCode) {
  45.             case 40: updateVoice(voiceIndex-1); break;
  46.             case 38: updateVoice(voiceIndex+1); break;
  47.             case 37: updateCategoly(categolyIndex-1); break;
  48.             case 39: updateCategoly(categolyIndex+1); break;
  49.             default:
  50.                 switch (c = String.fromCharCode(e.charCode)) {
  51.                 case 'q': keys.octDown(); break;
  52.                 case 'w': keys.octUp();   break;
  53.                 case 'p'
  54.                     mml = voiceList[voiceIndex].getMML(voiceIndex);
  55.                     clipboard.text = "[ P ] = Send parameters to clipboard \n" + mml.replace(/\r/g, '');
  56.                     System.setClipboard(mml);
  57.                     break;
  58.                 default:  if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOn(i); break;
  59.                 }
  60.             }
  61.         }
  62.         
  63.         private function _onKeyUp(e:KeyboardEvent) : void {
  64.             var i:int, c:String = String.fromCharCode(e.charCode);
  65.             if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOff(i);
  66.         }
  67.     }
  68. }
  69. import flash.display.*;
  70. import flash.events.*;
  71. import flash.filters.*;
  72. import flash.text.*;
  73. import flash.geom.*;
  74. import com.bit101.components.*;
  75. import org.si.sion.*;
  76. import org.si.sion.effector.*;
  77. import org.si.sion.sequencer.SiMMLTrack;
  78. import org.si.sion.utils.SiONPresetVoice;
  79. // SiON variables
  80. var driver:SiONDriver = new SiONDriver();
  81. var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  82. var voiceList:Array = presetVoice.categolies[0];
  83. var voiceIndex:int = 0;
  84. var categolyIndex:int = 0;
  85. var delaySendLevel:Number = 0.2;
  86. var chorusSendLevel:Number = 0;
  87. var lpf:SiCtrlFilterLowPass = new SiCtrlFilterLowPass();
  88. var cutoff:Number = 1;
  89. var resonance:Number = 0;
  90. // UIs
  91. var keyboard:Sprite;
  92. var keys:KeyDisplay;
  93. var selector:VoiceSelector;
  94. var volume:VolumePanel;
  95. var keyFlag:int;
  96. var clipboard:Text;
  97. // Global Functions
  98. function initializeSiON() : void {
  99.     // effector setting
  100.     lpf.initialize();
  101.     lpf.control(10);
  102.     var dly:SiEffectStereoDelay  = new SiEffectStereoDelay();
  103.     dly.initialize();
  104.     dly.setParameters(200,0.2,false);
  105.     var cho:SiEffectStereoChorus = new SiEffectStereoChorus();
  106.     cho.initialize();
  107.     cho.setParameters(20,0.2,4,20);
  108.     
  109.     driver.effector.initialize();
  110.     driver.effector.connect(0, lpf);
  111.     driver.effector.connect(1, dly);
  112.     driver.effector.connect(2, cho);
  113.     
  114.     // start stream without initializing effectors
  115.     driver.play(nullfalse);
  116. }
  117. function updateCategoly(index:int) : void {
  118.     var imax:int = presetVoice.categolies.length;
  119.     if (index < 0) index = imax - 1;
  120.     else if (index >= imax) index = 0;
  121.     categolyIndex = index;
  122.     voiceList = presetVoice.categolies[index];
  123.     selector.onUpdateCategoly();
  124.     volume.onUpdateCategoly();
  125.     updateVoice(voiceIndex);
  126. }
  127. function updateVoice(index:int, callFromKnob:Boolean=false) : void {
  128.     if (voiceList) {
  129.         if (index < 0) index = 0;
  130.         else if (index >= voiceList.length) index = voiceList.length - 1;
  131.         voiceIndex = index;
  132.         selector.updateName();
  133.         if (!callFromKnob) volume.updateVoiceIndex();
  134.     }
  135. }
  136. function keyOn(index:int) : void {
  137.     if ((keyFlag & (1<<index)) == 0) {
  138.         keyFlag |= 1<<index;
  139.         var trk:SiMMLTrack = driver.noteOn(index + keys.octave*12, voiceList[voiceIndex], 0);
  140.         trk.channel.setStreamSend(1, delaySendLevel);
  141.         trk.channel.setStreamSend(2, chorusSendLevel);
  142.         keys.keyOn(index);
  143.     }
  144. }
  145. function keyOff(index:int) : void {
  146.     keyFlag &= ~(1<<index);
  147.     driver.noteOff(index + keys.octave*12);
  148.     keys.keyOff(index);
  149. }
  150. function allNoteOff() : void {
  151.     for each (var trk:SiMMLTrack in driver.sequencer.tracks) trk.keyOff();
  152. }
  153. class KeyDisplay extends Sprite {
  154.     private var _screenBitmap:Bitmap;
  155.     private var _screen:BitmapData = new BitmapData(400144false0);
  156.     private var _cls:BitmapData = new BitmapData(400144false, 0x202020);
  157.     private var _bkeyBase:BitmapData = new BitmapData(320120true0);
  158.     private var _wkeyPos:Array = [100,120,140,160,180,200,220,240,260,280];
  159.     private var _bkeyPos:Array = [112,136,172,194,216,252,276];
  160.     private var _wkeyIndex:Array = [0,2,4,5,7,9,11,12,14,16];
  161.     private var _bkeyIndex:Array = [1,3,6,8,10,13,15];
  162.     private var _wkeyPushed:BitmapData = new BitmapData(20120true, 0x808080ff);
  163.     private var _bkeyPushed:BitmapData = new BitmapData(1280true, 0x408080ff);
  164.     private var _light:BitmapData = new BitmapData(1212true0);
  165.     private var _keyFlag:int = 0, _newKeyFlag:int = 0x3000000, _padUpdated:Boolean = false;
  166.     
  167.     public function get octave() : int { return (_keyFlag>>24)+2; }
  168.     
  169.     function KeyDisplay(parent:DisplayObjectContainer, x:Number, y:Number) {
  170.         this.x = x;
  171.         this.y = y;
  172.         parent.addChild(this);
  173.         _createBitmap();
  174.         addEventListener("enterFrame", _onEnterFrame);
  175.         addChild(_screenBitmap = new Bitmap(_screen));
  176.         stage.addEventListener("mouseDown", _onMouseDown);
  177.         stage.addEventListener("mouseUp",   _onMouseUp);
  178.         stage.addEventListener("mouseMove", _onMouseMove);
  179.     }
  180.     
  181.     public function keyOn(index:int)  : void { _newKeyFlag = _newKeyFlag | (1<<index); }
  182.     public function keyOff(index:int) : void { _newKeyFlag = _newKeyFlag &~(1<<index); }
  183.     public function octUp() : void { 
  184.         var oct:int = _newKeyFlag >> 24;
  185.         if (++oct > 6) oct=6;
  186.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  187.         allNoteOff();
  188.     }
  189.     public function octDown() : void { 
  190.         var oct:int = _newKeyFlag >> 24;
  191.         if (--oct < 0) oct=0;
  192.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  193.         allNoteOff();
  194.     }
  195.     
  196.     private function _createBitmap() : void {
  197.         var canvas:Shape = new Shape(), g:Graphics = canvas.graphics, chars:String,
  198.             i:int, mat:Matrix = new Matrix(), rc:Rectangle = new Rectangle(0,8,8,4), label:Label;
  199.         parent.addChild(canvas);
  200.         // white keys
  201.         g.clear();
  202.         g.lineStyle(20);
  203.         mat.createGradientBox(88, Math.PI/2);
  204.         g.beginGradientFill("linear", [0x404040,0xf0f0f0], [1,1], [0,255], mat);
  205.         g.drawRoundRect(0,-4,20,124,8);
  206.         g.endFill();
  207.         g.lineStyle(4, 0x808080, 0.25);
  208.         g.drawPath(Vector.<int>([1,2]), Vector.<Number>([0,-40,120]));
  209.         Style.LABEL_TEXT = 0x666666;
  210.         label = new Label(null,0,0,"");
  211.         chars = "Q  ZXCVBNM,./  W";
  212.         for (i=0; i<16; i++) {
  213.             mat.identity();
  214.             mat.translate(i*20+4020);
  215.             _cls.draw(canvas, mat);
  216.             label.text = chars.charAt(i);
  217.             label.draw();
  218.             mat.translate(496);
  219.             _cls.draw(label, mat);
  220.         }
  221.         // board
  222.         g.clear();
  223.         mat.createGradientBox(2020, Math.PI/2);
  224.         g.beginGradientFill("linear", [0,0x404040,0x202020], [1,1,1], [0,192,255], mat);
  225.         g.drawRect(0,0,400,20);
  226.         g.endFill();
  227.         _cls.draw(canvas);
  228.         // octave
  229.         label.text = "oct.";
  230.         label.draw();
  231.         mat.identity();
  232.         mat.translate(40);
  233.         _cls.draw(label, mat);
  234.         for (rc.x=30; rc.x<136; rc.x+=16) _cls.fillRect(rc, 0);
  235.         g.clear();
  236.         mat.createGradientBox(880);
  237.         g.beginGradientFill("radial", [0xff8040,0x800000], [1,0], [0,255], mat);
  238.         g.drawCircle(668);
  239.         g.endFill();
  240.         _light.draw(canvas);
  241.         // logo
  242.         label.text = "SiON FM Synthesizer WF-1";
  243.         label.draw();
  244.         mat.identity();
  245.         mat.translate(280, -2);
  246.         _cls.draw(label, mat);
  247.         // black keys
  248.         g.clear();
  249.         g.beginFill(0x808080, 0.25);
  250.         g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([12,016,018,7512,82]));
  251.         g.endFill();
  252.         g.lineStyle(20);
  253.         g.beginFill(0x303030);
  254.         g.drawRoundRect(0,0,12,80,3);
  255.         g.endFill();
  256.         g.lineStyle(3, 0x606060, 0.5);
  257.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,738,73]));
  258.         g.lineStyle(1, 0xc0c0c0, 0.5);
  259.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,717,71]));
  260.         Style.LABEL_TEXT = 0xaaaaaa;
  261.         label = new Label(null,0,0,"");
  262.         var pos:Array = [-8,14,36,72,96,132,154,176,212,236,272,294,316];
  263.         chars = "   SDGHJL;   ";
  264.         for (i=0; i<pos.length; i++) {
  265.             mat.identity();
  266.             mat.translate(pos[i], 0);
  267.             _bkeyBase.draw(canvas, mat);
  268.             label.text = chars.charAt(i);
  269.             label.draw();
  270.             mat.translate(150);
  271.             _bkeyBase.draw(label, mat);
  272.         }
  273.         // Filter pad
  274.         label.text = "Filter";
  275.         label.draw();
  276.         mat.identity();
  277.         mat.translate(684);
  278.         _cls.draw(label, mat);
  279.         _cls.fillRect(new Rectangle(8,104,24,24), 0);
  280.         
  281.         parent.removeChild(canvas);
  282.     }
  283.     
  284.     private function _onEnterFrame(e:Event) : void {
  285.         if (_keyFlag != _newKeyFlag || _padUpdated) {
  286.             _keyFlag = _newKeyFlag;
  287.             _padUpdated = false;
  288.             _screen.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  289.             var i:int, mat:Matrix = new Matrix(1,0,0,1,0,20), pt:Point = new Point(4020);
  290.             for  (i=0; i<_wkeyIndex.length; i++) {
  291.                 if (_keyFlag & (1<<_wkeyIndex[i])) {
  292.                     mat.tx = _wkeyPos[i];
  293.                     _screen.draw(_wkeyPushed, mat);
  294.                 }
  295.             }
  296.             _screen.copyPixels(_bkeyBase, _bkeyBase.rect, pt);
  297.             for  (i=0; i<_bkeyIndex.length; i++) {
  298.                 if (_keyFlag & (1<<_bkeyIndex[i])) {
  299.                     mat.tx = _bkeyPos[i];
  300.                     _screen.draw(_bkeyPushed, mat);
  301.                 }
  302.             }
  303.             pt.x = octave*16-2;
  304.             pt.y = 6;
  305.             _screen.copyPixels(_light, _light.rect, pt);
  306.             pt.x = int(resonance*23) + 4;
  307.             pt.y = 123 - int(cutoff*23);
  308.             _screen.copyPixels(_light, _light.rect, pt);
  309.         }
  310.     }
  311.     
  312.     private var _draggingStart:Point;
  313.     private function _onMouseDown(e:MouseEvent) : void { 
  314.         if (mouseX>4 && mouseX<36 && mouseY>104 && mouseY<136) {
  315.             _draggingStart = new Point(mouseX-resonance*50, mouseY+cutoff*50);
  316.         }
  317.     }
  318.     private function _onMouseUp(e:MouseEvent) : void { _draggingStart = null; }
  319.     private function _onMouseMove(e:MouseEvent) : void {
  320.         if (_draggingStart) {
  321.             resonance = (mouseX - _draggingStart.x) * 0.02;
  322.             if (resonance < 0) resonance = 0;
  323.             else if (resonance > 0.9) resonance = 0.9;
  324.             cutoff = (_draggingStart.y - mouseY) * 0.02;
  325.             if (cutoff < 0) cutoff = 0;
  326.             else if (cutoff > 1) cutoff = 1;
  327.             _padUpdated = true;
  328.             lpf.control(cutoff, resonance);
  329.         }
  330.     }
  331. }
  332. class VoiceSelector extends Sprite {
  333.     private var _cursor:Bitmap = new Bitmap(new BitmapData(4814true, 0x408080ff));
  334.     private var _categolies:Sprite = new Sprite();
  335.     private var _voiceName:Label;
  336.     
  337.     function VoiceSelector(parent:DisplayObjectContainer, x:Number, y:Number) {
  338.         this.x = x;
  339.         this.y = y;
  340.         parent.addChild(this);
  341.         _categolies.x = 1;
  342.         _categolies.y = 18;
  343.         addChild(_categolies);
  344.         var imax:int = presetVoice.categolies.length, button:PushButton;
  345.         for (var i:int=0; i<imax; i++) {
  346.             var list:Array = presetVoice.categolies[i],
  347.                 label:String = (list.name.charAt() == "v") ? list.name.substr(9) : list.name;
  348.             button = new PushButton(_categolies, (i&7)*50, (i>>3)*16label, _onCategolyPushed);
  349.             button.setSize(4814);
  350.         }
  351.     
  352.         (new PushButton(this,  12"-"function(e:Event) : void { updateVoice(voiceIndex-1); })).setSize(1414);
  353.         (new PushButton(this172"+"function(e:Event) : void { updateVoice(voiceIndex+1); })).setSize(1414);
  354.         _categolies.addChild(_cursor);
  355.         _voiceName = new Label(this330"SiON preset voices are from VAL-SOUND");
  356.         _voiceName.setSize(20018);
  357.     }
  358.     
  359.     private function _onCategolyPushed(e:Event) : void {
  360.         _cursor.x = e.target.x;
  361.         _cursor.y = e.target.y;
  362.         updateCategoly(int((_cursor.x+10)*0.02) + (int(_cursor.y>8)<<3));
  363.     }
  364.     public function updateName() : void {
  365.         var str:String = ("00"+String(voiceIndex+1)).substr(-3,3) + "; ";
  366.         str += voiceList[voiceIndex].name;
  367.         _voiceName.text = str;
  368.     }
  369.     
  370.     public function onUpdateCategoly() : void {
  371.         _cursor.x = (categolyIndex&7)*50;
  372.         _cursor.y = (categolyIndex>>3)*16;
  373.     }
  374. }
  375. class VolumePanel extends Sprite {
  376.     private var _rev:Knob, _cho:Knob, _prg:Knob;
  377.     function VolumePanel(parent:DisplayObjectContainer, x:Number, y:Number) {
  378.         this.x = x;
  379.         this.y = y;
  380.         parent.addChild(this);
  381.         _prg = _newKnob(this12,   0"Voice",  _onChangeVoice);
  382.         _rev = _newKnob(this372,  0"Delay",  _onChangeEffect);
  383.         _cho = _newKnob(this37260"Chorus", _onChangeEffect);
  384.         _prg.showValue = false;
  385.         _rev.value = 20;
  386.         
  387.         function _newKnob(cont:DisplayObjectContainer, x:Number, y:Numberlabel:String, cb:Function) : Knob {
  388.             var ret:Knob = new Knob(cont, x, y, label, cb);
  389.             ret.setSize(1616);
  390.             return ret;
  391.         }
  392.     }
  393.     
  394.     public function onUpdateCategoly() : void {
  395.         _prg.minimum = 0;
  396.         _prg.maximum = voiceList.length;
  397.         _prg.value = voiceIndex;
  398.         _prg.mouseRange = (voiceList.length<20) ? 100 : 200;
  399.     }
  400.     
  401.     public function updateVoiceIndex() : void {
  402.         _prg.value = voiceIndex;
  403.     }
  404.     
  405.     private function _onChangeVoice(e:Event) : void {
  406.         updateVoice(int(_prg.value), true);
  407.     }
  408.     
  409.     private function _onChangeEffect(e:Event) : void {
  410.         delaySendLevel  = _rev.value * 0.01;
  411.         chorusSendLevel = _cho.value * 0.01;
  412.     }
  413. }
noswf
  1. // forked from keim_at_Si's SiON FM Synthesizer WF-1
  2. // SiON Keyborad WF1 ver0.58
  3. package {
  4.     import flash.display.Sprite;
  5.     import flash.events.*;
  6.     import flash.system.System;
  7.     import com.bit101.components.*;
  8.     
  9.     public class main extends Sprite {
  10.         function main() {
  11.             graphics.beginFill(0);
  12.             graphics.drawRect(0,0,465,465);
  13.             graphics.endFill();
  14.             
  15.             addChild(keyboard = new Sprite());
  16.             keyboard.x = 0;
  17.             keyboard.y = 120;
  18.             
  19.             keys = new KeyDisplay(keyboard, 3254);
  20.             Style.BACKGROUND = 0x606060;
  21.             Style.BUTTON_FACE = 0x404040;
  22.             Style.LABEL_TEXT = 0xaaaaaa;
  23.             Style.DROPSHADOW = 0;
  24.             Style.PANEL = 0x202020;
  25.             Style.PROGRESS_BAR = 0x404040;
  26.             selector = new VoiceSelector(keyboard, 320);
  27.             volume = new VolumePanel(keyboard, 3278);
  28.             stage.addEventListener("keyDown", _onKeyDown);
  29.             stage.addEventListener("keyUp", _onKeyUp);
  30.             var disc:String = "[ UP / DOWN ] = Change Voice      ";
  31.             disc += "[ LEFT / RIGHT ] = Change Categoly      ";
  32.             disc += "[ Q / W ] = Octave Shift";
  33.             new Label(keyboard, 16204, disc);
  34.             
  35.             disc = "[ P ] = Send parameters to clipboard";
  36.             clipboard = new Text(keyboard, 16230, disc);
  37.             clipboard.setSize(43396);
  38.             
  39.             initializeSiON();
  40.         }
  41.         
  42.         private function _onKeyDown(e:KeyboardEvent) : void {
  43.             var i:int, c:String, mml:String;
  44.             switch (e.keyCode) {
  45.             case 40: updateVoice(voiceIndex-1); break;
  46.             case 38: updateVoice(voiceIndex+1); break;
  47.             case 37: updateCategoly(categolyIndex-1); break;
  48.             case 39: updateCategoly(categolyIndex+1); break;
  49.             default:
  50.                 switch (c = String.fromCharCode(e.charCode)) {
  51.                 case 'q': keys.octDown(); break;
  52.                 case 'w': keys.octUp();   break;
  53.                 case 'p'
  54.                     mml = voiceList[voiceIndex].getMML(voiceIndex);
  55.                     clipboard.text = "[ P ] = Send parameters to clipboard \n" + mml.replace(/\r/g, '');
  56.                     System.setClipboard(mml);
  57.                     break;
  58.                 default:  if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOn(i); break;
  59.                 }
  60.             }
  61.         }
  62.         
  63.         private function _onKeyUp(e:KeyboardEvent) : void {
  64.             var i:int, c:String = String.fromCharCode(e.charCode);
  65.             if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOff(i);
  66.         }
  67.     }
  68. }
  69. import flash.display.*;
  70. import flash.events.*;
  71. import flash.filters.*;
  72. import flash.text.*;
  73. import flash.geom.*;
  74. import com.bit101.components.*;
  75. import org.si.sion.*;
  76. import org.si.sion.effector.*;
  77. import org.si.sion.sequencer.SiMMLTrack;
  78. import org.si.sion.utils.SiONPresetVoice;
  79. // SiON variables
  80. var driver:SiONDriver = new SiONDriver();
  81. var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  82. var voiceList:Array = presetVoice.categolies[0];
  83. var voiceIndex:int = 0;
  84. var categolyIndex:int = 0;
  85. var delaySendLevel:Number = 0.2;
  86. var chorusSendLevel:Number = 0;
  87. var lpf:SiCtrlFilterLowPass = new SiCtrlFilterLowPass();
  88. var cutoff:Number = 1;
  89. var resonance:Number = 0;
  90. // UIs
  91. var keyboard:Sprite;
  92. var keys:KeyDisplay;
  93. var selector:VoiceSelector;
  94. var volume:VolumePanel;
  95. var keyFlag:int;
  96. var clipboard:Text;
  97. // Global Functions
  98. function initializeSiON() : void {
  99.     // effector setting
  100.     lpf.initialize();
  101.     lpf.control(10);
  102.     var dly:SiEffectStereoDelay  = new SiEffectStereoDelay();
  103.     dly.initialize();
  104.     dly.setParameters(200,0.2,false);
  105.     var cho:SiEffectStereoChorus = new SiEffectStereoChorus();
  106.     cho.initialize();
  107.     cho.setParameters(20,0.2,4,20);
  108.     
  109.     driver.effector.initialize();
  110.     driver.effector.connect(0, lpf);
  111.     driver.effector.connect(1, dly);
  112.     driver.effector.connect(2, cho);
  113.     
  114.     // start stream without initializing effectors
  115.     driver.play(nullfalse);
  116. }
  117. function updateCategoly(index:int) : void {
  118.     var imax:int = presetVoice.categolies.length;
  119.     if (index < 0) index = imax - 1;
  120.     else if (index >= imax) index = 0;
  121.     categolyIndex = index;
  122.     voiceList = presetVoice.categolies[index];
  123.     selector.onUpdateCategoly();
  124.     volume.onUpdateCategoly();
  125.     updateVoice(voiceIndex);
  126. }
  127. function updateVoice(index:int, callFromKnob:Boolean=false) : void {
  128.     if (voiceList) {
  129.         if (index < 0) index = 0;
  130.         else if (index >= voiceList.length) index = voiceList.length - 1;
  131.         voiceIndex = index;
  132.         selector.updateName();
  133.         if (!callFromKnob) volume.updateVoiceIndex();
  134.     }
  135. }
  136. function keyOn(index:int) : void {
  137.     if ((keyFlag & (1<<index)) == 0) {
  138.         keyFlag |= 1<<index;
  139.         var trk:SiMMLTrack = driver.noteOn(index + keys.octave*12, voiceList[voiceIndex], 0);
  140.         trk.channel.setStreamSend(1, delaySendLevel);
  141.         trk.channel.setStreamSend(2, chorusSendLevel);
  142.         keys.keyOn(index);
  143.     }
  144. }
  145. function keyOff(index:int) : void {
  146.     keyFlag &= ~(1<<index);
  147.     driver.noteOff(index + keys.octave*12);
  148.     keys.keyOff(index);
  149. }
  150. function allNoteOff() : void {
  151.     for each (var trk:SiMMLTrack in driver.sequencer.tracks) trk.keyOff();
  152. }
  153. class KeyDisplay extends Sprite {
  154.     private var _screenBitmap:Bitmap;
  155.     private var _screen:BitmapData = new BitmapData(400144false0);
  156.     private var _cls:BitmapData = new BitmapData(400144false, 0x202020);
  157.     private var _bkeyBase:BitmapData = new BitmapData(320120true0);
  158.     private var _wkeyPos:Array = [100,120,140,160,180,200,220,240,260,280];
  159.     private var _bkeyPos:Array = [112,136,172,194,216,252,276];
  160.     private var _wkeyIndex:Array = [0,2,4,5,7,9,11,12,14,16];
  161.     private var _bkeyIndex:Array = [1,3,6,8,10,13,15];
  162.     private var _wkeyPushed:BitmapData = new BitmapData(20120true, 0x808080ff);
  163.     private var _bkeyPushed:BitmapData = new BitmapData(1280true, 0x408080ff);
  164.     private var _light:BitmapData = new BitmapData(1212true0);
  165.     private var _keyFlag:int = 0, _newKeyFlag:int = 0x3000000, _padUpdated:Boolean = false;
  166.     
  167.     public function get octave() : int { return (_keyFlag>>24)+2; }
  168.     
  169.     function KeyDisplay(parent:DisplayObjectContainer, x:Number, y:Number) {
  170.         this.x = x;
  171.         this.y = y;
  172.         parent.addChild(this);
  173.         _createBitmap();
  174.         addEventListener("enterFrame", _onEnterFrame);
  175.         addChild(_screenBitmap = new Bitmap(_screen));
  176.         stage.addEventListener("mouseDown", _onMouseDown);
  177.         stage.addEventListener("mouseUp",   _onMouseUp);
  178.         stage.addEventListener("mouseMove", _onMouseMove);
  179.     }
  180.     
  181.     public function keyOn(index:int)  : void { _newKeyFlag = _newKeyFlag | (1<<index); }
  182.     public function keyOff(index:int) : void { _newKeyFlag = _newKeyFlag &~(1<<index); }
  183.     public function octUp() : void { 
  184.         var oct:int = _newKeyFlag >> 24;
  185.         if (++oct > 6) oct=6;
  186.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  187.         allNoteOff();
  188.     }
  189.     public function octDown() : void { 
  190.         var oct:int = _newKeyFlag >> 24;
  191.         if (--oct < 0) oct=0;
  192.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  193.         allNoteOff();
  194.     }
  195.     
  196.     private function _createBitmap() : void {
  197.         var canvas:Shape = new Shape(), g:Graphics = canvas.graphics, chars:String,
  198.             i:int, mat:Matrix = new Matrix(), rc:Rectangle = new Rectangle(0,8,8,4), label:Label;
  199.         parent.addChild(canvas);
  200.         // white keys
  201.         g.clear();
  202.         g.lineStyle(20);
  203.         mat.createGradientBox(88, Math.PI/2);
  204.         g.beginGradientFill("linear", [0x404040,0xf0f0f0], [1,1], [0,255], mat);
  205.         g.drawRoundRect(0,-4,20,124,8);
  206.         g.endFill();
  207.         g.lineStyle(4, 0x808080, 0.25);
  208.         g.drawPath(Vector.<int>([1,2]), Vector.<Number>([0,-40,120]));
  209.         Style.LABEL_TEXT = 0x666666;
  210.         label = new Label(null,0,0,"");
  211.         chars = "Q  ZXCVBNM,./  W";
  212.         for (i=0; i<16; i++) {
  213.             mat.identity();
  214.             mat.translate(i*20+4020);
  215.             _cls.draw(canvas, mat);
  216.             label.text = chars.charAt(i);
  217.             label.draw();
  218.             mat.translate(496);
  219.             _cls.draw(label, mat);
  220.         }
  221.         // board
  222.         g.clear();
  223.         mat.createGradientBox(2020, Math.PI/2);
  224.         g.beginGradientFill("linear", [0,0x404040,0x202020], [1,1,1], [0,192,255], mat);
  225.         g.drawRect(0,0,400,20);
  226.         g.endFill();
  227.         _cls.draw(canvas);
  228.         // octave
  229.         label.text = "oct.";
  230.         label.draw();
  231.         mat.identity();
  232.         mat.translate(40);
  233.         _cls.draw(label, mat);
  234.         for (rc.x=30; rc.x<136; rc.x+=16) _cls.fillRect(rc, 0);
  235.         g.clear();
  236.         mat.createGradientBox(880);
  237.         g.beginGradientFill("radial", [0xff8040,0x800000], [1,0], [0,255], mat);
  238.         g.drawCircle(668);
  239.         g.endFill();
  240.         _light.draw(canvas);
  241.         // logo
  242.         label.text = "SiON FM Synthesizer WF-1";
  243.         label.draw();
  244.         mat.identity();
  245.         mat.translate(280, -2);
  246.         _cls.draw(label, mat);
  247.         // black keys
  248.         g.clear();
  249.         g.beginFill(0x808080, 0.25);
  250.         g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([12,016,018,7512,82]));
  251.         g.endFill();
  252.         g.lineStyle(20);
  253.         g.beginFill(0x303030);
  254.         g.drawRoundRect(0,0,12,80,3);
  255.         g.endFill();
  256.         g.lineStyle(3, 0x606060, 0.5);
  257.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,738,73]));
  258.         g.lineStyle(1, 0xc0c0c0, 0.5);
  259.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,717,71]));
  260.         Style.LABEL_TEXT = 0xaaaaaa;
  261.         label = new Label(null,0,0,"");
  262.         var pos:Array = [-8,14,36,72,96,132,154,176,212,236,272,294,316];
  263.         chars = "   SDGHJL;   ";
  264.         for (i=0; i<pos.length; i++) {
  265.             mat.identity();
  266.             mat.translate(pos[i], 0);
  267.             _bkeyBase.draw(canvas, mat);
  268.             label.text = chars.charAt(i);
  269.             label.draw();
  270.             mat.translate(150);
  271.             _bkeyBase.draw(label, mat);
  272.         }
  273.         // Filter pad
  274.         label.text = "Filter";
  275.         label.draw();
  276.         mat.identity();
  277.         mat.translate(684);
  278.         _cls.draw(label, mat);
  279.         _cls.fillRect(new Rectangle(8,104,24,24), 0);
  280.         
  281.         parent.removeChild(canvas);
  282.     }
  283.     
  284.     private function _onEnterFrame(e:Event) : void {
  285.         if (_keyFlag != _newKeyFlag || _padUpdated) {
  286.             _keyFlag = _newKeyFlag;
  287.             _padUpdated = false;
  288.             _screen.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  289.             var i:int, mat:Matrix = new Matrix(1,0,0,1,0,20), pt:Point = new Point(4020);
  290.             for  (i=0; i<_wkeyIndex.length; i++) {
  291.                 if (_keyFlag & (1<<_wkeyIndex[i])) {
  292.                     mat.tx = _wkeyPos[i];
  293.                     _screen.draw(_wkeyPushed, mat);
  294.                 }
  295.             }
  296.             _screen.copyPixels(_bkeyBase, _bkeyBase.rect, pt);
  297.             for  (i=0; i<_bkeyIndex.length; i++) {
  298.                 if (_keyFlag & (1<<_bkeyIndex[i])) {
  299.                     mat.tx = _bkeyPos[i];
  300.                     _screen.draw(_bkeyPushed, mat);
  301.                 }
  302.             }
  303.             pt.x = octave*16-2;
  304.             pt.y = 6;
  305.             _screen.copyPixels(_light, _light.rect, pt);
  306.             pt.x = int(resonance*23) + 4;
  307.             pt.y = 123 - int(cutoff*23);
  308.             _screen.copyPixels(_light, _light.rect, pt);
  309.         }
  310.     }
  311.     
  312.     private var _draggingStart:Point;
  313.     private function _onMouseDown(e:MouseEvent) : void { 
  314.         if (mouseX>4 && mouseX<36 && mouseY>104 && mouseY<136) {
  315.             _draggingStart = new Point(mouseX-resonance*50, mouseY+cutoff*50);
  316.         }
  317.     }
  318.     private function _onMouseUp(e:MouseEvent) : void { _draggingStart = null; }
  319.     private function _onMouseMove(e:MouseEvent) : void {
  320.         if (_draggingStart) {
  321.             resonance = (mouseX - _draggingStart.x) * 0.02;
  322.             if (resonance < 0) resonance = 0;
  323.             else if (resonance > 0.9) resonance = 0.9;
  324.             cutoff = (_draggingStart.y - mouseY) * 0.02;
  325.             if (cutoff < 0) cutoff = 0;
  326.             else if (cutoff > 1) cutoff = 1;
  327.             _padUpdated = true;
  328.             lpf.control(cutoff, resonance);
  329.         }
  330.     }
  331. }
  332. class VoiceSelector extends Sprite {
  333.     private var _cursor:Bitmap = new Bitmap(new BitmapData(4814true, 0x408080ff));
  334.     private var _categolies:Sprite = new Sprite();
  335.     private var _voiceName:Label;
  336.     
  337.     function VoiceSelector(parent:DisplayObjectContainer, x:Number, y:Number) {
  338.         this.x = x;
  339.         this.y = y;
  340.         parent.addChild(this);
  341.         _categolies.x = 1;
  342.         _categolies.y = 18;
  343.         addChild(_categolies);
  344.         var imax:int = presetVoice.categolies.length, button:PushButton;
  345.         for (var i:int=0; i<imax; i++) {
  346.             var list:Array = presetVoice.categolies[i],
  347.                 label:String = (list.name.charAt() == "v") ? list.name.substr(9) : list.name;
  348.             button = new PushButton(_categolies, (i&7)*50, (i>>3)*16label, _onCategolyPushed);
  349.             button.setSize(4814);
  350.         }
  351.     
  352.         (new PushButton(this,  12"-"function(e:Event) : void { updateVoice(voiceIndex-1); })).setSize(1414);
  353.         (new PushButton(this172"+"function(e:Event) : void { updateVoice(voiceIndex+1); })).setSize(1414);
  354.         _categolies.addChild(_cursor);
  355.         _voiceName = new Label(this330"SiON preset voices are from VAL-SOUND");
  356.         _voiceName.setSize(20018);
  357.     }
  358.     
  359.     private function _onCategolyPushed(e:Event) : void {
  360.         _cursor.x = e.target.x;
  361.         _cursor.y = e.target.y;
  362.         updateCategoly(int((_cursor.x+10)*0.02) + (int(_cursor.y>8)<<3));
  363.     }
  364.     public function updateName() : void {
  365.         var str:String = ("00"+String(voiceIndex+1)).substr(-3,3) + "; ";
  366.         str += voiceList[voiceIndex].name;
  367.         _voiceName.text = str;
  368.     }
  369.     
  370.     public function onUpdateCategoly() : void {
  371.         _cursor.x = (categolyIndex&7)*50;
  372.         _cursor.y = (categolyIndex>>3)*16;
  373.     }
  374. }
  375. class VolumePanel extends Sprite {
  376.     private var _rev:Knob, _cho:Knob, _prg:Knob;
  377.     function VolumePanel(parent:DisplayObjectContainer, x:Number, y:Number) {
  378.         this.x = x;
  379.         this.y = y;
  380.         parent.addChild(this);
  381.         _prg = _newKnob(this12,   0"Voice",  _onChangeVoice);
  382.         _rev = _newKnob(this372,  0"Delay",  _onChangeEffect);
  383.         _cho = _newKnob(this37260"Chorus", _onChangeEffect);
  384.         _prg.showValue = false;
  385.         _rev.value = 20;
  386.         
  387.         function _newKnob(cont:DisplayObjectContainer, x:Number, y:Numberlabel:String, cb:Function) : Knob {
  388.             var ret:Knob = new Knob(cont, x, y, label, cb);
  389.             ret.setSize(1616);
  390.             return ret;
  391.         }
  392.     }
  393.     
  394.     public function onUpdateCategoly() : void {
  395.         _prg.minimum = 0;
  396.         _prg.maximum = voiceList.length;
  397.         _prg.value = voiceIndex;
  398.         _prg.mouseRange = (voiceList.length<20) ? 100 : 200;
  399.     }
  400.     
  401.     public function updateVoiceIndex() : void {
  402.         _prg.value = voiceIndex;
  403.     }
  404.     
  405.     private function _onChangeVoice(e:Event) : void {
  406.         updateVoice(int(_prg.value), true);
  407.     }
  408.     
  409.     private function _onChangeEffect(e:Event) : void {
  410.         delaySendLevel  = _rev.value * 0.01;
  411.         chorusSendLevel = _cho.value * 0.01;
  412.     }
  413. }
noswf
  1. // forked from manrrioqui's forked from: SiON FM Synthesizer WF-1
  2. // forked from keim_at_Si's SiON FM Synthesizer WF-1
  3. // SiON Keyborad WF1 ver0.58
  4. package {
  5.     import flash.display.Sprite;
  6.     import flash.events.*;
  7.     import flash.system.System;
  8.     import com.bit101.components.*;
  9.     
  10.     [SWF(width="400", height="220")] 
  11.     public class main extends Sprite {
  12.         function main() {
  13.             graphics.beginFill(0);
  14.             graphics.drawRect(0,0,400,220);
  15.             graphics.endFill();
  16.             
  17.             addChild(keyboard = new Sprite());
  18.             keyboard.x = 0;
  19.             keyboard.y = 0;
  20.             
  21.             keys = new KeyDisplay(keyboard, 054);
  22.             Style.BACKGROUND = 0x141414;
  23.             Style.BUTTON_FACE = 0x404040;
  24.             Style.LABEL_TEXT = 0xaaaaaa;
  25.             Style.DROPSHADOW = 0;
  26.             Style.PANEL = 0x202020;
  27.             Style.PROGRESS_BAR = 0x404040;
  28.             selector = new VoiceSelector(keyboard, 00);
  29.             volume = new VolumePanel(keyboard, 078);
  30.             stage.addEventListener("keyDown", _onKeyDown);
  31.             stage.addEventListener("keyUp", _onKeyUp);
  32.             var disc:String = "[ UP / DOWN ] = Change Voice      ";
  33.             disc += "[ LEFT / RIGHT ] = Change Categoly     ";
  34.             disc += "[ Q / W ] = Octave";
  35.             new Label(keyboard, 0204, disc);
  36.             
  37.             disc = "[ P ] = Send parameters to clipboard";
  38.             clipboard = new Text(keyboard, 16230, disc);
  39.             clipboard.setSize(00);
  40.             
  41.             initializeSiON();
  42.         }
  43.         
  44.         private function _onKeyDown(e:KeyboardEvent) : void {
  45.             var i:int, c:String, mml:String;
  46.             switch (e.keyCode) {
  47.             case 40: updateVoice(voiceIndex-1); break;
  48.             case 38: updateVoice(voiceIndex+1); break;
  49.             case 37: updateCategoly(categolyIndex-1); break;
  50.             case 39: updateCategoly(categolyIndex+1); break;
  51.             default:
  52.                 switch (c = String.fromCharCode(e.charCode)) {
  53.                 case 'q': keys.octDown(); break;
  54.                 case 'w': keys.octUp();   break;
  55.                 case 'p'
  56.                     mml = voiceList[voiceIndex].getMML(voiceIndex);
  57.                     clipboard.text = "[ P ] = Send parameters to clipboard \n" + mml.replace(/\r/g, '');
  58.                     System.setClipboard(mml);
  59.                     break;
  60.                 default:  if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOn(i); break;
  61.                 }
  62.             }
  63.         }
  64.         
  65.         private function _onKeyUp(e:KeyboardEvent) : void {
  66.             var i:int, c:String = String.fromCharCode(e.charCode);
  67.             if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOff(i);
  68.         }
  69.     }
  70. }
  71. import flash.display.*;
  72. import flash.events.*;
  73. import flash.filters.*;
  74. import flash.text.*;
  75. import flash.geom.*;
  76. import com.bit101.components.*;
  77. import org.si.sion.*;
  78. import org.si.sion.effector.*;
  79. import org.si.sion.sequencer.SiMMLTrack;
  80. import org.si.sion.utils.SiONPresetVoice;
  81. // SiON variables
  82. var driver:SiONDriver = new SiONDriver();
  83. var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  84. var voiceList:Array = presetVoice.categolies[0];
  85. var voiceIndex:int = 0;
  86. var categolyIndex:int = 0;
  87. var delaySendLevel:Number = 0.2;
  88. var chorusSendLevel:Number = 0;
  89. var lpf:SiCtrlFilterLowPass = new SiCtrlFilterLowPass();
  90. var cutoff:Number = 1;
  91. var resonance:Number = 0;
  92. // UIs
  93. var keyboard:Sprite;
  94. var keys:KeyDisplay;
  95. var selector:VoiceSelector;
  96. var volume:VolumePanel;
  97. var keyFlag:int;
  98. var clipboard:Text;
  99. // Global Functions
  100. function initializeSiON() : void {
  101.     // effector setting
  102.     lpf.initialize();
  103.     lpf.control(10);
  104.     var dly:SiEffectStereoDelay  = new SiEffectStereoDelay();
  105.     dly.initialize();
  106.     dly.setParameters(200,0.2,false);
  107.     var cho:SiEffectStereoChorus = new SiEffectStereoChorus();
  108.     cho.initialize();
  109.     cho.setParameters(20,0.2,4,20);
  110.     
  111.     driver.effector.initialize();
  112.     driver.effector.connect(0, lpf);
  113.     driver.effector.connect(1, dly);
  114.     driver.effector.connect(2, cho);
  115.     
  116.     // start stream without initializing effectors
  117.     driver.play(nullfalse);
  118. }
  119. function updateCategoly(index:int) : void {
  120.     var imax:int = presetVoice.categolies.length;
  121.     if (index < 0) index = imax - 1;
  122.     else if (index >= imax) index = 0;
  123.     categolyIndex = index;
  124.     voiceList = presetVoice.categolies[index];
  125.     selector.onUpdateCategoly();
  126.     volume.onUpdateCategoly();
  127.     updateVoice(voiceIndex);
  128. }
  129. function updateVoice(index:int, callFromKnob:Boolean=false) : void {
  130.     if (voiceList) {
  131.         if (index < 0) index = 0;
  132.         else if (index >= voiceList.length) index = voiceList.length - 1;
  133.         voiceIndex = index;
  134.         selector.updateName();
  135.         if (!callFromKnob) volume.updateVoiceIndex();
  136.     }
  137. }
  138. function keyOn(index:int) : void {
  139.     if ((keyFlag & (1<<index)) == 0) {
  140.         keyFlag |= 1<<index;
  141.         var trk:SiMMLTrack = driver.noteOn(index + keys.octave*12, voiceList[voiceIndex], 0);
  142.         trk.channel.setStreamSend(1, delaySendLevel);
  143.         trk.channel.setStreamSend(2, chorusSendLevel);
  144.         keys.keyOn(index);
  145.     }
  146. }
  147. function keyOff(index:int) : void {
  148.     keyFlag &= ~(1<<index);
  149.     driver.noteOff(index + keys.octave*12);
  150.     keys.keyOff(index);
  151. }
  152. function allNoteOff() : void {
  153.     for each (var trk:SiMMLTrack in driver.sequencer.tracks) trk.keyOff();
  154. }
  155. class KeyDisplay extends Sprite {
  156.     private var _screenBitmap:Bitmap;
  157.     private var _screen:BitmapData = new BitmapData(400144false0);
  158.     private var _cls:BitmapData = new BitmapData(400144false, 0x202020);
  159.     private var _bkeyBase:BitmapData = new BitmapData(320120true0);
  160.     private var _wkeyPos:Array = [100,120,140,160,180,200,220,240,260,280];
  161.     private var _bkeyPos:Array = [112,136,172,194,216,252,276];
  162.     private var _wkeyIndex:Array = [0,2,4,5,7,9,11,12,14,16];
  163.     private var _bkeyIndex:Array = [1,3,6,8,10,13,15];
  164.     private var _wkeyPushed:BitmapData = new BitmapData(20120true, 0x808080ff);
  165.     private var _bkeyPushed:BitmapData = new BitmapData(1280true, 0x408080ff);
  166.     private var _light:BitmapData = new BitmapData(1212true0);
  167.     private var _keyFlag:int = 0, _newKeyFlag:int = 0x3000000, _padUpdated:Boolean = false;
  168.     
  169.     public function get octave() : int { return (_keyFlag>>24)+2; }
  170.     
  171.     function KeyDisplay(parent:DisplayObjectContainer, x:Number, y:Number) {
  172.         this.x = x;
  173.         this.y = y;
  174.         parent.addChild(this);
  175.         _createBitmap();
  176.         addEventListener("enterFrame", _onEnterFrame);
  177.         addChild(_screenBitmap = new Bitmap(_screen));
  178.         stage.addEventListener("mouseDown", _onMouseDown);
  179.         stage.addEventListener("mouseUp",   _onMouseUp);
  180.         stage.addEventListener("mouseMove", _onMouseMove);
  181.     }
  182.     
  183.     public function keyOn(index:int)  : void { _newKeyFlag = _newKeyFlag | (1<<index); }
  184.     public function keyOff(index:int) : void { _newKeyFlag = _newKeyFlag &~(1<<index); }
  185.     public function octUp() : void { 
  186.         var oct:int = _newKeyFlag >> 24;
  187.         if (++oct > 6) oct=6;
  188.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  189.         allNoteOff();
  190.     }
  191.     public function octDown() : void { 
  192.         var oct:int = _newKeyFlag >> 24;
  193.         if (--oct < 0) oct=0;
  194.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  195.         allNoteOff();
  196.     }
  197.     
  198.     private function _createBitmap() : void {
  199.         var canvas:Shape = new Shape(), g:Graphics = canvas.graphics, chars:String,
  200.             i:int, mat:Matrix = new Matrix(), rc:Rectangle = new Rectangle(0,8,8,4), label:Label;
  201.         parent.addChild(canvas);
  202.         // white keys
  203.         g.clear();
  204.         g.lineStyle(20);
  205.         mat.createGradientBox(88, Math.PI/2);
  206.         g.beginGradientFill("linear", [0x404040,0xf0f0f0], [1,1], [0,255], mat);
  207.         g.drawRoundRect(0,-4,20,124,8);
  208.         g.endFill();
  209.         g.lineStyle(4, 0x808080, 0.25);
  210.         g.drawPath(Vector.<int>([1,2]), Vector.<Number>([0,-40,120]));
  211.         Style.LABEL_TEXT = 0x666666;
  212.         label = new Label(null,0,0,"");
  213.         chars = "Q  ZXCVBNM,./  W";
  214.         for (i=0; i<16; i++) {
  215.             mat.identity();
  216.             mat.translate(i*20+4020);
  217.             _cls.draw(canvas, mat);
  218.             label.text = chars.charAt(i);
  219.             label.draw();
  220.             mat.translate(496);
  221.             _cls.draw(label, mat);
  222.         }
  223.         // board
  224.         g.clear();
  225.         mat.createGradientBox(2020, Math.PI/2);
  226.         g.beginGradientFill("linear", [0,0x404040,0x202020], [1,1,1], [0,192,255], mat);
  227.         g.drawRect(0,0,400,20);
  228.         g.endFill();
  229.         _cls.draw(canvas);
  230.         // octave
  231.         label.text = "oct.";
  232.         label.draw();
  233.         mat.identity();
  234.         mat.translate(40);
  235.         _cls.draw(label, mat);
  236.         for (rc.x=30; rc.x<136; rc.x+=16) _cls.fillRect(rc, 0);
  237.         g.clear();
  238.         mat.createGradientBox(880);
  239.         g.beginGradientFill("radial", [0xff8040,0x800000], [1,0], [0,255], mat);
  240.         g.drawCircle(668);
  241.         g.endFill();
  242.         _light.draw(canvas);
  243.         // logo
  244.         label.text = "SiON FM Synthesizer WF-1";
  245.         label.draw();
  246.         mat.identity();
  247.         mat.translate(280, -2);
  248.         _cls.draw(label, mat);
  249.         // black keys
  250.         g.clear();
  251.         g.beginFill(0x808080, 0.25);
  252.         g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([12,016,018,7512,82]));
  253.         g.endFill();
  254.         g.lineStyle(20);
  255.         g.beginFill(0x303030);
  256.         g.drawRoundRect(0,0,12,80,3);
  257.         g.endFill();
  258.         g.lineStyle(3, 0x606060, 0.5);
  259.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,738,73]));
  260.         g.lineStyle(1, 0xc0c0c0, 0.5);
  261.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,717,71]));
  262.         Style.LABEL_TEXT = 0xaaaaaa;
  263.         label = new Label(null,0,0,"");
  264.         var pos:Array = [-8,14,36,72,96,132,154,176,212,236,272,294,316];
  265.         chars = "   SDGHJL;   ";
  266.         for (i=0; i<pos.length; i++) {
  267.             mat.identity();
  268.             mat.translate(pos[i], 0);
  269.             _bkeyBase.draw(canvas, mat);
  270.             label.text = chars.charAt(i);
  271.             label.draw();
  272.             mat.translate(150);
  273.             _bkeyBase.draw(label, mat);
  274.         }
  275.         // Filter pad
  276.         label.text = "Filter";
  277.         label.draw();
  278.         mat.identity();
  279.         mat.translate(684);
  280.         _cls.draw(label, mat);
  281.         _cls.fillRect(new Rectangle(8,104,24,24), 0);
  282.         
  283.         parent.removeChild(canvas);
  284.     }
  285.     
  286.     private function _onEnterFrame(e:Event) : void {
  287.         if (_keyFlag != _newKeyFlag || _padUpdated) {
  288.             _keyFlag = _newKeyFlag;
  289.             _padUpdated = false;
  290.             _screen.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  291.             var i:int, mat:Matrix = new Matrix(1,0,0,1,0,20), pt:Point = new Point(4020);
  292.             for  (i=0; i<_wkeyIndex.length; i++) {
  293.                 if (_keyFlag & (1<<_wkeyIndex[i])) {
  294.                     mat.tx = _wkeyPos[i];
  295.                     _screen.draw(_wkeyPushed, mat);
  296.                 }
  297.             }
  298.             _screen.copyPixels(_bkeyBase, _bkeyBase.rect, pt);
  299.             for  (i=0; i<_bkeyIndex.length; i++) {
  300.                 if (_keyFlag & (1<<_bkeyIndex[i])) {
  301.                     mat.tx = _bkeyPos[i];
  302.                     _screen.draw(_bkeyPushed, mat);
  303.                 }
  304.             }
  305.             pt.x = octave*16-2;
  306.             pt.y = 6;
  307.             _screen.copyPixels(_light, _light.rect, pt);
  308.             pt.x = int(resonance*23) + 4;
  309.             pt.y = 123 - int(cutoff*23);
  310.             _screen.copyPixels(_light, _light.rect, pt);
  311.         }
  312.     }
  313.     
  314.     private var _draggingStart:Point;
  315.     private function _onMouseDown(e:MouseEvent) : void { 
  316.         if (mouseX>4 && mouseX<36 && mouseY>104 && mouseY<136) {
  317.             _draggingStart = new Point(mouseX-resonance*50, mouseY+cutoff*50);
  318.         }
  319.     }
  320.     private function _onMouseUp(e:MouseEvent) : void { _draggingStart = null; }
  321.     private function _onMouseMove(e:MouseEvent) : void {
  322.         if (_draggingStart) {
  323.             resonance = (mouseX - _draggingStart.x) * 0.02;
  324.             if (resonance < 0) resonance = 0;
  325.             else if (resonance > 0.9) resonance = 0.9;
  326.             cutoff = (_draggingStart.y - mouseY) * 0.02;
  327.             if (cutoff < 0) cutoff = 0;
  328.             else if (cutoff > 1) cutoff = 1;
  329.             _padUpdated = true;
  330.             lpf.control(cutoff, resonance);
  331.         }
  332.     }
  333. }
  334. class VoiceSelector extends Sprite {
  335.     private var _cursor:Bitmap = new Bitmap(new BitmapData(4814true, 0x408080ff));
  336.     private var _categolies:Sprite = new Sprite();
  337.     private var _voiceName:Label;
  338.     
  339.     function VoiceSelector(parent:DisplayObjectContainer, x:Number, y:Number) {
  340.         this.x = x;
  341.         this.y = y;
  342.         parent.addChild(this);
  343.         _categolies.x = 1;
  344.         _categolies.y = 18;
  345.         addChild(_categolies);
  346.         var imax:int = presetVoice.categolies.length, button:PushButton;
  347.         for (var i:int=0; i<imax; i++) {
  348.             var list:Array = presetVoice.categolies[i],
  349.                 label:String = (list.name.charAt() == "v") ? list.name.substr(9) : list.name;
  350.             button = new PushButton(_categolies, (i&7)*50, (i>>3)*16label, _onCategolyPushed);
  351.             button.setSize(4814);
  352.         }
  353.     
  354.         (new PushButton(this,  12"-"function(e:Event) : void { updateVoice(voiceIndex-1); })).setSize(1414);
  355.         (new PushButton(this172"+"function(e:Event) : void { updateVoice(voiceIndex+1); })).setSize(1414);
  356.         _categolies.addChild(_cursor);
  357.         _voiceName = new Label(this330"SiON preset voices are from VAL-SOUND");
  358.         _voiceName.setSize(20018);
  359.     }
  360.     
  361.     private function _onCategolyPushed(e:Event) : void {
  362.         _cursor.x = e.target.x;
  363.         _cursor.y = e.target.y;
  364.         updateCategoly(int((_cursor.x+10)*0.02) + (int(_cursor.y>8)<<3));
  365.     }
  366.     public function updateName() : void {
  367.         var str:String = ("00"+String(voiceIndex+1)).substr(-3,3) + "; ";
  368.         str += voiceList[voiceIndex].name;
  369.         _voiceName.text = str;
  370.     }
  371.     
  372.     public function onUpdateCategoly() : void {
  373.         _cursor.x = (categolyIndex&7)*50;
  374.         _cursor.y = (categolyIndex>>3)*16;
  375.     }
  376. }
  377. class VolumePanel extends Sprite {
  378.     private var _rev:Knob, _cho:Knob, _prg:Knob;
  379.     function VolumePanel(parent:DisplayObjectContainer, x:Number, y:Number) {
  380.         this.x = x;
  381.         this.y = y;
  382.         parent.addChild(this);
  383.         _prg = _newKnob(this12,   0"Voice",  _onChangeVoice);
  384.         _rev = _newKnob(this372,  0"Delay",  _onChangeEffect);
  385.         _cho = _newKnob(this37260"Chorus", _onChangeEffect);
  386.         _prg.showValue = false;
  387.         _rev.value = 20;
  388.         
  389.         function _newKnob(cont:DisplayObjectContainer, x:Number, y:Numberlabel:String, cb:Function) : Knob {
  390.             var ret:Knob = new Knob(cont, x, y, label, cb);
  391.             ret.setSize(1616);
  392.             return ret;
  393.         }
  394.     }
  395.     
  396.     public function onUpdateCategoly() : void {
  397.         _prg.minimum = 0;
  398.         _prg.maximum = voiceList.length;
  399.         _prg.value = voiceIndex;
  400.         _prg.mouseRange = (voiceList.length<20) ? 100 : 200;
  401.     }
  402.     
  403.     public function updateVoiceIndex() : void {
  404.         _prg.value = voiceIndex;
  405.     }
  406.     
  407.     private function _onChangeVoice(e:Event) : void {
  408.         updateVoice(int(_prg.value), true);
  409.     }
  410.     
  411.     private function _onChangeEffect(e:Event) : void {
  412.         delaySendLevel  = _rev.value * 0.01;
  413.         chorusSendLevel = _cho.value * 0.01;
  414.     }
  415. }
noswf
  1. // forked from keim_at_Si's SiON FM Synthesizer WF-1
  2. // SiON Keyborad WF1 ver0.58
  3. package {
  4.     import flash.display.Sprite;
  5.     import flash.events.*;
  6.     import flash.system.System;
  7.     import com.bit101.components.*;
  8.     
  9.     public class main extends Sprite {
  10.         function main() {
  11.             graphics.beginFill(0);
  12.             graphics.drawRect(0,0,465,465);
  13.             graphics.endFill();
  14.             
  15.             addChild(keyboard = new Sprite());
  16.             keyboard.x = 0;
  17.             keyboard.y = 120;
  18.             
  19.             keys = new KeyDisplay(keyboard, 3254);
  20.             Style.BACKGROUND = 0x606060;
  21.             Style.BUTTON_FACE = 0x404040;
  22.             Style.LABEL_TEXT = 0xaaaaaa;
  23.             Style.DROPSHADOW = 0;
  24.             Style.PANEL = 0x202020;
  25.             Style.PROGRESS_BAR = 0x404040;
  26.             selector = new VoiceSelector(keyboard, 320);
  27.             volume = new VolumePanel(keyboard, 3278);
  28.             stage.addEventListener("keyDown", _onKeyDown);
  29.             stage.addEventListener("keyUp", _onKeyUp);
  30.             var disc:String = "[ UP / DOWN ] = Change Voice      ";
  31.             disc += "[ LEFT / RIGHT ] = Change Categoly      ";
  32.             disc += "[ Q / W ] = Octave Shift";
  33.             new Label(keyboard, 16204, disc);
  34.             
  35.             disc = "[ P ] = Send parameters to clipboard";
  36.             clipboard = new Text(keyboard, 16230, disc);
  37.             clipboard.setSize(43396);
  38.             
  39.             initializeSiON();
  40.         }
  41.         
  42.         private function _onKeyDown(e:KeyboardEvent) : void {
  43.             var i:int, c:String, mml:String;
  44.             switch (e.keyCode) {
  45.             case 40: updateVoice(voiceIndex-1); break;
  46.             case 38: updateVoice(voiceIndex+1); break;
  47.             case 37: updateCategoly(categolyIndex-1); break;
  48.             case 39: updateCategoly(categolyIndex+1); break;
  49.             default:
  50.                 switch (c = String.fromCharCode(e.charCode)) {
  51.                 case 'q': keys.octDown(); break;
  52.                 case 'w': keys.octUp();   break;
  53.                 case 'p'
  54.                     mml = voiceList[voiceIndex].getMML(voiceIndex);
  55.                     clipboard.text = "[ P ] = Send parameters to clipboard \n" + mml.replace(/\r/g, '');
  56.                     System.setClipboard(mml);
  57.                     break;
  58.                 default:  if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOn(i); break;
  59.                 }
  60.             }
  61.         }
  62.         
  63.         private function _onKeyUp(e:KeyboardEvent) : void {
  64.             var i:int, c:String = String.fromCharCode(e.charCode);
  65.             if ((i="zsxdcvgbhnjm,l.;/".indexOf(c)) >= 0) keyOff(i);
  66.         }
  67.     }
  68. }
  69. import flash.display.*;
  70. import flash.events.*;
  71. import flash.filters.*;
  72. import flash.text.*;
  73. import flash.geom.*;
  74. import com.bit101.components.*;
  75. import org.si.sion.*;
  76. import org.si.sion.effector.*;
  77. import org.si.sion.sequencer.SiMMLTrack;
  78. import org.si.sion.utils.SiONPresetVoice;
  79. // SiON variables
  80. var driver:SiONDriver = new SiONDriver();
  81. var presetVoice:SiONPresetVoice = new SiONPresetVoice();
  82. var voiceList:Array = presetVoice.categolies[0];
  83. var voiceIndex:int = 0;
  84. var categolyIndex:int = 0;
  85. var delaySendLevel:Number = 0.2;
  86. var chorusSendLevel:Number = 0;
  87. var lpf:SiCtrlFilterLowPass = new SiCtrlFilterLowPass();
  88. var cutoff:Number = 1;
  89. var resonance:Number = 0;
  90. // UIs
  91. var keyboard:Sprite;
  92. var keys:KeyDisplay;
  93. var selector:VoiceSelector;
  94. var volume:VolumePanel;
  95. var keyFlag:int;
  96. var clipboard:Text;
  97. // Global Functions
  98. function initializeSiON() : void {
  99.     // effector setting
  100.     lpf.initialize();
  101.     lpf.control(10);
  102.     var dly:SiEffectStereoDelay  = new SiEffectStereoDelay();
  103.     dly.initialize();
  104.     dly.setParameters(200,0.2,false);
  105.     var cho:SiEffectStereoChorus = new SiEffectStereoChorus();
  106.     cho.initialize();
  107.     cho.setParameters(20,0.2,4,20);
  108.     
  109.     driver.effector.initialize();
  110.     driver.effector.connect(0, lpf);
  111.     driver.effector.connect(1, dly);
  112.     driver.effector.connect(2, cho);
  113.     
  114.     // start stream without initializing effectors
  115.     driver.play(nullfalse);
  116. }
  117. function updateCategoly(index:int) : void {
  118.     var imax:int = presetVoice.categolies.length;
  119.     if (index < 0) index = imax - 1;
  120.     else if (index >= imax) index = 0;
  121.     categolyIndex = index;
  122.     voiceList = presetVoice.categolies[index];
  123.     selector.onUpdateCategoly();
  124.     volume.onUpdateCategoly();
  125.     updateVoice(voiceIndex);
  126. }
  127. function updateVoice(index:int, callFromKnob:Boolean=false) : void {
  128.     if (voiceList) {
  129.         if (index < 0) index = 0;
  130.         else if (index >= voiceList.length) index = voiceList.length - 1;
  131.         voiceIndex = index;
  132.         selector.updateName();
  133.         if (!callFromKnob) volume.updateVoiceIndex();
  134.     }
  135. }
  136. function keyOn(index:int) : void {
  137.     if ((keyFlag & (1<<index)) == 0) {
  138.         keyFlag |= 1<<index;
  139.         var trk:SiMMLTrack = driver.noteOn(index + keys.octave*12, voiceList[voiceIndex], 0);
  140.         trk.channel.setStreamSend(1, delaySendLevel);
  141.         trk.channel.setStreamSend(2, chorusSendLevel);
  142.         keys.keyOn(index);
  143.     }
  144. }
  145. function keyOff(index:int) : void {
  146.     keyFlag &= ~(1<<index);
  147.     driver.noteOff(index + keys.octave*12);
  148.     keys.keyOff(index);
  149. }
  150. function allNoteOff() : void {
  151.     for each (var trk:SiMMLTrack in driver.sequencer.tracks) trk.keyOff();
  152. }
  153. class KeyDisplay extends Sprite {
  154.     private var _screenBitmap:Bitmap;
  155.     private var _screen:BitmapData = new BitmapData(400144false0);
  156.     private var _cls:BitmapData = new BitmapData(400144false, 0x202020);
  157.     private var _bkeyBase:BitmapData = new BitmapData(320120true0);
  158.     private var _wkeyPos:Array = [100,120,140,160,180,200,220,240,260,280];
  159.     private var _bkeyPos:Array = [112,136,172,194,216,252,276];
  160.     private var _wkeyIndex:Array = [0,2,4,5,7,9,11,12,14,16];
  161.     private var _bkeyIndex:Array = [1,3,6,8,10,13,15];
  162.     private var _wkeyPushed:BitmapData = new BitmapData(20120true, 0x808080ff);
  163.     private var _bkeyPushed:BitmapData = new BitmapData(1280true, 0x408080ff);
  164.     private var _light:BitmapData = new BitmapData(1212true0);
  165.     private var _keyFlag:int = 0, _newKeyFlag:int = 0x3000000, _padUpdated:Boolean = false;
  166.     
  167.     public function get octave() : int { return (_keyFlag>>24)+2; }
  168.     
  169.     function KeyDisplay(parent:DisplayObjectContainer, x:Number, y:Number) {
  170.         this.x = x;
  171.         this.y = y;
  172.         parent.addChild(this);
  173.         _createBitmap();
  174.         addEventListener("enterFrame", _onEnterFrame);
  175.         addChild(_screenBitmap = new Bitmap(_screen));
  176.         stage.addEventListener("mouseDown", _onMouseDown);
  177.         stage.addEventListener("mouseUp",   _onMouseUp);
  178.         stage.addEventListener("mouseMove", _onMouseMove);
  179.     }
  180.     
  181.     public function keyOn(index:int)  : void { _newKeyFlag = _newKeyFlag | (1<<index); }
  182.     public function keyOff(index:int) : void { _newKeyFlag = _newKeyFlag &~(1<<index); }
  183.     public function octUp() : void { 
  184.         var oct:int = _newKeyFlag >> 24;
  185.         if (++oct > 6) oct=6;
  186.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  187.         allNoteOff();
  188.     }
  189.     public function octDown() : void { 
  190.         var oct:int = _newKeyFlag >> 24;
  191.         if (--oct < 0) oct=0;
  192.         _newKeyFlag = (oct<<24) | (_newKeyFlag & 0xffffff);
  193.         allNoteOff();
  194.     }
  195.     
  196.     private function _createBitmap() : void {
  197.         var canvas:Shape = new Shape(), g:Graphics = canvas.graphics, chars:String,
  198.             i:int, mat:Matrix = new Matrix(), rc:Rectangle = new Rectangle(0,8,8,4), label:Label;
  199.         parent.addChild(canvas);
  200.         // white keys
  201.         g.clear();
  202.         g.lineStyle(20);
  203.         mat.createGradientBox(88, Math.PI/2);
  204.         g.beginGradientFill("linear", [0x404040,0xf0f0f0], [1,1], [0,255], mat);
  205.         g.drawRoundRect(0,-4,20,124,8);
  206.         g.endFill();
  207.         g.lineStyle(4, 0x808080, 0.25);
  208.         g.drawPath(Vector.<int>([1,2]), Vector.<Number>([0,-40,120]));
  209.         Style.LABEL_TEXT = 0x666666;
  210.         label = new Label(null,0,0,"");
  211.         chars = "Q  ZXCVBNM,./  W";
  212.         for (i=0; i<16; i++) {
  213.             mat.identity();
  214.             mat.translate(i*20+4020);
  215.             _cls.draw(canvas, mat);
  216.             label.text = chars.charAt(i);
  217.             label.draw();
  218.             mat.translate(496);
  219.             _cls.draw(label, mat);
  220.         }
  221.         // board
  222.         g.clear();
  223.         mat.createGradientBox(2020, Math.PI/2);
  224.         g.beginGradientFill("linear", [0,0x404040,0x202020], [1,1,1], [0,192,255], mat);
  225.         g.drawRect(0,0,400,20);
  226.         g.endFill();
  227.         _cls.draw(canvas);
  228.         // octave
  229.         label.text = "oct.";
  230.         label.draw();
  231.         mat.identity();
  232.         mat.translate(40);
  233.         _cls.draw(label, mat);
  234.         for (rc.x=30; rc.x<136; rc.x+=16) _cls.fillRect(rc, 0);
  235.         g.clear();
  236.         mat.createGradientBox(880);
  237.         g.beginGradientFill("radial", [0xff8040,0x800000], [1,0], [0,255], mat);
  238.         g.drawCircle(668);
  239.         g.endFill();
  240.         _light.draw(canvas);
  241.         // logo
  242.         label.text = "SiON FM Synthesizer WF-1";
  243.         label.draw();
  244.         mat.identity();
  245.         mat.translate(280, -2);
  246.         _cls.draw(label, mat);
  247.         // black keys
  248.         g.clear();
  249.         g.beginFill(0x808080, 0.25);
  250.         g.drawPath(Vector.<int>([1,2,2,2]), Vector.<Number>([12,016,018,7512,82]));
  251.         g.endFill();
  252.         g.lineStyle(20);
  253.         g.beginFill(0x303030);
  254.         g.drawRoundRect(0,0,12,80,3);
  255.         g.endFill();
  256.         g.lineStyle(3, 0x606060, 0.5);
  257.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,738,73]));
  258.         g.lineStyle(1, 0xc0c0c0, 0.5);
  259.         g.drawPath(Vector.<int>([1,2,2]), Vector.<Number>([2,02,717,71]));
  260.         Style.LABEL_TEXT = 0xaaaaaa;
  261.         label = new Label(null,0,0,"");
  262.         var pos:Array = [-8,14,36,72,96,132,154,176,212,236,272,294,316];
  263.         chars = "   SDGHJL;   ";
  264.         for (i=0; i<pos.length; i++) {
  265.             mat.identity();
  266.             mat.translate(pos[i], 0);
  267.             _bkeyBase.draw(canvas, mat);
  268.             label.text = chars.charAt(i);
  269.             label.draw();
  270.             mat.translate(150);
  271.             _bkeyBase.draw(label, mat);
  272.         }
  273.         // Filter pad
  274.         label.text = "Filter";
  275.         label.draw();
  276.         mat.identity();
  277.         mat.translate(684);
  278.         _cls.draw(label, mat);
  279.         _cls.fillRect(new Rectangle(8,104,24,24), 0);
  280.         
  281.         parent.removeChild(canvas);
  282.     }
  283.     
  284.     private function _onEnterFrame(e:Event) : void {
  285.         if (_keyFlag != _newKeyFlag || _padUpdated) {
  286.             _keyFlag = _newKeyFlag;
  287.             _padUpdated = false;
  288.             _screen.copyPixels(_cls, _cls.rect, _cls.rect.topLeft);
  289.             var i:int, mat:Matrix = new Matrix(1,0,0,1,0,20), pt:Point = new Point(4020);
  290.             for  (i=0; i<_wkeyIndex.length; i++) {
  291.                 if (_keyFlag & (1<<_wkeyIndex[i])) {
  292.                     mat.tx = _wkeyPos[i];
  293.                     _screen.draw(_wkeyPushed, mat);
  294.                 }
  295.             }
  296.             _screen.copyPixels(_bkeyBase, _bkeyBase.rect, pt);
  297.             for  (i=0; i<_bkeyIndex.length; i++) {
  298.                 if (_keyFlag & (1<<_bkeyIndex[i])) {
  299.                     mat.tx = _bkeyPos[i];
  300.                     _screen.draw(_bkeyPushed, mat);
  301.                 }
  302.             }
  303.             pt.x = octave*16-2;
  304.             pt.y = 6;
  305.             _screen.copyPixels(_light, _light.rect, pt);
  306.             pt.x = int(resonance*23) + 4;
  307.             pt.y = 123 - int(cutoff*23);
  308.             _screen.copyPixels(_light, _light.rect, pt);
  309.         }
  310.     }
  311.     
  312.     private var _draggingStart:Point;
  313.     private function _onMouseDown(e:MouseEvent) : void { 
  314.         if (mouseX>4 && mouseX<36 && mouseY>104 && mouseY<136) {
  315.             _draggingStart = new Point(mouseX-resonance*50, mouseY+cutoff*50);
  316.         }
  317.     }
  318.     private function _onMouseUp(e:MouseEvent) : void { _draggingStart = null; }
  319.     private function _onMouseMove(e:MouseEvent) : void {
  320.         if (_draggingStart) {
  321.             resonance = (mouseX - _draggingStart.x) * 0.02;
  322.             if (resonance < 0) resonance = 0;
  323.             else if (resonance > 0.9) resonance = 0.9;
  324.             cutoff = (_draggingStart.y - mouseY) * 0.02;
  325.             if (cutoff < 0) cutoff = 0;
  326.             else if (cutoff > 1) cutoff = 1;
  327.             _padUpdated = true;
  328.             lpf.control(cutoff, resonance);
  329.         }
  330.     }
  331. }
  332. class VoiceSelector extends Sprite {
  333.     private var _cursor:Bitmap = new Bitmap(new BitmapData(4814true, 0x408080ff));
  334.     private var _categolies:Sprite = new Sprite();
  335.     private var _voiceName:Label;
  336.     
  337.     function VoiceSelector(parent:DisplayObjectContainer, x:Number, y:Number) {
  338.         this.x = x;
  339.         this.y = y;
  340.         parent.addChild(this);
  341.         _categolies.x = 1;
  342.         _categolies.y = 18;
  343.         addChild(_categolies);
  344.         var imax:int = presetVoice.categolies.length, button:PushButton;
  345.         for (var i:int=0; i<imax; i++) {
  346.             var list:Array = presetVoice.categolies[i],
  347.                 label:String = (list.name.charAt() == "v") ? list.name.substr(9) : list.name;
  348.             button = new PushButton(_categolies, (i&7)*50, (i>>3)*16label, _onCategolyPushed);
  349.             button.setSize(4814);
  350.         }
  351.     
  352.         (new PushButton(this,  12"-"function(e:Event) : void { updateVoice(voiceIndex-1); })).setSize(1414);
  353.         (new PushButton(this172"+"function(e:Event) : void { updateVoice(voiceIndex+1); })).setSize(1414);
  354.         _categolies.addChild(_cursor);
  355.         _voiceName = new Label(this330"SiON preset voices are from VAL-SOUND");
  356.         _voiceName.setSize(20018);
  357.     }
  358.     
  359.     private function _onCategolyPushed(e:Event) : void {
  360.         _cursor.x = e.target.x;
  361.         _cursor.y = e.target.y;
  362.         updateCategoly(int((_cursor.x+10)*0.02) + (int(_cursor.y>8)<<3));
  363.     }
  364.     public function updateName() : void {
  365.         var str:String = ("00"+String(voiceIndex+1)).substr(-3,3) + "; ";
  366.         str += voiceList[voiceIndex].name;
  367.         _voiceName.text = str;
  368.     }
  369.     
  370.     public function onUpdateCategoly() : void {
  371.         _cursor.x = (categolyIndex&7)*50;
  372.         _cursor.y = (categolyIndex>>3)*16;
  373.     }
  374. }
  375. class VolumePanel extends Sprite {
  376.     private var _rev:Knob, _cho:Knob, _prg:Knob;
  377.     function VolumePanel(parent:DisplayObjectContainer, x:Number, y:Number) {
  378.         this.x = x;
  379.         this.y = y;
  380.         parent.addChild(this);
  381.         _prg = _newKnob(this12,   0"Voice",  _onChangeVoice);
  382.         _rev = _newKnob(this372,  0"Delay",  _onChangeEffect);
  383.         _cho = _newKnob(this37260"Chorus", _onChangeEffect);
  384.         _prg.showValue = false;
  385.         _rev.value = 20;
  386.         
  387.         function _newKnob(cont:DisplayObjectContainer, x:Number, y:Numberlabel:String, cb:Function) : Knob {
  388.             var ret:Knob = new Knob(cont, x, y, label, cb);
  389.             ret.setSize(1616);
  390.             return ret;
  391.         }
  392.     }
  393.     
  394.     public function onUpdateCategoly() : void {
  395.         _prg.minimum = 0;
  396.         _prg.maximum = voiceList.length;
  397.         _prg.value = voiceIndex;
  398.         _prg.mouseRange = (voiceList.length<20) ? 100 : 200;
  399.     }
  400.     
  401.     public function updateVoiceIndex() : void {
  402.         _prg.value = voiceIndex;
  403.     }
  404.     
  405.     private function _onChangeVoice(e:Event) : void {
  406.         updateVoice(int(_prg.value), true);
  407.     }
  408.     
  409.     private function _onChangeEffect(e:Event) : void {
  410.         delaySendLevel  = _rev.value * 0.01;
  411.         chorusSendLevel = _cho.value * 0.01;
  412.     }
  413. }
noswf
Get Adobe Flash Player