Clojureで音楽組織プログラミングについて

はい、こんにちは。

今回はOvertoneについて書くといいましたが、それだけだとつまらないので、「Clojure」で「Clojureならではの」音楽をつくることを主眼に書きます。

あんまり、Overtoneについて書かないかもしれません。
ぶっちゃけこれ読んでくだたい。
http://overtone.github.io/

また、今回はあんまりポップな音楽については書きません。

# 「Clojureならでは」の音楽

## 1.音楽とは?

* そもそも、音と音楽の違いってなに？
* 車の音は音楽？
* リズム、メロディーがあれば音楽？

とか、音楽とはなんなのか、 とかいったらこの記事だと延々と終らないので、ここでは単純に

* 音
* その組みあわせの構造
* 組あわせをさらに組織

と考えます。一つ一つの音が折り重ねの結果が音楽というわけです。
基本的に音楽は「音そのもの」よりも、「その組みあわせの構造」が大事だと僕は思います。ちょっと抽象的に「なんのこっちゃ」という人がいるでしょうから、ある名曲を参考にしましょう。

## 2.ベートーヴェン交響曲第5番「運命」とはなぜ名曲か?

さて、だれもが聞いたことはあるでしょう。「運命」についてです。「運命」とはなぜ名曲(個人的な主観評価は置いておいて)、といわれるのでしょうか?

その理由の一つに「一つのモチーフが見事に組織されてできているから」だと僕は思います。され楽譜を見せましょう。(読めなくて良いです。)

*モチーフ
![スクリーンショット 2013-12-03 4.00.11.png](https://qiita-image-store.s3.amazonaws.com/0/31381/1d7da603-4347-5260-d38b-b2e376e3c716.png)


さてこれは口で言うと「たたた*ターン!」というフレーズです。 この「たたた*ターン!」というフレーズがモチーフとなって楽曲上に至るところに表われています。それは、このままの形で表われるのではなく、

* ひっくり変えしたり
![スクリーンショット 2013-12-04 0.34.34.png](https://qiita-image-store.s3.amazonaws.com/0/31381/1a401174-27db-1ae8-3ba3-70eaf0f1c283.png)


* 組み合わさったり

![スクリーンショット 2013-12-03 4.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/31381/03b41005-936b-de8f-09e8-e329c7cff16d.png)


スコア全体を見せたいですが、ベートーベンは良く「たたた*たーん」を組みあわせて音楽を作っているのがわかります。

このように「  **一つのモチーフが見事に組織されてできている** 」ことがわかるかと思います。


## 3. 音楽構造をプログラミングする。

良く音楽プログラミングをすると、音をプログラミングする人が結構います。けれども、それは大半は楽器にしかならず、音楽になっていかない、ってのを良くみかけます。

さて、僕は思ったのです、「 **音楽構造をプログラミング** 」してないからだと!。

それはなぜ音楽にならないのかというと、楽曲の構造をつくってないからです。音楽とは「構造」なのです。


## 4. Clojureで音楽構造を付くる。

さて、云々解説するよりやってみたほうが良いでしょう。
早速音楽構造をプログラミングしていきます。構造を定義していきましょう。

### 単旋律構造

まず簡単なモチーフを作りましょう。

```clj 
(def phrase-a '(1 2 3 4 5))
```

といあえず、こんなリストでいいです。このリストが、まず、モチーフとなります。これを音に関連付けるのですが、それは後でいいでしょう,
さてこれをこんな風に組みあわせていきます。

```clj 
;;単純につなげる構造
(def phrase-b 
 (concat 
     phrase-a phrase-a (reverse phrase-a)))
```

さて、簡単にちょっとした構造ができました。さてこれを音に割りあてて演奏する関数をつくりましょう。
ここでovertoneをつかいます。(overtoneについては解説しません。)


```clj 
(use 'overtone.live)

;; 音の定義 
;; 今回はなんとなく鋸派でつくる(ここは好きにしていいお!)
(definst saw-wave [freq 1 attack 0.01 sustain 0.4 release 0.1 vol 0.4] 
  (* (env-gen (lin-env attack sustain release) 1 1 0 1 FREE)
     (saw (* freq 100))
     vol))

;; 演奏する関数
(defn play-lst [lst tone time delta-time]
	(let [elt (first lst)]
	  (if (nil? elt)
	      nil
	    (do (at time (tone elt))
		(play-lst (rest lst) tone (+ time delta-time) delta-time)))))
```

さて、それでは、音を鳴らしましょう

```clj 
(play-lst  phrase-b tone (now) 100)
```

ちょっと短い単旋律が流れましたね。

### ポリフォニックな構造

さて単純な旋律をつくりました。さらに音楽らしくするには、今度な同時間的な構造を定義していきましょう。

 単純に上に移調したフレーズをつくります。

```clj 
(def phrase-c (map #(+ % 2) phrase-b))
```

さて、ポリフォニックにするために、play-lsts 関数をつくりましょう

```clj 
(defn play-lsts [phrase-lst tone time delta-time]
	(map #(play-lst % tone time delta-time) phrase-lst))
```

さて鳴らしてみましょう。

```clj 
(play-lsts (list phrase-b phrase-c) saw-wave (now) 200)
```

ちょっとポリフォニックになりました。
これはどうでしょうか?

```clj 
(play-lsts (list phrase-b (reverse phrase-c)) saw-wave (now) 200)
```

さて、これで、どんどん複雑に構造化していくと、より音楽的になります。

## 5.まとめ

さて、Clojureで僕が実際にどうやって音楽構造を作り、それをOvertoneに演奏させるかをみてきました。
これはあくまでも、構造化の一例にしかすぎません。いろいろな音楽組織、構造、が考えられます。

また、その構造をどう演奏命令に変換させるかも、様々なやりかたがあります。いろいろ、ためしてみればいかがでしょうか?

「音楽プログラミング」をすると大抵の人が「音プログラミング」に走ってしまいます。物理的な「音」をどう再現するか?に走ってしまい、その結果、単純な楽器にしかならない自体になってしまします。

あくまでも、音楽に大切なのはその音そのものよりも、その「構造化」にあると思います。その構造化が大事だとおもいます。

また、僕は音楽をプログラミングで作曲するときは、「音楽プログラミングならでは!」「Clojureの音楽ならでは!」を目指すべきだと思います。従来の五線楽譜の音楽ではなく、「プログラミング」でやるのだから、「プログラミング」の音楽を目指すべきだと思います。そこに「音楽プログラミング」による作曲の意義があるのではないでしょうか?