Sử dụng Android SoundPool xây dựng Piano App

0
159

 

Sử dụng Android SoundPool xây dựng Piano App

 

Việc chơi một loại nhạc cụ nào đó trên thiết bị Android là điều mà hầu như ai trong chúng ta cũng muốn làm, các ứng dụng này về cơ bản sử dụng SoundPool API của Android để xử lý các giai điệu nhạc ngắn. Bạn có thể chơi Piano, Violin hoặc Xylophone.

1. Android SoundPool

Trong hướng dẫn dưới đây, mình sẽ chỉ cho các bạn cách tạo một ứng dụng Piano bằng việc sử dụng SoundPool  trong Android API. Trước tiên, bạn cần có kiến thức cơ bản về ConstraintLayout để có thể hiểu và thiết kế giao diện các bàn phím Piano.

2. Trước tiên cần chuẩn bị

  • Windows 7 hoặc cao hơn / Mac OS (Mavericks or higher) với ít nhất 4GB RAM
  • Android Studio (với SDK và API bản mới nhất) và JAVA đã cài đặt trên hệ thống của bạn.
  • File hiệu ứng âm thanh mô phỏng các nốt nhạc . Download.

3. Chúng ta sẽ xây dựng những gì?

Ứng dụng mà mình giới thiệu trong bài này sẽ gồm 14 buttons, mỗi button được gán một Listener onClick và phát ra âm thanh bằng cách sử dụng SoundPool API. Các button và vị trí của chúng được thiết lập bằng cách sử dụng ConstraintLayout

Ứng dụng gồm 8 buttons có màu trắng với âm thanh C, D, E, F, G, A và B và 5 nút màu đen tương ứng với âm C #, D #, F #, G # , A # và 1 âm C # khác.

22

4. Các files sẽ tạo

  1. activity_main.xml
  2. MainActivity.java
  3. AndroidManifest.xml (No permissions required)

5. Các bước thực hiện

  • Mở Android Studio và tạo một dự án mới với tên là ‘My Piano’, tạo một class với tên là MainAvticity.java.
  • Trong activity_main.xml, xóa ‘Hello World’ TextView và thêm vào 8 buttons. Mỗi button có chiều cao là 63sp và chiều rộng là match_parent. 8 buttons này sẽ có màu trắng (#FFFFFF) và màu xám (# E5E5E5) làm background. Thêm text tương ứng, ví dụ: C, D, E, F, G, A, B, và C. Text size là 30sp với text là màu đen (# 000000) với kiểu Bold và được căn chỉnh alignment với ‘textstart’.
<Button
    android:id="@+id/c"
    android:layout_width="match_parent"
    android:layout_height="63dp"
    android:text="C"
    android:textSize="30sp"
    android:textStyle="bold"
    android:textAlignment="textStart"
    android:background="#ffffff"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:onClick="playC" />
  • Thêm tiếp 6 buttons vào layout với nút C # đầu tiên giữa các nút màu trắng C và D. Bạn có thể liên kết nó với nút tiếp theo, ví dụ: D # bên dưới C # và ở cuối của parent. Mỗi nút có chiều rộng 187sp và chiều cao là wrap_content. Thêm text cho mỗi button tương ứng là C #, D #, F #, G #, A # và C # một lần nữa. 6 buttons này sẽ có màu đen (# 000000) làm background với text size là 20sp và màu trắng (#FFFFFF) cùng với kiểu chữ Bold và căn chỉnh alignment với ‘textstart’.
<Button
    android:id="@+id/ds"
    android:layout_width="187dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:text="D#"
    android:textAlignment="textStart"
    android:textSize="20sp"
    android:textStyle="bold"
    android:background="#000000"
    android:textColor="#ffffff"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/cs"
    android:onClick="playDS"/>
  • Giờ hãy tìm hiểu về lớp chính trong dự án này – Android SoundPool. Tại sao cần sử dụng SoundPool? Đầu tiên, SoundPool trong Android có thể phát các tập tin audio cho các ứng dụng. Bên cạnh đó, nó cũng có thể quản lý số luồng âm thanh được hiển thị cùng một lúc (với trường hợp nhiều phím được ấn cùng một lúc). Đến đây bạn có thể băn khoăn sao không sử dụng MediaPlayer API thay thế ? Bởi vì nếu dùng MediaPlayer bạn sẽ không thể quản lý nhiều luồng âm thanh giống như SounPool. Lý do mà mình khuyên bạn chọn SoundPool là vì vậy.
  • Trong Android SoundPool bạn thực sự có thể kiểm soát âm lượng của loa trái và phải, gán quyền ưu tiên (Priority) cho 1 file âm thanh cụ thể , Loop một file âm thanh và điều chỉnh tốc độ chơi của nó. Tiếp theo chúng ta sẽ điều chỉnh các thông số của Android SoundPool bằng cách sử dụng những biến khác nhau như dưới đây:
private float LEFT_VOL = 1.0f;
private float RIGHT_VOL = 1.0f;
private int PRIORITY = 1;
private int LOOP = 0;
private float RATE = 1.0f;
  •  Tiếp theo tạo SoundPool constructor theo đoạn code dưới đây:
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC,0);
SoundPool(int maxStreams, int streamType, int srcQuality)
  • Đối với mỗi biến âm được tạo ở trên, gắn nó với âm thanh tương ứng. Đoạn code sẽ như sau:
