Các bạn giúp tớ với chứ.
Mình sử dụng :
mciSendString("play MySound from 0", 0, 0, 0);
hoặc :
mciSendCommand(mciGetDeviceID("MySound"), MCI_PLAY ,0, 0);
Để chơi 1 bài MIDI. Có điều nó chỉ chơi có 1 lượt mà ko repeat. Mình đã đọc MSDN rất kĩ và thử :
mciSendString("play MySound repeat", 0, 0, 0);
nhưng ko được. Hình như là cái repeat đó chỉ áp dụng cho video thôi.
Có bác nào bết xin chỉ dùm.
Các bạn giúp tớ với chứ.
Cái này hình như phải dựa vào thời gian rồi dùng vòng lặp thì phải, dù sao thì việc bật cái file midi này cũng phải cho vào một thread riêng nên cho vào vòng lặp vô hạn cũng không ảnh hưởng gì
Cách 1: chuyển qua dùng file *.wav (tha hồ loop), dùng sndPlaySound or PlaySound. Ngoài ra, nếu có thể thì nên dùng thằng OpenAL (thằng này resemble cả data type lẫn coding convention của OpenGL). Tin xấu: OpenAL không hỗ trợ midi file. Tin tốt: OpenAL rất khả chuyển (support Windows, Linux/Unix, MacOS như OpenGL) + provide 3D audio API (multichannel). Nếu bác quen OpenGL (provide 3D graphic API) thì bác sẽ thấy OpenAL là một sự bổ sung không thể thiếu.
OpenAL Homepage: www.openal.org (download OpenAL SDK & ALUT)
Cách 2: download DirectX SDK về rồi lên codeproject or codeguru, search bằng từ khóa "midi" hoặc vào phần multimedia của nó để xem một số project sẵn có về cách replay midi file (đối với codeproject, phải đăng ký thì mới có quyền down project về).
Cách 3: tính độ dài của file midi theo mili giây (giả sử là s). Sau đó, sử dụng hàm SetTimer để gửi thông điệp WM_TIMER sau mỗi s mili giây. Chặn thông điệp WM_TIMER để play lại file midi từ đầu. Bác nhớ gọi thằng KillTimer để ngưng khi không còn cần thiết nữa.
Nói chung, nên dùng file *.wav cho đơn giản, hiệu quả (các game như StarCraft, Age of Empires, CS ... đều sử dụng wav file - nếu không tin, bác cứ mở thư mục sound của chúng ra mà xem).
P.S: Cái này dùng cho phần credit của chương trình cờ caro của bác đúng không ?
Our dreams are young and we both know they take us where we want to go...
Thằng PlaySound thì quá tệ. Nó chỉ chạy được một cái tại 1 thời điểm mà ko thể chạy được 2 cái. Đã vậy cho thêm một đoạn nhạc .wav và chương trình thì chương trình của tớ sẽ "tăng trọng" gấp đôi mất.
- Cái cách tính độ dài của file MIDI rồi SetTimer có lẽ là được nhưng mà tớ thấy có vẻ ko ổn cho lắm. Có vẻ nó hơi bị thủ công ???
- Thằng DirectSound thì mình cũng search trên CodeProject từ trước rồi, nhưng mấy cái Direct này nó hơi bị khó, mình cũng chưa có tài liệu nên xem mã nguồn của người ta, toàn thấy một mớ bòng bong chẳng biết cái đoạn nó Play ở đâu nữa. Có lẽ mình sẽ sử dụng cách này, nhưng phải đầu tư nghiên cứu sâu hơn mới mong xài được.
PS : Hổng phải Credit đâu bạn. Cả chương trình đều chạy chung một nhạc nền mà ! À mà có cái tên của cậu ở trong phần Spacial Thanks của Credit đó. Cảm ơn vì đã giúp đỡ nhiều. Nhưng mà sao lạ quá vậy ? Cái này tớ hỏi mãi từ lâu rồi mà bi giờ cậu mới trả lời ?? Lần sau cậu nhớ siêng vào congdongcviet và tớ hỏi cái gì thì cậu nhớ trả lời luôn nhé không mất công tớ đợi mãi, khổ thân !
Đã được chỉnh sửa lần cuối bởi hieubm : 26-02-2007 lúc 02:16 PM.