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 NoteOn
và NoteOff
(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.
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ị. –
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))? –
@ 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