のぶLab.

流しのソフトウェアエンジニアの雑記帳. Android, Scala, Clojure, Ruby on Railsなど

OvertoneをEmacsで演奏してみる

EmacsでOvertoneの演奏環境構築は以下の記事を参照ください

EmacsでOvertone演奏環境構築 - のぶLab.

この記事ではOvertoneのGithub WikiにあるSwingチュートリアルEmacs Live上でやってみます。

また、前回の記事で作成したClojureプロジェクトを引き続き使っていきます。

事前準備

Emacs Liveを立ち上げる

$ emacs

演奏内容を記載するファイルを開く

任意のcljファイルに演奏内容を記載していきます ここではとりあえずsrc/hogehoge/core.cljに記載します

C-x C-f src/hogehoge/core.clj

REPLを立ち上げ

以下のコマンドでREPLを立ち上げます 

M-x cider-jack-in

(前回はホスト名やポート番号を指定していたが、この方法だとREPLの立ち上げからやってくれるらしい)

演奏内容の記述

実際に演奏内容を書き連ねていきます

使用するパッケージを記述

namespaseにOvertoneを使用することを明記します

(ns hogehoge.core
  (:use [overtone.live]))

ハイハット

ハイハットの音をシミュレートする関数を書いていきます

(definst c-hat [amp 0.8 t 0.04]
  (let [env (env-gen (perc 0.001 t) 1 1 0 1 FREE)
        noise (white-noise)
        sqr (* (env-gen (perc 0.01 0.04)) (pulse 880 0.2))
        filt (bpf (+ sqr noise) 9000 0.5)]
    (* amp env filt)))


(definst o-hat [amp 0.8 t 0.5]
  (let [env (env-gen (perc 0.001 t) 1 1 0 1 FREE)
        noise (white-noise)
        sqr (* (env-gen (perc 0.01 0.04)) (pulse 880 0.2))
        filt (bpf (+ sqr noise) 9000 0.5)]
    (* amp env filt)))

(ホワイトノイズでハイハットの音を作っているんですね。 こういう音作りも楽しそう。)

関数を書き終わったらカーソルを末尾に置いて、以下のコマンドでREPLに読み込ませることができます (実際どうなっているのかはよくわからない。とりあえず、あとで記述する関数からこれらを呼び出す場合はやっておかないといけない)

C-x C-e

テンポ

(def metro (metronome 120))

Overtoneライブラリのmetronomeという関数を使ってテンポを表現します

演奏内容

Swingの演奏を表現する関数を記述します

(defn swinger [beat]
  (at (metro beat) (o-hat))
  (at (metro (inc beat)) (c-hat))
  (at (metro (+ 1.65 beat)) (c-hat))
  (apply-at (metro (+ 2 beat)) #'swinger (+ 2 beat) []))

演奏する

演奏内容を表現した関数を呼び出します

(swinger (metro))

この関数末尾で以下のコマンドを実行するとSwingyな音が流れてきます (その前にこれまで書いてきた関数にも以下のコマンドを実行を忘れずに)

C-x C-e

演奏をやめる

演奏内容を表現する関数などを書き換えるなどいろいろ手段はあるかと思いますが、以下の関数で演奏をやめることができます

(stop)

以上。 ここまででClojureを書いてなんか音楽っぽいものを鳴らせるようになりました。