課題 (06:サウンド)

作業について

今回の課題は以下のパッケージに作成してください。

パッケージの名前
j1.lesson06

作成するクラスの名前は問題ごとに指示があります。下記を参照してください

課題の提出方法については下記を参照してください。

また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。

新しい内容

音の三要素

音は、「音の大きさ」、「音の高さ」、「音色」という三要素によって特徴が決まります。音は耳で聞くだけではなく、音データの波形を目で見て観察することでその特徴を詳しく調べることが出ます。「音の大きさ」については前回説明しましたので、今回は「音の高さ」と「音色」について説明します。

「音の高さ」は波形の周期によって変化します。周期が長いと低い音になり、周期が短いと高い音になります。

「音色」は、波形の形状と密接な関係があります。とげとげしい波形では、かたい音色となり、なだらかな波形ではやわらかい音になります。

「音の高さ」は「基本周波数」で表します。「基本周波数」は、繰り返す波形の周期の逆数として定義されます。つまり、波形の周期をtとすると、基本周波数は(1/t)となります。

音を作る

楽器の調律では、「12平均律音階(平均律)」が一般的に用いられています。平均律では、音の高さは音名を表すアルファベットと音域を表す数字を組み合わせて表記されます。例えば、「ラ」は音名のAと音域の4を組み合わせてA4というように表記されます。さらに1オクターブ高い「ラ」は、A5と表記されます。

また、それぞれの音は、「音の高さ」を表す基本周波数が決まっています。A4は、音の高さが440Hzです。A5は1オクターブ高い音なので、音の高さは880Hzとなります。

次の表を参照してください。この表からA3やB3など他の音の周波数を計算することもできます。

音名 音階 周波数(Hz)
A4 440.00
A#4 ラ♯ 446.16
B4 493.88
C5 523.25
C#5 ド♯ 554.37
D5 587.33
D#5 レ♯ 622.25
E5 659.26
F5 ファ 698.46
F#5 ファ♯ 739.99
G5 783.99
G#5 ソ♯ 830.61
A5 880.00

ある音より1音だけ高い音を作るには、その音に「2の1/12乗」を掛けてやります。これを12回繰り返すと2倍(「2の1/12乗」の12乗)の周波数になり、1オクターブだけ高い音となります。

標本化周波数を11025HzとするとA4(440Hz)の音を作るためには、「11025/440 = 25.0568181…」で波形の周期をサンプル25個分とすればよいことになります。つまり、25個の数値でひとつの周期を表現し、それを440回連結すれば1秒のA4の音が作れます。

例: 音データを作成する

音データを作成する方法を紹介します。パッケージ「j1.lesson06」にクラス「CreateA4Sample」を作成して下さい。

クラスを作成したら、次のようなプログラムを作成します。

package j1.lesson06;

import gpjava.Clip;

public class CreateA4 {

    public static void main(String[] args) {
        new CreateA4().start();
    }

    void start() {
        double data[] = new double[25];
        data[0] = createSample(0);
        data[1] = createSample(1);
        data[2] = createSample(2);
        data[3] = createSample(3);
        data[4] = createSample(4);
        data[5] = createSample(5);
        data[6] = createSample(6);
        data[7] = createSample(7);
        data[8] = createSample(8);
        data[9] = createSample(9);
        data[10] = createSample(10);
        data[11] = createSample(11);
        data[12] = createSample(12);
        data[13] = createSample(13);
        data[14] = createSample(14);
        data[15] = createSample(15);
        data[16] = createSample(16);
        data[17] = createSample(17);
        data[18] = createSample(18);
        data[19] = createSample(19);
        data[20] = createSample(20);
        data[21] = createSample(21);
        data[22] = createSample(22);
        data[23] = createSample(23);
        data[24] = createSample(24);

        Clip clip = Clip.create(11025);
        clip.setSampleData(data, 440);
        clip.save();
    }

    double createSample(double phase) {
        return Math.sin(2.0 * Math.PI * phase / 25);
    }
}

長いプログラムのうち、まずは下の「createSample」を見てみましょう。

double createSample(double phase) {
    return Math.sin(2.0 * Math.PI * phase / 25);
}

ここでは、「Math.sin()」というメソッドと「Math.PI」という値を使っています。前者の「Math.sin()」は引数に角度をラジアンで指定すると、そのsinの値を返すメソッドです。また、ラジアンではπをよく利用しますが、手で入力するのは大変なので「Math.PI」と書けば代わりに精度の高いπの値を利用できます。

「createSample」では、つまり「sin(n/25 * 2π)」という計算を行っています。sinは2πで1周するので、それを25分割してそれぞれの位置でのサンプルを作成しようとしています。

1周期分のサンプルは、以下の部分で作成しています。

double data[] = new double[25];
data[0] = createSample(0);
data[1] = createSample(1);
...
data[24] = createSample(24);

25個の要素を持つ配列に、それぞれ順番に25分割したサイン波1周分のサンプルを記憶させています。

最後に、作成したサンプルから音声ファイルを作成する部分です。

Clip clip = Clip.create(11025);
clip.setSampleData(data, 440);
clip.save();

今回は音声を別のファイルから読んだりせず、「Clip clip = Clip.create(11025);」という命令で直接作成しています。ここに指定した11025という値は標本化周波数(11025Hz)です。

次に、「clip.setSampleData(data, 440);」という命令で作成したサンプルを音声に登録しています。1つ目の引数である「data」は登録するサンプルで、2つ目の「440」はサンプルを繰り返す回数です。

今回は25個のサンプルからなるデータを440回繰り返すので、合計で11000個のサンプルが登録されることになります。また、標本化周波数は11025Hzで、基本周波数1回分のサンプルが25個なので、基本周波数は441Hz(=11025Hz/440)となります。

音声を保存したら、「音声を再生する前に」をよく読んでからAudacityで再生してみましょう。

まとめ

今回は、音を新しく作る方法について紹介しました。

まず、空の音声を作成するには、下記のように書きます。

Clip clip = Clip.create([標本化周波数]);

なお、標本化周波数は下記のいずれかを利用するのが一般的です。

  • 11025
  • 22050
  • 44100
  • 48000
  • 96000

つぎに、配列に作成したサンプルを繰り返し登録するには、下記のように書きます。

clip.setSampleData([サンプルの配列], [繰り返し回数]);

上記のように書くと、配列の長さ×繰り返し回数だけサンプルが登録されます。

問題

1. 別の音階

作成するクラスの名前
CreateC5

C5のサイン波を作成してください。また、振幅を-0.6から+0.6に納まるように、全体の波形を0.6倍してください。

また、作成した音声を再生する前に、必ず波形を確認してください。

2. 矩形波

作成するクラスの名前
SquareWave

G5の矩形波(くけいは)を作成してください。

矩形波はサンプルの値が2種類で、一定時間ごとに-1.0と+1.0の値を順にとるような波形のことです(矩形(=長方形)のような波形になります)。

なお、振幅を-0.3から+0.3に納まるように、全体の波形を0.3倍してください。サイン波より大きな音に聞こえるので気を付けてください。

また、作成した音声を再生する前に、必ず波形を確認してください。

3. 三角波

作成するクラスの名前
TriangleWave

G5の三角波を作成してください。

三角波はサンプルの値が三角形に見えるような波形で、-1.0から+1.0まで線形(まっすぐ)にサンプル値を増やした後、+1から-1まで線形にサンプル値を減らします(二等辺三角形のような波形になります)。

なお、振幅を-0.5から+0.5に納まるように、全体の波形を0.5倍してください。

また、作成した音声を再生する前に、必ず波形を確認してください。