Unknown - haskell-notes

Здесь есть возможность читать онлайн «Unknown - haskell-notes» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

haskell-notes: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «haskell-notes»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

haskell-notes — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «haskell-notes», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

data Midi = Midi{

fileType :: FileType,

timeDiv

:: TimeDiv,

tracks

::[ Track Ticks] }

midi-файл состоит из трёх значений. Это обозначение типа файла:

data FileType = SingleTrack | MultiTrack | MultiPattern

По типу midi-файлы могут различаться на файлы с одним треком, файлы с несколькими треками, и

файлы, которые содержат группы треков, которые называют узорами (pattern). По смыслу трек соответствует

партии инструмента.

Тип TimeDivкодирует скорость записи сообщений. Различают два варианта:

data TimeDive = TicksPerBeat Int

| TicksPerSecond Int Int

Первый конструктор говорит о том, что разрешение времени закодировано в формате PPQN, он указы-

вает на число ударов в одной четвертной длительности. Второй конструктор говорит о том, что разрешение

кодируется в формате SMPTE, оно указывает на число кадров в секунде.

Теперь посмотрим, что такое трек:

type Tracka =[(a, Message)]

Трек это список событий с временными отсчётами. Время в midi отсчитывается относительно предыдуще-

го события. Например в следующей записи три события произошли одновременно и затем спустя 10 тактов

произошли ещё два события:

[(0, e1), (0, e2), (0, e3), (10, e4), (0, e5)]

21.2 Музыкальная запись в виде событий

Писать музыку в виде событий midi очень неудобно, пусть даже и через HCodecs, необходимо придумать

надстройку над протоколом midi. Я долго думал об этом и в итоге пришёл к выводу, что наиболее простой

и податливый способ представления музыки на нотном уровне реализован в языке Csound. Там ноты пред-

ставлены в виде последовательности событий. Каждое событие начинается в определённый момент и длится

некоторое время. Событие содержит код инструмента и набор параметров, которые могут включать в себя

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

параметрами события являются лишь номер инструмента, который играет ноту, начало события и длитель-

ность события. Мы ослабим эти ограничения. Событие будет содержать лишь время начала, длительность и

некоторое содержание.

data Eventt a = Event{

eventStart

::t,

eventDur

::t,

eventContent

::a

} deriving( Show, Eq)

Параметр t символизирует время, а параметр a – некоторое содержание события. Мы будем говорить,

что в некоторый момент времени произошло значение типа a и оно длилось некоторое время. Треком мы

будем называть набор событий, которые длятся определённой время:

data Trackt a = Track{

trackDur

::t,

trackEvents

::[ Eventt a]

}

Первый параметр указывает на общую длительность трека, а второй содержит события, которые про-

изошли. Мы явно указываем длительность трека для того, чтобы иметь возможность представить тишину.

Значение тишины будет выглядеть так:

silence t = Trackt []

Этим мы говорим, что ничего не произошло в течение t единиц времени.

Музыкальная запись в виде событий | 307

Преобразование событий во времени

Наши события привязаны ко времени. Мы можем ввести линейные операции, которые будут изменять

расположение событий во времени. Самый простой способ изменения положения это задержка. Мы можем

задержать появление события, прибавив какое-нибудь число ко времени начала события:

delayEvent :: Numt =>t -> Eventt a -> Eventt a

delayEvent d e =e{ eventStart =d +eventStart e }

Ещё одно простое преобразование заключается в изменении масштаба времени, в музыке или анимации

этой операции соответствует перемотка. Событие начинает происходить быстрее или медленнее:

stretchEvent :: Numt =>t -> Eventt a -> Eventt a

stretchEvent s e =e{

eventStart

=s *eventStart e,

eventDur

=s *eventDur

e }

Для изменения масштаба времени мы умножили временные параметры на число s. Эти операции мы

можем перенести и на значения типа Track.

delayTrack :: Numt =>t -> Trackt a -> Trackt a

delayTrack d ( Trackt es) = Track(t +d) (map (delayEvent d) es)

stretchTrack :: Numt =>t -> Trackt a -> Trackt a

stretchTrack s ( Trackt es) = Track(t *s) (map (stretchEvent s) es)

Класс преобразований во времени

У нас есть аналогичные операции преобразования во времени для событий и треков, это говорит о том,

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «haskell-notes»

Представляем Вашему вниманию похожие книги на «haskell-notes» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «haskell-notes»

Обсуждение, отзывы о книге «haskell-notes» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x