SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2018-10-16(Tue) メトロノームを立体化する

  先日、思ったとおりにメトロノームを完成することができた。で、実際、それを使って歌う練習をしてみると、普通にカラオケの伴奏に合わせて歌うより上手く歌えているような気がした。おそらく、伴奏がないぶん、自分の声がよく聴こえること、好きなキーで歌えること、リズム音が単純なのでリズムが取りやすいこと、などに起因する結果なのではないかと思う。

  逆に言えば、伴奏のキーを適切に変更するか、自分が伴奏にキーを合わせること、伴奏からキチンとリズムを聴き取ること、ができれば、より上手く歌えるということになるわけだ。なるほど。

  んが、またもや、性格的に意識をテクノロジカルな方向に向ける人であるところの自分は、TrueLegacyGraphicsシリーズを使いながら、サクッとそれの3D版が作れないことにイライラきてしまった。んなことにイライラきてないで、当初の目的である歌の練習をすべきなのはもっともなのだが、自宅で大声を出すわけにもいかず、意識がそっちに向いてしまったのだから仕方がない。

  基本、TrueLegacyGraphicsシリーズは、最初にrequireするライブラリを入れ替えるだけで、描画エンジンを「curses」「Tk」「GTK2」「cairo」「OpenGL」の5種から選べる仕様になっていて、それに応じた描画結果が得られるようになっている。実際、深さ方向の指定だけちょいと追加し「OpenGL」に入れ替えれば、即座にこのような結果が得られる。

  画像の説明

  んが、動かす、つまり、3Dアニメーションをさせるに当たって、考え込んでしまったのであった。いったい、どういう形で実装したらよいのだろうと。

  考えてみれば、LINE文を筆頭とした「イニシエのグラフィック描画関数」とは「画面上に描画をする関数」である。それでアニメーションを生成したい場合、画面の全クリアによる何もない状態に線などを描画して画像として保存、画面の全クリアによる何もない状態に「少しずらして」線などを描画して画像として保存……を繰り返し、最後に画像をアニメ化するわけだ。

  しかし、3Dアニメーションを生成する場合、フレーム毎に画面の全クリアによる何もない状態から始めるわけにはいかない。フレーム毎にすべての形状データをGPUに送り直していては重すぎるからだ。よって、最初に画面の全クリアによる何もない状態に形状を配置したら、以降はフレーム毎に「一部の形状のみ消去してから」少しずらして形状を配置して……を繰り返す必要が生じる。実はこの「消去」という概念が「イニシエの描画関数」には存在しないために、実装に当たって途方に暮れてしまったわけだ。

  が、ここで思いついた。一部のマシンの「イニシエの描画関数」には「形状を動かす」という概念を持ったものがあったのだ。それは何か。それは「スプライト」である。描画の際、必ず過去の自分の消去が伴い、他の「イニシエの描画関数」の描画とも干渉しない。そうなのだ、スプライトという概念を導入すればいいのだ。メトロノームの場合、本体の多角形はこれまで通りに描画、動く腕の部分だけスプライトでの描画、という扱いにすればいいのだ。

  と、これを思いつくのには時間が要ったが、その実装に当たっても、相当に頭をヒネることになった。既に各種形状を描画する関数は書いてあるので、同じような処理は絶対に書きたくない……が、結局はうまくいった。クラスの内部構造のみ、関数の分割位置を変えただけで、ほぼ完璧に必要最小限の差分だけコードを書く形で実装できた。我ながら興奮に値するdiffが仕上がって、脳内麻薬が出たわ。

  後は「表示内容を画像として保存する」関数を実装し、コールバック関数からフレーム毎に呼んでやり、テンポ120で1600秒分のpng画像をレンダリング、cuickdtmで生成した1600秒分のwav音声をくっつけて、ffmpegでPSPで再生可能なmp4ビデオ形式に変換する。

  こんな感じに仕上がった。悪くない。パッケージを置いておく。

 

  スプライトを実装したことで、ちょっとしたゲームも作れるプラットフォームになり、そのプレイを録画することもできる。我ながら、よく手に馴染むライブラリができ上がり、とても気分がいい。

  ……しかし、やりたくなったからやっちゃったが、元はといえば、メトロノームを作ったのは、ボーカルの練習の際のリズムをなんとかするためだったワケで、こんなことで気分をよくしているのは目的外なのであった。

  とはいえ、練習もしていて、着実に進捗している。例えば腹式呼吸ならば、腹式呼吸を必要以上に意識した練習を繰り返すと、いつの間にか無意識に行うクセがついてくる。すると、意識を他に向けられるようになるので、鼻腔共鳴や、課題曲中の修正すべき歌唱を意識した練習ができるようになり、それもいつの間にか無意識に行えるようになってくる。

  そうなると、サビに思い切った声を張り上げつつも、伴奏からリズムを聴き取ることに意識を向けられるようになって、いつしかリズムも多少は改善してきたのであった。

  というわけで、先に「ボーカルはスポーツに近く、ボイストレーニングとは『発声器官』を鍛えることだ」と書いたが、さらに「歌うという運動を繰り返すことで、小脳に学習を促す、つまり反復練習が効果的」という面でも、やっぱりボーカルはスポーツなんだなぁ、と気がついた次第である。