Unknown - haskell-notes

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

что мы можем ввести специальный класс, который объединит в себе эти операции. Назовём его классом

Temporal(временн о й):

class Temporala where

type Dura :: *

dur

::a -> Dura

delay

:: Dura ->a ->a

stretch :: Dura ->a ->a

В этом классе определён один тип, который обозначает размерность времени, и три метода в дополнении

к методам delay и stretch мы добавим метод dur, мы будем считать, что всё что происходит во времени

конечно и с помощью метода dur мы всегда можем узнать протяжённость значения их класса Temporalво

времени. Для определения этого класса нам придётся подключить расширение TypeFamilies. Теперь мы

легко можем определить экземпляры класса Temporalдля Eventи Track:

instance Numt => Temporal( Eventt a) where

type Dur( Eventt a) =t

dur

=eventDur

delay

=delayEvent

stretch =stretchEvent

instance Numt => Temporal( Trackt a) where

type Dur( Trackt a) =t

dur

=trackDur

delay

=delayTrack

stretch =stretchTrack

Композиция треков

Определим две полезные в музыке операции: параллельную и последовательную композицию треков. В

параллельной композиции мы играем два трека одновременно:

( =:=) :: Ordt => Trackt a -> Trackt a -> Trackt a

Trackt es =:= Trackt’ es’ = Track(max t t’) (es ++es’)

Теперь общая длительность трека равна длительности большего из треков, а события включают в себя

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

композицию, для этого мы сместим второй трек на длину первого и сыграем их одновременно:

308 | Глава 21: Музыкальный пример

( +:+) ::( Ordt, Numt) => Trackt a -> Trackt a -> Trackt a

( +:+) a b =a =:=delay (dur a) b

При этом у нас как раз и получится, что мы сначала сыграем целиком трек a, а затем трек b. Теперь

определим аналоги операций =:=и +:+для списков:

chord ::( Numt, Ordt) =>[ Trackt a] -> Trackt a

chord =foldr ( =:=) (silence 0)

line ::( Numt, Ordt) =>[ Trackt a] -> Trackt a

line =foldr ( +:+) (silence 0)

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

loop ::( Numt, Ordt) => Int -> Trackt a -> Trackt a

loop n t =line $replicate n t

Экземпляры стандартных классов

Мы можем сделать тип трек экземпляром класса Functor:

instance Functor( Eventt) where

fmap f e =e{ eventContent =f (eventContent e) }

instance Functor( Trackt) where

fmap f t =t{ trackEvents =fmap (fmap f) (trackEvents t) }

Мы можем также определить экземпляр для класса Monoid. Параллельная композиция будет операцией

объединения, а нейтральным элементом будет тишина, которая длится ноль единиц времени:

instance( Ordt, Numt) => Monoid( Trackt a) where

mappend =( =:=)

mempty

=silence 0

21.3 Ноты в midi

С помощью типа Trackмы можем описывать всё, что имеет свойство случаться во времени и длиться,

мы можем описывать наборы событий. Операции из класса Temporalи операции последовательной и парал-

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

чтобы это стало музыкой, нам не хватает нот.

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

основных параметра, это номер инструмента, громкость и высота. Длительность ноты будет кодироваться в

событии, эта информация уже встроена в тип Track.

data Note = Note{

noteInstr

:: Instr,

noteVolume

:: Volume,

notePitch

:: Pitch,

isDrum

:: Bool

}

Итак нота содержит код инструмента, громкость и высоту и ещё один параметр. По последнему пара-

метру можно узнать сыграна нота на барабане или нет. В midi ноты для ударных обрабатываются особым

образом. Десятый канал выделен под ударные, при этом номер инструмента игнорируется, а вместо этого

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

Интервал:

Закладка:

Сделать

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

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


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

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

x