2015年8月15日土曜日

ソフトシンセの作り方(3) - 音の強弱

VGSのソフトシンセ(波形メモリ音源)の開発で得られた知見を元に、PCやスマートフォンで動くソフトシンセの作り方を解説していきます。一冊の本が書ける程度の分量なので、幾つかのパートに区切って解説していきます。このシリーズを一通り読めば、サウンドプログラミングについて全くの素人でも、PCやスマホなどのプラットフォームで動くオリジナルのソフトシンセが作れる程度になります(たぶん)

なお、このシリーズで扱うプログラミングの例題のビルドには、パソコンが必要です。OSは私が使っているMac OS X向けに解説を記述しますが、Linux(※ALSAに対応しているもの)やWindowsでも問題ありません。

当面は、基礎編ということで、音についての基本的なことについて書きます。
今回は音の強弱について。

【基礎編2】音の強弱

人間が知覚する音の大小

音には「強弱」という概念がありますが、これは 音波の大きさ により決まります。
ビットレートが16bit PCMの場合、音波の振幅値は -32768 32767 で、単位時間あたりの振幅値の絶対値を平均化したものの大小 が、人間が知覚する音の大小となります。

ベロシティ

音の強弱というと、ベロシティのことをイメージされた方が多いかもしれません。
ベロシティとは、例えば、ピアノの鍵盤を弱く押すと小さな音が鳴り、強く叩くと大きな音が鳴ることです。
もちろん、ベロシティは音楽表現をする上で重要な要素です。
しかし、必須な要素ではありません。
ピアノとは、楽譜記号で弱く演奏することを意味しますが、ピアノという名前の由縁は、その名の通り「弱く弾くこともできるよ」ということです。ピアノ以前に主流だったハープシコードやオルガンでは、音に強弱を付けることができません。
ハープシコードやオルガンなどの強弱がつけられない楽器でも、当然ながら音楽表現は不可能ではありません。
例えば、筆者が敬愛するJ.S.Bachの時代にはピアノが無かったため、Klavia(鍵盤楽器)で演奏する楽曲は、概ねハープシコードかオルガンで演奏することを想定しています。しかし、その時代であっても、平均律クラヴィーア曲集、6つのパルティータ、フーガの技法など、素晴らしい楽曲が多く存在します。
要するに何が言いたいのかというと、音の強弱表現というのは、あった方が当然良いけど無くても問題ないもの だと言うことができるということです。
しかし、音の強弱で考慮すべき点に、時間の経過による音の強弱の変化(エンベロープ) というものがあります。ソフトウェアシンセサイザーを実装する上で、ベロシティについては最悪余力があれば実装した方が良い程度のものです。
しかし、エンベロープは必ず実装しなければならないもの です。

エンベロープ

エンベロープ(包絡線)とは、先述の通り 時間の経過による音の強弱の変化 のことです。 楽器の音の大きさは、時間の経過により必ず変化します。 これは、オルガンなどの強弱表現ができない楽器にも存在するものです。

(1) AT; Attack Time

例えば、オルガンの鍵盤を押した時、押した瞬間に音が最も大きくなる訳ではなく、一定の時間をかけて最大音量になります。この、鍵盤を押してから最大音量に達するまでの時間のことをアタックタイム(AT; Attack Time)と呼びます。

(2) RT; Release Time

そして、鍵盤を離すと一瞬で消音状態にはならず、一定の時間をかけて無音になります。この、鍵盤を離してから無音になるまでの時間のことをリリースタイム(RT; Release Time)と呼びます。

(3)その他

RT AT 以外にも音と時間に関係する用語あるので、紹介しておきます
  • ST; Sustain Time (維持時間)
    • ATで最高点に達した後 から RTに入るまでの間に音量を維持する期間
    • 一般的に弦楽器(ピアノやハープシコードなど)はSTで維持する音量が無音
    • 一般的に管楽器(オルガンやトランペットなど)はSTで維持する音量が無音ではない
  • DT; Decay Time(減衰時間)
    • ATで最高点に達した後からSTになるまでの時間

