2015年8月15日土曜日

ソフトシンセの作り方(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鍵ピアノの音程周波数を求めて標準出力に表示するコンソールプログラムを作成してみます。
/* 88鍵ピアノの音階周波数 & サンプリング周波数1Hzあたりのラジアン増分を求めて表示 */
#include <stdio.h>
#define S 44100.00
#define B 1.0594631
#define PI 3.1415926535897932
#define PI2 6.2831853071795864
int main(int argc,char* argv[])
{
const char* t[12]={
"A "
,"A#"
,"B "
,"C "
,"C#"
,"D "
,"D#"
,"E "
,"F "
,"F#"
,"G "
,"G#"
};
double hz[88];
int n=0;
double a=13.75;
double b;
for(n=0;n<88;n++) {
if(n%12==0) {
a*=2.0;
hz[n]=a;
} else {
hz[n] = hz[n-1] * B;
}
b=PI2/(S/hz[n]);
printf("%s : %9.4fHz : %.4f rad/1Hz\n",t[n%12],hz[n],b);
}
return 0;
}
view raw piano.c hosted with ❤ by GitHub

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

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

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