チューニングシステムを作ってみる

すぱこで独自チューニングシステムを作ってみよう!の回。

最近、WIREDの「電子音楽の脱植民地化はソフトウェアから始まる」という記事を読みました。

グローバルなチューニングシステムの実験を促すプログラム”として「Leimma」と「Apotome」という無料のソフトウェアが紹介されているのですが、Leimmaの方はアフリカやアジアその他の地域の音楽で使われているチューニングを試したり、独自にチューニングを作って演奏してみたりすることが出来るプログラムで、ApotomeはLeimmaで作ったチューニングを基に音楽を生成することが出来るプログラムになっていました。

このソフトウェアが必要とされた背景には、世界には様々な音律や複雑なリズムパターンが沢山あるのに、一般的な作曲ソフトは強制的に平均律と4ビートをデフォルト設定にしているという現状があります。

わたしは最近中東の音楽とか、ラテン音楽とか、日本の民謡とかをネットラジオでよく聴いていて(今いちばんアツく注目してるのはブラジルのバイレファンキですが。。)、そこに現れるリズムや音律の違いについて意識を向けることが多かったので、世界市場でシェアを占めている制作ツールに西洋音楽中心的なバイアスが潜んでいるというテーマを考えることは個人的にタイムリーでした。

マカーム ラーストについて所感

もちろん平均律って汎用性が高くてめちゃよくできているシステムだと思うし、DAW画面の4ビート基軸のグリッド表示とかも分かりやすさのために必要だと思いますが、それはそれとして、人の作るものはシステムの「型」に無意識に左右されるということを考えると、オルタナティブな可能性を知っておくというのは良い事だと思います。

というわけで、一旦LeimmaとApotomeでどういう体験ができるのか遊んでみました。こちらのサイトから。チュートリアル動画もありますが、試してみるほうが早いかも。どちらもブラウザで動くので気軽に試すことができます。ツリーのしたのやつが実際遊んでみた映像です。

「音楽生成」が具体的にどうなっているかというと、まず任意のチューニング(ここではアラブ音楽のカテゴリからチューニングシステムをひとつ選択しました)を選んで、そこからランダムにどの音階を鳴らすか/どの間隔で鳴らすか/どの長さで鳴らすかの確率をそれぞれ指定してあげる、というようなプログラムになっています。自動チャンスオペレーションみたいなことですね。

UIも操作もシンプルなのでとっつきやすいですが、せっかくなのでここで得たアイデアを持って帰ってSuperColliderでも試してみたいな~と思いました。

実はSuperColliderにも独自のチューニングシステムを作る機能があったんですね!(いやそれを言ったら一般的なDAWソフトとかにもそういう機能自体はあるのかもですが。micro Korgのキーボードシンセとかもチューニング作成機能ありますよね)

SuperColliderでは、元々Tuningクラスに色々チューニングが登録されていて、

Tuning.directory

で登録されているリストが見られるので、そこから選択することもできるし、自分の好みのチューニングを0から作ることもできます。まずはなんか適当に作ってみます。

tuning = Tuning(#[0, 30, 224, 370, 400, 550, 588, 650, 792, 956, 996, 1186]/100);

ここでsemitonesの配列で音程を指定しているのですが、1semitone = 100centsなので、音程をセントで表した配列を作って100で割っています。さっき紹介したLeimmaでも各チューニングの音程をセントの並びで出力できるので、そっちで気に入ったらこれですぱこの方にも持ってこれますね。

作ったチューニングを音階として利用するためにScaleを作成します。

myScale = Scale.chromatic(tuning);

これを最終的に音楽的に利用する方法は色々あるとおもうのですが、ScaleのメソッドにあるdegreeToFreqを利用するのが良いのかなと考えました。

.degreeToFreq(degree, rootFreq, octave)

度数、ルート周波数、オクターブの高さを与えると周波数で返してくれます。というわけでまずは簡単にランダムにメロディーを選んでデフォルトのシンセを演奏するプログラムを作ってみました。

//チューニングの設定
(
var pitch, tuning, root;
tuning = Tuning(#[0, 30, 224, 370, 400, 550, 588, 650, 792, 956, 996, 1186]/100);
~myScale = Scale.chromatic(tuning);
~root = "C5".notemidi; //ルートkey
pitch = 440; //基本周波数
~refPitch = ~root.midicps * (pitch/440);
)

//play
(
Pbind(
	\deg, Prand([0,2,4,5,7,9,11],inf), //度数をランダムで選ぶ
	\freq, Pfunc{ |n|
		~myScale.degreeToFreq(n.deg, ~refPitch, 0);
	},
	\dur, 0.3,
).play;
)

ついでに、midiキーボードとかをつなげて弾いてみる場合はこんな感じになるかなと思います。

//MIDI初期設定
MIDIClient.init;
MIDIIn.connectAll;

//gate on/offありのシンセを作る
(
SynthDef(\miditest, {
var sn, env;
env = EnvGen.kr(
Env([0, 1, 0.5, 0], [0.01, 0.5], [1, -4], 2),
\gate.kr(1), doneAction: 2);
sn = Saw.ar(\freq.kr(440), mul: 0.2);
sn = Pan2.ar(sn * env, 0);
Out.ar(0, sn);
}).add;
)

//midi設定
(
var on, off, ofset=41;
//鍵盤数分の配列作成
var notes = Array.newClear(32);

//キーボードonしたとき
on = MIDIFunc.noteOn( { |veloc, num|
    //noteをチューニングと紐づけ
    f = (
       ~myScale.degreeToFreq(
           (num - ~root).mod(12),
           ~refPitch,
           ((num - ~root)/12).floor
       );
    );
    notes[num-ofset] = Synth(\miditest, [\freq, f]);
} );

//キーボードoffしたとき
off = MIDIFunc.noteOff({ |veloc, num|
    notes[num-ofset].set(\gate, 0);
    notes[num-ofset] = nil;
} );

//リセット用
q = { on.free; off.free; };
)
//MIDIfuncリセット
q.value

自分で適当に作ったチューニングが、色々計算されて作られた歴史あるチューニングよりも「良いもの」になるかどうか、っていうのは分かりませんが、なんにせよ色々試してみるのは面白いとおもいます。理にかなってなくても自分のシグネチャーチューニングとか作れたら面白いんじゃないでしょうか。

すぱこ習熟度まだまだですので、なんか間違ってたり「こういうのもあるよ!」というのがあったら教えてください。

今度はリズムパターンについても考えていきたいと思います。

「チューニングシステムを作ってみる」への1件のフィードバック

コメントは停止中です。