(* piano-cutoff.nb --- ピアノの和音ド・ミ・ソ で遊ぶ *)

(* ネットから直接 WAVE ファイルを読む *)

snd=Import["http://nalab.mind.meiji.ac.jp/~mk/fourier/piano-do-mi-so.wav","Sound"]

{left,right}=snd[[1,1]];

sr=snd[[1,2]]

(* データの切り出し用関数 *)

(* t1秒後からt2秒まで *)

take[tbl_,t1_,t2_]:=Take[tbl,{Floor[t1*sr],Floor[t2*sr]}]

(* t秒後から1秒間 *)

take1[tbl_,t_]:=Take[tbl,{Floor[t*sr],Floor[t*sr]+sr-1}]

(* 1秒後から1秒分の標本化データを x として、プロットする *)

g=ListPlot[x=take1[left,1.0],PlotRange->All]

(* サンプリング周波数を変えながら再生 *)

ListPlay[x]

ListPlay[x,SampleRate->sr]

ListPlay[x,SampleRate->sr/2]

ListPlay[x,SampleRate->sr*2]

ListPlay[x,SampleRate->Floor[sr*1.5]]

(* x を離散Fourier変換して c とする *)

c=Fourier[x,FourierParameters->{-1,-1}];

g=ListPlot[Abs[c],Joined->True,PlotRange->All]

(* f Hz 以上をカットするための準備 *)

cutoff[f_]:=Join[Table[1,{n,f+1}],Table[0,{n,sr-2*f-1}],Table[1,{n,f}]];

(* ドミソの基本周波数は？ *)

440.0*2^(-{9,5,2}/12)

(* 500Hz 以上をカットする *)

c2=c*cutoff[500];

g3=ListPlot[Abs[c2],Joined->True,PlotRange->All]

Export["do-mi-so-cutoff500.png",g3]

x2=Re[InverseFourier[c2,FourierParameters->{-1,-1}]];

ListPlay[x2,SampleRate->sr]

(* 300 Hz 以上をカット, ドだけ残る *)

do=Re[InverseFourier[c*cutoff[300],FourierParameters->{-1,-1}]];

(* 360 Hz以上をカット, ミは入る *)

domi=Re[InverseFourier[c*cutoff[360],FourierParameters->{-1,-1}]];

(* 450 Hz 以上をカット、ド・ミ・ソの基本周波数成分は残る *)

domiso=Re[InverseFourier[c*cutoff[450],FourierParameters->{-1,-1}]];

(* 900 Hz 以上をカット、2倍音まで残る *)

domiso2=Re[InverseFourier[c*cutoff[900],FourierParameters->{-1,-1}]];

(* 元の音 *)

original=Re[InverseFourier[c,FourierParameters->{-1,-1}]];

(* 順番に聞いてみよう *)

ListPlay[do,SampleRate->sr]

ListPlay[domi,SampleRate->sr]

ListPlay[domiso,SampleRate->sr]

ListPlay[domiso2,SampleRate->sr]

ListPlay[original,SampleRate->sr]