lecture:design_with_prototyping:20.音を鳴らす

音の再構成

私達が普段「音」と言っているのは,比較的高速な空気振動のことをさしています.PCにはスピーカがついています(今となっては当然ですが).スピーカには磁石の周りにコイルが巻かれており,コイルに電流を流すことでこの磁石が流れた電流に応じて振動をします.磁石はコーンと呼ばれる紙等の比較的軽くて表面積の広いものとつながっているため,コイルの電流の流れがそのままコーンを通じて空気の振動に変わる仕組みです.

このスピーカを利用してまずは音を振動を理解します.まずは以下のコードをtweakモードで実行してみましょう.

import processing.sound.*;

SinOsc sine;

void setup() {
  size(640, 360);
  background(255);
  // create and start the sine oscillator.
  sine = new SinOsc(this);
  sine.play();  
}

void draw() {
  sine.amp(0.500); // Amplitude: -1.0 - 1.0
  sine.freq(138.2); // Frequency: 0 - 20000
}

音の基本的な要素には

  • 振幅(一般的に音量と呼ばれるもの)
  • 周波数(一般的に音が高い,低い,と呼ばれるもの)

があり,上記のサンプルはこの2つの要素をコントロールしたものです.なお,ampにわたす引数は最小0.0, 最大が1.0なので,それ以外の値を入れると,コンソール部分に

Sound library error: amplitude has to be in [-1,1]

と表示(version.3.4)されます.英語を読んだ通りですが,amplitudeは-1から1の範囲で指定する必要があります.音量と思って考えると-1というのがちょっと違和感あるかもしれませんが,これは振幅なので,サイン関数に乗算(掛け算)する変数となります.もともとサイン波は-1.0 - 1.0まで変化する変数なので,-1.0をかけた場合はそのサインはの極性が反転したものと考えます.

\[ 1.0\times sin(x) -1.0\times sin(x) = 0 \]

実際にこれをプログラムで記述してみましょう.

import processing.sound.*;

SinOsc sine;
SinOsc sine_invert;

void setup() {
  size(640, 360);
  background(255);
  // create and start the sine oscillator.
  sine = new SinOsc(this);
  sine.amp(0.5); // 0.0 - 1.0
  sine.freq(440.0); // 0 - 20000

  sine_invert = new SinOsc(this);
  sine_invert.amp(-0.5);
  sine_invert.freq(440.0);

  sine.play();
  sine_invert.play();
}

void draw()
{
}

なにも起こらないコードです.発音する音がわかっているのであれば逆位相を加算すると音が消える,という例です.これはノイズキャンセリングで用いられている原理になります.現在はサイン波という単純な音ですが,これが周辺の音になった場合も逆位相の音を流すことで音を消すことができるわけですね.

import processing.sound.*;

AudioSample sample;

void setup() {
  size(640, 360);
  background(255);

  // Manually write a sine wave oscillations into an array.
  int resolution = 1000;
  float[] sinewave = new float[resolution];
  for (int i = 0; i < resolution; i++) {
    sinewave[i] = sin(TWO_PI*i/resolution);
  }

  // Initialize the audiosample, set framerate to play 200 oscillations/second
  sample = new AudioSample(this, sinewave, 200*resolution);
  sample.amp(0.2);
  sample.loop();
}      
void draw() {
}

このサンプルでは自分でサインはの配列データを一周期分作成して,それを元に音を鳴らしています. 上記サンプルを利用して,下記リンクで紹介されている波形(sine, square, triangle, sawtooth)を自分で作成し,音を確認してみましょう.

  • lecture/design_with_prototyping/20.音を鳴らす.txt
  • 最終更新: 2020/04/20 08:10
  • by baba