VGSのソフトシンセ(波形メモリ音源)の開発で得られた知見を元に、PCやスマートフォンで動くソフトシンセの作り方を解説していきます。一冊の本が書ける程度の分量なので、幾つかのパートに区切って解説していきます。このシリーズを一通り読めば、サウンドプログラミングについて全くの素人でも、PCやスマホなどのプラットフォームで動くオリジナルのソフトシンセが作れる程度になります(たぶん)
なお、このシリーズで扱うプログラミングの例題のビルドには、パソコンが必要です。OSは私が使っているMac OS X向けに解説を記述しますが、Linux(※ALSAに対応しているもの)やWindowsでも問題ありません。
当面は、基礎編ということで、音についての基本的なことについて書きます。
今回は前回の音程の解説の続きで12平均律について。
12平均律
一般的に、音楽では 12平均律 という音階が用いられます。
これは、1オクターブを12分割したものです。
他にも色々な種類の音階があるようですが、昨今では12平均律の楽譜ぐらいしか見る機会がないので、12平均律 = デファクトスタンダート という解釈で問題無いでしょう。
音程周波数を2倍にすると1オクターブ上の音程になるので、音程周波数を約1.0594631倍にすれば、だいたい半音上 になることになります。
時間の基数 としてよく用いられる 12進法 と、基数全般として用いられる 10進法 が混在している関係(※10は12で割り切れ無い関係)なので、物凄い端数になってしまっています。
割り切れ無いからこそ面白いのかもしれません。 だから、結果的に12平均律がデファクトスタンダートになったのかもと考えると、少し楽しい気分になります。
88鍵ピアノの音程周波数を求める
ここまでの仕組みが理解できれば、楽器の中でも最も幅広い音階を持っているピアノ(88鍵)の音程周波数を求めることができます。そこで、88鍵ピアノの音程周波数を求めて標準出力に表示するコンソールプログラムを作成してみます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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; | |
} |
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。