皆さん爆発音を自分で用意したくなった時があると思います。でも、どう作ればいいかわからないですよね? そんな方のために今回は爆発音を作る方法を紹介しようと思います!

 まず、作成経緯です。爆発音のフリー素材なんかネット上にごろごろ転がっているので、それを持ってくればこの記事はいりません。しかし、全部Processingで完結させるといってしまった以上Processingで作るしかありません。いくら調べてもProcessing上で爆発音を作っている人はいなかったので日本初の試みです。
 次に爆発音についてです。爆発音は調べたところノイズを減衰させるといい感じに聞こえるらしいです。それなのでminimの中にあるNoiseというものを使って作ることにします。

 これを実装するためにはノイズの大きさを変える必要があるのですが、自分が英語リファレンスを読んだ感じできませんでした。それなので今回は音量が違う8800通りのノイズを定義しています。この8800という数字はほかのところとの兼ね合いで生まれたものなので特に気にしなくていいです。

 また、Processingには
  1. ホワイトノイズ
  2. ブラウンノイズ
  3. ピンクノイズ
  4. レッドノイズ
の4つのノイズが存在します。それぞれのノイズをsinカーブで減衰させたときの例を↓に出します。自分の好みに合わせて、組み合わせるノイズや減衰の関数を選んでください。



 個人的にはブラウンノイズとレッドノイズがそれっぽいと思うので今回のコードではこの二つを採用しています。

 ↓にそれぞれのツイートの元のコードを書いておきます。
1つ目のツイート
  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. Noise[] noisevol = new Noise[5];
  9. int mode;

  10. Minim minim; 
  11. AudioOutput out;

  12. void setup() {
  13.   size(300, 100);
  14.   textAlign(CENTER, CENTER);
  15.   fill(255);
  16.   textSize(64);
  17.   background(0);
  18.   minim = new Minim(this);
  19.   out = minim.getLineOut(Minim.STEREO);
  20.   noisevol[1] = new Noise(1.0, Noise.Tint.WHITE);
  21.   noisevol[2] = new Noise(1.0, Noise.Tint.BROWN);
  22.   noisevol[3] = new Noise(1.0, Noise.Tint.PINK);
  23.   noisevol[4] = new Noise(1.0, Noise.Tint.RED);
  24. }

  25. void draw() {
  26. }

  27. void keyPressed() {
  28.   background(0);
  29.   if (mode != 0) {
  30.     noisevol[mode].unpatch(out);
  31.   }
  32.   switch(key) {
  33.   case '1':
  34.     mode = 1;
  35.     text("WHITE", width / 2, height / 2);
  36.     break;
  37.   case '2':
  38.     mode = 2;
  39.     text("BROWN", width / 2, height / 2);
  40.     break;
  41.   case '3':
  42.     mode = 3;
  43.     text("PINK", width / 2, height / 2);
  44.     break;
  45.   case '4':
  46.     mode = 4;
  47.     text("RED", width / 2, height / 2);
  48.     break;
  49.   default:
  50.     break;
  51.   }
  52.   noisevol[mode].patch(out);
  53. }
2つ目のツイート
  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. Noise[][] noisevol = new Noise[8800][5];
  9. int[] noisevolmode = new int[3];
  10. int mode;

  11. Minim minim; 
  12. AudioOutput out;

  13. void setup() {
  14.   size(300,100);
  15.   textAlign(CENTER, CENTER);
  16.   fill(255);
  17.   textSize(64);
  18.   background(0);
  19.   minim = new Minim(this);
  20.   out = minim.getLineOut(Minim.STEREO);
  21.   for (int i = 0; i < 8800; i++) {
  22.     noisevol[i][1] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.WHITE);
  23.   }
  24.   for (int i = 0; i < 8800; i++) {
  25.     noisevol[i][2] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.BROWN);
  26.   }
  27.   for (int i = 0; i < 8800; i++) {
  28.     noisevol[i][3] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.PINK);
  29.   }
  30.   for (int i = 0; i < 8800; i++) {
  31.     noisevol[i][4] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.RED);
  32.   }
  33. }

  34. void draw() {
  35.   noisevolmode[0] = (millis() - noisevolmode[2]) * 10;
  36.   if (mode != 0) {
  37.     if (noisevolmode[0] > 8800) {
  38.       noisevol[noisevolmode[1]][mode].unpatch(out);
  39.       noisevolmode[0] = 0;
  40.     } else {
  41.       noisevol[noisevolmode[1]][mode].unpatch(out);
  42.       noisevol[noisevolmode[0]][mode].patch(out);
  43.       noisevolmode[1] = noisevolmode[0];
  44.     }
  45.   }
  46. }

  47. void keyPressed() {
  48.   background(0);
  49.   if (mode != 0) {
  50.     noisevol[noisevolmode[1]][mode].unpatch(out);
  51.   }
  52.   switch(key) {
  53.   case '1':
  54.     mode = 1;
  55.     text("WHITE", width / 2, height / 2);
  56.     break;
  57.   case '2':
  58.     mode = 2;
  59.     text("BROWN", width / 2, height / 2);
  60.     break;
  61.   case '3':
  62.     mode = 3;
  63.     text("PINK", width / 2, height / 2);
  64.     break;
  65.   case '4':
  66.     mode = 4;
  67.     text("RED", width / 2, height / 2);
  68.     break;
  69.   default:
  70.     break;
  71.   }
  72.   noisevolmode[2] = millis();
  73. }