все элементы на 18 за один проход. Для этого мы можем закодировать преобразования событий во времени
в типе Track:
data Track t a = Track {
trackDur
:: t,
trackEvents :: TList t a
data TList t a = Empty | Single a | Append (TList t a) (TList t a)
| TFun (Tfm t) (TList t a)
data Tfm t = Tfm ! t ! t
Тип TList позволяет проводить быстрое объединение списков. Дополнительный конструктор TFun обо-
значает линейное преобразование списка во времени. Линейное преобразование кодируется двумя числами,
это масштаб и смещение. Мы считаем, что события в конструкторе Single начинаются в момент времени 0
и длятся 1 единицу времени. Так например событие, которое произошло на 2 единице времени и длилось 4
единицы можно представить так:
TFun (4 2) (Single a)
Значение Tfm k d обозначает линейную функцию
f ( x) = kx + d
Для того чтобы получить настоящие отсчёты по времени мы применяем её к временным координатам
“не преобразованного” события, то есть события Event 0 1 a.
Единственное, что нам нужно для того чтобы встроить этот вариант в библиотеку это написать функцию:
fromTList :: TList t a -> [Event t a]
И конечно переопределить все функции композиции. Но все сложные функции, которые отвечают за
перевод из Track в Midi останутся прежними.
21.7 Краткое содержание
В этой главе мы построили секвенсор для создания midi-файлов. Мы воспользовались библиотекой
HCodecs и создали над ней небольшую надстройку.
В нашей библиотеке примитивными конструкциями были события, параллельная композиция (одновре-
менное воспроизведение) и преобразование событий во времени (сдвиг и масштабирование). Все остальные
операции выражались через эти простейшие операции. Отметим, что есть и другие подходы. Например в биб-
лиотеках Haskore и Euterpea примитивными конструкциями является единичное событие (без отметок во
времени) и параллельная и последовательная композиции. Подход, который мы рассмотрели в более общем
виде реализован в библиотеках temporal-music-notation и temporal-music-notation-demo.
316 | Глава 21: Музыкальный пример
21.8 Упражнения
• Попробуйте написать какую-нибудь мелодию.
• Подумайте каких операций не хватает. Например было бы удобно иметь возможность вырезать из ме-
лодии куски. Так в примере у нас остались хвосты от ударной секции, определите операцию, которая
позволяет убрать лишнее.
Упражнения | 317
Приложения
318 | Приложения
Начало работы с Haskell
Компилятор
Для программирования в Haskell нам понадобится компилятор. Мы будем пользоваться наиболее разви-
тым компилятором~– GHC. Лучше всего устанавливать его вместе с Haskell Platform:
http://hackage.haskell.org/platform/
Haskell Platform содержит стабильную версию компилятора и много хороших, проверенных временем
библиотек. Если по каким-то причинам установить Haskell Platform не удалось. Не отчаивайтесь, можно
загрузить компилятор с сайта GHC:
http://www.haskell.org/ghc/
И далее установить все необходимые библиотеки с Hackage с помощью cabal (устанавливается отдельно
с http://www.haskell.org/cabal/).
Среда разработки
Для Haskell существует очень мало сред разработки. Обычно на Haskell программируют в каких-нибудь
продвинутых текстовых редакторах (vim, Emacs, scite, kate, notepad++). Отметим всё же среду разработки
Leksah (http://leksah.org/), она написана на Haskell и её можно установить с Hackage.
Если вы не хотите разбираться с новым текстовым редактором или средой разработки, и вам нужна лишь
подсветка синтаксиса можно воспользоваться gedit. Пишем код в gedit, сохраняем, переключаемся на ghci,
пробуем, обновляем, пробуем, при случае компилируем или собираем в пакет. Всё это можно делать и в
gedit.
Начало работы с Haskell | 319
Литература
О Haskell написано много интересных книг и статей, но все они на английском. На русском языке выходит
электронный журнал “Практика функционального программирования” (). Пока в нём доминируют два языка
– это Erlang и Haskell.
Я бы хотел рассказать о тех книгах и статьях, которые мне помогли. Все они приняли активное участие
в создании этой книги.
Книги
• Miran Lipovac̆a. Learn You A Haskell For A Great Good.
Очень хорошая книга для начинающих, Haskell в картинках. Весёлая и познавательная книга1