* 本記事はコマンドに関する記載が多くなっています。あらかじめご了承ください。

IGOR Pro は音を鳴らすことができます。これは新機能ではなくて、ずっと昔から搭載されている機能です。今回はこの機能にフォーカスしてみます。

▼ 音の高さと周波数

言わずと知れたことですが、音は「波」です。例えば、Sin 関数を使えばこんな風に表現できますね。

y = A sin(2π×f×t)
  • A:波の振幅。音の大きさ(ボリューム)に対応します。
  • f:周波数。音の高さに対応す。
  • t:時刻

周波数によって音の高低が変わります。周波数が大きいと高い音、小さいと低い音、ですね。周波数と音の対応は、ラ(A4)*1 = 440Hz を基準に行います。どのくらい周波数が大きくなると、どのくらい音が高くなるのかというと、ちょうど周波数が2倍になると、1オクターブ上の音になります。例えば、1オクターブ低いラ(A3) の音は半分の周波数 220Hz となり、1オクターブ高いラ(A5) の音は倍の周波数 880Hz となります。

この基準となる周波数から1オクターブの間にどのように音を並べるのか(=音律)については、実はいろいろありますが、ここでは単純な「十二平均律」とよばれる音律で考えます。この十二平均律では、隣り合う音の周波数 fi+1fi+1 の比を

fi+1/fi= 2^(1/12)

としています。公比が 21/12 の等比数列ですね。蛇足ですが、1オクターブ(ドレミファソラシド)には8個しか音がないのに12分割なのは、もちろん、ド#とかファ# (鍵盤だと黒鍵)があるからです。

平均律で、ドレミファソラシドと周波数の対応を整理すると、

ド(C4)ファラ(A4)ド(C5)
周波数 Hz261.63293.66329.63349.23392.00440.00493.88523.25

という感じになります。

▼ サンプリングレート

周波数と同様に大切なのはサンプリングレートです。サンプリングレートは一定時間にどれだけのデータポイントが存在するかという情報で、これも Hz の単位をもちます。次の図はその模式図になっていて、いずれの波形も同じ周波数の1周期の波形ですが、サンプリングレートが異なっています。すべてマーカープロットですが1番下はほぼ滑らかにつながったカーブに見えます。これをベースに、1つ上はサンプリングレートを 1/4 に落としたもの、2つ上はサンプリングレートを 1/8 に落としたもの、一番上はサンプリングレートが1/12に落としたものです。どんどんプロットがスカスカしてきます。

1.png

マーカーを滑らかに結べば、元の(1番下)と同じカーブ、すなわち同じ音がしそうですが、デジタルな世界では、次の図のようにカクカクと結ばれてしまうので、元のカーブとは異なり、何か違う音、ノイズの混じったような音になってしまいます。

2.png

サンプリングレートが高ければ高いほど、オリジナルの音=波形を精度良く再現できますので、良い音質になりますが、データポイント数が増えますので、データサイズは大きくなってしまいます。ちなみに、CD では 44,100 Hz が標準的なサンプリングレートとされています。IGOR Pro で指定できるサンプリングレートについてはこちらをご覧ください。

▼ さぁやってみよう

最初に出てきた Sin 関数で表現されるような単純な波形を使って、IGOR Pro で音を鳴らしてみましょう。IGOR Pro で音のウェーブを作成するには、例えば、次のように操作します。

Make/W/O/N=10000 sss		// 16 bit 整数のウェーブを作成
SetScale/P x,0,1e-04,sss	// サンプリングレートを 10 kHz に設定
sss = 10000*sin(2*Pi*440*x)	// ラ(A4)を作成。

登場する操作関数は Make と SetScale だけで、真新しいものではありません。Make 操作関数で 16 bit 整数(/W) で 10,000 ポイントのウェーブを作成します。16 bit 整数なのは、この後登場する音を鳴らす操作関数の制約です。最大のポイントは、サンプリングレートを X スケーリングで設定するところ。サンプリングレートが 10 kHz ということはデータポイントは 1/10,000 秒間隔ですので、SetScale ではポイント間隔を 1e-04 と指定しています。作成したウェーブのポイント数は 10,000 ポイントですので、ちょうど1秒音がするはずです。最後に、Sin 関数で 440 Hz のラ(A4)の音を作成します。音の強さは 10000 くらいにしないと手元の環境では聞こえませんでしたが、環境や設定によっては大きな音がするかもしれませんので要注意。

肝心要の音を鳴らす操作関数は PlaySound です。

PlaySound sss

どうでしょう、一秒間「ラ~」って聞こえましたか?

うまく「ラ~」って聞こえたら、次に、ド(C4)レミファソラシド(C5) の1オクターブの音をそれぞれウェーブで作成します。上記の周波数を使って1個ずつ作ってもOKですが、ここではこんな関数(MakeSoundWave)を作ってやってみます。

Function MakeSoundWave(f)
Wave f
Variable n,i

n = numpnts(f)

For(i=0;i<n;i+=1)	
	Make/W/O/N=10000 $("sss"+num2str(i))
	Wave w = $("sss"+num2str(i))
	SetScale/P x,0,1e-04,w
	w =10000*sin(2*Pi*f[i]*x)
EndFor

End

周波数を並べたウェーブを引数 f として渡すと、sss+数字 というウェーブ名で1秒鳴る音のウェーブを作成する関数です。利用するには、

Make/O/N=8 note_freq={261.63,293.66,329.63,349.23,392,440,493.88,523.25}
MakeSoundWave(note_freq)

とします。エラーなく作成できたらあとは演奏(?)するだけ。

PlaySound sss0
PlaySound sss1
PlaySound sss2
PlaySound sss3
PlaySound sss4
PlaySound sss5
PlaySound sss6
PlaySound sss7

全部同じ長さで間の抜けた感じですが、ドレミファソラシド、って聞こえましたか?

▼ 音色

もう一つ音の大事な要素は音色です。この例では、波の形はすべて Sin 関数で与えましたが、単純な波形では、単純な音色しか表現できません。いろんな波を重ねあわせた複雑な波形を使うと、独自の音色を作り出すことができるはず。

しかしながら、不勉強で、音色に関しては詳しくありません。調べてみて、またお伝えできるネタがあるようであれば、またここで紹介しようと思います。

▼ まとめ

IGOR Pro の PlaySound 操作関数で音を鳴らしてみました。ちょっと頑張るとこんなこと(音が鳴ります)もできますよー。

--
井上@技術部でした。

*1 A4 の 4 は、ピアノでいう真ん中のドから始まるオクターブを意味しています。

※この記事の内容は執筆者の個人的見解で、ヒューリンクスによる公式情報ではありません。[免責事項]

トラックバック

この記事へのトラックバックURL
http://blog.hulinks.co.jp/cgi/mt/mt-tb.cgi/488
内容に対しての関連性がみられないものは削除する場合があります

コメントの投稿

Emailアドレスは表示されません。は必須項目です。
ヒューリンクス取り扱い製品の内容や購入に関するお問い合わせはヒューリンクスサイト連絡先へお願いいたします。投稿前にその他の注意事項もご覧ください。

HULINKS サイトの新着情報