理系的音楽道の5回目です。[1]で作ったプログラムは人工的に作った波形を音(wavファイル)にして聞けるプログラムでした。今回はその逆で、wavファイルをデータにするプログラムです。将来、ピアノの音を分析するもっとも基礎的な機能です。とりあえず、本日はピアノのA(ラ)の音をPCに取り込み、その波形を目で見てみる企画です。電子ピアノはメーカが理想的な音響室でグランドピアノの音を採音したもので、これを使わない手はありません。さっそく、手持ちのソフトsound itを使って、 wavファイルとして録音し、本日のプログラムでそのwavファイルを取り込み、テキストデータとして書き込み、今月、フリーソフト化されたばかりのngraph[3]で波形を書いてみました。まず、全体状況は
です。横軸は時間で0.5秒付近で打鍵し、音が減衰していることがわかります。波形が込み入っているので、かいつまんで拡大してみましょう。まず、打鍵してすぐ0.5秒から0.51秒の様子を見てみましょう。
本[2]にも載っているような典型的なピアノの波形です。でも本と違って上下非対称ですね。では次に0.6秒から0.61秒の波形を見て見ましょう。
0.5秒付近波形の小さな振動がなまって来ているのが観察されます。次に0.7秒から0.71秒の様子をみましょう。
なんだか正弦波ではなく、三角形の波形に変わって来ました。では0.8秒から0.81秒を見て見ましょう。
頂点がとがっていたのが、まるくなって来ました。総じて印象は
1,時間の経過とともに波形は変化する。
2,他の楽器の波形[2]と比べると単純な波形で、おおむね正弦波的である。でもよく見れば、正弦波というより三角波である。
というものです。皆さんはどのような感想でしょうか。プログラムに興味のある方は下の「プログラムはこちら」を押してみてください。
[1] 周波数当てクイズ, 10/02/24
[2] 楽器の物理学, 10/03/20
[3] ngraph, http://www2e.biglobe.ne.jp/~isizaka/
/******************************************************************
・本ソースファイル名はwave2data100311.cです。
・本プログラムの著作権はyablinskyに属します。
・本プログラムで作ったファイルの著作権はwavファイルの作成者にあります。
・本プログラムのコピー・改変は自由です。
ただし、改変されたプログラムは個人で楽しむ以外に使う場合、
例えば、wavデータやそれを変換したデータをブログやホームページに
アップロードする場合はソースコードも公開しなければならない。
version 10.03.11 waveファイルの取り込みdata化
http://desktop-piano.blog.so-net.ne.jp
Copyright 2010 yablinsky All rights reserved.
Presented by yablinsky
*******************************************************************/
#include
#include
#include
#include
void wave2data(char **argv);
void write_error(char *c);
void main(int argc,char *argv[]) {
int i,N,sampling;
struct LR *sound;
if (argc!=3) {
printf("wave2data000000 input_data_file_name(*.wav) output_data_name(*.dat)\n");
exit(1);
}
wave2data(argv);
}
// wavデータをキャラクタデータへ変換
void wave2data(char **argv) {
int i,RIFFsize,fmtsize,bytepersec,datasize,sampling,N;
short fmttag,chan,bitpersample,blockboundary,sound_left,sound_right;
double t,dt;
char c1;
FILE *fpi,*fpo;
fpi=fopen(argv[1],"rb");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'R') write_error("R");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'I') write_error("I");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'F') write_error("F");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'F') write_error("F");
fmtsize=16;
fread(&RIFFsize,sizeof(int),(size_t)1,fpi);
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'W') write_error("W");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'A') write_error("A");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'V') write_error("V");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'E') write_error("E");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'f') write_error("f");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'm') write_error("m");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 't') write_error("t");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != ' ') write_error("[space]");
fread(&fmtsize,sizeof(int),(size_t)1,fpi);
fread(&fmttag,sizeof(short int),(size_t)1,fpi);
fread(&chan,sizeof(short int),(size_t)1,fpi);
fread(&sampling,sizeof(int),(size_t)1,fpi);
fread(&bytepersec,sizeof(int),(size_t)1,fpi);
fread(&blockboundary,sizeof(short int),(size_t)1,fpi);
fread(&bitpersample,sizeof(short int),(size_t)1,fpi);
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'd') write_error("d");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'a') write_error("a");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 't') write_error("t");
fread(&c1,sizeof(char),(size_t)1,fpi);
if (c1 != 'a') write_error("a");
fread(&datasize,sizeof(int),(size_t)1,fpi);
N=datasize/(int)blockboundary-1;
fpo=fopen(argv[2],"w");
dt=1/(double)sampling;
if (chan==2) {
for (i=0;i<=N;++i) {
t=(double)i*dt;
fread(&sound_left,sizeof(short int),(size_t)1,fpi);
fread(&sound_right,sizeof(short int),(size_t)1,fpi);
fprintf(fpo,"%e %d %d\n",t,(int)sound_left,(int)sound_right);
}
}else if (chan==1) {
for (i=0;i<=N;++i) {
t=(double)i*dt;
fread(&sound_left,sizeof(short int),(size_t)1,fpi);
fprintf(fpo,"%e %d\n",t,(int)sound_left);
}
}else{
printf("chan error\n");
exit(1);
}
fclose(fpo);
fclose(fpi);
}
void write_error(char *c) {
printf("%s\n",c);
exit(1);
}
2010-03-21 23:00
nice!(7)
コメント(13)
トラックバック(0)
共通テーマ:
音楽
興味深い実験ですね。
楽器の音は幾つかの波が組み合わさってできていると思うのですが、波形が変わるというのは、小さな波が減衰してしまうからでしょうか?
by nyankome (2010-03-22 00:33)
やはり、ピアノの発音は人間ではなくメカが担当しているから
他の楽器よりも単純な波形となるのでしょうネ
波形が上下非対称である事や、変化する事、歪がある事
これらは電子ピアノのサンプリング時に発生した反響に
よるものかもしれませんね、恐らくは理想的な環境における
波形は上下対象になるのだろうなぁと。
(科学における"理想的な環境"ってヤツです)
by Caelum (2010-03-22 06:28)
nyankomeさん、コメントありがとうございます。どうして波形が変化するのかはなぞです。これから分析してみないとわかりません。今回は分析の前にとりあえずデータをプログラムに取り込む最初のステップです。Enriqueさんも縦の振動が横の振動になるとか、3本の弦のうなりとかいろいろ記事にしておられますので、参考にしながら考えてみます。
by yablinsky (2010-03-22 06:34)
Caelumさん、コメントありがとうございます。想像していたより単純な波形でした。そうですね。楽器である電子ピアノとしての理想的な採音と無響音室での採音は違うかもしれませんね。それから、ピアノ本体の反響とか、他の弦との干渉とかいろいろありそうです。電子ピアノ側でホールなどの反響を人工的に追加しているかもしれません。とても参考になるご意見ありがとうございます。
by yablinsky (2010-03-22 06:40)
大枠は,高調波成分が先に減衰し余韻は基本波で構成されるということですね。
様々な波形解析の基盤整備をされたところとお見受けします。ご承知の通り,波形は高調波の混ざり具合で千変万化しますが波形と音色の聞こえとは一対一に対応しません。同じ波形は同じように聞こえますが,全く違う波形でも同じように聞こえることもよくあり,原因は高調波の位相関係です。教科書の波形と実際観測した波形とのずれの原因もここにあります。部屋やマイクの距離でも位相関係は変わります。
位相が変われば波形は変わりますが,高調波の量が同じならば,耳には同じように聞こえます。ひとの耳はオシロでなく,スペアナだと書いたことがあります。
http://classical-guitar.blog.so-net.ne.jp/2009-04-18-1
波形の上下非対称は高調波の重なり具合,線形重ね合わせの範囲で説明可能です(全波整流波ですね)。
三角波も澄んだ良い音ですね。
データ取り込みプログラムも出来上がり,今後の色々な検討結果を期待いたします。
by Enrique (2010-03-22 10:53)
Enriqueさん、コメントありがとうございます。音響関係は素人なもので、人間の耳はスペクトルアナライザだということ初耳でした。記事も拝見しましたが、納得です。通常、弦の振動は、2倍、4倍、8倍・・・周波数の重ね合わせになりますが、それ以外もありそうな予感です。いずれにしてもこれからですが、趣味なので、ゆっくりしか開発が進まない予定です。ここまでのプログラム開発と解析を仕事でやると、多分、1日とか2日の分量ですから、趣味だといかに遅いかがわかります。
by yablinsky (2010-03-22 13:33)
回転軸。空気抵抗。角度。ピッチャーは物理教師
by ワカタカタカコ (2010-03-22 18:36)
ワタタカタカコさん、コメントありがとうございます。スポーツ物理学というのがあって、いろいろ研究している人もいるようですね。スポーツも物理学の応用で新しいことをやろうとしている人もいますから、音楽も物理学を使って何かできるかもしれませんね。私はあくまで趣味としてやっていきますが・・・
by yablinsky (2010-03-22 19:02)
こんばんは。
詳しいことはわかりませんが、興味深い実験ですね。
波形が微妙に変わるといっても、さすがピアノ、結構安定しているものですね。
自分なんか、オーボエでAの音をロングトーンしても、不安定だから、きっとこんな綺麗な波形にはならないでしょう(^_^;)
by ながぐつ (2010-03-22 21:06)
ながぐつさん、コメントありがとうございます。オーボエの波形はもっともっと複雑な形をしていると想像します。ピアノは単純で安定していますね。ここから先は周波数の分析を始めるのが王道なのですが、趣味なので寄り道をするかもしれません。
by yablinsky (2010-03-22 22:16)
弦の倍音には2,3,4,5,,,と全てあります。ピタゴラスはモノコードで3倍音(オクターブと5度上)を出して,彼の音階を作りました。
管楽器でも,例えばフルートは偶数系,クラは奇数系です。一般に奇数次高調波では半周期とらえた波形が対称,偶数次では非対称になります(もちろん位相関係で波形は変わりますが)。
by Enrique (2010-03-23 00:26)
Enriqueさん、補足いただきありがとうございます。そうですね。2,3,4,5,・・・ですね。ちょっと勘違いです。弦の振動に関する線形偏微分方程式をとけば、その固有値は2,3,4,5,・・・と出てきますね。というより弦の振動の図を書けば明らかですが・・・ありがとうございます。このまま勘違いするところでした。
by yablinsky (2010-03-23 00:43)
江州石亭さん、niceありがとうございます。
by yablinsky (2010-03-24 21:08)