概要
TidalCyclesで音楽を作り、その音に反応する映像をProcessingで作りました。コードを公開します。筆者はMac環境です。
完成動画
TidalCyclesのコード
TidalCyclesのデフォルトサンプル音源は使用していないので、サンプルは適当に用意して頂く必要があります。
let
speedx = "1.0 1.0 1.0 1.0 1.0 0.8 1.0 1.6 1.0 1.0 2.0 1.0 0.8 0.9 1.0 1.3"
delayx = "0.0 0.0 0.0 0.0 0.0 0.0 0.8 0.7 0.8 0.0 0.0 0.9 0.0 0.0 0.8 0.8"
delaytx = "0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0"
gainx = "1.3 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.7 0.9 0.7"
gainx2 = "1.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 0.4 1.0 0.7"
roomx = "0.5 0.0 0.0 0.0 0.0 0.0 0.8 0.0 0.8 0.0 0.0 0.0 0.0 0.0 0.8 0.8"
szx = "0.7 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.8 0.0 0.0 0.0 0.0 0.6 0.8 0.8"
lpfx = "100 1000 20000 _ 500 20000 2000 ~ 5000 _ 200 _ 20000 2000 2000 20000"
nx = "1 1 2 3 5 1 0 1 1 5 3 4 1 1 1 6"
nx2 = "0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0"
coarsex = "16 3 16 32 2 2 64 64 2 16 12 16 2 128 32 64"
hpffx = ((# hpf (range 200 2000 sine)).(# hpq 0.4))
lpffx = ((# lpf (slow 8 $ rangex 300 20000 saw)).(# lpq 0.3))
panfx = (# pan (fast 4 $ range 0 1 square))
juxfx = jux (choose[0.125,0.25] ~>)
delayfx = (within (0.5, 1) ((# delayfb 0.95).(# delayt 0.065)))
speedfx = (# speed "2 0.5")
revfx = (# room (slow 4 $ range 0.2 0.9 saw))
d1
$ sometimesBy 0.2 juxfx
$ sometimesBy 0.1 speedfx
$ every 1 ((# speed speedx).(|* gain gainx).(# n nx))
$ every 4 (# coarse coarsex)
$ s "[jbd*16]" # cut 1 # shape 0.6 |* gain 1.2
d2
$ sometimesBy 0.05 juxfx
$ whenmod 32 24 revfx
$ every 1 ((# speed speedx).(# gain gainx).(|+ n nx))
$ whenmod 32 24 (# n (irand 5))
$ s "[Hihat*16,Snare(3,8,1)]" # shape 0.5
d3
$ sometimesBy 0.1 (hurry (irand 3))
$ whenmod 32 24 lpffx
$ whenmod 32 24 rev
$ someCyclesBy 0.05 hpffx
$ someCyclesBy 0.1 revfx
$ every 1 ((|* speed speedx).(|* gain gainx2).(|+ n nx2))
$ every 2 ((# delay delayx).(|+| delayt (3/16)).(# lock 1))
$ every 3 ((# lpf lpfx).(#lpq 0.4))
$ s "[jchord*16]" # cut 3 |+ n 7 # shape 0.3 |* speed (3) |> gain 1.3
setcps(140/60/4)
hush
Processingのコード
minimライブラリを使ってオーディオに合わせた波形を表示させています。Tidalcyclesの音をaudioinputに入力する必要がありますが、環境によって設定が異なるので、何かしら設定しないと動かないかもしれません。私の場合はオーディオインターフェースのLoopback機能をつかったらうまく入力できました。
// 参考サイト https://tech-camp.in/note/technology/45369/
import ddf.minim.*; //minimライブラリのインポート
Minim minim; //Minim型変数であるminimの宣言
AudioInput in; //マイク入力用の変数
float rot =0;
void setup(){
size(1280, 720,P3D);
minim = new Minim(this); //初期化
surface.setLocation(0,0); //スクリーン上の左上に位置付ける
frameRate(30);
rectMode(CENTER);
smooth();
//バッファ(メモリ上のスペース。この場合は512要素のfloat型の配列)を確保し、マイク入力用の変数inを設定する。
in = minim.getLineIn(Minim.STEREO, 512);
}
void draw(){
background(70*sin(rot)+10,100,100);
stroke(255);
strokeWeight(random(5));
camera(sin(rot)*height,height/2, height, width / 2.0, height / 2.0, 0, sin(rot), sin(rot/2), sin(rot/3));
//円と四角を描く
for(int i=0;i<30;i++){
stroke(255);
if (in.left.get(0) > 0.3){
stroke(in.left.get(0)*1000,100,100);
}
noFill();
rotate(in.left.get(0)/10+0.01);
rect(0,0,200+i*20,200+i*20);
}
if (in.left.get(0) > 0.3){
stroke(in.left.get(0)*1000,100,100);
}
sphereDetail(second()/2+5);
sphere(in.left.get(0)*1500);
//角度を更新
rot += 0.03;
//波形を描く
for(int j = 0; j< 100;j++){
stroke(second()*1.2,60,100);
for(int i = 0; i < in.bufferSize()-1; i++){
if (in.left.get(0) > 0.1){
// stroke(in.left.get(0)*10+second()*10,0,0);
stroke(255);
}
float x1 = map(i,0,in.bufferSize(),0,width);
float x2 = map(i+1, 0,in.bufferSize(),0,width);
float y1 = height / 3;
float y2 = height / 3 * 2;
line( x1,y1+in.left.get(i)*100,j*20,x2,y1+in.left.get(i+1)*100,j*20);
line( x1,y2+in.right.get(i)*100,j*20,x2,y2+in.right.get(i+1)*100,j*20);
}
}
}
リンク