Lập trình một ứng dụng giả lập Piano đơn giản bằng Python

Bài viết này sẽ hướng dẫn tạo ra một ứng dụng giả lập piano đơn giản bằng Python. Sử dụng kết hợp 2 thư viện đó là Pygame và Tkinter.

1: Chuẩn bị:

Trước khi bắt tay vào viết code, thì các bạn cần chuẩn bị những điều sau:

+ Cài đặt thư viện Pygame (nếu bạn dùng máy tính và chưa cài): Đơn giản là gõ pip install pygame trên command prompt. Nếu bạn dùng python trên điện thoại thì nó đã có sẵn thư viện Pygame rồi.

+ Chuẩn bị sẵn file mp3 tiếng piano riêng lẻ: Mình đã chuẩn bị sẵn cho các bạn (tìm mấy file mp3 ghi lại từng tiếng piano riêng lẻ còn lâu hơn thời gian mình ngồi viết code), các bạn có thể tải về tại đây và đưa vào thư mục có chứa file .py bạn đang làm.

Update: Mình đã up code và các file cần thiết lên GitHub. Các bạn có thể tải về tại đây.

2: Code:

Sau đây là đoạn mã nguồn của ứng dụng. Bạn có thể áp dụng cho cả máy tính lẫn điện thoại:

from tkinter import *
from pygame import mixer
tk = Tk()
fr1 = Frame(tk)
fr1.place(x =0,y=0)
list = ['Db','Eb']
list2 = ['Gb','Ab','Bb']

for i in 'CDEFGAB':
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play()
    b = Button(fr1,text = i,
                               height = 5,
                               width = 50,
                               bg ="white",
                               anchor = "w",command=C)
    b.pack()
x1 = 200
y1 = 155
for i in list:
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play()
    c = Button(tk,text = i,
                        height = 2,
                        width = 30,
                        bg = 'black',
                        fg = 'white',anchor ='w',
                        command = C)
    c.place (x = x1, y = y1)
    y1 = y1 + 210
x2 = 200
y2 = 775
for i in list2:
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play()
    c = Button(tk,text = i,
                        height = 2,
                        width = 30,
                        bg = 'black',
                        fg = 'white',anchor ='w',
                        command = C)
    c.place (x = x2, y = y2)
    y2 = y2 + 210
tk.mainloop()

3: Giải thích về code:

Ý tưởng của ứng dụng này vô cùng đơn giản: khi nhấn vào phím đàn thì sẽ phát ra âm thanh. Chúng ta sẽ sử dụng các Button đóng vai trò là các phím đàn. Mỗi một button sẽ ứng với một phím đàn. Tuy nhiên, việc tạo từng Button sẽ vô cùng tốn thời gian. Bởi vậy, mình cho 1 vòng lặp for sẽ nhanh hơn nhiều.

for i in 'CDEFGAB':
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play() #chạy file âm thanh
    b = Button(fr1,text = i,
                               height = 5,
                               width = 50,
                               bg ="white",
                               anchor = "w",command=C)
    b.pack()

Đoạn code trên tạo ra các nốt trắng của đàn piano. Hàm C đóng vai trò phát ra âm thanh khi người dùng nhấn vào phím đàn. Để hàm C được thực hiện khi nhấn thì mình gán nó cho thuộc tính command của button. Câu lệnh mixer.music.load( x + ‘4.mp3’) có tác dụng load các file mp3, với x + ‘4.mp3’ đóng vai trò là tên file. Lí do mình để x + ‘4.mp3’ là vì các file mp3 mình đều đặt tên theo dạng nốt + ‘4.mp3’. Ví dụ: nốt Đô là ‘C4.mp3’.

Để giúp các bạn dễ hình dung thì mình sẽ mô tả lại cách vòng lặp này chạy.

Vòng lặp đầu tiên: i sẽ có giá trị là kí tự ‘C’. Lúc này file mp3 được load sẽ là ‘C4.mp3’. Thuộc tính text của Button đầu tiên được tạo có giá trị là ‘C’.

Vòng lặp thứ hai: i sẽ có giá trị là kí tự ‘D’. Lúc này file mp3 được load sẽ là ‘D4.mp3’. Thuộc tính text của Button thứ hai được tạo có giá trị là ‘D’.

Cứ lần lượt như thế cho đến hết vòng lặp.

2 đoạn code sau đó cũng có thuật toán tương tự:

+ Tạo 2 nốt đen Db, Eb:

x1 = 200
y1 = 155
for i in list:
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play()
    c = Button(tk,text = i,
                        height = 2,
                        width = 30,
                        bg = 'black',
                        fg = 'white',anchor ='w',
                        command = C)
    c.place (x = x1, y = y1)
    y1 = y1 + 210

+ Tạo 3 nốt đen còn lại:

x2 = 200
y2 = 775
for i in list2:
    def C(x = i):
        mixer.init()
        mixer.music.load(x + '4.mp3')
        mixer.music.play()
    c = Button(tk,text = i,
                        height = 2,
                        width = 30,
                        bg = 'black',
                        fg = 'white',anchor ='w',
                        command = C)
    c.place (x = x2, y = y2)
    y2 = y2 + 210

4: Tổng kết:

Hi vọng bài viết này sẽ giúp các bạn được mở rộng thêm kiến thức về GUI trong Python, cũng như hiểu thêm về ứng dụng của giải thuật vào trong phát triển phần mềm.

Ứng dụng này vẫn còn chưa hoàn chỉnh khi chỉ có thể đánh vỏn vẹn 1 nốt đơn, chưa thể đánh các hợp âm. Đồng thời, chỉ có các phím đàn ở 1 octave chưa thể chỉnh nên các octave cao hơn và thấp hơn. Trong tương lai, mình sẽ cố gắng ra bài viết hướng dẫn hoàn thiện ứng dụng này nhanh nhất có thể. Hi vọng các bạn ủng hộ.

Hẹn gặp lại!

Leave a comment

Design a site like this with WordPress.com
Get started