52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 349

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 349

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

Далее следуют сообщения из проигрывателя timidity и долгожданный звук. Мы слышим ноту до, сыг-

ранную на рояле. Наберём какую-нибудь мелодию:

*Main> let x = line [c, hn e, hn e, low b, c]

*Main> out x

Сыграем в два раза быстрее, на другом инструменте:

*Main> out $ instr 15 $ hn x

Сыграем канон. Канон это когда одна и та же мелодия ведётся в разных голосах с запаздыванием. Сыграем

двухголосный канон:

*Main> out $ instr 80 (loop 3 x) =:= delay 2 (instr 65 $ low $ loop 3 x)

Номера инструментов можно посмотреть по справке к протоколу General Midi. Это дополнение к прото-

колу midi определяет какие номера каким инструментам должны соответствовать. Звучит ужасно, но звучит!

21.5 Пример

Опираясь на примитивы композиции, которые мы определил в модуле Score, мы можем написать мело-

дию. Ниже приведён небольшой пример. Инструменты:

closedHiHat = drum 42;

rideCymbal = drum 59;

cabasa = drum 69;

maracas

= drum 70;

tom

= drum 45;

flute

= instr 73;

piano

= instr 0;

Ударная секция:

b1 = bam 100

b0 = bam 84

drums1 = loop 80 $ chord [

tom

$ line [qn b1, qn b0, hnr],

maracas $ line [hnr, hn b0]

]

drums2 = quieter 20 $ cabasa $ loop 120 $ en $ line [b1, b0, b0, b0, b0]

drums3 = closedHiHat $ loop 50 $ en (line [b1, loop 12 wnr])

drums = drums1 =:= drums2 =:= drums3

Уже сейчас мы можем загрузить эту партию в интерпретатор и послушать, вызвав out drums. Аккорды к

мелодии:

c7

= chord [c, e, b]

gs7 = chord [low af, c, g]

g7

= chord [low g, low bf, f]

harmony = piano $ loop 12 $ lower 1 $ bn $ line [bn c7, gs7, g7]

Мелодия:

ac = louder 5

mel1 = bn $ line [bnr, subMel, ac $ stretch (1+1/8) e, c,

subMel, enr]

where subMel = line [g, stretch 1.5 $ qn g, qn f, qn g]