ハッカーっぽい画面を作る

Processingでロボットアニメ的な小物を作っている話

 6月(公開2週目)に"閃光のハサウェイ"を見てきて影響されたので、それっぽいものをProcessingで作りました。
 いつも通り全部ランダムofランダムなので毎回挙動が違っていい感じです。
 希望があれば.exeとか.pdeとかで公開しようと思います。







 せっかく作ったので今度出るガンダムのFPSとかで使おうと思っています。

黛灰さんの背景っぽい画面をProcessingで作った話

 にじさんじの黛灰さんの背景っぽい映像を映すProcessingのコードを書きました。Dropboxにコードを置いておくので自由に使ってください。

 配布しているコードではフォントが"DSEG14Modern-Regular.ttf"というものになっているのでそこは各々変更してもらえると嬉しいです。ちなみにこのフォントは↓のサイトで配布してあります。

 実際に動くと↓の感じです。個人的にはまあまあ良くできてると思ってます。

憲法記念日なので憲法をかっこよく表示した話。

 今日は憲法記念日なので憲法をかっこよく表示しました。

 使っているコードは前の記事(https://www.chisatofu.com/archives/26990736.html)の物です。
 変更点としては、日本語対応させ、フォントを装甲明朝と限界明朝にし、表示を手直ししただけです。

 ていうことで今回はこれだけです。YouTubeに動画が上がってるので見てってください。

Processingで昔のパソコンみたいな画面を作る

 前回(http://blog.livedoor.jp/chisato_tofu/archives/26990604.html)の応用例として、昔のパソコンみたいな画面を作った話です。

 内容としては.txtファイル内の文字を順番に表示していくだけです。
 作ったのはこんな感じです。特に難しいことはしていないので下にコードだけ共有しておきます。しいて言えば今回"list"を使いましたが、今回の使い方では長さが決まっていない配列ぐらいの使い方しかしていません。

 コードはDropBox(https://www.dropbox.com/sh/kxa7ugqqsf1sk1r/AAAqzezBDWzq6RdSk-eL73e4a?dl=0)においてあるので使ってください。フォントだけ抜いてあるのでお好みのフォントで動かしてみてください。
 フォントの替え方はこちら(http://blog.livedoor.jp/chisato_tofu/archives/25772956.html)

Processingでテキストファイル(.txt)を読み込む方法

 今回はProcessing Javaモードで.txtファイルから文字データを読み込む方法です。

 今回主に使うのは"loadStrings()"です。
 この関数は書いたコードの.pdeと同じファイル内にある"data"の中に入っているファイルから、一行ごとに書いてある文字を読み取ってくれます。

①使いたい.txtファイルの準備
 メモ帳などを使って適当に作成してください。
スクリーンショット 2021-04-21 113129

②.txtファイルをProcessingのIDEにドラッグアンドドロップ
 この時.pdeと同じ階層に"data"というファイルができ、その中に先ほど作ったファイルが入っているか確認してください。なくても自分で"data"というファイルを作成し、その中に.txtを入れることで動作するようです。
スクリーンショット 2021-04-21 113704

③プログラムを書く
 これを動かすための最小構成は下の通りです。
  1. void draw() {
  2.   String[] lines = loadStrings("sample.txt");
  3.   for (int i = 0; i < lines.length; i++) {
  4.     println(lines[i]);
  5.   }
  6. }
 2行目で"sample.txt"からデータを"lines[]"に格納し、行目で表示しています。

④実行する
 実行すると下のようにコンソールに.txtファイルの内容が表示されます。
スクリーンショット 2021-04-21 114535



 また、これを応用すると下のようなものが作れます。これの作り方及びコードはこの記事(http://blog.livedoor.jp/chisato_tofu/archives/26990736.html)で紹介しています。

Processingで作るハッカーっぽい画面のまとめ

 今まで書いてきた"ハッカーっぽい画面を作る"のタブのまとめです。これまでの技術を組み合わせると↓のような映像が作れます。


 難しい技術は使っていないのでどうにかできると思います。また、コードを添付しますが自分が分かればいいと思って適当に書いてたので汚いです。ゲーミングPCで動かすことを想定して作ったので、処理が重いです。変数もグローバルで乱立させてしまっているので、わかりにくかったらtwitterかコメントで聞いてください。なるべく丁寧に解説します。

 今回使用したコードはDropBoxに入れておきます。Readmeにも書いてありますが、今回使ったフォントを利用する場合はこちら(https://www.keshikan.net/fonts.html)のサイトのフォントを使用してください。

Processingでグリッチエフェクトを作る

 有名な画面効果にグリッチエフェクトというものがあります。今回はそれをProcessingで描画した図形にかける方法です。

 今回使用したのはPImageという機能で、これによって画像を表示したりそれにエフェクトを足したりすることができます。今回は前回(http://blog.livedoor.jp/chisato_tofu/archives/25967168.html)の7セグマトリクスにエフェクトをかけたいため、Processingの画面をPImageで扱える形に変更する必要があります。そのために今回はget()関数を利用しています。
 get()関数はget(x,y,dx,dy)とすることで、(x,y)から(dx,dy)分の色を取得できます。今回はこれをランダムに決められた値分移動させることで、それっぽいエフェクトにしています。今回は自分の趣味でrandom関数を使用しましたが、noise関数を利用することでより連続的なノイズを作ることができるとおもいます。

 今回作ったエフェクトは↓のようなものです。元の図形は緑色の正方形が連続しているものです。

 以下コードです。get()で取得した範囲は真っ黒のrectで埋めることで、ずらして描画した際の重なりをなくしています。
  1. import java.util.Random;

  2. PImage img;
  3. int[] glitch = new int[4];
  4. Random random = new Random();


  5. void setup() {
  6.   size(1920, 1080);
  7.   img = createImage(width, height, ARGB);
  8.   colorMode(HSB, 360, 255, 255, 255);
  9.   noStroke();
  10. }

  11. void draw() {
  12.   background(0);
  13.   fill(156, 137, 172, 255);
  14.   for (int i=0; i<9; i++) {
  15.     for (int j=0; j<16; j++) {
  16.       if ((i + j) % 2 == 0) {
  17.         rect(120 * j, 120 * i, 120, 120);
  18.       }
  19.     }
  20.   }

  21.   glitch();
  22. }


  23. void glitch() {
  24.   if (random.nextInt(10) >= 9) {
  25.     if (random.nextInt(2) > 0) {
  26.       glitch[0] = random.nextInt(1080);//y
  27.       glitch[1] = random.nextInt(60);//dx
  28.       glitch[2] = random.nextInt(100);//dy
  29.       glitch[3] = random.nextInt(2) * 2 + 1;//n
  30.     } else {
  31.       glitch[0] = 0;
  32.       glitch[1] = 0;
  33.       glitch[2] = 0;
  34.       glitch[3] = 0;
  35.     }
  36.   }

  37.   switch(glitch[3]) {
  38.   case 1:
  39.     img = get(0, glitch[0], width, glitch[2]);
  40.     fill(0, 0, 0);
  41.     rect(0, glitch[0], width, glitch[2]);
  42.     image(img, 30 - glitch[1], glitch[0]);
  43.     if (glitch[1] > 30) {
  44.       image(img, 30 - glitch[1] + width, glitch[0]);
  45.     } else {
  46.       image(img, 30 - glitch[1] - width, glitch[0]);
  47.     }
  48.     break;

  49.   case 3:
  50.     img = get(0, glitch[0], width, glitch[2]);
  51.     fill(0, 0, 0);
  52.     rect(0, glitch[0], width, glitch[2]);
  53.     image(img, 30 - glitch[1], glitch[0]);
  54.     if (glitch[1] > 30) {
  55.       image(img, 30 - glitch[1] + width, glitch[0]);
  56.     } else {
  57.       image(img, 30 - glitch[1] - width, glitch[0]);
  58.     }
  59.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  60.     fill(0, 0, 0);
  61.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  62.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  63.     if (glitch[1] > 30) {
  64.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  65.     } else {
  66.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  67.     }
  68.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  69.     fill(0, 0, 0);
  70.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  71.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  72.     if (glitch[1] > 30) {
  73.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  74.     } else {
  75.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  76.     }
  77.     break;

  78.   case 5:
  79.     img = get(0, glitch[0], width, glitch[2]);
  80.     fill(0, 0, 0);
  81.     rect(0, glitch[0], width, glitch[2]);
  82.     image(img, 30 - glitch[1], glitch[0]);
  83.     if (glitch[1] > 30) {
  84.       image(img, 30 - glitch[1] + width, glitch[0]);
  85.     } else {
  86.       image(img, 30 - glitch[1] - width, glitch[0]);
  87.     }
  88.     img = get(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  89.     fill(0, 0, 0);
  90.     rect(0, glitch[0] - glitch[2] / 2, width, glitch[2] / 2);
  91.     image(img, -30 + glitch[1], glitch[0] - glitch[2] / 2);
  92.     if (glitch[1] > 30) {
  93.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2] / 2);
  94.     } else {
  95.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2] / 2);
  96.     }
  97.     img = get(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  98.     fill(0, 0, 0);
  99.     rect(0, glitch[0] + glitch[2] / 2, width, glitch[2] / 2);
  100.     image(img, -30 + glitch[1], glitch[0] + glitch[2] / 2);
  101.     if (glitch[1] > 30) {
  102.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2] / 2);
  103.     } else {
  104.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2] / 2);
  105.     }
  106.     img = get(0, glitch[0] - glitch[2], width, glitch[2]);
  107.     fill(0, 0, 0);
  108.     rect(0, glitch[0] - glitch[2], width, glitch[2]);
  109.     image(img, -30 + glitch[1], glitch[0] - glitch[2]);
  110.     if (glitch[1] > 30) {
  111.       image(img, -30 + glitch[1] + width, glitch[0] - glitch[2]);
  112.     } else {
  113.       image(img, -30 + glitch[1] - width, glitch[0] - glitch[2]);
  114.     }
  115.     img = get(0, glitch[0] + glitch[2], width, glitch[2]);
  116.     fill(0, 0, 0);
  117.     rect(0, glitch[0] + glitch[2], width, glitch[2]);
  118.     image(img, -30 + glitch[1], glitch[0] + glitch[2]);
  119.     if (glitch[1] > 30) {
  120.       image(img, -30 + glitch[1] + width, glitch[0] + glitch[2]);
  121.     } else {
  122.       image(img, -30 + glitch[1] - width, glitch[0] + glitch[2]);
  123.     }
  124.     break;
  125.   }
  126. }

Processingで7セグマトリクスを作る

 もうそろそろこのシリーズも終盤に差し掛かってきました。今回は↓の映像のような7セグマトリクスを作っていきたいと思います。
 これはあらかじめ決められた40*18の升目にランダムな数字を表示し、その明るさが徐々に表示していくというものです。それなので今回は、
  1. ランダムに抽出された場所にランダムな数字を表示する部分
  2. その表示をだんだん暗くさせていく部分
に分けて作成しました。最後にプログラムを載せていますが、randomnum()がランダムな場所の数字を抽選し透過率を0にする関数、matrix()がマトリクスを表示させつつ透過率を上げていく関数です。

  1. import java.util.Random;

  2. Random random = new Random();
  3. char[] mode = new char[2];
  4. int[][] txt = new int[40][18];
  5. int[][] Br = new int[40][18];
  6. PFont D7;

  7. void setup() {
  8.   size(1920, 1080);
  9.   D7 = createFont("DSEG7ClassicMini-Regular.ttf", 60);
  10.   colorMode(HSB, 360, 255, 255, 255);
  11.   textAlign(CENTER, CENTER);
  12.   textFont(D7);
  13. }

  14. void draw() {
  15.   background(0);
  16.   randomnum();
  17.   matrix();
  18. }

  19. void keyPressed() {
  20.   mode[0] = key;
  21. }

  22. void randomnum() {
  23.   for (int i=0; i<24; i++) {//ランダムな24ますにランダムな数字を入れ、透過率を0にする
  24.     int c = random.nextInt(40);//ランダムなx座標
  25.     int d = random.nextInt(18);//ランダムなy座標
  26.     txt[c][d]=random.nextInt(10);//0~9のランダムな数字
  27.     Br[c][d]=255;//透過率最大
  28.   }
  29. }

  30. void matrix() {//マトリクスを表示し、各マス目の透過率を下げる。
  31.   for (int i=0; i<40; i++) {
  32.     for (int j=0; j<18; j++) {
  33.       fill(180, 255, 255, Br[i][j]);
  34.       Br[i][j]=Br[i][j]-5;
  35.       text(txt[i][j], -20 + i * 49, 30 + j * 65);
  36.     }
  37.   }
  38. }

Processingにデスクトップ音声を入力する方法(Windows10)

 Processingでは基本的にWindowsのデフォルト入力しか使えません。それなのでProcessingでデスクトップ音声を認識したい場合は、デスクトップ出力をデフォルト入力にすることが必要です。

 これを実現するために今回はVB-Audioというソフトを使います。
 このソフトの使い方としては、まずhttps://vb-audio.com/Cable/からダウンロードをします。そしたらダウンロードしたzipファイルを解凍し、その中のVBCABLE_Setup_x64.exeを実行するとこのソフトが使えるようになります。

 windowsの設定画面で↓のように設定すると出力が入力にループバックします。それなので、Processingでデフォルト入力を使用するとデスクトップ出力を使用できます。

スクリーンショット 2021-01-10 142431

Processingで作るオーディオビジュアライザー

 オーディオビジュアライザーってかっこいいので作りたくなることがあります。自分も今回初めて正式名称を知りましたが、オーディオビジュアライザーとは音の大きさによってぴょこぴょこする棒のことです。

 今回はProcessingで作成するのでminimライブラリの中にあるFFTという機能を使います。そもそもオーディオビジュアライザーとはFFT(高速フーリエ変換)の結果をかっこよく表示したものなので、FFTをすれば後は表示するだけです。
 ↓のような画面ぐらいならすぐに作ることができます。
 この時に前回(http://blog.livedoor.jp/chisato_tofu/archives/25956603.html)のソフトを使用するとデスクトップ音声のオーディオビジュアライザが使用できます。

 ↓に今回のコードを載せておきます。
  1. import java.util.Random;
  2. import ddf.minim.*;
  3. import ddf.minim.analysis.*; 
  4. import ddf.minim.effects.*;
  5. import ddf.minim.signals.*;
  6. import ddf.minim.spi.*;
  7. import ddf.minim.ugens.*;

  8. Minim minim; 
  9. AudioInput in; 
  10. FFT fft; 
  11. int w;

  12. void setup() {
  13.   size(1920, 1080);
  14.   colorMode(HSB, 360, 255, 255, 255);
  15.   strokeWeight(5);
  16.   fill(180, 255, 255, 100);
  17.   minim = new Minim(this);
  18.   in = minim.getLineIn(Minim.STEREO, 512);//デフォルト入力をProcessingに取り込み
  19.   fft = new FFT(in.bufferSize(), in.sampleRate()); 
  20.   fft.logAverages(60, 2);//(FFTのバンドの数,FFTのオクターブ当たりの分割数)を設定
  21.   w=width/fft.avgSize();
  22. }

  23. void draw() {
  24.   background(0);
  25.   fft.forward(in.mix);
  26.   for (int i = 0; i < fft.avgSize(); i++) { //オーディオビジュアライザを描画
  27.     rect((i*w), height, w, -fft.getAvg(i) * 50);
  28.   }
  29. }
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード