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+1 と fi+1 の比を
fi+1/fi= 2^(1/12)
としています。公比が 21/12 の等比数列ですね。蛇足ですが、1オクターブ(ドレミファソラシド)には8個しか音がないのに12分割なのは、もちろん、ド#とかファ# (鍵盤だと黒鍵)があるからです。
平均律で、ドレミファソラシドと周波数の対応を整理すると、
| 音 | ド(C4) | レ | ミ | ファ | ソ | ラ(A4) | シ | ド(C5) |
| 周波数 Hz | 261.63 | 293.66 | 329.63 | 349.23 | 392.00 | 440.00 | 493.88 | 523.25 |
という感じになります。
▼ サンプリングレート
周波数と同様に大切なのはサンプリングレートです。サンプリングレートは一定時間にどれだけのデータポイントが存在するかという情報で、これも Hz の単位をもちます。次の図はその模式図になっていて、いずれの波形も同じ周波数の1周期の波形ですが、サンプリングレートが異なっています。すべてマーカープロットですが1番下はほぼ滑らかにつながったカーブに見えます。これをベースに、1つ上はサンプリングレートを 1/4 に落としたもの、2つ上はサンプリングレートを 1/8 に落としたもの、一番上はサンプリングレートが1/12に落としたものです。どんどんプロットがスカスカしてきます。

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

サンプリングレートが高ければ高いほど、オリジナルの音=波形を精度良く再現できますので、良い音質になりますが、データポイント数が増えますので、データサイズは大きくなってしまいます。ちなみに、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 操作関数で音を鳴らしてみました。ちょっと頑張るとこんなこと(音が鳴ります)もできますよー。
--
井上@技術部でした。



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