[Android] Soundpool으로 만드는 피아노 앱
- Mobile/Android
- 2017. 10. 18.
안드로이드 SOUNDPOOL 메서드를 활용한 피아노 앱을 만들어보았습니다.
완성한 피아노 앱의 모습입니다.
SoundPool로 만드는 피아노앱
먼저 좌측 res 파일에 오른쪽 클릭하여 새로운 폴더 raw를 만들어주세요.
Directory를 클릭!
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함수를 이용해주는것이 좋습니다.
'Mobile > Android' 카테고리의 다른 글
[Android] 공공기관 API 신청 및 파싱하기(검색기능구현) (28) | 2017.10.18 |
---|---|
[Android] Soundpool으로 만드는 드럼 앱 (12) | 2017.10.18 |
[Android] 안드로이드와 오라클 스프링으로 연동/통신하기 (40) | 2017.10.15 |
[Android] 안드로이드와 오라클 JSP로 연동/통신하기 (48) | 2017.10.13 |