環境/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"

<コードの解説>

はじめに、oscP5netP5のライブラリーをインポートします。
続いて、OscP5の ocs という名前でオブジェクトの宣言を行います。

setupで画面サイズと背景を指定し、oscには new OscP5で自身を指定するthis2020ポートを代入します。

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の基礎と実践

SoundProduction_DTM-header

初版/ 2021.3.23
ページ数/208ページ
出版社/ビー・エヌ・エヌ
言語/日本語

【Amazon.co.jp で購入】

ーーーーー
”Books”では、”barbe_generative_Library”として、
barbe_generative_diary の創作において実際に購入し、読んだ本を紹介します。

ーーーーー