【Processing】minimを使ってみる(3)
#Processing #Minim pic.twitter.com/Y5TFaQdYFu
— 94 (@_94_94) 2018年11月3日
minimを触る機会があったので。
ハイハット・スネア・バスドラ・シンセ、この4音のみ。すべてボールの挙動のif文を使ってトリガー。
スネア(十字架の部分に触れたらトリガー)が40回再生されたら、ボールのパワーを再設定する。
条件が変わらないけど、変数がかわると音の表情がかわるのがおもしろい。と思ってる。
リズムのシンプルな骨組みから、僕たちはグルーヴを感じたり、特定の音楽を連想するのかもしれない。
一緒に活動する大島くんと、サウンドアートや実験音楽をやってる/聴いている人はそもそもの聴き方がうまい、という話題になった。
= 聴覚の解像度が高い(微細な音の変化に気づくことができる)
= 解像度を低くして聴くこともできる(あえて音の特定の細かい部分を聞かない、カタマリとして聴くなど)
どうやって聴くのか っていうのを明示すること、その体験を丁寧に設計することが、サウンドアートや音の表現の肝なのかもしれない。
このプログラムもボールの動きが見えなかったら、ただの雑なリズムの生成にしか聴こえないと思う。
物理法則に基づくボールの動きがなんとなーく聴き方のフォーマットを提示してくれるし、変数の再設定(転調)もすんなりと受け入れて聴く準備ができるんだと思う。
目と耳は切り離せない。
import ddf.minim.*; import ddf.minim.analysis.*; import ddf.minim.effects.*; import ddf.minim.signals.*; import ddf.minim.spi.*; import ddf.minim.ugens.*; Minim minim; AudioOutput out; //出力 Sampler kick; //キック Sampler snare; //スネア Sampler hi; //ハイハット Sampler al; //シンセ float x = width/2; //初期値x float y = height/2; //初期値y float xpow = random(30); //パワー float ypow = random(20); //パワー int count = 0; void setup() { size(500, 500, P3D); minim = new Minim(this); out = minim.getLineOut(); kick = new Sampler( "BD.mp3", 4, minim);//読み込み、この4と言う数字は最大再生数のことを指定するらしい。 kick.patch(out);//出力準備 snare = new Sampler("SD.wav", 4, minim);//読み込み snare.patch(out);//出力準備 hi = new Sampler("HH.wav", 4, minim);//読み込み hi.patch(out);//出力準備 al = new Sampler("al.wav", 4, minim);//読み込み al.patch(out);//出力準備 } void draw() { //跳ね返るボールの処理 noStroke(); fill(255); ellipse(x, y, 50, 50); rectMode(CENTER); fill(250); rect(width/2, height/2, width, 10); fill(250); rect(width/2, height/2, 10, height); fill(0, 40); rect(width/2, height/2, width, height); x+=xpow; y+=ypow; //再生レートの計算 float snarerate = map(y, 0, height, 0.1, 5); //yをレートにする float kickrate = map(x, 0, width, 0.1, 5); //xをレートにする snare.rate.setLastValue(snarerate); //設定 kick.rate.setLastValue(kickrate); //設定 if (x > width) { x = width; xpow *= -1; hi.trigger(); } else if ( x < 0 ) { x = 0; xpow *= -1; hi.trigger(); } if (y > height) { y = height; ypow *= -1; kick.trigger(); } else if (y < 0 ) { y = 0; ypow *= -1; kick.trigger(); } if ( abs(height/2 - y) < 10 || abs(width/2 - x) < 10 ) { snare.trigger(); count++; } if (count > 40) { //カウントリセット xpow = random(30); //パワー再設定 ypow = random(20); //パワー再設定 al.trigger(); count = 0; background(255); } }