Edited at
ClojureDay 3

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

More than 5 years have passed since last update.

はい、こんにちは。

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

あんまり、Overtoneについて書かないかもしれません。

ぶっちゃけこれ読んでくだたい。

http://overtone.github.io/

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


「Clojureならでは」の音楽


1.音楽とは?


  • そもそも、音と音楽の違いってなに?

  • 車の音は音楽?

  • リズム、メロディーがあれば音楽?

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



  • その組みあわせの構造

  • 組あわせをさらに組織

と考えます。一つ一つの音が折り重ねの結果が音楽というわけです。

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


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

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

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

*モチーフ

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


  • ひっくり変えしたり



  • 組み合わさったり


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

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


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

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

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

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


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

さて、云々解説するよりやってみたほうが良いでしょう。

早速音楽構造をプログラミングしていきます。構造を定義していきましょう。


単旋律構造

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

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

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

さてこれをこんな風に組みあわせていきます。

;;単純につなげる構造

(def phrase-b
(concat
phrase-a phrase-a (reverse phrase-a)))

さて、簡単にちょっとした構造ができました。さてこれを音に割りあてて演奏する関数をつくりましょう。

ここでovertoneをつかいます。(overtoneについては解説しません。)

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

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

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

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


ポリフォニックな構造

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

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

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

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

(defn play-lsts [phrase-lst tone time delta-time]

(map #(play-lst % tone time delta-time) phrase-lst))

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

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

ちょっとポリフォニックになりました。

これはどうでしょうか?

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

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


5.まとめ

さて、Clojureで僕が実際にどうやって音楽構造を作り、それをOvertoneに演奏させるかをみてきました。

これはあくまでも、構造化の一例にしかすぎません。いろいろな音楽組織、構造、が考えられます。

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

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

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

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