周波数当てクイズ [理系的音楽道]

 A(ラ)の音が440Hzか442Hzかと言う話題[1]が、Enriqueさんや江州石亭さんのブログでも取り上げられています。そもそも、440Hzと442Hzではどの程度の違いがあるのか試したくなりました。まず、クイズです。

[クイズ]
今から8つの音を出しますが、どのように並んでいるでしょうか。

[A] 440Hz 440Hz 440Hz 440Hz 442Hz 442Hz 442Hz 442Hz
[B] 442Hz 442Hz 442Hz 442Hz 440Hz 440Hz 440Hz 440Hz
[C] 440Hz 440Hz 442Hz 442Hz 440Hz 440Hz 442Hz 442Hz
[D] 442Hz 442Hz 440Hz 440Hz 442Hz 442Hz 440Hz 440Hz
[E] 440Hz 442Hz 440Hz 442Hz 440Hz 442Hz 440Hz 442Hz
[F] 442Hz 440Hz 442Hz 440Hz 442Hz 440Hz 442Hz 440Hz



なんだか、飛行機のシートベルトサインの音を思い出しませんか。答えは後ほど。

これからのことも考え、いろいろ音の実験をするために、プログラムを組んでみました。プログラミング言語はC言語を選びました。C++が良かったかどうかまだ迷っていますが、のちのち、CPU時間が必要そうな予感もあり、OpenMP(並列処理するためのもの)やCUDA(グラフィックボードで計算するもの)をにらみとりあえずC言語です。最も現時点ではとても軽いプログラムです。ちなみにコンパイラ(C言語をマシン語に翻訳するソフト)はgccを使用しています。

プログラムはプログラミングを知っている人には単純なもので、

eq100224.jpg

の周波数の減衰正弦波をCDのサンプリングレート44.1kHzでwavファイルとして書き出すものです。wavファイルの規格はネットで検索すれば、出てきました。本当はmp3なら、かっこいいのですが、規格が難しそうです。趣味ではプログラミングにそれほど時間がかけられませんので、wavファイルをsound itでmp3に変換しました。ちなみにwavファイル自体もメディアプレイヤで再生できます。またmp3化したときに音質低下していて区別が付かなくなっている可能性もあります。

私の感想としては、基本的に440Hzと442Hzは私には区別が付きません。よくよく聞けば音のはじめの違いを感じることができるが、これは答えを知っているためか、本当に分かるのか疑わしいという程度です。絶対音感を持つうちの子ども初号はこの音がA4(国際規格)であることは分かりましたが、実は2種類の音だと言わないと2つの音の違いは分かりませんでした。

[関連情報]
[1] 音階と周波数, 10/02/17

さて、クイズの答えは以下を押して頂ければ出てきますが、仕事と違い趣味なのでプログラムも公開しますので、プログラムをみるとアレルギーの出る方には危険ですから、押さない方がいいかも知れませんね。
--------------------------------------------------------------------------------------

答えは[E]です。
私はわかりませんが、わかりました?

ではプログラムです。

/******************************************************************
・本ソースファイル名はdtp100218.cです。
・本プログラムの著作権はyablinskyに属します。
・本プログラムで作ったファイルの著作権はwavファイルの作成者にあります。
・本プログラムのコピー・改変は自由です。
     ただし、改変されたプログラムは個人で楽しむ以外に使う場合、
     例えば、wavデータやそれを変換したデータをブログやホームページに
     アップロードする場合はソースコードも公開しなければならない。
                         2010/02/18
            http://desktop-piano.blog.so-net.ne.jp
         Copyright 2010 yablinsky All rights reserved.
                    Presented by yablinsky
*******************************************************************/
#include < stdio.h>
#include < math.h>
#include < stdlib.h>
#include < malloc.h>
#define Pi 3.14159265358979323846                // π
#define SAMPLING 44100                           // CD音質->44100

double sound_wave(double f,double t);
void wave_output(char **argv,int N,double *sound);
double max_sound(int N,double *sound);

void main(int argc,char *argv[]) {
  int i,N;
  double f,t0,t1,t,dt,*sound;

  if (argc!=2) {
    printf("dtp000000 output_data_file_name(*.wav)\n");
    exit(1);
  }
  f=440;
  t0=0;
  t1=1;
  N=(int)(SAMPLING*(t1-t0)+0.5);  // データ数
  sound=(double *)malloc((unsigned) (N+1)*sizeof(double));
  dt=1/(double)SAMPLING;
  for (i=0;i<=N;++i) {
    t=(double)i*dt;
    sound[i]=sound_wave(f,t); // 波形データの作成
  }
  wave_output(argv,N,sound);  // wavファイルの出力
  free((double*) sound);
}

