각설하고,
소리(Sound) 인스턴스(instance)의 음량(volume)은 그 자체로 조절할 수 없습니다. 아시다시피(?) SoundTransform 클래스로만 변경이 가능하죠. 또한 transform을 거치는 인스턴스에는 tween을 줄 수 없기 때문에(문법상으로는 문제가 없지만 실행해보면 당연히 tween이 안 먹힙니다) 페이드인(fade-in)을 구현하는 데 어려움이 있었습니다.
그래서 찾아본 결과:
Fading sound using AS3 (새창)
요약하자면 다음 fla 소스(임의로 행순서를 바꾸고 주석을 달았습니다):
var fadeInIncr = 0.1; // 음량 전역변수
var soundFadeInTimer:Timer = new Timer(100,30);
var snd:Sound = new Sound(new URLRequest("myLoop.mp3"));
var trans:SoundTransform = new SoundTransform(fadeInIncr, 0);
var channel:SoundChannel = snd.play(0, 1, trans);
soundFadeInTimer.addEventListener("timer", soundFadeIn);
soundFadeInTimer.start();
function soundFadeIn(e:TimerEvent){ // 이벤트 핸들러
fadeInIncr += 1/30;
var sAmbienceVol:SoundTransform = new SoundTransform(fadeInIncr, 0);
channel.soundTransform = sAmbienceVol;
}
var soundFadeInTimer:Timer = new Timer(100,30);
var snd:Sound = new Sound(new URLRequest("myLoop.mp3"));
var trans:SoundTransform = new SoundTransform(fadeInIncr, 0);
var channel:SoundChannel = snd.play(0, 1, trans);
soundFadeInTimer.addEventListener("timer", soundFadeIn);
soundFadeInTimer.start();
function soundFadeIn(e:TimerEvent){ // 이벤트 핸들러
fadeInIncr += 1/30;
var sAmbienceVol:SoundTransform = new SoundTransform(fadeInIncr, 0);
channel.soundTransform = sAmbienceVol;
}
수정:
위 방법으로는 여러 개의 인스턴스에 각각 페이드인 효과를 구현할 수 없다는 내용의 장문-_-을 썼다가, 별 의미 없어서 지웠습니다. 여러 개의 인스턴스에서 사용하려면 ENTER_FRAME 이벤트 핸들러(즉 idle 함수)에서 for문 돌려가며 해당 인스턴스의 음량 변수를 가지고 와서 변경하면 됩니다(물론 SoundTransform을 통해서). 타이머 클래스에는 currentCount라는 속성(property)이 있는데, 이걸 사용해도 되겠죠. 방법은 여러가지. 페이드아웃 역시 마찬가지로 구현하면 됩니다.
페이드인/페이드아웃을 구현한 예제 (새창)
'프로그래밍' 카테고리의 다른 글
| [마리가 연주하는 음악]에 부쳐 (0) | 2008/06/28 |
|---|---|
| [actionscript 3.0] 소리 페이드인(Sound fade-in) (0) | 2008/05/17 |
| 플래시 이것저것 (6) | 2008/05/09 |
| 다양한 정렬 알고리즘의 성능분석 - 코드 (0) | 2007/05/15 |


