音階練習を楽しくする 〜 49トーンで踊ります

ニュートンのカラーサークルを参考に、L*a*b空間上、L=30, 40, 60, 80, 99の平面に円を描いて12音を決定し、それぞれA2からA6までを表現しています。それから、今回の色の決定はCmaj/a-です。

また、トーンが飛ぶ高さは、音のスペクトル密度で、水色の波はAutoCorrelationで描いています。

ピッチの計測は、AutoCorrelationの波の一番高いピークの音を拾って行えます。

スペクトル密度はノイズが大きいので、それほど正確ではありませんが、ピーク以外の音の動きが見えるので面白くて使いました。

技術的には、AutoCorrelationへの副作用を排除するため、Windowingを使用していません。また、AutoCorrelationをWiener–Khinchin theoremで求める過程で得られるスペクトル密度を活用しています。スペクトル密度、AutoCorrelation共に1024サンプルに対し、0パディングを行い、4096のフーリエ変換で一回の計測をしています。さらにそれらの8個の平均からグラフを描画しています。

Texture AtlasiPhoneで行いたい場合、連続していないTextureのquadをどうやってGL_TRIANGL_STRIPで描画するんだという問題がありました。みなさんいろいろやっているようですが、一番いい方法がGLTextureAtlasというiPhoneのサンプルプロジェクトにあります。

// build the index array
for (i = 0; i < NUM_IMPOSTERS; i++)
{
// the first and last additional indices are added to create degenerated triangles
// between consistent quads. for example, we use the compact index array 0123*34*4567
// to draw quad 0123 and 4567 using one draw call
indices_all[i*6] = i*4;
for (j=0; j<4; j++)
indices_all[i*6+j+1] = i*4+j;
indices_all[i*6+5] = i*4+3;
}

0123と4567という四角形があった場合で、これらが隣接していない場合、233/334/344というダミーの三角形を間に挟む事で、隣接していなくてもSTRIPが機能するようにしています。このように生成したインデックスを用いて、

glDrawElements(GL_TRIANGLE_STRIP, NUM_IMPOSTERS*6, GL_UNSIGNED_SHORT, indices_all);


一発で描画できます。