// 発生する音の波形 f:周波数
double sound_wave(double f,double t) {
  return exp(-5*t)*sin(2*Pi*f*t);
}

// wavデータ形式でファイルに出力
void wave_output(char **argv,int N,double *sound) {
  int i,RIFFsize,fmtsize,sampling,bytepersec,datasize;
  short fmttag,chan,bitpersample,blockboundary,*data_y;
  double Ymax,b;
  FILE *fpo;
  // 波形データsound[]中から最大値(Ymax)を検出する
  Ymax=max_sound(N,sound);
  printf("Ymax=%e\n",Ymax);

  data_y=(short *)malloc((unsigned) 2*(N+1)*sizeof(short));
  printf("%s\n",argv[1]);
  fpo=fopen(argv[1],"wb");
  fprintf(fpo,"RIFF");
  fmtsize=16;
  chan=2;
  bitpersample=16;
  blockboundary=chan*bitpersample/8;
  datasize=(N+1)*(int)blockboundary;
  RIFFsize=7*4+fmtsize+datasize;
  fwrite(&RIFFsize,sizeof(int),(size_t)1,fpo);
  fprintf(fpo,"WAVEfmt ");
  fwrite(&fmtsize,sizeof(int),(size_t)1,fpo);
  fmttag=1;
  fwrite(&fmttag,sizeof(short int),(size_t)1,fpo);
  fwrite(&chan,sizeof(short int),(size_t)1,fpo);
  sampling=SAMPLING;
  fwrite(&sampling,sizeof(int),(size_t)1,fpo);
  bytepersec=sampling*bitpersample/8*chan;
  fwrite(&bytepersec,sizeof(int),(size_t)1,fpo);
  fwrite(&blockboundary,sizeof(short int),(size_t)1,fpo);
  fwrite(&bitpersample,sizeof(short int),(size_t)1,fpo);
  fprintf(fpo,"data");
  fwrite(&datasize,sizeof(int),(size_t)1,fpo);
  for (i=0;i<=N;++i) {
    b=sound[i]*32000./Ymax;
    data_y[2*i]=(short)b;
    data_y[2*i+1]=(short)b;
  }
  fwrite(data_y,sizeof(short),(size_t)((N+1)*chan),fpo);
  fclose(fpo);
  free((short*)data_y);
}

// 波形データ(sound[])の最大値(smax)を検出し、その値を帰す
double max_sound(int N,double *sound) {
  int i;
  double a,smax=0;
  for (i=0;i<=N;++i) {
    a=fabs(sound[i]);
    smax=(a >= smax) ? a : smax;
  }
  return smax;
}


2010-02-24 00:00  nice!(5)  コメント(21)  トラックバック(0) 
共通テーマ:音楽

nice! 5

コメント 21

江州石亭

面白い試みですねぇ^^
何となくEのように聞こえるのかなと思ってましたが、あてずっぽうで合っていました。
でも絶対音感なんて持ち合わせてませんからね。
by 江州石亭 (2010-02-24 00:45) 

nyankome

さすが理系です。
一応正解しました。(^_^)
両方同時に鳴らすと明らかなのでしょうけど、交互だとあまり差は感じられませんね。
by nyankome (2010-02-24 00:49) 

yablinsky

nyankomeさん、コメントありがとうございます。正解すごいですね。交互、特に減衰音にしていますから、難しくなっているのでしょうか。減衰しなければ、音と音と境目でわかるかもしれません。
by yablinsky (2010-02-24 08:05) 

yablinsky

江州石亭さん、コメントありがとうございます。あてずっぽうでもあっていたのはすごいですね。相対音感が大事で絶対音感は実はそれほど重要でないという専門家も多いですよね。
by yablinsky (2010-02-24 09:35) 

Cecilia

私はわかりませんでした。(苦笑)
江州さんもnyankomeさんもすごいです!
こういうことを記事にできるyablinskyさんもすごいです!
by Cecilia (2010-02-24 10:55) 

matcha

そんなん、頭イタなって、ナーンわからんわ~。
すみません。富山弁でした。
by matcha (2010-02-24 13:18) 

ワカタカタカコ

三毛猫の染色体もワカランのに。。。
by ワカタカタカコ (2010-02-24 17:35) 

Caelum

ぬぅ、全くわかりませんでした(;´д`)
こういうのはアレですね、弦楽器をやっている方
つまり、ご自身で調律される方は得意かもしれませぬ。

yablinskyさんはifの中カッコは文末に付ける派ですか('w`)
俺は改行派でございまする。

↓コレ派です
if(true)
{
return;
}
by Caelum (2010-02-24 21:20) 

Enrique

