'Sound'에 해당되는 글 4건

  1. 2008.08.16 사운드 스펙트럼
  2. 2008.08.16 사운드 Seek만들기
  3. 2008.08.16 사운드 스트림 재생/정지
  4. 2008.08.16 사운드 프로그래밍
예전에는 사운드의 스펙트럼을 사용하기 위해서 다른 어플리케이션툴(swiftmp3)등과 같은 툴을 사용하여 스펙트럼 정보가 있는 swf를 만들어 사용했다. 하지만 AS3에서는 SoundMixer클래스에서 computeSpectrum()메서드를 통해 ByteArray를 얻어와 시각적인 효과를 만들어 줄 수 있다.
 
* computeSpectrum() 메서드
현재 사운드 웨이브의 스냅샷을 취하여 지정된 ByteArray 객체에 배치합니다. 값은 -1.0부터 1.0까지의 정규화된 부동 소수점 값으로 outputArray 매개 변수에 전달된 ByteArray 객체를 새 값으로 덮어씁니다. 만들어진 ByteArray 객체의 크기는 512개의 부동 소수점 값으로 고정되며, 처음 256개의 값은 왼쪽 채널을, 다음 256개의 값은 오른쪽 채널을 나타냅니다.

사용법은 비어있는 ByteArray를 만든 다음 computeSpectrum()의 매개변수로 대입한다. 그러면 ByteArray에는 현재 재생중인 ByteArray값을 반환하게 되고 그 값을 비트맵 데이터나 기타 클래스등을 통해서 사용한다.

티스토리 크로스도메인 보안 정책때문에 스펙트럼 무비가 mp3의 바이트데이터 접근에 차단되고있네요... 아쉽지만 플래시 무비파일는 다운로드하여 재생하여 보시면 될 것같습니다.




신고
Posted by 정윤수 버터백통
사운드 관련 클래스들은 Seek관련된 메서드를 제공하지 않는다. 따라서 앞서 살펴본 바와 같이 현재 재생위치를 저장한 값이나 재생시키고자 하는 시작위치를 Sound.play()의 startTime값으로 설정하여야 한다.
아래 무비는 0,10000,30000,40000와 같이 재생할 시간을 미리 배열에 저장하여 버튼을 눌렀을 때 해당 배열의 원소 값을 play()의 시작 값으로 설정한 것이다.

재생할 시작 시간을 배열에 설정
var cuePoint:Array = [0,10000,30000,40000]
각 버튼에는 해당하는 원소를 play에 대입
soundChannel = sound.play( cuePoint[0] );


[위 무비는 일정 버퍼타임을 확보한 후에 버튼이벤트가 실행됩니다]

다음은 프로그래스 바를 이용하여 재생시점을 찾아 play()의 시작값으로 대입하는 seek를 다루어 보았다.
계산을 하기위해서는 반드시 알아야 할 변수가 몇가지 있는데 그것이 Sound클래스에서 제공하는 length이다. 이는 사운드의 전체 길이를 반환한다. 그리고 현재 위치를 알수 있는 채널에서 제공하는 position속성이 있다. 이는 현재 재생중인 위치의 값을 반환한다. 이들을 통해 1차 함수를 이용하면 아래와 같은 식이 성립된다.
현재 재생위치 = ( position / length ) * 100
이는 100이라는 최대값을 가지고 계산해 본 것이다.
재생할 위치 = ( length * 100을 기준으로 이동할 위치) / 100
위와 같이 식을 구한 다음 나온 값을 play()에 반영한다.

[위 무비는 일정 버퍼타임을 확보한 후에 버튼이벤트가 실행됩니다]





신고
Posted by 정윤수 버터백통
사운드 객체,즉 Sound클래스는 외부의 mp3파일로 접근하여 다운로드하며 재생을 할 수 있다.
음원을 다운받기 위해서는 서버에 Request하는 객체인 Request클래스를 선언하여 경로를 선어나여야 하고 그 값은 Sound.load()메서드의 파라미터 값으로 사용된다. 이부분은 일단 Loader나 URLLoader등과 같다.
이처럼 불러온 경로가 만들어지면 Sound.play()를 통하여 스트림을 시작한다. play()는 파일 받기 시작과 동시에 재생을 하며 SoundChannel을 반환한다. 재생되는 사운드의 볼륨 조절이나 정지를 하려면 SoundChannel을 사용해야 하는데 SoundChannel을 Delegate한 객체가 SoundChannel = Sonud.play()와 같이 채널에 사운드 스트림 연결 객체를 대입하여 채널과 음원데이터를 연결한다.

