본문 바로가기

무언가 만들기 위한 지식/Action Script

About Sound Class

이제 사운드 클래스에 대해 알아보자.
Sound클래스란 말그대로 플래쉬에 소리를 넣을때 도움이 되는 클래스이다.

Sound클래스를 이용하여 삽입하는 방법에는 두가지가 있다.
첫번째 방법은 사운드 라이브러리에 삽입한후 attachSound()를 이용하여 이용하는 것이다.
두번째 방법은 외부 사운드를 즉시 로드하여 사용하는 것이다. 이떄는 loadSound를 이용하여 스트림을 이용해 로드한다.

Sound 클래스의 내용은 다음과 같다.

(Method)
attachSound(id) : 라이브러리에서부터 linkage에 설정한 매개변수 id를 로드하여 스테이지에 첨부한다.
getBytesLoaded() : 지정된 Sound객체에 대해 로드된 바이트수를 반환
getBytesTotal() : 지정된 SOnd객체의 크기를 바이트 단위로 반환
getVolume() : 사운드 볼륨 레벨을 0~100사이의 정수로 반환한다. 0은 꺼져있는 상태, 100은 최대 볼륨이다.
setVolume() : 사운드 볼륨을 셋팅
loadSound() : 외부 사운드를 로드한다.(mp3만 됨)
start() : 사운드를 시작함.
stop() : 사운드를 중지함.

(속성)
position : 사운드 재생된 밀리초 수
duration : 밀리초단위의 사운드 지속시간

(이벤트)
onSoundComplete=function(){} : 사운드가 재생을 중지할때 자동으로 호출.
onLoad=function(){} : 로드될때 호출


첫번째 방법으로 삽입하여 보자.(라이브러리 이용)



전번에 무비클립 복제할때 처럼 사운드로 식별자를 정해주어야 attachSound를 사용할 수 있다. actionScript에 내보내기에 체크를 한 후 식별자에 원하는 변수를 넣자. 원더걸스의 so hot 이 삽입한 음악이기 때문에 식별자를 sohot으로 설정하였습니다^^



다음 위와 같이 작성한다.
처음 new Sound는 객체를 생성하여 s가생성된 객체를 참조하도록 설정하는 것이다.
모든 언어의 객체 생성 기초는 이런방식이다. 다음 생성된 객체 s내의 주언진 메소드인 attachSound를 이용한다.
new Sound()에서 가로 안에 들어가는 매개변수는 사운드가 삽입되는 타임라인의 위치이다.

attachSound의 매개변수는 이 바로 위의 스크린 샷에 나온 식별자이다. 특정 사운드 파일을 생성된 s라는 사운드객체에 붙이겠다는 소리이다.
나머지는 버튼에 사운드 객체에 할당된 이벤트를 달아놓은 것이다.

위 코드로 만든 것은 다음과 같다.




참고로 한개 이상의 사운드를 첨부하기 위해서는 각 사운드 객체를 복수개 생성해야만 한다. 그후 따로따로 컨트롤 하여야 한다.


두번째 방법, 무비재생시 외부사운드 삽입

사실 말이 두번째 방법이지 사용되는 형식은 거의 비슷하다, 그러나 의미는 전혀 다르다고 할 수 있다.
사용할때는 위에서 사용한 attachSound가 아닌 loadSound를 사용한다.
다음은 위와 똑같은 코드이다.


loadSound를 사용하였다. loadSound의 매개변수는 첫번째는 파일명(웹상에서는 경로를 다 써주어야함.), 두번째 매개변수는 스트리밍으로 재생할 것인지 이벤트 방식으로 재생할지를 결정하는 것이다.

true로 설정할 경우 Streaming으로 재생하는 것이기 때문에 따로 start를 호출할 필요가 없다. 스트리밍이란 받는 부분만큼 실시간으로 재생하는 방법이다.
false일 경우에는 파일이 모두 다운로드가 완료된후에 처리하겠다는 것이다. 이 경우에는 다음에 onLoad 콜백함수를 통하여 start()를 호출해야 한다.


사운드 등록시 고려해야할 부분은 여러개의 사운드를 삽입할때이다.

사운드는 타임라인에 등록이 된다. 또한 한개의 타임라인에 여러개의 사운드가 등록이 된다.
여러개의 사운드가 하나의 타임라인에 등록될 경우 정지명령어를 사용하게 되면 모든 사운드가 해제된다.
그렇기 때문에 보통 createEmptyMovieClip을 이용해 빈 무비클립을 만든후 각 무비클립당 1개의 사운드를 등록시킨후 제어를 하면 된다.
무비클립에 등록은 new Sound() 에서 가로안에 매개변수를 무비클립 name을 사용하면 된다.
다음 만든 것을 보자.



일단 1, 2, 3번 행을 통하여 3개의 무비클립을 등록시켰다.(사운드 control을 위해)
그후 각 사운드 객체를 생성하였다. 이때 등록되는 무비클립을 설정해준다.[new Sound()는 new Sound(_root)이다. 디폴드값으로 _root가 설정된다.]

참고로 하나의 사운드 객체에는 하나의 사운드만 등록가능하다.
세개의 사운드를 등록하고 싶을때는 3개의 객체를 생성해야 한다. (위에서처럼 new를 3번)
단 타임라인에는 여러개 사운드 등록가능!

버튼이벤트에 있는 명령어들은 하나의 버튼이 실행될때 종료버튼 이외의 버튼은 작동하지 않도록 설정해 놓은 것이다. 그렇지 않으면 사용자에 의해 동시에 여러개의 사운드가 실행될 것이다.