ついにプログラミングが登場しましたね。面白い実験です。
私も感覚では分からなかったので,規則的ではないかなと推測しました(どの選択肢も規則的ですが)。分かりにくいパターンだと思います。アタック音を聞くと分かりません。余韻の方を聞けば分かります。余韻でチューニングしている人は分かりやすいと思います。
by Enrique (2010-02-24 22:09) 

yablinsky

Ceciliaさん、ありがとうございます。この2Hzの違いですが、簡単に聞き分ける方法が見つかりましたので、また、27日の記事にしますので、是非、ご訪問ください。
by yablinsky (2010-02-24 23:24) 

optimist

全く分かりませんでした・・・^^;
というか、全部同じ音に聞こえる~
by optimist (2010-02-24 23:27) 

yablinsky

matchaさん、いつもコメントありがとうございます。変な音をお聞かせしてしまって本当に失礼しました。Ceciliaさんへの返事にも書きましたが、この2Hzは方法を変えれば私にも聞き分けられます!是非、次の記事も懲りずにお試しください。
by yablinsky (2010-02-24 23:27) 

yablinsky

崇子さん、コメントありがとうございます。三毛猫は人類の科学では雌しか存在しないそうですね。でも実際は雄がいて、しかも雄は天気予報ができるとか・・・三毛猫問題が遥かに難問です。
by yablinsky (2010-02-24 23:29) 

yablinsky

Caelumさん、大変でしたね。私は年がばれますが、四半世紀C言語とつきあっています。当初からマルチタスク、マルチモニタ(マルチウィンドでない)でした。古い人間はこの中括弧は揃えない人が多いと思います。若い方は中括弧を揃える方が多いように思いますが、Caelumさんの周りでもそうですか。しかしプロの方にプログラム見られると恥ずかしい・・・
by yablinsky (2010-02-24 23:35) 

yablinsky

Enriqueさん、コメントありがとうございます。アタック音があると人間の脳は別の処理をするのかもしれませんね。人間の脳とFFTは違いますが、FFTでも減衰音と、単なる正弦波では減衰音は変な周波数がたくさん出てくるでしょうから、人間の処理においても周波数を知るのは難しいのかもしれません。
by yablinsky (2010-02-24 23:40) 

yablinsky

Optimistさん、コメントありがとうございます。Optimistさんをまねて、私も科学実験です。いや音楽実験です。多分、次回記事の方法ではOptimistさんもこの2Hzが聞き分けられるとおもいます。
by yablinsky (2010-02-24 23:43) 

わかたかたかこ

こんにちは~♪

ガーシュウインの曲でオリンピックで金メダル2個、世界選手権でも1個。
素晴らしい。
フィギュア金メダル獲得に向け、選曲のもたらす意味、選手にノーミス演技を導く吸引力、誰か研究してくださいな。

ではまた
わかたかたかこ

by わかたかたかこ (2010-02-26 16:30) 

yablinsky

鷹子さん、コメントありがとうございます。ラフマニノフは負けちゃいましたね。私は悪い選曲でないと思いますよ。
by yablinsky (2010-02-26 23:22) 

クリボー

はじめまして。クラリネットとオーボエの波形、矩形波とパルス波の倍音の違いのこと調べてたら、たどりつきました。
いやー面白いですねー。古い記事にすみませんm(__)m。
分かりました!最後の3つの音が、高低高の順になっているのが分かって、それはEしかなかったので。で正解って分かったら、もうE以外考えられなくなっちゃいますね。先入観とはおそろしや~。もちろん違う周波数だって教えて頂いたから分かったわけで、絶対音感を持った人がこの違いを気にするようだと、平均律の調律はありえないような気がしました。素敵なブログですね。(^O^)/
by クリボー (2010-08-20 05:25) 

yablinsky

クリボーさん、ご訪問ありがとうございます。よく正解されましたね。連続音は比較的簡単ですが、減衰音の判別は難しいようです。理系的音楽道というカテゴリーでプログラミングをしてきましたが、残念ながら最近は時間がとれず開発がとまっています。また、ご訪問ください。
by yablinsky (2010-08-20 07:56) 

お~しゃん

440Hz で検索して、こちらにたどり着きました。

クイズやってみたら、わかりました!
低い高い低い高い低い高い低い高いと聞こえました。

吹奏楽部での担当楽器やウクレレのチューニングをしたりするからでしょうか。
正解できてうれしかったです。
by お~しゃん (2012-11-07 02:03) 

コメントを書く

お名前:
URL:
コメント:
画像認証: 下の画像に表示されている文字を入力してください。

 

このブログの更新情報が届きます

すでにブログをお持ちの方は[こちら]


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。