SuperColliderで純正律を使う

現代の音楽文化においてはすっかり十二平均率が普及しているため、MIDIキーボードにせよ音楽作成ソフトにせよ、音律を変更すると言うことはほぼできませんが、SuperColliderならかんたんに平均率以外の音律を使うことができます。

平均率以外の音律を使うには、Scaleクラスを使うのが便利です。Scaleクラスを使うと長調、短調、またホールトーンや日本の律旋法など、様々な音階を取得することができます。これは音階にあてはめた音楽を生成するには便利ですが、次に示すサンプルではMIDIキーボードを作ろうとしているため、 .chromatic を指定しオクターブ内の12音全てを取得しています。

次に、Scaleオブジェクトに .tuning_ メッセージを送り、チューニングを変更しています。\justの場合は純正律、\et12だと12平均率、\mean4だと1/4コンマ中全音律、\pythagoreanだとピタゴラス音律になります。かんたんですね。

MIDIナンバーを音階に割り振り音度(Degree)を取得するのに .keyToDegree メッセージを使っています。さらに、音度からMIDIナンバーに戻すのに .degreeToKey メッセージを使っています。結局MIDIナンバーに戻しているのが不思議に感じるかもしれませんが、この時点で平均率以外を選択していれば小数点になるはずです(平均率からはずれる)。最後に .midicps メッセージで周波数に変換しています。処理が冗長なので、もっといい方法があれば教えてください。

Scaleクラスが対応している音階や音律を知るには、Scale.scファイルを見てソースコードを見るのが良さそうです(一覧が見つけられなかった)。音階は ScaleInfo クラス、音律は TuningInfo クラスで定義しています。バルトーク音階など音楽史上に現れた様々な音階、雅楽やラーガなど民族音楽の音階、さらに1オクターブに12音以上存在する特殊な音階も対応しています。ミーントーンも1/4、1/5、1/6に対応、キルンベルガー第3法、ウェンディ・カルロスの超純正律などマニアックなものも入ってます。実用性のほどは分かりませんが、この懐の深さがオープンソースのSuperColliderならではの魅力かもしれません。

SuperColliderでMIDIキーボード

MIDIInクラスのヘルプにMIDIキーボードのサンプルが載っていますが、ひとつのSynthオブジェクトに対して周波数や音量の変更のメッセージを送ると言うものなので、同時発音数は1になります。これでは実際の演奏にはとても耐えられません。以下のサンプルは同時発音数を128まで拡張したものです。

以前も同様のコードをSuperCollider.jpなどに投稿していましたが、SuperCollider3.6.x用に書き直しました。

node.jsとSuperColliderをOSCでつないでみる

nodejs  icon.supercollider

node.js はほぼ初体験ですが、どうしてもSuperColliderと組み合わせたくてチャレンジしてみました。

node.js とは、スケーラブルなネットワークプログラムをかんたんに開発するためのプラットフォームです。最近ではメタCSSのLESSがnode.jsで動いていて、ぼくもなんとなくLESSのためにMacにインストールしていたのですが、HTMLテンプレート言語のEJS, Webアプリケーションフレームワークのexpress, Sails.jsHogan.jsなどなどが出てきて、Webサービスの開発言語にどんどん採用されている…というイメージです。

で、node.jsとSuperColliderがどうつながるか、ですが、もともとnode.jsのデモとしてチャットシステムを見せてもらったんですが、完全にリアルタイムなんですよ。Skypeチャットなどはタイプした瞬間に相手にも見えているわけですが、それと同じようなことが自分でもできるというわけです。これは、リアルタイム性が要求される音楽の領域においては魅力的ですよね。

しかも、node.jsは言語としてはJavascriptなので習得がかんたん、npmというパッケージ管理システムがあるため環境構築もかんたん、イイコトずくめというわけです。

とはいえ普段仕事が忙しすぎてなかなか取り組む機会がないため、大阪で開催されたNode.jsの勉強会に参加して、どんな風に使われているのかと、環境構築についてちょっと勉強して来ました。
Continue reading

SuperColliderでクラスを作る時のメモ

普段はPHPerになってしまった私がSuperColliderのクラスを書こうとした時に詰まったポイントのメモ。基本、ドキュメントを読まずにObjectクラスのソースを読んでお作法を知ろうと思ったのだけど、意外とハードル高かった。

準備

拡張子は.scで、下記のディレクトリーに置いて、メニューの [ Language > Recompile Class Library ] を選択。

/Libraries/Application Support/SuperCollider/Extensions/

コンパイルに失敗したらエラーが表示されるので、ひたすらエラーを潰す。

継承

スーパークラスの指定はコロンでOK

MyClass : SomeSuperclass {

}

スーパークラスを指定しないと、暗黙的にObjectクラスを継承したことになる

メソッド名にアスタリスク( * )が付くものがある

アスタリスクが付くものはクラスメソッドで、thisがクラスを指す。アスタリスクがつかないものはインスタンスメソッドで、thisがインスタンスを指す。分かりにくいぜ

メソッド内にキャレット( ^ )があるけど何だこれ

returnでした。分かりにくいぜ

returnしない場合は、インスタンスが返されるので、書かなくても動く。

変数の前の大なり小なり( <, > )は何だ

< がゲッター、> がセッターでした。分かりにくいぜ

MyClass : Superclass {
  var myVariable;

  variable {
    ^myVariable
 }

  variable_ { arg newValue;
    myVariable = newValue;
  }
}

本来このようにゲッターとセッターを書かないといけないところを、、、

MyClass {
var <getMe, >setMe, <>getMeOrSetMe;
}

短く書けるよ!ということらしい。

ちなみに変数も var と classvar があり、前者はインスタンス変数、後者はクラス変数。クラス変数は他の言語だと定数と似た扱いなのかな?

このあたりの解説はヘルプの Guides/Writinglasses に書いてあって、詳しくはデザインパターンでググれって書いてあるので、デザインパターンについて勉強しないといかんっぽい。仕事でも必要になるし、勉強するか〜