(C) by T.IZUMI @ Ritsumeikan U, Jul 2017 - 無断複製・再配布を禁ず
中高生・学部低回生向け実験
by 立命館大学 理工学部 電子情報工学科 いずみ研
〜WAVファイル生成〜
以下を復習・予習しておくこと。
以下をインストールし使い方を確認しておくこと。
以下をダウンロードして適当な作業フォルダに展開しておくこと。
ともかく、サンプルプログラムをコンパイルして実行してみる。
青字が入力する部分、斜体は実行環境によって異なる部分。
※Windows のファイルは Cygwin から /cygdrive/ドライブ文字/ でアクセスできる。
例えば、D:\work\sinwave なら /cygdrive/d/work/sinwave になる。
izumi@izumipc$ cd /cygdrive/w/sinwave izumi@izumipc$ ls Makefile sinwave.c wavfast.c wavfile.c wavfile.h izumi@izumipc$ make gcc -O -Wall -g -c sinwave.c gcc -O -Wall -g -c wavfile.c gcc -O -Wall -g -osinwave.exe sinwave.o wavfile.o -lm izumi@izumipc$ ls Makefile sinwave.exe wavfast.c wavfile.h sinwave.c sinwave.o wavfile.c wavfile.o izumi@izumipc$ ./sinwave.exe usage: ./sinwave [outputfile] generate a PCM wav file for tests Copyright: Tomonori IZUMI, Apr 2017 output file "out.wav" izumi@izumipc$ ls Makefile sinwave.c sinwave.o wavfile.c wavfile.o out.wav sinwave.exe wavfast.c wavfile.h |
ソースコードを確認する。Windowsのメモ帳(notepad)等で sinwave.c を開いてみる。
以下の部分を確認する。
#define NUMCH 2 /* number of channels = 2 (left, right)*/ #define BITPERSMPL 16 /* quantization bits = 16bits */ #define SMPLPERSEC 44100 /* sampling rate = 44100Hz (samples/second)*/ #define NUMSMPL 88200 /* sound length */ #define OUTFILE "out.wav" |
ここで、SMPLPERSEC (samples per second) はサンプリング周波数を定義している。 ここでは CD と同じ 44100Hz (44.1kHz) としている。 NUMSMPL (number of samples) は出力する音のサンプル数を定義している。 ここでは 88200 サンプルでサンプリング周波数が44100Hzなので、 88200/44100=2秒分の音データを出力する。 この値を替えることで音の長さを替えることができる。 OUTFILE は出力ファイル名を定義している。
さらに、以下の部分を確認する。
for (t=0;t<NUMSMPL;t++){ double v0,v1; v0=1.0*sin(2.0*M_PI*440.0*t/SMPLPERSEC); v1=1.0*sin(2.0*M_PI*440.0*t/SMPLPERSEC); smpl.smpl[0]=sature16(32767.0*v0); smpl.smpl[1]=sature16(32767.0*v1); writewavsmpl(fpo,&wavo,&smpl); } |
ここで、変数 t が時間ステップ(44.1kHzで何個目か)を表しており、 青字の部分の式で正弦波を計算している。 これはCプログラムの計算式で、数学・物理の表現では下の式のようになる。 v0は左チャンネルの音、v1は右チャンネルの音である。 M_PI は円周率πを表し、 1.0 が正弦波の振幅、t/SMPLPERSEC が時刻(秒)、440.0が音波の周波数である。 プログラム中、数値が整数ではなく小数点を含む計算であることを明示するため、 「.0」を敢えて付与していることに注意。 この式を変更すると振幅や周波数を替えることができる。
音の周波数を替えてみよ。sinwave.cを保存、再コンパイルし、
音声ファイルを生成、再生して確認せよ。
注…sinwave.exe の実行時には Media Player を閉じること。
Media Playerが out.wav を開いていると、
sinwave.exe が out.wav を書くことができない。
参考… 2i/12の表 | |
---|---|
21/12 | 1.059 |
22/12 | 1.122 |
23/12 | 1.189 |
24/12 | 1.260 |
25/12 | 1.335 |
26/12 | 1.414 |
27/12 | 1.498 |
28/12 | 1.587 |
29/12 | 1.682 |
210/12 | 1.782 |
211/12 | 1.888 |
212/12 | 2.000 |
音を生成する部分を以下のように変更して音を確認せよ。
for (t=0;t<NUMSMPL;t++){ double v0,v1; v0=0.33*sin(2.0*M_PI*440.0*1.0/1.0*t/SMPLPERSEC) +0.33*sin(2.0*M_PI*440.0*5.0/4.0*t/SMPLPERSEC) +0.33*sin(2.0*M_PI*440.0*3.0/2.0*t/SMPLPERSEC); v1=0.0; smpl.smpl[0]=sature16(32767.0*v0); smpl.smpl[1]=sature16(32767.0*v1); writewavsmpl(fpo,&wavo,&smpl); } |
ここでは、左音声を440Hzとその4分の5倍、2分の3倍の音を合成している。 3つの波を足しているのでそれぞれの波の振幅を0.33倍にしていることに注意。 なお、右音声は一定値0で無音にしている。
分数を変更して、様々な和音を鳴らしてみよ。
正弦波以外の、方形波や鋸波を生成せよ。
♪チューリップ♪の音楽を生成せよ。