[ 사운드 스트림 객체와 사운드 채널 ]
Sound 객체는 스트림 연결/종료만 관리하므로 음원 파일을 계속 받지만 소리만 정지 시키고 싶을 때는 채널에서 stop()메서드를 사용한다. 그러면 사운드 스트림은 중단되지 않고 현재 재생되는 사운드만 정지 시킬 수 있다. 그러나 채널에는 play()라는 메서드가 없다. 따라서 사운드 객체에 play()를 통하여 다시 채널을 생성해야 한다.
* Sound.play()는 사운드 채널을 반환하므로 이전에 대입된 사운드 채널은 Sound.play()이후 새로운 채널을 사용하게 된다. 따라서 이전에 사용된 이벤트 리스너등을 Sound.play() 이후 새로 등록해 주어야 한다.
* Sound.close()는 스트림을 중단하는 것이다. 따라서 재생을 중단하기 위해서는 사운드 채널의 stop()을 사용한다.

var sd:Sound = new Sound();
sd.load( new URLRequest("사운드파일 경로") );
var sc:SoundChannel = new SoundChannel();
sc = sd.play()     --> 사운드 스트림상의 사운드 데이터를 채널에 등록
sc.stop()            --> 채널의 사운드를 정지
sd.close()          --> 사운드 스트림을 중단


[ 일시정지와 재생시점 ]
안타깝게도 비디오객체 처럼 pause와 resume메서드가 없다. 따라서 사운드 채널에서 현재까지의 재생된 위치를 얻어와 저장하고 있다가 Sound.play( startTime, loops, sndTransform )에서 startTime대입하여야 한다. 값은 밀리초 단위이다.

var pos:int = sc.position --> 현재 재생중인 위치
sc = sd.play( pos )        --> 시작위치를 성절하고 스트림 재생




[일시정지는 버퍼가 끝난후 노래가 나올 때 이후 실행 가능 합니다.]


신고
Posted by 정윤수 버터백통
AS3로 사운드 관련 작업을 하려면 우선 사운드를 가져올 수 있는 Sound클래스가 필요하다.
Sound객체는 mp3파일의 스트림을 열거나 닫을 수 있으며 사운드의 크기나 ID3관련 정보들을 취득할 수 있습니다. 그리고 SoundChannel 클래스는 사운드의 스트림의 재생관련(재생헤드)이나 사운드 정지(스트림 중단은 Sound객체) 오른쪽과 왼쪽 볼룸조절을 할 수 있으며, 좌우볼륨을 조절 할 수 있는 SoundTransform 객체를 포함하고 있습니다.
SoundTransform 는 볼륨이나 Pan에 대한 속성을 가지고 있습니다. 또한 플레이어에서 다루는 모든 사운드 채널은 SoundMixer를 걸치게 되어있다. SoundMixer는 모든 사운드 정지나 스펙트럼 등의 작업을 할 수 있다.

[ 사운드 관련 객체들의 개념 정리 ]
Sound : 외부 사운드 파일을 스트림 재생 , 스트림 중단(닫기), 파일관련 정보나 스트림관련 이벤트 발생

SoundChannel : 관련된 Sound객체의 사운드 재생,정지,왼쪽/오른쪽 볼륨담당 , soundTransform속성을 사용

SoundTransform : 사운드의 불륨 , 왼쪽/오른쪽 패닝 등 사운드 변형 담당, 값은 SoundChannel 의 속성
                              soundTransform에 대입

SoundMixer : 플래시 플레이어 무비에서 스피커로 전달되는 통로, 모든 사운드 채널관리(모두 정지) , 스펙트럼

이처럼 사운드 변형을 하기 위해 많은 클래스들이 필요하다...간단히 스트림파일 접근객체, 재생/정지클래스 , 볼륨 및 패닝 클래스 등으로 역할이 정확이 분리되어 있으면 좋겠는데 그러자면 몇가지 간단한 작업을 하고 싶은데 어마어마한 기능의 클래스를 생성하기 때문에 저렇게 기능이 조금씩 섞여있는 것인지는 모르겠지만 사용하기 편한 클래스들은 아닌것 같다.
신고
Posted by 정윤수 버터백통