본문 바로가기
[Public] 프로그래밍/Android

[Android] 안드로이드 비프음 소리 내기

by 차출발 2010. 8. 23.
반응형

이번 시간에는

특수효과로 소리를 내는 기능을 만들어 볼것이다.

비프음이다.

C 에서 간단히 나는 삐~ 하는 소리 보다는

간단하게 wav 파일의 소리를 내보도록하겠다.



그럼 어떻게 소리를 내는지 알아보자 !

먼저 사운드 파일을 열어야한다.

그러기 위해서는 소리파일을

프로젝트의 레이아웃폴더의 raw 폴더에 복사를 미리 해두어야 한다.

res/raw

다음 파일을 읽어 오기위해 정적으로 create  함수를 호출한다.

static MediaPlayer create(Context context, int resid)

context
resid : 리소스 아이디다 보통 res/raw 폴더에 있기에 이거 역시 (R.raw.id) 로 불러온다.




불러왔으니 이제 소리를 내나요 ?

그렇다 이제는 불러왔으니 활용하기 위해서는 다음과 같은 함수를 이용한다.

public void start()                               시작
public void stop()                               중지
public void seekTo(int msec)              시간을 찾아 재생
public void pause()                            일시정지

다음 함수를 이용하여 소리를 내는 것이다.




흠흠 역시나 예제로 보여 줘야 이해가 갈거 같아요 예제로 보여주세요 !

기타를 연주하는 어플리케이션을 만들어보자

1. 가장먼저 res/raw 폴더를 만들어주고 음악파일을 넣어준다.
    필자는 음악파일을 (ccode.wav, dcode.wav fcode.wav) 3개를 넣어 주었다.

2. 다음 layout 을 설정해준다.
    음악을 연주하기 위하여 간단하게 버튼을 3개 만들어주었다. (C 코드, D 코드, F 코드)




2. 버튼의 각각 클릭이벤트를 활성화 시켜주었다.

   클릭시 !

          MediaPlayer player;                                                   //   플레이어 변수를 선언
          player = MediaPlayer.create(main.this, R.raw.dcode);   //   플레이어 변수의 파일을 열고
          player.start();                                                            //   음악파일을 플레이

    설정을 해주 었다.




3. 이제 결과를 확인해보자.

   와우 ! 누르니 잘된다. 코드가 소리가 잘난다. 





그럼 우리 한번 음악을 연주해볼가요 ? 

연속으로 코드를 치다 보니 매번 소리를 낼때 마다 코드의 소리가 끝이 안난 상태에서 진행이 되기에

음악이 겹치게 되어 아주 듣기 흉하다. (코드를 직접 작성해보고 실험해보면 알게된다.)

위의 방법은 매번 소리를 낼 때마다 객체를 만들다.


그래서 (장점)

      따로 파괴하지 않아도 되므로 간편하다는 점

      사운드가 항상 처음부터 출력되어 소리가 겹치지 않는다는 점


 하지만 (단점)

       매번 객체를 새로 생성해야하므로 재생 시작 속도가 느리고 반응성이 느리다는점

       하나의 사운드 카드를 놓고 경쟁을 하므로 안정성이 보장되지 않는다는점

       자꾸 버튼을 누르면 프로그램이 다운되는 점




왐마 문제가 많네요 ! 그럼 어떻게 위의 문제점을 해결하죠 ?

네 생각하시고 계셧을 겁니다. 하나의 변수를 가지고 활용하면 되겠죠

그래서 팩토리 패턴으로 클래스 하나 만들어 줍니다.

클래스 이름은 Sound




그리고 위 Sound 클래스를 활용하기 위하여 이전 소스를 약간 수정합니다.


 
(소스가 틀렷네요 SoundC SoundD SoundF 입니다 알아서 이해좀 ^^;;)


자 그리고 이제 실행을 한번 해봅시다.

와우 그러면 이제는 중복되는 현상이 사라졌습니다.

그러면 이제는 기타를 연주하는데 문제가 없겠죠 ?




도움이 되셨다면 리플하나 남겨주세요.
큰 힘이 됩니다 ^^