Lập trình với các nốt nhạc

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Chủ đề này đã từng được bạn TuanVNUNI làm khá hoàn thiện... Ở đây ta dùng code để chơi các note nhạc với giải pháp đơn giản hơn rất nhiều
A> TIẾN HÀNH:
1> Chèn code vào Module
- Chèn 1 module và đặt code này vào nó:
PHP:
Dim handleMidiOut As Long
Private Declare Function midiOutShortMsg Lib "winmm.dll" _
   (ByVal hMidiOut As Long, ByVal dwMsg As Long) As Long
Private Declare Function midiOutOpen Lib "winmm.dll" (lphMidiOut As Long, _
   ByVal uDeviceID As Long, ByVal dwCallback As Long, _
   ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Private Declare Function midiOutClose Lib "winmm.dll" (ByVal hMidiOut As Long) As Long
PHP:
Function OpenMidiOut(ByVal dev_id As Long) As Long
  CloseMidiOut
  midiOutOpen handleMidiOut, dev_id, 0, 0, 0
  OpenMidiOut = (handleMidiOut <> 0)
End Function
PHP:
Sub CloseMidiOut()
  If handleMidiOut <> 0 Then
    midiOutClose handleMidiOut
    handleMidiOut = 0
  End If
End Sub
PHP:
Sub PlayNote(Ch As Long, ByVal nn As Long, vel As Long)
  Dim PackDword As Long
  PackDword = &H90 + Ch + nn * &H100 + vel * &H10000
  midiOutShortMsg handleMidiOut, PackDword
End Sub
2> Chèn UserForm
- Chèn 1 UserForm với 1 ScrollBar... Đặt giá trị Min và Max cho ScrollBar lần lượt là 30100
- Chèn code này vào UserForm
PHP:
Private Sub UserForm_Initialize()
  OpenMidiOut (-1)
End Sub
PHP:
Private Sub UserForm_Terminate()
  CloseMidiOut
End Sub
PHP:
Private Sub ScrollBar1_Change()
  PlayNote 0, ScrollBar1.Value, 120
End Sub
Mở Form rồi dùng chuột kéo ScrollBar, các bạn sẽ thấy 1 chuổi âm thanh piano phát ra từ thấp đến cao
Tham khảo file PlayMusicalNote_1.xls
-----------------------------------------
B> NÂNG CẤP
Từ code trên, chúng ta hoàn toàn có thể nghĩ đến việc tạo ra 1 cây đàn piano với 44 phím trắng đen được vẽ bằng CommandButton


untitled.JPG

Code vẫn dựa trên cơ sở code cũ, chỉ thêm 1 ClassModule nhằm mục địch rút gọn code cho CommandButton (thay vì phải viết 44 đoạn code)... Tham khảo file PlayMusicalNote_2.xls
-----------------------------------------
C> NHỮNG KHẢ NÂNG MỞ RỘNG CÓ THỂ:
- Từ file này, các bạn có thể nghĩ đến việc dùng bàn phím thay cho chuột khi nhấn các phím đàn (KeyPress Event hay gì gì đó)
- Có thể nghiên cứu chỉnh sửa các thông số để thêm các loại nhạc cụ khác vào
- Có thể lập trình sẳn để nó chơi 1 bài nhạc nào đó
vân vân...
-----------------------------------------
Code này được tham khảo từ các trang web nước ngoài nhưng đã chỉnh sửa và cắt bỏ những phần không cần thiết... Các bạn hãy xem và góp ý thêm nhé
 

File đính kèm

Thử trò chơi này xem!
- Đầu tiên cho thêm hàm Sleep vào
PHP:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
- Tiếp theo đăt code này vào module
PHP:
Sub BELBR()
  Dim Ch, Dur, i As Long
  Ch = Array(69, 71, 72, 76, 69, 71, 72, 76, 69, 71, 72, 76, 69, 71, _
          72, 76, 69, 64, 69, 71, 72, 74, 71, 69, 67, 69, 69, 64, 69, _
          71, 72, 74, 71, 69, 67, 64, 64, 69, 74, 76, 74, 76, 74, 69, _
          72, 74, 72, 74, 72, 69, 76, 74, 72, 71, 69)
  Dur = Array(200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, _
              200, 200, 200, 200, 200, 2000, 400, 400, 400, 400, 800, _
              400, 400, 400, 400, 2000, 400, 400, 400, 400, 800, 400, _
              400, 400, 400, 2000, 400, 400, 400, 400, 400, 1200, 400, _
              400, 400, 400, 400, 1200, 400, 800, 800, 800, 800, 800)
  OpenMidiOut (-1)
  For i = 0 To UBound(Ch)
    PlayNote 0, Ch(i), 120
    Sleep Dur(i)
    DoEvents
  Next
  Sleep 1000
  CloseMidiOut
End Sub
Chạy thử xem bạn đã nghe được những gì?
 
Upvote 0
Một bài nhạc Valse cổ điển

Đây là 1 bài nhạc Valse cổ điển rất nổi tiếng
File này được thực hiện như sau:
- Tạo 1 bảng tra thể hiện sự tương quan giữa các ký tự ký âm và cao độ
- Cột A dùng để ký âm
- Cột B dùng hàm VLOOKUP để lấy giá trị cao độ từ bảng tra
- Cột C: thời gian trễ

untitled.JPG

- Code sẽ được viết dựa vào vòng lập for duyệt qua các cell
PHP:
Sub Classic1()
  Dim i As Long, n As Long
  OpenMidiOut (-1)
  For n = 0 To 1
    For i = 2 To 23
      PlayNote 0, Cells(i, 2) + n * 12, 120
      Sleep Cells(i, 3)
      DoEvents
    Next i
  Next n
  Sleep 300
  For n = 1 To 0 Step -1
    For i = 24 To Range("A1000").End(xlUp).Row
      If i >= 30 And i <= 59 Then PlayNote 0, Cells(i, 2) + 3 + n * 12, 120
      PlayNote 0, Cells(i, 2) + n * 12, 120
      Sleep Cells(i, 3)
      DoEvents
    Next i
  Next n
  Sleep 1000
  CloseMidiOut
End Sub
- Để ý nghe sẽ thấy đoạn nhạc trên được phối thêm phần bè
- Các bạn hãy nghe xem có nhận ra là bài gì không?
(Giá có thêm tiếng trống giữ nhịp nữa thì.. hay tuyệt)
-----------------------------------------------------------------------
Chỉ cần biết 1 chút nhạc lý là các bạn có thể ký âm bất cứ bản nhạc nào các bạn muốn (đương nhiên bản nhạc ấy phải tương đối phù hợp với tiếng đàn piano)
Thưởng thức thành quả do chính ta tạo ra cũng thú vị đấy chứ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cái vụ này nên đề trong word hay gì, gì khác; Còn Excel để bà con mần ăn chứ chú mày?!

Hay fải mở 1 lúc 2 trình excel!
 
Upvote 0
Cái vụ này nên đề trong word hay gì, gì khác; Còn Excel để bà con mần ăn chứ chú mày?!

Hay fải mở 1 lúc 2 trình excel!
Giải trí thôi mà sư phụ
Ứng dụng ở đây có thể là: trong 1 chương trình lớn, ta có thể điều khiển để phát ra 1 âm thanh cảnh báo gì đó do ta tự biên (không cần nhờ vào file nhạc). Vậy thì khi anh gữi chương trình cho người khác, anh cũng không cần đính kèm theo file nhạc này luôn, đúng không?
Nói thì nói vậy chứ mục đích của em chỉ là giải trí (chưa nghĩ đến ứng dụng dù biết chắc sẽ có)
 
Upvote 0
Chủ đề này đã từng được bạn TuanVNUNI làm khá hoàn thiện... Ở đây ta dùng code để chơi các note nhạc với giải pháp đơn giản hơn rất nhiều

Hoan nghênh anh Tuấn đã đến với thế giới âm nhạc trên Excel. Mong rằng anh sẽ luôn nâng cấp để hoàn thiện tiếp các chức năng còn lại.

Hiện nay anh làm rất đơn giản vì thiếu nhiều chức năng âm nhạc cũng như giao diện hỗ trợ người dùng soạn nhạc:

+ Chưa hỗ trợ tốt cho người dùng soạn nhạc (các ký hiệu chưa hoàn chỉnh, độ ngưng hiện nay để bằng số, mình nên định nghĩa cho người dùng thành: trong, trắng, đen, đơn, kép,...)
+ Bản nhạc không thể hiện sự tổng quát hay chưa thực hiện được chu trình chạy (ví dụ 3 đoạn nhạc giống nhau nhưng lời trong đó thì khác nhau), theo file anh làm thì số lượng dòng soạn nhạc phải gấp 3 lần mặc dù chúng giống nhau.
+ Bản chạc chạy không thay đổi loại nhạc cụ, từ đầu đến cuối chỉ Piano.
+ Chưa có các chức năng cơ bản, menu người dùng để chạy bản nhạc. Ví dụ "Chơi trọn bài hát", "Chơi một đoạn nhạc" - Để kiểm tra việc soạn nhạc đúng chưa.

Với những góp trên hy vọng anh hoàn thiện thêm file âm nhạc của mình.
Khi anh hoàn thiện được các chức năng trên thì độ phức tạp của nó sẽ giống như chương trình em làm MIDI Sound - Soạn nhạc trong Excel.

Em có một quan niệm "Để có những thứ tuyệt vời không hề đơn giản". Trong lập trình, để đơn giản cho người dùng thì người lập trình phải làm việc rất nhiều và cũng không đơn giản.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi anh hoàn thiện được các chức năng trên thì độ phức tạp của nó sẽ giống như chương trình em làm MIDI Sound - Soạn nhạc trong Excel.
Em có một quan niệm "Để có những thứ tuyệt vời không hề đơn giản". Trong lập trình, để đơn giản cho người dùng thì người lập trình phải làm việc rất nhiều và cũng không đơn giản
Hi... hi... làm được tới đây là mừng lắm rồi đấy Tuân à
Biết rằng mình còn phải cố gắng rất nhiều! Đây chỉ là bước khởi đầu nên rất mong Tuân hở trợ và góp ý thêm
(Ý kiến của Tuân cũng chính là những gì mà tôi đang theo đuổi)
 
Lần chỉnh sửa cuối:
Upvote 0
attachment.php


Ah, anh có thể sửa lại cái đàn. Theo quy tắc, cứ 2 nút đen thì đến 3 nút đen rồi lại 2 đen...

Để dùng bàn phím, em nghĩ mình bẫy KeyPress trên một nút (ngoài bàn phím nhạc), SetFocus luôn đặt ở nút này. So sánh phím được nhấn rồi gọi phím nhạc tương ứng.
 
Lần chỉnh sửa cuối:
Upvote 0
Có lẽ Tuân không để ý, có 1 nửa phím đen ngoài cùng bên trái. Nhưng anhtuan cắt 1 khúc theo 1 quãng âm 44 phím nên không có phím đó.

Ah, vì em nhìn thôi nên nhầm. Vậy sao mình không sửa cho thành thứ tự từ trái qua phải: 2 đen->3 đen->2 đen....kết thúc là 3 đen. Hình như trong tâtcs cả các cây đàn Piano, Organ đều bố trí như vậy, nênminhf làm theo sẽ thuận mắt.
 
Upvote 0
Có cái này mình xin nhờ Tuân tư vấn giúp
Mình đang phân vân không biết note C có cao độ = 60 hay 61?
Hiện tại mình đang án chừng nó = 60 (do nghe từ 1 công cụ phát âm thanh chuẩn)... nhưng trên mạng người ta lại bảo note C có cao độ = 61
Tuân rành về việc này xin chỉ giúp với
 
Upvote 0
Có cái này mình xin nhờ Tuân tư vấn giúp
Mình đang phân vân không biết note C có cao độ = 60 hay 61?
Hiện tại mình đang án chừng nó = 60 (do nghe từ 1 công cụ phát âm thanh chuẩn)... nhưng trên mạng người ta lại bảo note C có cao độ = 61
Tuân rành về việc này xin chỉ giúp với

Việc chọn 60 hay 61 thực sự em không chắc chắn, nếu anh có cái đàn Organ bên cạnh thì có thể thử ra ngay. Cái chương trình em làm là lấy nốt C là 53 (không biết có chuẩn không nữa :) )

