「音楽・音響情報処理」第2回レポート課題(改訂版)

「音楽・音響情報処理」第2回レポート課題(改訂版)
平成 27 年 11 月 20 日
• 提出方法: 原則として manaba により提出する(下記参照)
• 提出期限: 12 月 4 日(金) 24:00(12/5 0:00)
manaba で提出できない場合には、メールで送付する(上記期限まで)、4 日授業時に提出するのどちらかの
方法をとること。
• 提出するもの
– レポート本文ファイル
– 付属資料ファイル(WAV ファイル、プログラムのソースファイル等)
なお提出ファイルはレポート本文ファイルも含め、zip 等で1つのアーカイブにまとめること。
またサイズがあまり大きくならないようにすること(せいぜい 10MB ぐらいまで)。
提出上の注意(第1回と基本的には同じ)
• manaba (https://manaba.tsukuba.ac.jp) にログインし、本授業: GC51101「音楽・音響情報処理」の
「レポート」→「第 2 回レポート」から、提出ファイルをアップロードする。
• レポートファイルは原則として PDF 形式(A4 サイズ)で作成し、表紙をつけること。
(PDF への変換ができない事情がある場合に限り、WORD ファイルなどで提出も認める)
表紙は(印刷文書としての)レポート体裁を整えるためのもので、授業名・レポート課題番号、タイトル(も
しあれば)、提出日付、学生番号、氏名は必ず記すこと。
(manaba 提出の場合、表紙は必ずしも必要ではないが、レポート作成練習の一環として表紙もつける。表
示の例(テンプレートファイル)は manaba 上に用意する。)
• 付属資料ファイルは必要に応じて添付する。
• ファイル名には日本語コードは用いず、半角英数字(&使用可能な記号)のみを使用すること。
(日本語コードがあると移動した際に文字化けが生じるため。)
ファイル名そのものについては格別の指定はしないが、わかりやすい名前をつけ、添付ファイルについては
必要に応じて本文で参照すること。
1
テーマ: 音響データ(WAV ファイル)を作成・分析する
1
概要
• 音響データ(WAV ファイル)を正弦波合成等により作成し、どのような音になるかを実際に耳でも聞いて
確かめる。
• 課題の目的は、何らかの意図・目的を元に音を合成し、それを聞いてみて実際にはどのような音になるかを
述べ、それについての分析や考察を記すことである。したがって単に「音を作りました」だけで終わるよう
なレポートは評価しない。
また分析についてはフーリエ級数・フーリエ変換などを用いた数理的な内容を含むものであることが望まし
い。
• 作成は原則として C ないし Matlab で行う。
それ以外のソフトウェアやツール(例えば SuperCollider)を使用してもよいが、レポートにソースリスト
の説明などを詳細に記すこと。
• Matlab によるプログラムについての説明や資料は 2. を、C によるプログラムについては 3. を参照。
• どちらの場合にも共通するのは、単位時間(サンプリングレートの逆数)ごとの離散的な波形の振幅値を配
列(Matlab 用語ではベクトル)に格納し、再生ないしは WAV ファイルに格納することである。
複数の音を順に鳴らすには、それぞれの音を収めた配列を連結すればよい。また同時に鳴らすには、(重ね
合わせの原理が働くので)それぞれの音の配列要素を単純に足し合わせればよい。ただし、振幅値の範囲は
制限されているので、その範囲に収めることが必要である。
• レポートにはレポート本文ファイルの他に、作成した WAV ファイルのサンプル(レポートとして必要なも
のだけ)、プログラムのソースリスト、その他関連ファイルを併せて提出する。
• 特に Matlab を用いる場合、波形のグラフなどを交えて分析・考察することが望ましい。
2
Matlab による作成
• Matlab については別資料に使い方や作成例を示す。また可能であれば実習室で講習を行う。
例えば Matlab で1秒分の正弦波(純音)は以下のように簡単に作成できる。
>> Fs = 44100; % サンプリングレート (44100 Hz)
>> f0 = 440; % 基本周波数 (440 Hz)
>> t = 0:1/Fs:1; % 1秒分の時刻ベクトル(両端を含むので 44101 点)
>> y = sin(2*pi*f0*t); % 1秒分の波形ベクトル
>> wavplay(y, Fs); % 内蔵音源で演奏
>> wavwrite(y, Fs, ’f0.wav’); % ファイル f0.wav に書き出し
• プログラム例及び説明資料は授業ページ下部、「WAV データ・Matlab プログラム集」のリンクから入手で
きる。(URL は変更の可能性があるのでここには記さない。)
• 説明資料としては上記ページの「Matlab プログラミングの手引き」(PPTX ファイル)、「Matlab 演習」
(2013 年度実験用資料: PDF ファイル)等を参照のこと。
2
C による作成
3
C でプログラムを書く場合、ゼロから書くのがいい勉強になるのだが(特にファイルの入出力の扱いなど)、こ
こでは Matlab による解答との粒度を揃え、波形データの作成・処理に専念できるよう、WAV ファイル入出力の
ライブラリを提供する。
3.1
提供ファイル
wavfile.h
ライブラリの共通ヘッダファイル
wavfile.c
test1.c
test2.c
ライブラリのソースファイル
テストプログラム 1: WAV ファイルの入力
テストプログラム 2: WAV ファイルへの出力(正弦波)
重要! 互換性について
• このようなソースプログラムでの提供は、異なるプラットフォーム(マシン、OS)では動作しない場合があ
る。そこで以下のような対応をしている。
• wavfile.c では、整数型(int)は4バイト、short 型整数は2バイトであることを前提としている。これ
以外の場合(ほとんどないだろうが)には、wavfile.h 中の SHRT_MAX 等を修正する必要がある。
• wavfile.c では実行効率等は気にせず、わかりやすさを心がけた。
例えば fread, fwrite 等は使用せず、ファイルの入出力は fgetc, fputc だけを用いた。
これはバイトオーダー(いわゆる little/big Endian 問題)を生じさせないためでもある。
• 日本語文字コードは、基本は EUC コードを用いている(下記の Web ページ掲載版)。
ただし、文字コードによる問題を回避するため、日本語コードはコメントのみで利用し、プログラムが出力
するメッセージでは日本語コードは使用せず、すべて英語(ASCII コード)を用いている。そのためメッ
セージがわかりにくくなっていることは寛恕してほしい。
3.2
入手方法
• (その1)Web ページからのダウンロード
授業ページ下部:
「WAV, MIDI 関係 C プログラム集」のリンクにいくと、上記のファイルのリンクがある
のでそれぞれをダウンロードする。
ファイルは EUC コードで作成されているので、文字化けが生じる場合にはダウンロード後にコード変換す
るか、ブラウザで「EUC コード」で表示し、それを copy & paste する。
• (その2)全学計算機システム上
全学計算機システム上では、~hiraga.yuzuru.gf/public/src/ のディレクトリの下、下記の各ディレクト
リに対応する文字コードに変換したファイル一式がある。
3.3
EUC
EUC コード
UTF
SJIS
シフト JIS コード
SJIScrlf
シフト JIS コードで改行を CRLF としたもの
unicode (UTF-8 コード)
ライブラリの内容
詳しい定義は wavfile.h, wavfile.c の内容及びそこにあるコメントを参照。
3
3.3.1
WAVFILE 構造体
WAV ファイルに含まれる内容を集約した構造体。情報のやりとりは原則としてこの構造体を介して行う。
ただし、2次的に導出できる値については整理してあるので、WAV ファイルのフォーマットチャンクに含まれ
る情報の通りではない。
• ファイルフォーマット(FormatID)は #01(linear PCM)のみ扱う。
• チャンネル数(Channels)は 1(モノラル)か 2(ステレオ)。
• サンプリングレート(SamplingRate)はデフォールトでは 44100Hz(CD のサンプリングレート)
• データ当たりのバイト数(BytesPerSample)は 1 (8 bit) か 2 (16 bit: default)。
• (重要)音響データは、ファイル内でのデータ当たりバイト数に関わりなく、構造体では −1.0 ∼ 1.0 の範
囲の値をとる double 型データに変換する。
符号付整数の場合、正・負の値の範囲が異なるが、2バイトデータでは −32767 ∼ +32767 (= 215 − 1) の
みを使用し、−32768 (= −216 ) は使用しない。入力データにこれがあった場合には −32767 と同様、−1.0
に変換する。
同様に1バイトデータでは −127 ∼ +127 のみを使用し、−128 (= −27 ) は使用しない。
• モノラルデータは Track フィールドに double 型配列を格納し、ステレオデータは TrackL, TrackR フィー
ルドにそれぞれ double 型配列で左右トラックを格納する。
ただし、Track, TrackL は実質的には同一として扱う。
• 音響データの配列は calloc により動的に割当てるため、極端に大きなデータでは格納できない(実質的には
問題ないだろう。現在のマシンなら数千万個ぐらいなら問題なく作れるはず)。
3.3.2
関数群
• WAVFILE *wavalloc()
WAVFILE 構造体を作成し、それへのポインタを返す。
デフォールト値の設定は行うが、ファイル名、音響データ配列などは空で返されるので、あとから自分で設
定する。
• WAVFILE *wavread(char *filename)
ファイル名が filename である WAV ファイルを読み込み、その内容を格納した WAVFILE 構造体へのポイ
ンタを返す。
• WAVFILE *wavwrite(WAVFILE *wf)
WAVFILE 構造体ポインタ wf の内容を WAV ファイルに出力する。
呼び出し時に必要な情報は各フィールドに全て設定しておかなければならない(例えばファイル名は wf->Filename
にあるものを用いる)。
• WAVFILE *wavwrite monaural(char *filename, int SamplingRate, int Blocks, double *Track)
wavwrite の簡易版。モノラルデータを WAV ファイルに出力する。
ファイル名、サンプリングレート、データ数、データ配列を引数として渡すと、その内容の WAVFILE 構
造体を動的に作成し、wavwrite に渡す(データ当たりバイト数は 2 に固定)。
• WAVFILE *wavwrite stereo(char *filename, int SamplingRate, int Blocks, double *TrackL, double
*TrackR)
wavwrite の簡易版。ステレオデータを WAV ファイルに出力する。
データ配列が2トラックになる以外は上と同じ。
4
注・備考
• 上でファイル名について、拡張子 (extenstion) の補完はしない。
例えば与えられたファイル名が abc の場合、これを文字通りに処理し、abc.wav のように拡張子をつけて
扱ったりはしない。
• 上は(データ値の範囲等)、Matlab の wavread, wavwrite 関数にできるだけ対応させてはいるが、言語仕
様が異なるため、全く同一というわけにはいかない。
• 一方、Matlab の wavplay (sound, soundsc) のようにその場で直接、音を再生する機能は、デバイスド
ライバの設定などプラットフォーム依存になるので用意していない。
作成した音は、一旦 WAV ファイルに格納して、適当なオーディオ再生プログラムで再生する必要がある
(その意味では Matlab に比べて少々不便)。
課題
4
以下の各問の中から適当なもの(1つ以上)を選んで実施する。
なお課題の先頭に「ランク A, B, C」などとあるのは、それを実施した場合のレポート評価の目安である。ただ
し、実際の評価は実現された音やそのプログラムだけでなく、レポートの記述も含めて行うので、それによる変
動はある。
• A, A+ 評価を得るには、ランク A 以上を含む複数の課題を実施していることが望ましい。
• Matlab を用いる場合、様々なツールやプログラム例を提供しているので、その範囲を超えないような内容
については評価 C(せいぜい B)になる。様々な、またバラエティのある例を試してしっかりとした考察を
行う必要がある。
備考
以下で音階音を作成する場合、別途指示されない限り、中央ハ音(C4)の基本周波数を
2− 12 × 440 = 261.62556... Hz
9
とする(A4 = 440 Hz とした場合の平均律での C4 の基本周波数。したがって平均律以外の音律の場合、A4 の
基本周波数が 440 Hz になるとは限らない。)
1. (番外:これはレポートにいれなくてよい)
何はともあれ、実際に音データを作成し、ちゃんと意図通りに鳴ることを確かめる。
まずはこちらで示したプログラム例をそのままコピーして実行するのでよい。その上で、基本周波数を変え
てみるなどの変更をいろいろ試してみる。
2. (ランク C)
ユーザが指定した高さの音(正弦波)を作成する。高さは周波数ではなく、音名、MIDI ノート番号などで
指定し、平均律で対応する周波数値を求める。
周波数値は、数表(定数)をプログラムで持つのではなく、定義にしたがってその場で計算すること。なお
べき乗 xy は Matlab なら x^y、C では math ライブラリの関数 pow(x, y) で計算できる。
3. (ランク B)
上で平均律以外の音律(純正律、ピタゴラス律等)も出せるようにする。それにより、音律同士の協和度等
を比較する。特にピタゴラス律については基準音から出発して、5度円の右回り(3/2 倍)、左回り(2/3
倍)をいくつずつ行うかで異なる音律が得られるのでそれらを互いに比較する。
単音ではわかりにくいので、それぞれの音律での音階や和音を鳴らせるようにする、異なる音律での同音を
重ねて鳴らしたり、左右チャンネルに別々に鳴らしたりするなどの工夫をする。
5
4. (ランク C–B)
複数(2個以上)の周波数の音を同時に鳴らす音を作成する。
周波数値をいろいろ変えて、協和する音程(周波数比が簡単な整数比)、うなり(周波数が近い場合)、音楽
で使う和音などの場合を作り出してみる。
5. (ランク B)
複数の音を時間順に鳴らすファイルを作成する。例えば音階の音を順に鳴らす、簡単なメロディを演奏する
など。できれば音のつながり部分で「プチ」音などの雑音が生じないような工夫をする。
6. (ランク B)
鋸歯状波、矩形波、三角波など、フーリエ展開が知られている音について、直接的にその波形の音を作成す
る。一方、フーリエ成分を順に n 倍音まで重ね合わせた合成波を作成し、上にどのように近づくかを検討す
る(授業のデモも参照)。
7. (ランク B–A)
音の強さが時間的に変化する音を作る。
強さについては減衰する音、増大する音、また ADSR のパラメタにしたがって波形エンベロープが変化す
るものなど。減衰音などは人間の耳にスムーズに変化しているように聞こえるよう工夫し、また様々な場合
について比較検討する。実は単純な作成方法だと高さがわずかに(数 Hz 程度)変化したりするが、それに
ついての考察なども加える。
8. (ランク A)
音の高さが時間的に変化する音を作る。
典型的にはある周波数から別の周波数に、高さが連続的に変化する音(いわゆる chirp 音)。例えば最初に
440 Hz の定常音を1秒程度鳴らし、そこから連続的に上昇して 880 Hz に達してその定常音を1秒程度鳴
らすなど。(これは簡単に考えるとうまくいかない。時間的に変化する音高はどう定式化できるかを考える
必要がある。)その他に、周波数が時間的に変動する音(ヴィブラート、ワウワウ)など。
9. (ランク A)
スペクトルエンベロープ(各倍音成分の大きさ)をうまく設定することにより、様々な音色の音を作り出す。
例えば特定の楽器(木管楽器、金管楽器等)に近い音を作る、人間の音声の母音(AEIOU)に近い音を作
るなど。そのために必要なパラメタの値は、文献で調べたり、実音を自分で分析してみる。
10. (ランク A)
Shepard tone を作る。Shepard tone はオクターブ成分(2n f0 )のみからなる合成音で、山型・釣鐘型の固
定したスペクトルエンベロープを持たせることにより、1オクターブ分上がったところで元の音に戻るよう
な音を指す(詳しくはネット等で調べること)。
11. (ランク A)
既存の音ファイルを読み込み、それに対する様々な加工・編集を加える。
エコーをはじめとする様々なエフェクトを加えるなど。
12. (ランク ?)
その他、本課題の趣旨に沿うような内容であれば自由に設定してよい。
13. (ランク C)
本課題の趣旨はあくまで音を作ってみることだが、どうしてもプログラムできない場合には、授業資料の
wave2.pdf の p.13 練習問題 3 の (a)∼(i) のうち、3題以上を選んで解答すること。
6