enabled라는 명령어는 참 유용하다.
버튼관련하여 enabled값을 false로 주면 등록된 버튼기능을 사용하지 않고 true를 쓰면 사용한다.
_visible과 같이 여러모로 자주 쓰인다.


위코드에 몇가지를 추가하여 구현한 것은 위와 같다.

다음에는 사운드를 일시정지시키는 Mute기능과 Volume조절에 관해 알아보자.
사운드 일시정지기능은 사운드 객체의 속성 중 position을 사용한다.
이 포지션은 진행되고 있는 사운드의 밀리초 단위를 시간을 반환한다.
시작 0초부터 현재까지 재생된 시간을 뜻한다. 이를 이용하여 사운드 중간중간에 원하는 장면이나 기타효과를 나타낼 수 있다. 또한 두번째 속성 duration을 통해 전체 재생시간 및 %를 이용해 현재 재생 상태등을 간단한 수학식으로 구현이 가능하다.

직접 작성해 보자.

차근차근 알아보자. 음악은 요즘 자주듣는 마이티마우스의 에너지로 정했다^^;
일단 하단부분의 두개의 조작 버튼을 알아보자. 코드에서는 33~46번줄에 작성되어 있다.
temp변수는 현재 진행되고 있는 위치를 저장하는 변수이다.
초기값은 0으로 설정되어 있기때문에 start(temp/1000)에서는 start(0)으로 작동하기 때문에 처음부터 시작한다.

여기서 start메소드에 대해 잠깐 알아보고 넘어가자.

start(Offset:Number,loops:Number);

두개의 매개변수가 있다. 공란으로 넣어두면 모두 0으로 처리되어 그냥 사운드 실행만한다.
대신 offset을 넣어주면 등록된 사운드의 원하는 부분으로 접근해서 처리가 가능하다.

단여기서 Offset의 단위는 초(s)이다. 즉 duration이나 position 속성을 이용하려면 1000을 나눠준후 연산을 해야지만 정상적으로 작동을 한다.

두번째 매개변수는 몇번을 재생할 것인지를 정하는지 옵션이다. 단 이 옵션은 loadSound를 이용해 스트리밍기법 사용시에는 사용할 수 없다.

위 소스에서 드래그 관련은 볼륨조절 막대에 관한 코드이다.
그 부분은 마우스의 움직임에 따라 총 막대 길이에 대한 %값을 반환하고 그것을 이용하여 setVolume을 통하여 onEnterFrame부분에서 볼륨의 크기를 결정한다.

onEnterFrame부분에서는 실시간으로 변동되는 것들에 대한 통제이다.
볼륨에 대한 부분과 현재 재생되는 상태의 정보를 실시간으로 보여주기위한 코드들이 삽입되어 있다.
이 onEnterFrame이 종료하는 시점은 다 재생된 순간 즉 s.duration과 s.position이 일치하는 순간이다. 이는 곧 재생이 종료함을 의미한다.

onEnterFrame의 경우 항상 종료조건을 주어야 cpu의 부담이 감소한다.

볼륨부분처럼 막대부분을 이용하기 위해서는 좌표문제때문에 항상 무비클립을 새로 생성하여 그부분에서 좌표통제하는 것이 가상 이상적이다.

완성된 swf는 다음과 같다.


<볼륨은 0으로 설정해 놓았으니 높여가며 차이를 느껴보기 바란다.^^;>

마지막으로 알아볼 것은 onSoundComplete라는 이벤트이다.
이는 사운드가 종료된후의 명령을 작성할 수 있게 사운드 종료후를 알리는 이벤트이다.
굳이 따지자면 position을 이용하여도 같은 기능을 구현할 수는 있다.
이 이벤트를 이용해서 무한반복 재생도 가능하다.

특히 스트리밍 방식의 경우 start를 통해 반복 횟수를 정해줄 수 없기때문에 반복재생할 경우
이 이벤트를 이용하여야 한다.


사용 예를 보자.

s=new Sound();
s.loadSound("asdf.mp3");
s.start();
s.onSoundComplete=function()
{
          s.start();
}


위와 같이 작성할 경우 무한반복이 된다.
이부분에 따로 조건을 추가하여 delete s.onSoundComplete; 를 onSoundComplete문 안에 추가한다면,
도중에 이벤트를 삭제할 수 도 있다.
이 개념을 이용하여 더 다양한 사운드를 이용한 이벤트를 작성할 수 있다.


※ 주의사항
    가끔 mp3가 플래쉬 라이브러리로 삽입 자체가 되지 않을때가 있다. 이때는 mp3포맷 형식이 이상하거나 본인 컴퓨터에 퀵타임 플레이어깔려있지 않기때문이다.
    동영상이나 mp3 특정포맷을 플래쉬에 삽입하기 위해서는 반드시 퀵타임 플레이어 깔려 있어야 한다.
    또한 플래쉬내 라이브러리로 삽입하여 attachSound등을 사용하면 음질이 상당히 변질되어 플래쉬내의 적은 용량으로 변환된다. 나은 음질로 재생할려면 외부삽입기능 loadSound를 사용할 것을 권한다. loadSound를 삽입한후 다운로드가 완료된후 재생하는 것이 이상적일 것이다.(단 사용자에게 로드중임을 알려줘야함.-추후 배울 getBytesTotal,getBytesLoaded 이용!)