【Processing】画像のピクセル情報を利用したソニフィケーション


youtu.be


ピクセル情報を取得してソニフィケーション。
一定の距離を進むとy方向に進みつつ距離とループ回数を再設定する。
すでに誰かがやってそうだけど、ここからいろいろ発展できそう。

import processing.sound.*;

SawOsc sine1, sine2, sine3;
float amp1 = 1;
float amp2 = 1;
float amp3 = 1;
float hertz1 = 0; 
float hertz2 = 0;
float hertz3 = 0;

PImage img; //画像のオブジェクトdogを宣言
float moza; //モザイクの大きさための変数
int x = 0;
int xst = 0;
int xend = 0;
int y = 0;
int sq = 0;
int sqend = 4;

void setup() {

  sine1 = new SawOsc(this);
  sine2 = new SawOsc(this);
  sine3 = new SawOsc(this);
  sine1.play();
  sine2.play();
  sine3.play();  

  xend = xst + 200;

  img = loadImage("fns.jpg"); //画像をロードする
  size(1200, 600);   //画面サイズ
  background(0);
  frameRate(60);
}

void draw() {

  sonic(); //音響処理

  image(img, 0, 0);


  color aaa = img.get(x, y);
  color xy = color(255) - aaa;
  hertz1 = map(red(xy), 0, 255, 0, 10000); //周波数
  hertz2 = map(green(xy), 0, 255, 0, 10000); //周波数
  hertz3 = map(blue(xy), 0, 255, 0, 10000); //周波数

  if (x < xend) {
    x+=10;
  } else {
    sq++;
    println(sq,sqend);
    x = xst;
  }
  if (sq >= sqend ) {
    sq=0;
    sqend = int(random(4))*2;
    y = y + int(random(-10,30));
    if(y < 0 || y > height){y = 0 ;}
    xst = (int)random(width - 200);
    x = xst;
    xend = xst + 25*(int)random(1,6);
  }

  noFill() ;
  strokeWeight(3);
  stroke(aaa);
  ellipse(x, y, 10, 10);
  line(x, 0, x, height);
  line(0, y, width, y);
}

void sonic() {


  sine1.freq(hertz1);
  sine1.amp(amp1);

  sine2.freq(hertz2);
  sine2.amp(amp2);

  sine3.freq(hertz3);
  sine3.amp(amp3);
}