Выбрать главу

все элементы на 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