csound = mSoundPool.load(getApplicationContext(),R.raw.c,1);
dsound = mSoundPool.load(getApplicationContext(),R.raw.d,1);
  • Bây giờ tất cả những gì bạn cần làm là tạo một onClick Listenner cho mỗi button như trong tệp activity_main.xml ở trên. Cách làm cực kì đơn giản chỉ cần sử dụng phương thức play trong lớp Android SoundPool như đoạn code cho button C dưới đây
public void playC(View v){
mSoundPool.play(csound,LEFT_VOL,RIGHT_VOL,PRIORITY,LOOP,RATE);
}
  • Đoạn code cho MainActivity.java file sẽ như thế này:
package com.faultinmycode.mypiano;
import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    private SoundPool mSoundPool;
    private int csound;
    private int dsound;
    private int esound;
    private int fsound;
    private int gsound;
    private int asound;
    private int bsound;
    private int ccsound;
    private int cssound;
    private int csssound;
    private int dssound;
    private int gssound;
    private int assound;
    private int fssound;
    private float LEFT_VOL = 1.0 f;
    private float RIGHT_VOL = 1.0 f;
    private int PRIORITY = 1;
    private int LOOP = 0;
    private float RATE = 1.0 f;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        csound = mSoundPool.load(getApplicationContext(), R.raw.c, 1);
        dsound = mSoundPool.load(getApplicationContext(), R.raw.d, 1);
        esound = mSoundPool.load(getApplicationContext(), R.raw.e, 1);
        fsound = mSoundPool.load(getApplicationContext(), R.raw.f, 1);
        gsound = mSoundPool.load(getApplicationContext(), R.raw.g, 1);
        asound = mSoundPool.load(getApplicationContext(), R.raw.a, 1);
        bsound = mSoundPool.load(getApplicationContext(), R.raw.b, 1);
        cssound = mSoundPool.load(getApplicationContext(), R.raw.c_hash, 1);
        csssound = mSoundPool.load(getApplicationContext(), R.raw.c_hash, 1);
        ccsound = mSoundPool.load(getApplicationContext(), R.raw.c2, 1);
        assound = mSoundPool.load(getApplicationContext(), R.raw.a_hash, 1);
        fssound = mSoundPool.load(getApplicationContext(), R.raw.f_hash, 1);
        gssound = mSoundPool.load(getApplicationContext(), R.raw.g_hash, 1);
        dssound = mSoundPool.load(getApplicationContext(), R.raw.d_hash, 1);
    }
    public void playC(View v) {
        mSoundPool.play(csound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playD(View v) {
        mSoundPool.play(dsound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playE(View v) {
        mSoundPool.play(esound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playF(View v) {
        mSoundPool.play(fsound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playG(View v) {
        mSoundPool.play(gsound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playA(View v) {
        mSoundPool.play(asound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playB(View v) {
        mSoundPool.play(bsound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playCC(View v) {
        mSoundPool.play(ccsound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playCS(View v) {
        mSoundPool.play(cssound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playDS(View v) {
        mSoundPool.play(dssound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playFS(View v) {
        mSoundPool.play(fssound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playGS(View v) {
        mSoundPool.play(gssound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playAS(View v) {
        mSoundPool.play(assound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
    public void playCSS(View v) {
        mSoundPool.play(csssound, LEFT_VOL, RIGHT_VOL, PRIORITY, LOOP, RATE);
    }
}

Cuối cùng, đã đến lúc tận hưởng thành quả ! Chạy ứng dụng vừa mới tạo trên thiết bị di động của bạn, chơi và thưởng thức những giai điệu du dương do chính mình tạo ra bởi Android SoundPool. Bạn thấy thế nào về trải nghiệm này? Chia sẻ ngay với mình ở phần nhận xét bên dưới để khiến cho trải nghiệm chơi nhạc của bạn ngày một thú vị hơn nhé !

Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Thông báo