Em góp ý thên về cách chơi nốt nhạc.

Trong âm nhạc cũng như trong một đoạn văn, có dấu chấm, dấu phảy, để nghỉ (lấy hơi :)). Âm nhạc cũng vậy, khi chơi nốt xong (sau độ ngưng/Sleep) nếu gặp nốt nghỉ (trắng, tròn, đem, đơn....) thì phải tắt (Stop) nó.

Mã:
Sub PlayNote(Ch As Long, ByVal nn As Long, vel As Long)
  Dim PackDword As Long
  PackDword = &H90 + Ch + nn * &H100 + vel * &H10000
  midiOutShortMsg handleMidiOut, PackDword
End Sub

Để chơi nốt Đô - C, cao độ là 60
Mã:
PlayNote 0, 60, [COLOR="Blue"]120[/COLOR]

Đối số thứ 3-"vel As Long" của hàm PlayNote là mức âm to nhỏ (có thể từ 0->127). Anh có thể làm ProgressBar để tăng giảm loa.

Để ngừng (Stop) chơi nốt Đô
Mã:
PlayNote 0, 60, [COLOR="Blue"]0[/COLOR]
Sleep(...) - Nghỉ bao lâu?

Anh lưu ý, khi ngừng chơi nốt nhạc thig phải biết nghỉ bao lâu? Cái này tùy thuộc vào nốt nghỉ: trắng, tròn, đen,...


