2014-10-02 42 views
7

Tôi muốn tạo một chương trình đơn giản sẽ tạo tệp MIDI. Không, tôi không muốn sử dụng Haskore, bởi vì nó là quá mức cần thiết cho dự án này. Tôi nghĩ rằng một cái gì đó như this library sẽ là đủ.Tạo tệp MIDI trong Haskell

Những gì tôi muốn để có thể làm:

  • tạo tập tin MIDI mới;
  • viết một số sự kiện vào đó (Tôi muốn kiểm soát vận tốc, quảng cáo chiêu hàng và vị trí trong thời gian);
  • lưu tệp MIDI.

Nó đơn giản như vậy, tôi đặt cược nó không phải là khó, nhưng tôi không thể tìm thấy bất kỳ ví dụ tốt làm thế nào để làm điều đó.

Vui lòng cung cấp ví dụ cơ bản hoặc chỉ ra nơi tôi có thể tìm thông tin về cách tạo tệp MIDI trong Haskell.

Lưu ý: Tôi không hỏi bạn về thư viện tốt để làm điều đó, tôi hỏi bạn làm thế nào để làm điều đó trong Haskell (với bất kỳ thư viện mà bạn cho là tốt để sử dụng trong ví dụ).

+3

Tôi không biết Haskell, nhưng nội dung trong thư mục thử nghiệm và ví dụ có vẻ thú vị. –

+0

Bạn đã thử các chương trình đơn giản có sẵn trên Web (như [this this] (http://www.increpare.com/2008/10/basic-haskell-midi-file-output/) hoặc [các chương trình khác bởi cùng tác giả] (http://www.increpare.com/?s=midi))? –

+0

@ Aurélien, tôi thấy chương trình này khi tôi cố gắng tìm đến chủ đề của Google. Thật không may tôi không biết nếu điều này là làm thế nào nó nên được thực hiện trong một chương trình phong nha (nó sử dụng 'Codec.Midi', là nó thực sự tốt?). Nếu mã đó có nhận xét chi tiết, nó sẽ hữu ích hơn nhiều. – Mark

Trả lời

6

Lời nói đầu

OK, tôi không chắc chắn rằng đó là một câu hỏi hay, nhưng tôi không thể chờ đợi được nữa, vì vậy đây là làm thế nào để viết một số MIDI sử dụng Haskell. Tôi nên lưu ý rằng chủ đề này hầu như không được ghi lại trừ một số mô tả gói trông khá khó hiểu.

Gói tối giản nhất phù hợp với nhu cầu của chúng tôi là HCodecs và dường như nó được cập nhật thường xuyên. Chúng tôi quan tâm đến mô-đun Codec.Midi.

MIDI Sự kiện

Trong thư viện này sự kiện dự kiến ​​sẽ được biểu diễn dưới dạng các bộ:

(time-offset, message) 

đâu time-offset được thời gian trôi qua trong tích tắc (xem dưới đây làm thế nào để thiết lập số tick mỗi nhịp) giữa sự kiện cuối cùng và sự kiện mới. message phải thuộc loại Message, danh sách đầy đủ các nhà thầu có thể được tìm thấy here. Các hàm tạo này tương ứng với tất cả các sự kiện MIDI cơ bản.

Tạo bản nhạc

Bản nhạc là danh sách sự kiện. Vì vậy, chúng ta có thể viết một cái gì đó rất đơn giản bây giờ:

track0 = [(0, NoteOn 0 60 80), 
      (24, NoteOff 0 60 0), 
      (0, TrackEnd)] 

Đó là một nốt nhạc (60 = middle C), chúng tôi đã sử dụng ở đây sự kiện NoteOnNoteOff (nó cũng giống như NoteOn của 0 vận tốc, vì vậy trong thực tế người có xu hướng chỉ sử dụng NoteOn). Để biết thêm thông tin về những gì người ta có thể làm ở đây Google về định dạng MIDI!

Hãy tạo thêm một ca khúc chứa E:

track1 = [(0, NoteOn 0 64 80), 
      (24, NoteOn 0 64 0), 
      (0, TrackEnd)] 

Tuyệt vời! Đã đến lúc đưa dữ liệu vào bộ chứa MIDI.

Hãy đến với nhau!

Hãy tạo đối tượng đại diện cho toàn bộ tệp MIDI. Chúng tôi sẽ sử dụng hàm tạo của Midi datatype.

myMidi = Midi { fileType = MultiTrack, 
       timeDiv = TicksPerBeat 24, 
       tracks = [track0, track1] } 

Vậy đó! timeDiv xác định lượng tử của bản nhạc, nếu chúng tôi có 24 bọ ve mỗi nhịp, ghi chú của chúng tôi sẽ phát âm thanh chính xác cho một nhịp (chắc chắn, bạn có thể thêm một số sự kiện để đặt tiến độ và nội dung, dùng thử!).

Cứu Stuff

Để lưu Midi chúng ta nên sử dụng exportFile (nhấp vào liên kết để biết thêm thông tin ... OK, chỉ đùa thôi không có thậm chí còn mô tả một dòng):

exportFile "my-midi.mid" myMidi 

Xong.