Предисловие
ОК, я не уверен, что это был хороший вопрос, но я не могу больше ждать, так вот как написать некоторый MIDI с помощью Haskell. Я должен отметить, что эта тема едва документирована, за исключением некоторых описаний пакетов, которые выглядят довольно загадочными.
Самый минималистический пакет, который соответствует нашим потребностям, - HCodecs, и, похоже, он регулярно обновляется. Нас интересует модуль Codec.Midi.
MIDI События
В этой библиотеке событий, как ожидается, будут представлены в виде кортежа:
(time-offset, message)
Где time-offset
это истекшее время в клещах (см ниже, как установить количество тиков в такт) между последнее событие и новое. message
должен быть типа Message
, полный список конструкторов можно найти here. Эти конструкторы соответствуют всем основным событиям MIDI.
Создание дорожки
Трек - это список событий. Таким образом, мы можем написать что-то очень упрощенно Сейчас:
track0 = [(0, NoteOn 0 60 80),
(24, NoteOff 0 60 0),
(0, TrackEnd)]
Это одна нота (60 = середина C), мы использовали здесь события NoteOn
и NoteOff
(это то же самое, как NoteOn
от 0
скорости, так что на практике людей имеют тенденцию использовать только NoteOn
). Для получения дополнительной информации о том, что можно здесь сделать, Google о формате MIDI!
Давайте создадим еще один трек, содержащий E:
track1 = [(0, NoteOn 0 64 80),
(24, NoteOn 0 64 0),
(0, TrackEnd)]
Отлично! Пришло время поместить данные в контейнер MIDI.
Идите вместе!
Давайте создадим объект, представляющий весь MIDI-файл. Мы будем использовать конструктор Midi
datatype.
myMidi = Midi { fileType = MultiTrack,
timeDiv = TicksPerBeat 24,
tracks = [track0, track1] }
Вот и все! timeDiv
определяет квантование трека, если у нас есть 24
тиков за такт, наши ноты будут звучать ровно для одного удара (конечно, вы можете добавить некоторые события, чтобы установить темп и прочее, попробуйте!).
Сохранение вещи
Чтобы сохранить Midi
мы должны использовать exportFile
(не нажмите на ссылку для получения дополнительной информации ... ОК, шучу нет даже описание одна линия):
exportFile "my-midi.mid" myMidi
Готово.
Я не знаю Haskell, но материал в тестовых и примерных каталогах выглядит интересным. –
Вы уже пробовали более простые программы, доступные в Интернете (например [этот] (http://www.increpare.com/2008/10/basic-haskell-midi-file-output/) или [другие тот же автор] (http://www.increpare.com/?s=midi))? –
@ Aurélien, я видел эту программу, когда пытался в Google тему. К сожалению, я не знаю, так ли это должно быть сделано в приличной программе (он использует 'Codec.Midi', это действительно хорошо?). Если бы в этом коде были подробные комментарии, это было бы намного более полезно. – Mark