
Фрагмент - 104 Кб
В запись "Мидиотизма" войдёт музыка, индивидуально сгенерированная для каждого экземпляра. Играющая её программка была написана летом 2002 года на языке CAL, встроенном в музыкальную среду Cakewalk Pro Audio 9, с помощью которой, собственно, и создавался альбом.
Несколько слов о языке CAL. Язык основан на небезысвестном Лиспе, структуру коего я описывать не стану (несмотря на его резкое отличие от C, Pascal, Basic и прочих языков с традиционным видом выражений). CAL очень скуп. В частности в нём нет никаких процедур/функций - вместо этого используется include-файл, фактически, макрос. Мелодия сочиняется и играется в реальном времени.
Я почти не пишу комментариев в программах (только когда сам путаюсь окончательно) Поэтому к нижеуказанным текстам комментарии приписаны курсивом.
; (do
(sendMIDI 1 1 PATCH 24) устанавливаем инструменты. Канал 1-гитара (sendMIDI 1 2 PATCH 72) Канал 2 - флейта. (int t 0) (int y 0) (int x 0) (int z 0) (int note 0) (int note1 0) (int note2 0) (int note3 0) (int C 48) До (int D 50) Ре (int E 52) Ми (int F 53) (int G 55) (int A 57) (int B 59) Си (int r 0) (int count 3) Цикл (можно и побольше) (while (> count 0) (do (= note1 C) Устанавливаем аккорд (= note2 E) До мажор (= note3 G) (= t 800) Длительность аккорда (include "jazz2$1.cal") См. ниже (= note1 F) (= note2 A) Фа мажор (= note3 C) (= t 400) (include "jazz2$1.cal") (= note1 G) (= note2 B) Соль мажор (= note3 D) (= t 400) (include "jazz2$1.cal") (= note1 C) (= note2 E) До мажор (= note3 G) (= t 800) (include "jazz2$1.cal") (= note1 F) (= note2 A) До мажор (= note3 C) (= t 400) (include "jazz2$1.cal") (= note1 G) (= note2 B) Соль мажор (= note3 D) (= t 400) (include "jazz2$1.cal") (= note1 D) (= note2 A) Ре минор (= note3 F) (= t 800) (include "jazz2$1.cal") (= note1 F) (= note2 A) Фа мажор (= note3 C) (= t 400) (include "jazz2$1.cal") (= note1 G) (= note2 B) Соль мажор (= note3 D) (= t 400) (include "jazz2$1.cal") (= note1 A) (= note2 C) Ля минор (= note3 E) (= t 400) (include "jazz2$1.cal") (= note1 D) (= note2 F) Ре минор (= note3 A) (= t 400) (include "jazz2$1.cal") (= note1 A) (= note2 C) Ля минор (= note3 E) (= t 400) (include "jazz2$1.cal") (= note1 G) (= note2 B) Ми минор (= note3 E) (= t 400) (include "jazz2$1.cal") (-- count) )) Кода (= note1 G) (= note2 B) (= note3 E) (= t 4000) (include "jazz2$1.cal") )
; (do Начинаем играть переданные ноты на гитаре (sendMIDI 1 1 NOTE note1 60) (sendMIDI 1 1 NOTE note2 60) (sendMIDI 1 1 NOTE note3 60) (= r (+ count 2))
Выбираем ноты на флейте (while (> t 1) (do При t=1 программа застревает. Поэтому кое-что должно оставаться. Мы жертвуем ритмом
(= note (random 1 3)) (if (== note 1) (= note note1)) (if (== note 2) (= note note2)) (if (== note 3) (= note note3)) Ноту для флейты выбрали (+= note 12) Октавой выше
(= x (random 0 25)) (if (> x 0) (= x 25)) (*= x 4) Пауза с вероятностью 0.04 (= y (+ t 1)) (while (> y t) (do (= y (random 1 r)) (*= y t) (/= y r) (+= y 1) )) Выбираем длительность, чтоб не превысило t Точность до t/r
(= z (random 1 5)) (= z (random 1 5)) (if (== z 5) (+= note 12)) Еще октавой выше (-= t y) (message "t=" t "y=" y "r=" r) Вывод в окно Cakewalk (if (> t 0) (do (sendMIDI 1 2 NOTE note x) (delay y) (sendMIDI 1 2 NOTE note 0) )) Играем ноту длительностью y на флейте )) (sendMIDI 1 1 NOTE note1 0) (sendMIDI 1 1 NOTE note2 0) (sendMIDI 1 1 NOTE note3 0) Завершаем аккорд гитары )
C | F G | C | F G|
Dm | F G | Am Dm Am Dm|