AS3으로 끊김없이 사운드 루프 실행하기

작성자

카테고리:

Gapless sound looping in ActionScript 3.0

보통 사운드 루핑을 만들 때 Event.SOUND_COMPLETE 이벤트나 Sound.play(0, 999);를 사용할텐데요. 이 경우에 음악이 재생되는 사이에 약간의 틈이 발생합니다. 다음 플래시 무비처럼 말이죠.

이 파일은 아래의 코드와 같이, Event.SOUND_COMPLETE를 사용하여 사운드를 루프시키고 있습니다.

import flash.media.*;
import flash.events.*;
import flash.utils.Timer;

var snd:Sound = new loop();
var chn:SoundChannel;

function playSound():void
{
	if(chn){
		chn.removeEventListener(Event.SOUND_COMPLETE, sndListener);
	}
	chn = snd.play();
	chn.addEventListener(Event.SOUND_COMPLETE, sndListener);
}

function sndListener(e:Event):void
{
	playSound();
}

lbl.text = "Loop with Event.SOUND_COMPLETE";
btn2.enabled = false;
btn1.addEventListener(MouseEvent.CLICK, clickListener1);
btn2.addEventListener(MouseEvent.CLICK, clickListener2);
function clickListener1(e:MouseEvent):void
{
	playSound();
	btn1.enabled = false;
	btn2.enabled = true;
}
function clickListener2(e:MouseEvent):void
{
	btn1.enabled = true;
	btn2.enabled = false;
	chn.stop();
}

이 문제를 해결하기 위해서 이것저것 테스트 해 보다가, Timer를 사용하여 현재 재생중인 음악이 끝나기 전에 미리 새로운 음악을 재생시켜 주어서, 틈이 생기지 않도록 하는 방법을 생각하게 되었습니다. 아래의 플래시 무비에서 그 결과를 확인할 수 있습니다.

사용된 코드는 다음과 같습니다.

import flash.media.*;
import flash.events.*;
import flash.utils.Timer;

var snd:Sound = new loop();
var chn:SoundChannel;

var timer:Timer = new Timer(10);
timer.addEventListener(TimerEvent.TIMER, timerListener);

function timerListener(e:TimerEvent):void
{
	if(chn && chn.position > snd.length - 450){
		playSound();
	}
}

function playSound():void
{
	if(! timer.running){
		timer.start();
	}
	chn = snd.play();
}

lbl.text = "Loop with TimerEvent.TIMER";
btn2.enabled = false;
btn1.addEventListener(MouseEvent.CLICK, clickListener1);
btn2.addEventListener(MouseEvent.CLICK, clickListener2);
function clickListener1(e:MouseEvent):void
{
	playSound();
	btn1.enabled = false;
	btn2.enabled = true;
}
function clickListener2(e:MouseEvent):void
{
	btn1.enabled = true;
	btn2.enabled = false;
	chn.stop();
	timer.reset();
}

코멘트

6의 “AS3으로 끊김없이 사운드 루프 실행하기”에 대한 답변

  1. hika 아바타

    근데 부하가 빡센 게임에선 타이머도 밀려요 ^^

    1. Hangun's World 아바타

      워낙에 플래시가 CPU 의존도가 높다보니, 그런 경우에선 문제가 될 수도 있겠네요.

  2. andwhy 아바타
    andwhy

    좀 복잡해지긴하겠지만 byteArray로 갖다 붙이는건 어떨까요??

    1. Hangun's World 아바타

      바이트어레이로 음악을 제어하는 건 안해봐서 잘 모르겠지만, 가능하다면 그 방법도 괜찮을 것 같네요. ^^

  3. paranure 아바타
    paranure

    감사합니다 꼭 필요한 건데…
    근데 저는 cs5를 쓰는데 loop가 검정글씨로 뜨고 메소드가 없다며 에러가 떠요. 왜 그런가요?

    1. Hangun's World 아바타

      안녕하세요 ^^
      loop()는 라이브러리에서 지정한 사운드 파일의 클래스 명이라서 그렀습니다. 라이브러리의 사운드 파일을 선택하여 프로퍼티 창을 열고, Linkage의 Export for ActionScript를 선택하면 활성화되는, Class에 클래스 명을 지정할 수 있는데, 이 클래스 명을 loop() 대신 사용하시면 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다