キーボードでピアノ!(動的サウンド)
サイン波
♥0 |
Line 92 |
Modified 2012-08-24 15:05:33 |
MIT License
archived:2017-03-20 03:09:52
ActionScript3 source code
/**
* Copyright Seiya.Kai ( http://wonderfl.net/user/Seiya.Kai )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/jZAr
*/
package
{
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.text.TextField;
public class Main02 extends Sprite
{
private var sd:SoundTest = new SoundTest();
public function Main02()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);
var tf:TextField = new TextField();
tf.text="キーボードで音を鳴らせます\nA=ド、S=レ、D=ミ、F=ファ、G=ソ、H=ラ、J=シ、K=ド";
tf.width = 350;
addChild(tf);
}
private function onKeyDown(e:KeyboardEvent):void
{
sd.Play(e.keyCode);
}
private function onKeyUp(e:KeyboardEvent):void
{
sd.Stop();
}
}
}
import flash.display.Sprite;
import flash.events.Event;
import flash.events.SampleDataEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.utils.ByteArray;
import flash.ui.Keyboard;
class SoundTest extends Sprite
{
private var FREQUENCY:Number = 440; // 周波数
private static const SAMPLING:int = 8192; // バッファ
private static const SAMPLING_RATE:int = 44100; // サンプリングレート
private static const PI:Number = Math.PI * 2; // 1周期
private static const VOLUME:Number = 0.8; // ボリューム
private var sound:Sound = new Sound();
private var soundChannel:SoundChannel;
public var isPlay:Number = 0;
public function SoundTest()
{
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, onSampleData);
}
public function Play(code:uint):void
{
var keyCheck:int = 0;
if(isPlay == 0)
{
switch(code)
{
case Keyboard.A: FREQUENCY=261.6255653; break;
case Keyboard.S: FREQUENCY=293.6647679; break;
case Keyboard.D: FREQUENCY=329.6275569; break;
case Keyboard.F: FREQUENCY=349.2282314; break;
case Keyboard.G: FREQUENCY=391.995436; break;
case Keyboard.H: FREQUENCY=440; break;
case Keyboard.J: FREQUENCY=493.8833013; break;
case Keyboard.K: FREQUENCY=523.2511306; break;
default: keyCheck = 1; break;
}
if(keyCheck != 1)
{
soundChannel = sound.play();
}
isPlay = 1;
}
}
public function Stop():void
{
isPlay = 0;
soundChannel.stop();
}
private function onSampleData(e:SampleDataEvent):void
{
var data:ByteArray = e.data;
var pos:Number = e.position;
var w:Number = (PI / (SAMPLING_RATE / FREQUENCY));
var phase:Number = (pos * w) % PI;
for(var i:int = 0 ; i<SAMPLING ; i++)
{
var d:Number = VOLUME * Math.sin(phase);
phase = (phase + w) % PI;
data.writeFloat(d);
data.writeFloat(d);
}
}
}