Новое

Алгоритм - генератор случайной музыки.

Фрагмент -  104 Кб

В запись "Мидиотизма" войдёт музыка, индивидуально сгенерированная для каждого экземпляра. Играющая её программка была написана летом 2002 года на языке CAL, встроенном в музыкальную среду Cakewalk Pro Audio 9, с помощью которой, собственно, и создавался альбом.

Несколько слов о языке CAL. Язык основан на небезысвестном Лиспе, структуру коего я описывать не стану (несмотря на его резкое отличие от C, Pascal, Basic и прочих языков с традиционным видом выражений). CAL очень скуп. В частности в нём нет никаких процедур/функций - вместо этого используется include-файл, фактически, макрос. Мелодия сочиняется и играется в реальном времени.

Я почти не пишу комментариев в программах (только когда сам путаюсь окончательно) Поэтому к нижеуказанным текстам комментарии приписаны курсивом.

Текст основного файла jazz2.cal

;

(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")
						
)

Текст вставного файла 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|

KAPACbоглавлениепочтагостеваяlinkmap





Используются технологии uCoz