(4)エンベロープの全体像

エンベロープの全体像を図示すると、下図のようになります。
エンベロープのイメージ

(5)まとめ

音のライフサイクルを端的に表すと次のようになります。
無音  key-on  AT  DT  ST  key-off  RT  無音
  • key-on: 音を鳴らす指示(鍵盤を押す)
  • key-off: 音を停止する指示(鍵盤を離す)
そして、これらをまとめて エンベロープ と呼びます。
エンベロープ(包絡線)とは、 時間の経過による音の強弱の変化 のことと先述しましたが、音のライフサイクル と言い換えた方が分かり易いかもしれません。

(6)重要なのはAT, RT

エンベロープの内、特に重要なのが AT  RT です。
DT  ST については、最悪実装しなくても 楽器 になります。
実際、VGSの波形メモリ音源でも DT  ST は実装していません。 しかし、AT  RT については、実装しなければ楽器とは呼べないお粗末なものになってしまうため、実装が必須なため、VGSの波形メモリ音源でも実装しています。

なお、本ブログで取り扱うPSG音源については、ATDTSTRT 全てを実装することにします。そのため、本書の内容をマスターすれば、VGSよりも優秀なチップチューン・ソフトウェアシンセサイザーを開発することができるかもしれません。

ソフトシンセの作り方(2) - 12平均律

VGSのソフトシンセ(波形メモリ音源)の開発で得られた知見を元に、PCやスマートフォンで動くソフトシンセの作り方を解説していきます。一冊の本が書ける程度の分量なので、幾つかのパートに区切って解説していきます。このシリーズを一通り読めば、サウンドプログラミングについて全くの素人でも、PCやスマホなどのプラットフォームで動くオリジナルのソフトシンセが作れる程度になります(たぶん)


なお、このシリーズで扱うプログラミングの例題のビルドには、パソコンが必要です。OSは私が使っているMac OS X向けに解説を記述しますが、Linux(※ALSAに対応しているもの)やWindowsでも問題ありません。

当面は、基礎編ということで、音についての基本的なことについて書きます。
今回は前回の音程の解説の続きで12平均律について。

12平均律

一般的に、音楽では 12平均律 という音階が用いられます。
これは、1オクターブを12分割したものです。
他にも色々な種類の音階があるようですが、昨今では12平均律の楽譜ぐらいしか見る機会がないので、12平均律 = デファクトスタンダート という解釈で問題無いでしょう。
音程周波数を2倍にすると1オクターブ上の音程になるので、音程周波数を約1.0594631倍にすれば、だいたい半音上 になることになります。
時間の基数 としてよく用いられる 12進法 と、基数全般として用いられる 10進法 が混在している関係(1012で割り切れ無い関係)なので、物凄い端数になってしまっています。
割り切れ無いからこそ面白いのかもしれません。 だから、結果的に12平均律がデファクトスタンダートになったのかもと考えると、少し楽しい気分になります。

88鍵ピアノの音程周波数を求める

ここまでの仕組みが理解できれば、楽器の中でも最も幅広い音階を持っているピアノ(88鍵)の音程周波数を求めることができます。そこで、88鍵ピアノの音程周波数を求めて標準出力に表示するコンソールプログラムを作成してみます。

ソフトシンセの作り方(1) - 音程の性質

VGSのソフトシンセ(波形メモリ音源)の開発で得られた知見を元に、PCやスマートフォンで動くソフトシンセの作り方を解説していきます。一冊の本が書ける程度の分量なので、幾つかのパートに区切って解説していきます。このシリーズを一通り読めば、サウンドプログラミングについて全くの素人でも、PCやスマホなどのプラットフォームで動くオリジナルのソフトシンセが作れる程度になります(たぶん)

なお、このシリーズで扱うプログラミングの例題のビルドには、パソコンが必要です。OSは私が使っているMac OS X向けに解説を記述しますが、Linux(※ALSAに対応しているもの)やWindowsでも問題ありません。

