MML(Music Macro Language) 간단 사용법:

cdefgab: 도레미파솔라시.
r: 쉼표
음표나 쉼표 뒤에 1을 쓰면 온음표, 2를 쓰면 2분음표, 8을 쓰면 8분음표, 16을 쓰면 16분음표.
.은 점음표, +는 샵 -는 플랫. 셋잇단 음표의 경우 4분음표 셋잇단음표: 6, 8분: 12, 16분: 24
& : 이음,붙임줄
l(엘)뒤에 숫자를 써서 기본박자를 설정할 수 있다. l8이라고 앞에 쓸 경우 박자를 안 쓴 것은 8분음표가 된다.
옥타브 높이기: > 낮추기: < 혹은 o 뒤에 숫자를 써서 조절 가능. ex) o4: 4옥타브
음색: 1. 악보 앞 v를 쓴 뒤 숫자.
2.%0@0 단파형(디폴트) %0@1 노이즈 %1@8 삼각파 %3@1도 괜찮은 음색.
템포(음악 속도): t 다음 숫자가 클수록 빠르다.
q: 음 길이 지정(스타카토, 레가토 등) q0, q8 등 기본은 q6
p: 음의 좌우 위치 설정(스테레오) p0, p8 등 기본은 p4
@p: 음의 좌우 위치 설정(스테레오) @p-64 ~ @p64 기본은 @p0
[]숫자: 숫자만큼 반복. ex) [cde]2 도레미도레미
|(백스페이스 옆): 한번은 일단 지나간 뒤 두번째 도착하면 종료. ex) [cd | e]2 도레미도레
// 한줄 주석
/* 여러줄 주석 */

ex)t150 o4cdefgabo5crco4bagfedc : 템포 150, 도 > 한옥타브 위 도, 쉼표, > 원래 도로.
t150 o4c2e8g8gag8gf8rc8cdd8e8f8gga8g8ba8o5c: 템포 150, 간단한 네마디 음악.
t100 l8 %3@1 [ccggaag4 ffeeddc4 | [ggffeed4]2 ]2: 템포 100, 기본 8분음표, 삼각파 , ABC송.


Flash CS4 + ActionScript 3.0으로 Sion065 라이브러리를 이용해 MML 코드 플레이 어 만들기.

각각의 입력창에 현재 예제로 들어있는 MML 코드를 지운 뒤 새로 MML 코드를 작성해 넣고 플레이 버튼을 클릭하면 음악이 연주된다.

일주일 전에 만들었던 Midi, MML Play Test 프로그램에서 미디 부분을 빼고 MML을 다중 채널 동시 연주가 가능하게 변경했다.

사실 이전의 창 한 개 만으로도 매크로를 이용해 다중 채널 연주가 가능하지만 사용자 입장에서 좀 더 편하게 만든 것. 기본음색으로 둥글둥글한 음색인 %3@1을 설정해 두었다.

Sion의 MML 코드로는 아래 예제와 같이 하면 다중 채널 연주가 가능하다.

#MACRO{dynamic};
#A=%3@200 o4 c2e8g8gag8gf8rc8cdd8e8f8gga8g8ba8 o5 c;
#B=A;
B;
#A=%1@8 o4 eggecegegbdgc>c<egg>c;
B;

실제 이번에 개량한 건 입력창을 3개로 늘리고 위의 매크로 코드를 자동화한 것 뿐.

15/5/5 화

Sion 공식홈: https://sites.google.com/site/sioncenter
MML 간단 사용법(일문): http://www.16dimensional.com/sion140/
MML Reference(영문):
http://mmltalks.appspot.com/document/siopm_mml_ref_05_e.html

위키피디아 Music Macro Language 항목(영문)
위키피디아 Music Macro Language 항목(일문)

화면에 'playButM'란 이름의 버튼 모양 무비클립과 'inputText1', 'inputText2', 'inputText3'란 이름의 입력 텍스트 창을 만들어 두다.
import org.si.sion.SiONDriver; //라이브러리 불러오기
import org.si.sion.midi.SMFData;

var driver:SiONDriver = new SiONDriver();

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

function init(){
     playButM.addEventListener(MouseEvent.CLICK,mClick);
}
function mClick(e:MouseEvent){ //버튼들 마우스 클릭시 처리
     switch(e.target.name){ //눌려진 버튼 이름으로 분기
          case("playButM"):{
               //입력창의 내용을 받아 플레이하기
               mml1 = String(inputText1.text);
               mml2 = String(inputText2.text);
               mml3 = String(inputText3.text);
               mmlData = "#MACRO{dynamic}; #Z="+tune + mml1 
                              + "; #Y=Z; Y; #Z="+tune + mml2
                              + "; Y; #Z="+tune + mml3 + "; Y;";
               driver.play(mmlData);
               break;
          }
     }
}

init();