こんにちはマイコン制御

May FORTH be with you.

C言語の基本とかお手軽CGとか

ヘッダファイルを作ってみる

LPC1114用のPwmOut向けシンセライブラリをボチボチ書き直し始めているんですが、色々と課題が。
まずはC3とかA4#とかで音程を指定できるようにヘッダファイルを書いてみて、すんなりOKでしたが、そこから先が結構未知の領域で本とかwebとかで情報を探しながら手探りでやってみてました。
ヘッダファイルにstaticの変数書いちゃいけないとか知らなかった。よく検定受かったな。

Head First C ―頭とからだで覚えるCの基本

Head First C ―頭とからだで覚えるCの基本

d.hatena.ne.jp

音程の周波数定義の他、オシレーターとか音の合成とかをヘッダファイルにして問題なく動くことは確認できました。
PCMを扱う箇所はグローバル関数が関係していたりするので、とりあえずメインファイルの中に保留。
そのうえでオシレーターと合成を書き換えて、2DCOにしてみたところ怪しいところはあるけれど、取り敢えずは動きました。こういう怪しい挙動の検証のためにもデバッガが欲しくなってきます。mbedのweb環境は手軽で良いんですがデバッグ関連はまだちょっと弱い。オフラインのIDE環境に軍配があがります。
mbed LPC1114FNのmbedファイルをエクスポートできる開発環境は以下の通り。

  • Keli μVersion4
  • LPCXpresso
  • GCC
  • IAR systems
  • Em::Blocks

このプロジェクトについてはLPCXpresso一択でしょうねえ。mX-LPC1114-S買えばデバッグ環境が入手できます。akizukidenshi.com
今は勉強がてら遊ぶので非力なLPC1114FNが良い感じなのですが、本気で音質とか考えるならばDACが3つあるSTM32F334R8T6がいいのかも知れないです。

取り敢えずデバッガは置いておいて、スタック構造を持つサウンドエンジンにするための変更を書いていたところ、音が鳴らなくなりました。
恐らく、TickerクラスとPwmOutクラスがタイマーの扱いでバッティングしていると思うのですが、どうすれば良いかは現時点では考えるための材料が全く無い状態。多分ずっと懸案にしていたライブラリを使わない直叩きをしないといけないと思われるのでまずは資料を漁り基本を知らないと。
直叩きの簡単な例が出ていたMonolistの記事を見に行ったところ、最終回を迎えていました。お疲れ様でした。初心者にとって非常に為になる連載でした。monoist.atmarkit.co.jp
まだやっていなかった連載分の例を軽く写経してノートにメモをとり、さて次はトラ技の記事読むかというところで一息ついたら、ちょっと集中力が途切れてしまったので、お茶をしたあとStructure Synthで遊ぶことにしました。

お手軽CGを作ってみる

structuresynth.sourceforge.net
Structure Synthは随分前に存在を知って、ちょっと触ったっきりになっていたのです。スクリプトは文脈自由文法でとても簡単。ただ、最新版ではJavascriptが統合されていて、色々自動化できるようになっています。それでアニメーションとか作れるようになっていて、それで興味を持って触ってみたけれど案の定よく判らなくてほったらかしにしていたと言う。
ただ、今回図書館に行った時に別の本を借りて、その流れでなんとなく借りた簡単解説本を改めて読んでみたら、アニメーション作るのもものすごく簡単でした。もしかしたら自分のこの手の事に関する理解力が上がったからかも知れない。

かたち: 自然が創り出す美しいパターン

かたち: 自然が創り出す美しいパターン

Structure Synthで描く3D‐CGアート (I・O BOOKS)

Structure Synthで描く3D‐CGアート (I・O BOOKS)

取り敢えず試作のスクリプト(ファイル名が"ss_test02.es")

set translation [-0.133891 -2.76372e-07 -20]
set rotation [-0.694201 -0.700668 -0.164788 -0.499769 0.633962 -0.59019 0.517996 -0.327355 -0.790268]
set pivot [0 0 0]
set scale 1.46838
set background #ddd
set colorpool grayscale
set seed 70
set raytracer::light [5,5,10]
set raytracer::shadows true
set raytracer::samples 10
set raytracer::dof [0.5 / 0.8]
set raytracer::size [800 x 600]
set raytracer::reflection 0.25
#define pos 0 (float:0-60)
{color #D33 a 0.3} box
{x 1 s 0.3 0.3 2  color random} box
{x -1 s 0.3 0.3 2 color random} box
{y 1 s 0.3  2 0.3 color random} box
{y -1 s 0.3 2 0.3 color random} box
{z 1 s 2 0.3 0.3 color random} box
{z -1 s 2 0.3 0.3 color random} box
rule circle  md 4{
	12 * {rz pos} 1 * {x 2 s 0.5 color random} circle
	 box }
circle

アニメーション用のスクリプト("ss_test02.es"と同じフォルダに入れておく)

#javascript
function ss(number) {
	while (number.length < 4) {
	number = "0" + number ;
	}
	return number;
}
Builder.load("ss_test02.es");
max = 30;
for (i = 0; i <= max; i+=1){
	Builder.reset();
	Builder.setSize(0,500);
	Builder.define("pos",i);
	Builder.build();
	Builder.raytraceToFile("N" + ss(i+1) + ".png",true);
}

こうしておいてアニメ用スクリプトファイルを実行する(操作としてはビルドボタンを押す)と、スクリプトの入れてあるフォルダに連番のpngファイルが保存されます。
要は、元のスクリプトで#defineで変数を定義しておいて、アニメ用のファイルでその変数を変えながらレンダリングしていくという段取り。
Structure Synthのレイトレーシングはあまり綺麗でないと言われてますが、スピードとか考えたら中々綺麗ではないでしょうか。
f:id:SenjiNiban:20150921211006p:plain

あとはまとめて動画にすれば完成。自分はlinuxでだとopenshot愛用してます。
ちょっとエンコードが荒かったですね。youtu.be