Nếu anh không thực hiện việc Stop như trên thì với những loại đàn dây (String) âm thanh nó kêu mãi không ngừng, khi đó mình nghe sẽ ù hết tai.
 
Lần chỉnh sửa cuối:
Upvote 0
Việc chọn 60 hay 61 thực sự em không chắc chắn, nếu anh có cái đàn Organ bên cạnh thì có thể thử ra ngay. Cái chương trình em làm là lấy nốt C là 53 (không biết có chuẩn không nữa :) )

Em góp ý thên về cách chơi nốt nhạc.

Trong âm nhạc cũng như trong một đoạn văn, có dấu chấm, dấu phảy, để nghỉ (lấy hơi :)). Âm nhạc cũng vậy, khi chơi nốt xong (sau độ ngưng/Sleep) nếu gặp nốt nghỉ (trắng, tròn, đem, đơn....) thì phải tắt (Stop) nó.

Anh lưu ý, khi ngừng chơi nốt nhạc thig phải biết nghỉ bao lâu? Cái này tùy thuộc vào nốt nghỉ: trắng, tròn, đen,...

Nếu anh không thực hiện việc Stop như trên thì với những loại đàn dây (String) âm thanh nó kêu mãi không ngừng, khi đó mình nghe sẽ ù hết tai.
Vấng! Mấy chuyện này tôi có nghĩ qua... chỉ là nóng lòng muốn ra ngay thành phẩm nên chưa bàn đến
Có 1 món cần sự trợ giúp của Tuân: Trong code trên, ta cần thay đổi cái gì và quy luật thay đổi thế nào để tạo ra âm thanh của 1 nhạc cụ khác?
 
