[Android] Soundpool으로 만드는 피아노 앱

안드로이드 SOUNDPOOL 메서드를 활용한 피아노 앱을 만들어보았습니다.

피아노앱1

완성한 피아노 앱의 모습입니다. 

 

SoundPool로 만드는 피아노앱

피아노앱2

먼저 좌측 res 파일에 오른쪽 클릭하여 새로운 폴더 raw를 만들어주세요.

Directory를 클릭!

 

피아노앱3

 

raw라고 입력해준뒤 피아노소리를 raw폴더안에 넣습니다.

이제 소스코드를 입력할 차례입니다.

 

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/activity_Piano"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context="com.example.user.music.MainActivity"
 >

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button22"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button29"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button28"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button27"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button26"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button25"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button24"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

         <Button
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:id="@+id/button23"
            android:onClick="mOnClick"
            android:background="@android:drawable/editbox_background_normal" />

     </LinearLayout>

     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent">

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button30"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="40dp"
            android:background="@android:drawable/screen_background_dark" />

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button37"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="20dp"
            android:background="@android:drawable/screen_background_dark" />

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button36"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="80dp"
            android:background="@android:drawable/screen_background_dark" />

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button35"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="20dp"
            android:background="@android:drawable/screen_background_dark" />

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button34"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="20dp"
            android:background="@android:drawable/screen_background_dark" />

         <Button
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:id="@+id/button32"
            android:onClick="mOnClick"
            android:layout_gravity="right"
            android:layout_marginTop="80dp"
            android:background="@android:drawable/screen_background_dark" />
   </LinearLayout>
</FrameLayout>

흰건반위에 검은건반을 올려야하기때문에 위로 중첩이 가능한 FrameLayout을 활용하였습니다..

또한 버튼 하나하나에 onClick을 주어 자바코드에서 활용 가능하게 만들어주세요.

 

JAVA

SoundPool pool;
int d1;
int d2;
int re;
int mi;
int pa;
int sol;
int ra;
int si;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Window win=getWindow();
    win.requestFeature(Window.FEATURE_NO_TITLE);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.activity_piano);

    pool=new SoundPool(4, AudioManager.STREAM_MUSIC,0);
    d1=pool.load(this,R.raw.d1,1);
    d2=pool.load(this,R.raw.d2,1);
    re=pool.load(this,R.raw.re,1);
    mi=pool.load(this,R.raw.mi,1);
    pa=pool.load(this,R.raw.pa,1);
    sol=pool.load(this,R.raw.sol,1);
    ra=pool.load(this,R.raw.ra,1);
    si=pool.load(this,R.raw.si,1);
}
public void mOnClick(View v){

   switch(v.getId())
   {
       case R.id.button22:
            pool.play(d1,1,1,0,0,1);
            break;
        case R.id.button23:
            pool.play(d2,1,1,0,0,1);
            break;
         case R.id.button24:
             pool.play(si,1,1,0,0,1);
             break;
         case R.id.button25:
             pool.play(ra,1,1,0,0,1);
             break;
         case R.id.button26:
             pool.play(sol,1,1,0,0,1);
             break;
         case R.id.button27:
             pool.play(pa,1,1,0,0,1);
             break;
         case R.id.button28:
             pool.play(mi,1,1,0,0,1);
             break;
         case R.id.button29:
             pool.play(re,1,1,0,0,1);
             break;
         case R.id.button30:
             pool.play(re,1,1,0,0,1);
             break;
         case R.id.button32:
             pool.play(d2,1,1,0,0,1);
             break;
         case R.id.button34:
             pool.play(si,1,1,0,0,1);
             break;
         case R.id.button35:
             pool.play(ra,1,1,0,0,1);
             break;
         case R.id.button36:
             pool.play(pa,1,1,0,0,1);
             break;
         case R.id.button37:
             pool.play(mi,1,1,0,0,1);
             break;
        }
    }
}

이번 피아노앱은 SOUNDPOOL을 활용한 방식입니다.

안드로이드에서 소리를 내기위해서는 Midea Player 방식과 SoundPool 방식이있는데

MidaPlayer은 비교적 긴소리를 적용하기에 적합한 방식이고,

SoundPool은 이번에 만든 피아노와같이 짧은소리를 내기 위해서 적합한 방식입니다.

악기처럼 간단한 소리를 내는데는 SoundPool함수를 이용해주는것이 좋습니다.

댓글

Designed by JB FACTORY