【Processing】minimを使ってみる(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);
  }
}