Processingで自動VJというか古きwindowsのオーディオビジュアルみたいなやつ

クリスマス会で音楽を流す時にビカビカする照明がなかったのでプロジェクターで代用しようと、Processingで自動VJというか古きwindowsのオーディオビジュアルみたいのを作った。

できは残念だがないよりは良かった。
ゴミでも公開するパーソンなので一応置いておきます。
ProcessingのJAVAアプレットで書いています…。よくわからなかったので…。


# 再生されるもの

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">テスト <a href="https://t.co/jXSXqfw9mD">https://t.co/jXSXqfw9mD</a></p>&mdash; むらさきMFTaipei c23 (@interestor) <a href="https://twitter.com/interestor/status/1077876266538160128?ref_src=twsrc%5Etfw">2018年12月26日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ビデオに使ってる音源はこれです。

#コード
```Xmas_VJmodoki.pde

import ddf.minim.spi.*;
import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*;

Minim minim;
AudioInput in;
int timestamp = 0; //プログラム1に戻すため経過時間のリセット用のタイムスタンプ
int waveH = 300; //プログラム3用の波の高さ

void setup() {
  size(1440, 900); //スケッチ→プレゼンテーションで全画面表示できる
  minim = new Minim(this);
  in = minim.getLineIn(Minim.STEREO, 1440); 
  background(0);
}

void draw() {

  //一定時間経過したら次のプログラムに行く。ループする。

  int time = (millis() - timestamp)/1000;
  int  pgnumber;
  int pgtime = 60; //一つのプログラムが流れる秒数


  pgnumber = time/ pgtime+1;  //メモ。整数割る整数は小数点以下切り捨てされる
  if (pgnumber>5) { //プログラムの数を増やしたらここの数を変える
    timestamp = millis();
  }
  println(pgtime);
  println(pgnumber);
  println(time);


  switch( pgnumber) {

  case 1:

    //音量によって背景色を黒と白とに切り替え
    colorMode(RGB, 255);
    //  float backcolor = map(in.mix.level(), 0, 0.5, 0, 255);
    if (in.left.level() > 0.05 ) { //コンソールにでてくる音量を見てちょうどいい感じの閾値に設定する
      //コンソールに音量の値を表示
      // println(in.left.level());  

      background(255, 255, 255);
    } else {
      background(0, 0, 0);
    }

    break;


  case 2 :

    //音量によって一面の円の大きさが変わる
    colorMode(RGB, 255);
    fill(0, 150);
    noStroke();
    rect(-1, -1, width, height);
    colorMode(HSB, 360, 100, 100);
    float basecolor =0;

    if (pgnumber==2 && time%pgnumber== 0) {
      basecolor = random(360);
    }


    float brightness = 50 + map(in.mix.level(), 0, 0.5, 0, 50);

    for (int x = 0; x < 37; x++) { //円を配置
      for (int y = 0; y < 24; y++) {
        fill( basecolor +x*2, 200-y*2, brightness);//円のいろをグラデーションで変える
        float radious = map(in.mix.level(), 0, 0.5, 0, 30) ;//ムラなくしたかったらこれを円を配置するかっこから出す。むらある方がかっこいいと思う。
        ellipse(20+ x * 40, 20+y * 40, radious *2, radious * 2);
      }
    }
    break;

  case 3 : //点線で波型
    background(0);
    stroke(255);
    //波形を描く
    for (int i = 0; i < in.bufferSize()-1; i++) {

      point(i, 50 + in.left.get(i)*waveH);  //左の音声の波形を画面上に描く
      point(i, 250 + in.right.get(i)*waveH);  //右　　〃

      point(i, 450 + in.left.get(i)*waveH);  //左の音声の波形を画面上に描く
      point(i, 650 + in.right.get(i)*waveH);  //右　　〃
    }

    break ; 


  case 4:

    //音量によって背景色を黒とカラーとに切り替え
    colorMode(RGB, 255);
    //  float backcolor = map(in.mix.level(), 0, 0.5, 0, 255);
    if (in.left.level() > 0.05 ) {
      background(random(255), random(255), random(255));
    } else {
      background(0);
    }

    //調整用。コンソールに音量の値を表示
    // println(in.left.level());

    break;

    //テキストをちらべる。音との連携はなし。
  case 5 :
    background(255);
    for (int i = 0; i < 1000; i++) {
      float x = random(width);
      float y = random(height);
      textSize(18);
      text("HELLO WOLD", x, y);
    }
    break;

  }
}


void stop() {
  in.close();
  minim.stop();
  super.stop();
}

```