当面は、基礎編ということで、音についての基本的なことについて書きます。
今回は音程の性質について。

【基礎編1】音程の性質

音には「高さ」という概念があります。 音の高さ(音程)は 音波が1秒間に何周期(何Hz)繰り返されるか で決まります。 1秒間に音波を繰り返す周期のことを 音程周波数 と呼びます。

音程周波数の性質

音程周波数と音程の関係は、次のようになっています。
  • 1秒間に440回繰り返す(440Hz) :
  • 1秒間に880回繰り返す(880Hz) : 1オクターブ上のラ
つまり、音程周波数には 2倍にすると1オクターブ上(1/2倍にすると1オクターブ下)の音程になる という性質があります。
ここで、周波数を表す Hz(ヘルツ = 繰り返す回数を表す単位)が出てきましたが、コンピュータに詳しい方の場合、サンプリング周波数のHz  音程周波数のHz を混同しがちなので、注意しましょう。サンプリング周波数 音程周波数 の間には密接な関係があるので、若干ややこしいです。 

サンプリング周波数

サンプリング周波数とは、1秒間に何回の量子化を行うか を表すものです。

量子化

音の正体は波(音波)ですが、現実世界の波(アナログ波) の全ての音を コンピュータの世界(デジタル波) で表現することは不可能です。そのため、コンピュータの世界の波(デジタル波)は、単位時間(1秒)を幾らかの値で区切り、その区切られた単位時間毎の波の位置をデータとして持ちます。
これを量子化と呼びます。
そして、この量子化の粒度が細かいほど、現実の音(アナログ波)に近くなります。 例えば、VGSの音声のサンプリング周波数は22050Hzですが、CD44100Hzなので、VGSの音声よりもCDの音声の方が、より現実の音に近いと言えます。
しかし、粒度が細かいほど、コンピュータが処理するデータ量が増え、データ消費量が増えると端末の電池消費量の増加や、発熱がし易くなるなどのデメリットが生じます。

量子化粒度と「音の良さ」の関係

現実世界に近い音の方が良い音かというと、これも必ずしも Yes ではありません。
実際、VGSの音声処理を改造して、サンプリング周波数を44100Hzにする改造(ハイレゾ化)をする実験を試みたことがあるのですが、それにより音が良くなったとは感じられない結果になりました。
また、東方BGM on VGSのレビューでも「音質が良い」という評価を頂くことがしばしばあります。仮に量子化の粒度と「音の良さ」の間に相関関係があったとすると、そのような評価が得られることは無い筈です。
圧縮技術の進化により、普段聴いているであろうmp3の音楽や動画の音声(aac)のサンプリング周波数は、44100Hzかそれ以上が一般的です。そのため、殆どの人は44100Hz(以上)のサンプリング周波数を基準にして「音の良さ」を判断している筈なので。
つまり、量子化の粒度というのは、グラフィックスの画素数 と同様かもしれません。例えば、画素数が荒いドット絵のゲームを、Retinaの画質に合わせた綺麗なハイレゾグラフィックにしてみると、「雰囲気が失われた」と不評を買うことがあります。
量子化の粒度についても、それと同じことが言えるのではないでしょうか。
また、ほとんどのデジタル音声が44100Hzのため、22050Hzの東方BGM on VGSの荒い音声が逆に新鮮に感じたのかもしれません。もちろん、ドット絵よりもハイレゾグラフィックが好きな人が居るのと同様、VGSよりもハイレゾな現実に近い音を好きな人も居る筈です。

サンプリング周波数と音程周波数の関係

サンプリング周波数 音程周波数 は、異なる概念です。しかし、プログラムで目的の音程周波数を求めようとすると、どうしても必要になるから少し厄介なのです。 サンプリング周波数と音程周波数の関係を手っ取り早く理解するには、実際にプログラムを書いてみるのが一番楽かと思います。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...