Vocaloid 2 하츠네 미쿠로 동요 만들기.

하츠네 미쿠는 보컬로이드 시리즈의 첫 인공 목소리로 사실 인간의 목소리와는 상당히 차이가 있는 뭔가 빈 듯한 어색한 목소리인데 이젠 오히려 그게 개성적으로 들리게 됐다.

15/4/07 화

赤空
-작사/작곡: 바람들들

赤空が燃える。赤山が消える。
赤がいい。赤が。

燃える夕日
赤く光っている。

赤空が燃える。赤山が消える。
赤がいい。赤が。

만든 동요를 Flash+ActionScript 3.0으로 웹 상에서 들을 수 있게 만들다.

* 플레이 버튼을 마우스로 클릭하면 노래가 연주되고 연주중 다시 버튼을 클릭하면 노래가 중단됨.
* 노래 연주중 미쿠도 움직이게 처리. 노래가 멈추면 미쿠도 멈춤.
* 노래가 모두 연주되면 버튼이 연주중에서 비연주중 모드로 변경된다 -Sound를 직접 play 않고 SoundChannel에 넣어 간접적으로 play하며
channel.addEventListener(Event.SOUND_COMPLETE, musicEnd);
로 연주가 끝날 경우 이벤트를 발생하게 하여 처리.

import flash.events.MouseEvent;
import flash.media.Sound;

var snd:Sound = new akaSora();
var channel:SoundChannel=new SoundChannel(); //사운드 위치 기록용
var nowPlay:Boolean = false; //현재 음악 연주중인지 여부 체크용

function init(){
     aniM.gotoAndStop(1); //전체 애니 멈추기
     aniM.shadow.gotoAndStop(1); //애니속 그림자 애니 멈추기
     aniM.miku.mikuIn.gotoAndStop(1); //애니속 미쿠 애니 멈추기

     playBut.addEventListener(MouseEvent.MOUSE_DOWN, mClicked);
     playBut.addEventListener(MouseEvent.MOUSE_OVER, mOver);
     playBut.addEventListener(MouseEvent.MOUSE_OUT, mOut);
}
function mClicked(e:MouseEvent){
     if(!nowPlay){ //현재 음악 연주 중이 아니면
          musicStart(null);
     }else{ //현재 음악 연주 중이면
          musicEnd(null);
     }
}
function musicStart(e:Event){ //음악 플레이시 처리
     trace("musicStart!!!");
     //snd.play(); //직접적인 방법. 여기선 우회적으로 channel에 넣어 실행
     channel=snd.play(channel.position); //음악 재생 시작
     nowPlay = true;
     playBut.gotoAndStop(3);
     playBut.x = 485, playBut.y = 75;
     yFilter.x = -1000;
     aniM.gotoAndPlay(1);
     aniM.shadow.gotoAndPlay(1);
     aniM.miku.mikuIn.gotoAndPlay(1);
     //음악이 끝날 경우를 위한 이벤트 처리용
     channel.addEventListener(Event.SOUND_COMPLETE, musicEnd); 
}
function musicEnd(e:Event){ //음악 종료시 처리
     trace("musicEnd!!!");
     channel.stop();  //음악 멈추기
     nowPlay=false;
     playBut.gotoAndStop(1);
     aniM.gotoAndStop(1);
     aniM.shadow.gotoAndStop(1);
     aniM.miku.mikuIn.gotoAndStop(1);
}
function mOver(e:MouseEvent){ //버튼 위에 마우스 오버시 처리
     if(!nowPlay){playBut.gotoAndStop(2);}else{playBut.gotoAndStop(4);}
}
function mOut(e:MouseEvent){ //버튼에서 마우스 아웃시 처리
     if(!nowPlay){playBut.gotoAndStop(1);}else{playBut.gotoAndStop(3);}
}

init();