2014-10-02 2 views
7

Я хотел бы создать простую программу, которая будет генерировать MIDI-файлы. Нет, я не хочу использовать Haskore, потому что это любопытное переполнение для этого проекта. Я думаю, что что-то вроде this library будет достаточно.Создание MIDI-файла в Haskell

То, что я хочу быть в состоянии сделать:

  • создать новый MIDI-файл;
  • записывать в него некоторые события (я хочу управлять скоростью, шагом и положением во времени);
  • Сохраните файл MIDI.

Это так просто, я уверен, это не сложно, но я не могу найти хороший пример, как это сделать.

Просьба привести базовый пример или указать, где я могу найти информацию о создании MIDI-файлов в Haskell.

Примечание: Я не прошу вас о хорошей библиотеке, чтобы это сделать, я спрашиваю вас, как это сделать в Haskell (с любой библиотекой, которую вы считаете хорошей для использования в примере).

+3

Я не знаю Haskell, но материал в тестовых и примерных каталогах выглядит интересным. –

+0

Вы уже пробовали более простые программы, доступные в Интернете (например [этот] (http://www.increpare.com/2008/10/basic-haskell-midi-file-output/) или [другие тот же автор] (http://www.increpare.com/?s=midi))? –

+0

@ Aurélien, я видел эту программу, когда пытался в Google тему. К сожалению, я не знаю, так ли это должно быть сделано в приличной программе (он использует 'Codec.Midi', это действительно хорошо?). Если бы в этом коде были подробные комментарии, это было бы намного более полезно. – Mark

ответ

6

Предисловие

ОК, я не уверен, что это был хороший вопрос, но я не могу больше ждать, так вот как написать некоторый 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 

Готово.

Смежные вопросы