Flash CS4 + ActionScript 3.0로 Sion065 라이브러리를 이용해 만든 랜덤 음표 플레이어.

* 랜덤으로 음표의 높이와 길이를 정해 연주하게 만들다.
* 음표의 높이와 길이에 맞게 시각적으로 보이게 하다.
* 우상단의 정지/재생 토글 버튼은 누를 때 마다 정지/재생을 오간다.

15/6/30 화

화면에 'noteM'이란 이름의 음표 무비클립(무비클립 내에는 's'란 이름의 샵 모양 무비클립을 만들어 두었다) , 'toggleBtn'이란 이름의 정지/재생 토글 버튼 무비클립, 'debugTxt'란 이름의 다이나믹 텍스트를 만들어 두다.
var museNoteArr:Array=["c","c+","d","d+","e","f","f+","g","g+","a","a+","b"];//음계 배열
var museLengArr:Array=["2","4","4","8","8","8","8","8","8","16","16"];//음 길이 배열
var museTempArr:Array=new Array();

var rMuseTimer:Timer=new Timer(1000); //랜덤 음 발생 타이머(1초)
var stopMuse = false; //재생/정지 체크용 변수

function init(){
	for(var k=0; k < 100; k++){ randMusicNoteCreate(); } //랜덤 음악 만들어
	trace(museTempArr);
	playMMLarr(museTempArr); //플레이.
	//mmlInit(); //미디 음악 연주하기
	
	toggleBtn.addEventListener(MouseEvent.CLICK, toggleClick);
	
	rMuseTimer.addEventListener(TimerEvent.TIMER, rMusePlay);
	rMuseTimer.start(); //랜덤 음 발생 타이머 시작
}
function rMusePlay(e:TimerEvent){ 
	randMusicNotePlay(); //랜덤한 음 연주하기 함수 호출
}
function toggleClick(e:MouseEvent){ //플레이/정지 토글버튼 클릭시
	if(stopMuse){ //멈춰 있는 중이면
		rMuseTimer.start();
		toggleBtn.gotoAndStop("stop");
		stopMuse = false;
	}else{ //플레이 중이면
		rMuseTimer.stop();
		toggleBtn.gotoAndStop("play");
		stopMuse = true;
	}
}
//************************************************************
// MML 관련 함수들
//************************************************************
import org.si.sion.SiONDriver; //라이브러리 불러오기
import org.si.sion.midi.SMFData;

//[Embed(source="ckipang6.mid", mimeType="application/octet-stream")]
//var Test:Class;
//var smfData:SMFData = new SMFData();
var driver:SiONDriver = new SiONDriver();

var mmlData, mml1, mml2, mml3; //mml 내용 임시 저장용 변수
var tune:String="%3@1"; //기본음색 지정용
var noteLength; //음 길이 저장용

function playMMLarr(arr:Array){ //배열에 저장된 음 연주하기
	mml3 = "";
	mml3 += "%3@200 ";
	for(var i = 0; i < arr.length; i++){
		mml3 += arr[i]+ ",";
	}
	driver.play(mml3); //만들어진 음 연주하기
}
function randMusicNotePlay(){//랜덤한 음 연주하기 함수 
	mml1 = Math.floor(Math.random()*museNoteArr.length);
	mml2 = Math.floor(Math.random()*museLengArr.length);
	mmlData = museNoteArr[mml1]+museLengArr[mml2];
	//museTempArr.push(mmlData);
	trace2(mmlData);
	mmlData = "%3@200 "+mmlData;
	//음표 길이, 모양 시각적으로 표현하기
	noteLength = int(museLengArr[mml2]);
	noteM.gotoAndStop(String(noteLength));
	switch(museNoteArr[mml1]){
		case("c"): noteM.y = debugTxt.y = 240; noteM.s.visible=false; break;
		case("c+"): noteM.y = debugTxt.y = 240; noteM.s.visible=true; break;
		case("d"): noteM.y = debugTxt.y = 225; noteM.s.visible=false; break;
		case("d+"): noteM.y = debugTxt.y = 225; noteM.s.visible=true; break;
		case("e"): noteM.y = debugTxt.y = 210; noteM.s.visible=false; break;
		case("f"): noteM.y = debugTxt.y = 195; noteM.s.visible=false; break;
		case("f+"): noteM.y = debugTxt.y = 195; noteM.s.visible=true; break;
		case("g"): noteM.y = debugTxt.y = 180; noteM.s.visible=false; break;
		case("g+"): noteM.y = debugTxt.y = 180; noteM.s.visible=true; break;
		case("a"): noteM.y = debugTxt.y = 165; noteM.s.visible=false; break;
		case("a+"): noteM.y = debugTxt.y = 165; noteM.s.visible=true; break;
		case("b"): noteM.y = debugTxt.y = 150; noteM.s.visible=false; break;
	}
	//음표 길이에 맞춰 타이머 지연시간 변경
	noteLength = 5000 / noteLength;
	rMuseTimer.delay = noteLength; //타이머 지연시간 바꾸기*****
	driver.play(mmlData); //만들어진 음 연주하기
}
function randMusicNoteCreate(){//랜덤한 음으로 배열 만들기
	mml1 = Math.floor(Math.random()*museNoteArr.length);
	mml2 = Math.floor(Math.random()*museLengArr.length);
	mmlData = museNoteArr[mml1]+museLengArr[mml2];
	museTempArr.push(mmlData);
}
//function mmlInit(){ //미디 파일 플레이.
//	smfData.loadBytes(new Test); //미디파일 불러오기
//	driver.play(smfData); //불러온 미디 파일 플레이하기
//}
//************************************************************
// 기타 도우미 함수들
//************************************************************
function trace2(a,b="",c='',d="",e="",f="",g=""){
	trace(a,b,c,d,e,f,g);
	//debugTxt.appendText(a+b+c+d+e+f+g+"\n");
	debugTxt.text=a+b+c+d+e+f+g+"\n";
}
init();