Upvote 0
Ah... tôi biết cách làm rồi
Nhờ Tuân xem giúp file này!
Thay đổi loại nhạc cụ như thế có ổn không?
 

File đính kèm

Upvote 0
Upvote 0
Như thế lad đúng cách rồi anh ạ. Nhạc điện tử trong máy tính có 128 (0-127) loại.
Ôi... mừng quá!
Bây giờ lại bắt tay với cái vụ "ngưng" "nghỉ" cho các note.... Vụ này đòi hỏi kiên nhẫn là chính
Nói thật, nhạc lý tôi cũng khá rành (vì ngày trước tôi từng là nhạc công Guitar), nhưng ký âm trên giấy xem ra còn dễ hơn rất nhiều so với việc cho nó vào code (Thấy ngán quá Tuân ơi!)
-------------------------
Cảm ơn những góp ý rất hữu ích của TuanVNUNI
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng là nhìn các sư phụ nói còn thấy hoa cả mắt lên đây này. Mong anhtuan1066 sớm hoàn thiện để anh em còn thưởng thức.
 
Upvote 0
Ôi... mừng quá!
Bây giờ lại bắt tay với cái vụ "ngưng" "nghỉ" cho các note.... Vụ này đòi hỏi kiên nhẫn là chính
Nói thật, nhạc lý tôi cũng khá rành (vì ngày trước tôi từng là nhạc công Guitar), nhưng ký âm trên giấy xem ra còn dễ hơn rất nhiều so với việc cho nó vào code (Thấy ngán quá Tuân ơi!)
-------------------------
Cảm ơn những góp ý rất hữu ích của TuanVNUNI

Oh, giờ em mới biết bác là cao thủ guitar. Anh có am hiểu về nhạc lý + chịu "cày với code" thì sẽ sớm được như ý thôi. Em còn mong muốn chương trình của em nâng cao hơn là chạy hợp âm cùng nhưng chắc là rất khó nên phải dành nhiều time nghiên cứu nữa.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom