サウンド

1.やってみよう

(1) Processingのプログラミング環境に、つぎのプログラムを入力しなさい。
import ddf.minim.*;

Minim minim;
AudioSample ding;
int x;

void setup()
{
  size(200, 150);
  frameRate(30);
  
  minim = new Minim(this);
  ding = minim.loadSample("ding.wav");
  
  x = 1;
}

void draw()
{
  if (x == 0)
  {
    background(255, 255, 255);
    fill(0, 0, 255);
    textSize(28);
    textAlign(CENTER);
    text("click", 100, 75);
  }
  else
  {
    background(0, 0, 255);
    fill(255, 255, 255);
    textSize(28);
    textAlign(CENTER);
    text("click", 100, 75);
  }
}

void mousePressed()
{
  ding.trigger();
  x = 1 - x;
}

void stop()
{
  ding.close();
  minim.stop();
  super.stop();
}
(2) このプログラムをフォルダに保存し、それと同じフォルダに効果音の音データを保存しなさい。効果音の音データとしては、たとえば、Windows 7の場合は、「コンピューター」→「ローカルディスク(C:)」→「Windows」→「Media」のなかにある「ding.wav」などをコピーして使うのもひとつの方法である。
(3) Runボタンを押してプログラムを実行し、マウスをクリックするたびに音が鳴ることを確認しなさい。

2.解説

 Processingのサウンド機能を利用するには、デフォルトのライブラリであるMinimを利用するのが簡単である。バージョン2.2.1のProcessingであれば、インストールするだけで自動的にセットアップされる。ただし、バージョン3以降のProcessingではオプションになっているため、別途セットアップが必要になる。
 Minimを利用して音を鳴らす場合、効果音のように短い音であれば、AudioSampleクラスの関数を使う。AudioSampleクラスには、ファイルから音データを読み出すための関数としてloadSample関数、音データを再生するための関数としてtrigger関数が用意されている。

3.課題

(1) マウスをクリックすると音楽の再生をはじめるプログラムを作りなさい。音楽の音データとしては、たとえば、Windows 7の場合は、「ライブラリ」→「ミュージック」→「サンプルミュージック」にある「Kalimba.mp3」などをコピーして使うのもひとつの方法である。

(2) マウスをクリックするたびに再生と一時停止が交互に切り替わる音楽プレーヤーを作りなさい。

4.ヒント

 Minimを利用して音を鳴らす場合、音楽のように長い音であれば、AudioPlayerクラスの関数を使う。図1に示すように、AudioPlayerクラスには、ファイルから音データを読み出すための関数としてloadFile関数、音データを再生するための関数としてplay関数が用意されている。



図1.AudioPlayerクラスの関数

 音楽プレーヤーのプログラムを作る場合、図2に示すように、再生と一時停止のトグルボタンを描画し、さらに再生位置を表示する機能をつけ加えると、プログラムの動作を目で見て確認することができるようになり、使い勝手がよいものになる。



図2.音楽プレーヤーのインターフェース

5.ゲームをつくってみよう(3)

(1) Processingのプログラミング環境に、つぎのプログラムを入力しなさい。
int ball_x, ball_y, ball_dx, ball_dy, ball_size;

void setup()
{
  size(300, 400);
  frameRate(30);
  
  ball_size = 64;
  
  ball_x = (int)random(32, width - 32);
  ball_y = (int)random(32, height - 32);
  
  ball_dx = 10;
  ball_dy = 10;
  
  minim = new Minim(this);
  ding = minim.loadSample("ding.wav");
}

void draw()
{
  background(0, 0, 255);
  
  noStroke();
  fill(255, 255, 255);
  ellipse(ball_x, ball_y, ball_size, ball_size);
  
  ball_x += ball_dx;
  if (ball_x < 0)
  {
    ding.trigger();
    ball_dx *= -1;
    ball_x = -ball_x;
  }
  if (ball_x > width)
  {
    ding.trigger();
    ball_dx *= -1;
    ball_x = width - (ball_x - width);
  }
  
  ball_y += ball_dy;
  if (ball_y < 0)
  {
    ding.trigger();
    ball_dy *= -1;
    ball_y = -ball_y;
  }
  if (ball_y > height)
  {
    ding.trigger();
    ball_dy *= -1;
    ball_y = height - (ball_y - height);
  }
}
(2) Runボタンを押してプログラムを実行し、ウィンドウの壁でボールが反射するたびに音が鳴ることを確認しなさい。前回までにつくったラケットでボールを打ち返すゲームを改良し、ウィンドウの壁やラケットでボールが反射するたびに音が鳴るようにしなさい。

Last Modified: October 1 12:00 JST 2021 by Naofumi Aoki
E-mail: aoki@ime.ist.hokudai.ac.jp