Date:2022-04-26
Tidal Cycles の演奏を Processing でビジュアライズする方法 〜後編〜 Processingの設定と描画
後編では、前編で送信したTidalCycles(SuperCollider経由)のOSCメッセージを利用して、いよいよProcessingで描画していきます。描画にはある程度のProcessingの知識が必要になりますが、できるだけ簡単なコードの例とあわせて解説も加えていきます。
環境/macOS Montery Apple Silicon Mac
前編/Tidal Cycles の演奏を Processing でビジュアライズする方法 〜前編〜 OSCの利用
後半は下記内容にて、Processing側の設定とコード例です。
ーーーーー
Index/目次
・oscP5ライブラリーをインストール
・Processing側で受信したメッセージを確認
・コード例/”kick”の音がすると赤、それ以外は黒
・あとがき
ーーーー
oscP5ライブラリーをインストール
描画コードを書く前に、送られているOSCメッセージをProcessing側で受信するための設定が必要です。
まず、ProcessingでOSCのための oscP5 ライブラリーをインストールします。Processingエディタの右上からライブラリー追加画面に移動し oscP5 と検索、選択のち Install ボタンを押します。
Processing側で受信したメッセージを確認
受信するProcessing側でどのようなOSCメッセージが送られてきたかを確認します。Processing で下記コードを実行、TidalCyclesで音を出し確認します。
import oscP5.*;
import netP5.*;
OscP5 osc;
void setup() {
size(1280, 720);
background(0);
osc = new OscP5(this, 2020);
}
void draw() {
}
void oscEvent(OscMessage m) {
m.print();
}
d1 $ n "0*4" # sound "kick"
<コードの解説>
はじめに、oscP5とnetP5のライブラリーをインポートします。
続いて、OscP5の ocs という名前でオブジェクトの宣言を行います。
setupで画面サイズと背景を指定し、oscには new OscP5で自身を指定するthisと2020ポートを代入します。
drawには、描画はしないので何も記載しません。
OSCを利用するため、oscEvent関数を作成し、引数にメッセージ情報を受け取るための OscMessage m と指定します。
関数内で 引数として受信したOSCメッセージ m に .print() を付けることで、Processing コンソールにOSCメッセージを出力します。
上記のコードで、Processing コンソールに出力されたOSCメッセージ。
-OscMessage----------
received from /127.0.0.1:57120
addrpattern /dirt/play
typetag sssfsfsfsfsiss
[0] _id_
[1] 1
[2] cps
[3] 0.5625
[4] cycle
[5] 17094.5
[6] delta
[7] 0.44444418
[8] n
[9] 0.0
[10] orbit
[11] 0
[12] s
[13] kick
---------------------
上記のようにOSCメッセージは、ひとつに音に対したくさんの情報が詰まっています。上記は[0]〜[13]までの計14の情報。
情報群は、[0] [1] [2] … といった番号にて、[0]変数名 > [1]その数値 > [2]変数名 > [3]その数値… と順に表記され、変数名は偶数、その数値は奇数にて並べられます。
それぞれの変数名の仕様は下記通り。
ーーーーー
[0] _id_ [1] 1
idの値、d1 d2などのDirt番号をString型の文字列としてidとします。(string型)
[2] cps [3] 0.5625
cps(サイクルパーセコンド):1秒間のサイクル数。cpsを理解したい人は下記より。(float型)
Tidal Cyclesの仕様、リズム構成とテンポの設定方法(CPSとBPM)
[4] cycle [5] 17094.5
総サイクル数での音の開始されるサイクル値です。音がなっていなくてもバックグラウンドでサイクルは回っているため常に加算されていきます。resetCyclesで0になります。(float型)
[6] delta [7] 0.44444418
1サイクル中にそのサウンドが流れる長さです。(float型)
[8] n [9] 0.0
サウンドの種類。# n の数値、サウンドファイル内のサウンドの種類です。(float型)
[10] orbit [11] 0
周期番号。d1 d2 などのDirt数です。[0] _id_と似ていますが、こちらはing型にて、演算が可能です。0からカウントされるため、d1などに合わせて1から取得したい場合は+1をします。(int型)
[12] s [13] kick
サウンドの名前です。(string型)
これ以外にも # gainや # pan などのエフェクトを加えると、変数名・数値が追加されます。
ーーーーー
奇数番号に当てられた、数値の型は、float型, int型, string型とさまざまで、それぞれの型の頭文字( floatならf )をまとめたものをtypetagとして利用できます。上記のOSCメッセージの typetag の場所に sssfsfsfsfsiss 表記されているのがそれです。
typetagの使い方は、頭文字の総数をfor文の繰り返し回数として利用します。
先ほどの sssfsfsfsfsiss の総数は14です。
そして、for文の中に変数名の条件分岐を入れる事で、条件の変数名から数値を指定し、描画プログラムに組み込んでいきます。
コードで見るとより分かりやすいので、例として、「”kick”の音がすると画面が赤になり、それ以外は黒」というプログラムを組んでみます。
コード例/”kick”の音がすると赤、それ以外は黒
下記、ProcessingコードとTidalCyclesの”kick”の入ったコードを実行します。
import oscP5.*;
import netP5.*;
OscP5 osc;
String sInst = "";
void setup() {
size(1280, 720);
background(0);
osc = new OscP5(this, 2020);
}
void draw() {
fill(0, 0, 0, 10);
rect(0, 0, width, height);
if(sInst.equals("kick")){
fill(200, 30, 30);
rect(0, 0, width, height);
}else{
fill(0, 0, 0);
rect(0, 0, width, height);
}
}
void oscEvent(OscMessage m) {
//m.print();
for (int i = 0; i < m.typetag().length(); i+=2) {
String name = m.get(i).stringValue();
switch(name) {
case "s":
sInst = m.get(i+1).stringValue();
//println(sInst);
break;
}
}
}
d1 $ n "0 [1 0] 3 <5 2>" # sound "kick*2 sn kick"
実行すると、kick 音の時は赤、sn 音の時は黒になります。
<コードの解説>
String sInst = ""; にて空のString型を設定します。
drawにて、sInst が kick音なら赤、それ以外は黒という条件式を入れます。
oscEvent では、ひとつの音が鳴るたびに全ての情報を for文 にて回します。回す情報数の回数は、OSCMessage m で取得したtypetagを.length()にて割り出し、変数名を取得するためは偶数分の i += 2 づつ増やしていきます。
for文内では、回すたびに、String name = m.get(i).stringValue(); にて変数名を入れます。
また、条件分岐のswithにて、name が "s" なら数値をnameに代入させるため、変数名(偶数)の次にある数値(奇数)を( i + 1 ) にてstringValueを取得し、sInst に代入します。
その後は、先ほどのdrawの条件式に割り当てられ、kickであれば赤になり、それ以外であれば黒になります。
ーーーーー
追記
その他、Tidal Cycles の音源番号 "n" を利用した例も紹介します。
Tidal Cycles の演奏を Processing でビジュアライズする方法 〜番外編〜 Euclidean Algorithm and note
あとがき
OSCのメッセージが解析できれば、エフェクトやその他の変数名・数値も扱うことができます。それらの数値を利用し、TidalCyclesで演奏した音をリアルタイムで Processing にてビジュアライズすることができます。
Processing コード理解ありきで執筆ですが、Processingは初心者でも簡単に扱えるツールなので少しづつ学んで行ければと思います。
おすすめの本は ”Books” にてまとめています。
barbe_generative_library
サウンドプロダクション入門 DAWの基礎と実践
初版/ 2021.3.23
ページ数/208ページ
出版社/ビー・エヌ・エヌ
言語/日本語
ーーーーー
”Books”では、”barbe_generative_Library”として、
barbe_generative_diary の創作において実際に購入し、読んだ本を紹介します。
ーーーーー