読者です 読者をやめる 読者になる 読者になる

こんにちはマイコン制御

May FORTH be with you.

風邪の効用

  • 『風邪の効用』という本があって実はまだ未読なのだけれども、整体の創始者である作者の「風邪は自然の健康法である。風邪は治すべきものではない、経過するものであると主張する著者は、自然な経過を乱しさえしなければ、風邪をひいた後は、あたかも蛇が脱皮するように新鮮な体になると説く。」(「BOOK」データベースより)という風邪に関する考え方は非常に影響されたところがある。
  • この1週間位無気力感がひどくて必要最低限以外の事はほとんど手につかなかったのだけれども、週末にあまりに酷い頭痛と軽い吐き気で起き上がれなくなってしまい1日寝ていたら、次の日に回復して、なんか気力も随分回復したのだった。
    • 風邪の場合のような理屈は判らないんだけれど、身体が心身の不具合を治すために頭痛を起こしていたんだと思う。
      • こういう病に対する東洋医学的な考え方はとてもしっくり感がある。
  • おかげで昨日は最近出来なかったLÖVEのプログラミングが結構進んだのだけれども、今やり方は大体判っているんだけれどちょっと面倒臭いところに差し掛かって、はてなに逃避しているところ。
    • 逃避ついでに、またちょっとDEPTHやったり。
  • 自分のノートPCはWondows10とLinuxMintのダブルブート環境なのだけれど、Windows10になってからWindows環境で使うことが多かったけれど、最近Linux使う事が増えてきた。Linuxだと誘惑が少なくてプログラミングに集中できて良いのだ。
    • でもエディタはNotepad++使ってます。
      • ファイルセーブしてもUNDO効くのが気に入ってるので。
    • Luaゲームエンジンで検索して知ったPlaygroundはwineだと不安定なので、使ってみるとなったらWindowsかなあ。

風邪の効用 (ちくま文庫)

風邪の効用 (ちくま文庫)

DEPTH

DEPTH

github.com

メモ補足

  • LÖVEで音楽のBPMをきっちりキープするならWAVEというライブラリがあるのを見つけた。
    • LÖVEのライブラリは基本Wikiにまとまっているんだけども、膨大な分量のあるフォーラムにだけ公開されているのも結構あって、探すの大変だったりする。

github.com

  • ただ、このライブラリが想定しているサウンドファイルは1曲分で、BPMを検出したり、ダイナミクスを計算したり、love.updateのデルタタイムとは別にbpmに合わせた関数呼び出しをするのと、あとは音ファイルの再生について管理をするものなので、自分の用途とはちょっと違う。
    • LÖVEの基本は関数であるlove.update()とlove.draw()の中で処理をするのが基本なので、WAVEを使うのは多分中級者以上向け。
    • waveObject.setBPMとか手掛かりは色々あるのだけれど、Lua自体勉強中なので、今の自分にはちょっと難しい。
      • ただ使い方は何となく判ってきたので、いわゆるBPM管理じゃない昔のトラッカー風の速度設定にして、シーケンサーもどきプログラムを進めてみる。
    • 多分、アクションゲーム作るとかって事だとAIMSの方が簡単に出来そうな気がするけど、LÖVEは変なこと色々できそうなんだよな~。
  • なので厳密にテンポはキープできなくても怪しげなアプリをバージョン1は目指そう。
    • そう、あとLÖVEは標準ライブラリでトラッカーのMODファイルを再生できるってのもポイント高いんだよな。
      • Renoiseで曲作ってMODファイルで出力すればそのままBGMになるんですよ。
      • 対応しているMODのフォーマットも多い。自分がTokyoJunkSoundCollection作るのに使ってたOctaMedSoundStudioのMEDファイルも読める。
      • てな具合に宣伝もしてみる。

onbangdo.bandcamp.com

  • その他の自分用メモ
    • UnityのJavaScriptっていわゆる方言なのでC#の方がまんま文法が使えるのでC#の方が良いって意見をちらほら見た。そうなんか。
    • あと滅茶苦茶速いQuickBasic準拠BasicコンパイラのQB64がVer1.1になってた。

http://www.qb64.net/

メモ

LÖVE Lua 音楽
  • LÖVEで音周りを弄っています。
    • シーケンスのタイミングは画面書き換えのフレーム単位に合わせると安定しているけれど、今の知識、理解ではかなり厳しい。
      • アンビエントみたいなやつならいい感じで出来そう。
      • なので、引き続き遊んではいます。取り敢えず、シーケンサーのバージョン1を作るまではやる。
    • あとLuaで配列作る場合、配列に何も入れないとその分メモリを食わないので、LÖVEでラングトンのアリの格子を書かないようにすると大幅に高速になりました。
  • Luaは引き続き勉強するにして、LÖVEの他にもLua使えるゲームエンジンあったよなあと思ってちょっとググったり自分専用のWiki検索したりしました。
    • マルチプラットホームだとCocos2D-Xが一番有名ドコロだと思うんですが、今、公式IDEだとJavaScriptだけでLuaが使えなくなってますね。
    • あとMaratisていうのが良い感じなんですけど、開発止まってるようで悲しい。
    • WindowsってことだとAIMとかAEnなんてのもちょっと触ってみました。

Cocos2d-x - World's #1 Open-Source Game Development Platform
http://www.maratis3d.org/
AIMS Headquarters
AEnオンラインヘルプ

  • あとJavaScript
    • 今はLuaをイジってますが、j5.jsもボチボチと。
      • 音のタイミングとかはこっちのほうが自由度は高いかも。
      • とはいえウェブブラウザなんで厳密にって訳には行かないかもですな。ちょっと実験してみよう
    • UnityもJavaScriptで書けるんだよな。
      • あと、Unityで音の加工も色々出来そう。

ラングトンのアリ

LÖVE Lua
  • 引き続きLÖVEで遊んでいます。
  • いろんな言語をとっかえひっかえ試しては形にならずに放置していましたが、取りあえず今回はこのLÖVEとLuaで前にQB64で大雑把に作ったシーケンサーの骨組みから完成させるまで作ってみようと自分に課しました。
    • なんか、今の自分にとっては出来る事とやりたい事とやるべき事のバランスがLÖVEだとちょうどいい感じがします。
    • 作りたいのはテノリオン+グルーヴ地獄Vみたいなの。
      • そこはDEPTHにしておけよ、という話もありますが。
  • まあでも最初は公式Wikiチュートリアルを写経するわけです。
    • 写経ついでにちょっとアレンジしたりして勉強するのが速いですよね。下みたいに点を打つついでに動かしてみるとか。
  • 写経だけっていうのも飽きてきて、そろそろゼロから何か書こうかということで、目標アプリではテノリオンみたいな感じにしたいので取りあえずみんな大好きライフゲームでも、と思ったんですが、ふと思いついて同じセル・オートマトンでもラングトンのアリを書くことにしました。簡単だし。
  • それでやってみたらサクッと書けました。まだこのレベルならLuaとLÖVEで引っかかることは無いですね。配列が1始まりなのが変わっているくらい?
    • 途中までライフゲーム作るつもりだったので効率が悪いコードですが、Luaに慣れるためなので、まあいいでしょうということで。
    • 上のWikipediaの画像はかなり早回しで、これを1セルずつの書き換えにすると非常にかったるいので20倍速にしました。

f:id:SenjiNiban:20161010161307j:plain

  • Wikiを見るとセルの色でのバリエーションが研究されているみたいだけど、アリの歩く幅を色々変化せてみたりしました。
    • 向きによって歩く幅が違うようにしつつ、縦横での一定の比率にするとか、ある一方向だけ他の方向と違う歩幅にするとか。
  • で、やってみた結果
    • 縦横の歩幅の比が整数の場合はオリジナルと同じような挙動の場合が多いようです。
    • 縦横比が整数でない場合、一方向だけ異なる値の場合、はパターンを描きながら直進するパターンが多いようです。
      • ただし、どういう理屈でそうなるのか判らないのですが、突如後戻りしたり曲がりだしたりするので油断がならない。
      • そうとう大きいフィールドを作らないと詳しく調べられないので、このプログラムでは探索に限界がありそう。
    • 全くのランダム、カオスなパターンというのは今のところは出てきてません。
  • オリジナルのパターンでも10000ステップ超えたあたりで必ず直進パターンに移行するとか、直進開始後に適切なパターンに衝突すると巻き戻しが起こるとか、ライフゲームに負けず劣らず面白い挙動をするラングトンのアリですが、バリエーションも探すと色々面白そう。

f:id:SenjiNiban:20161010164852j:plain
f:id:SenjiNiban:20161010164905j:plain

  • 見てて面白かったパターンのソースを晒してみます。LÖVE0.10.1なら動くはず。
    • 最初見ていて予想するのとは違う展開になると思います。
    • Web上でも動きますがかなり遅いので100倍速にしています。
--ラングトンのアリ・バリエーション for LÖVE0.10.1
function love.load()
--
	width = 198
	height = 148
--
	ant = {}
	ant.x = width / 2
	ant.y = height / 2
	ant.direction = 1
--
	map = {}
	for i=1, width do
		map[i] = {}
		for j=1, height do
			map[i][j] = 0
		end
	end
end
 
function love.update()
for i=1, 20 do 
	if map[ant.x][ant.y] == 0 then
		map[ant.x][ant.y] = 1
		ant.direction = ant.direction + 1
		if ant.direction > 4 then
			ant.direction = 1
		end
		next_pos(ant.direction)
	else
		map[ant.x][ant.y] = 0
		ant.direction = ant.direction - 1
		if ant.direction < 1 then
			ant.direction = 4
		end
		next_pos(ant.direction)
	end
end
end
 
function love.draw()
	for x=1, width do
		for y=1, height do
			if map[x][y] == 0 then
				love.graphics.rectangle("line", x * 4, y * 4, 4, 4)
			else
				love.graphics.rectangle("fill", x * 4, y * 4, 4, 4)
			end
		end
	end
end
 
function next_pos(a)
--
	if a == 1 then
		ant.x = ant.x - 2
		elseif a == 2 then
		ant.y = ant.y + 1
		elseif a == 3 then
		ant.x = ant.x + 1
		elseif a == 4 then
		ant.y = ant.y - 1
	end
--
	if ant.x < 1 then
		ant.x = width
	end
	if ant.x > width then
		ant.x = 1
	end
	if ant.y < 1 then
		ant.y = height
	end
	if ant.y > height then
		ant.y = 1
	end
end

LÖVEメモ その3

LÖVE Lua
  • LÖVEを色々いじって遊んでいます。
  • 公式サイトのチュートリアルに一通り作例があるのでそれ見ると大体どんな風に書けばいいのかが判ってきます。
  • あと日本語の解説ページだとここが詳しかった。
  • 英語の解説ページも結構ありますが、Luaはバージョン違うと結構動かないことが多いので、出来るだけ作例とバージョンは合わせた方がいいのだけれど、英語ページでバージョンまで言及してなくて、あれっ?て事になったりするので、今最新の0.10.1を使うなら上の二つのページを見た方が確実かも知れない。
  • 文法というか書き方は、まんまLuaなのでLuaが判っている人なら戸惑うことなくどんどん書けそう。
    • 自分は買ったままで積読だったLua公式本を読みつつ、チュートリアルを触ったり人のプログラムを読んだりって感じです。
    • 洋書でLÖVEの解説本もありますね。

Programming in Lua プログラミング言語Lua公式解説書

Programming in Lua プログラミング言語Lua公式解説書

  • 構造としてはj5.jsなんかと似ている。
    • ゲームというのはある種のステートマシンなので大体似てしまうのかも。
    • ケルトンとしてはこんな感じで3つのコールバックがメインになっている。
      • updateとdrawはデルタタイム毎に呼び出されて更新されてて、その他、キーやジョイスティックの入力なんかも、この3つの関数に書いても、入力の都度などその都度処理が行われる。
function love.load()
--ここでデータの読み込みやテーブルの定義などをする
end
function love.update()
--ここでフレーム毎の処理を行う
end
function love.draw()
--ここで画面描画を行う
end
  • 上の公式本はRenoiseのスクリプトLuaが使われていて、何かできるかしらと思って買って積読になっていたんだけれど、LÖVEで慣れたらRenoiseに再挑戦するのも良いかも。
  • でもって改めてLuaを勉強しているんだけれども、割合判りやすいと思いますが、いくつか課題もあって、以下自分用メモ
    • データ構造はテーブル一択。でもテーブルに何でも放り込めるのでこれで何とかなってしまう。
      • いわゆる配列として使える
      • テーブルの要素にテーブルも使えるので多次元配列はもちろんできる
      • 連想記憶としても使える
    • 関数もテーブルの要素として扱えるので関数型言語っぽい使い方も出来る
    • 配列の要素にアクセスするときにx["a"]でもx.aでもいけるので、オブジェクト指向ぽく書くことも可能
    • コルーチンのところまでまだ読み進んでいないんだけれど、コルーチンはschemeの継承ぽいようなので、ゲームのような並行処理をいっぱいするものには便利に使えそう
  • あと、いま使っているLÖVE0.10.1はLua5.1ベースなんだけれど、当然のことながらLua5.1で書かれたらLua用のライブラリならそのまま使える。
    • LuafftというLuaだけで書かれた高速フーリエ変換ライブラリがあって、それを使ったLÖVEのアプリとかあった。前のエントリーでも書いたけれど、音をいじるライブラリをLuaだけで書いて十分実用になるというのはさすがスクリプト言語最速を謳っているだけのことはあるのかも。

LÖVEメモ その2

LÖVE Lua

github.com

play.google.com

メモっていうかLÖVE

LÖVE Lua
  • 結局ワナビーでコーディングも出来てないので見聞きしたことのメモ書き
  • 自分が使いたいプログラム言語やフレームワークというのはこんな感じ
    • 音と画像が簡単に操作できる
      • それらがリアルタイムに動いてほしい
      • 3Dも簡単に扱えたらなお良し
    • 音に関してはサウンドファイルの再生だけではなくて、もう少しディープにいじれて欲しい
    • マルチプラットホームでスマホも視野に入っていたら嬉しい
    • 単独アプリとして配布できると嬉しい
  • それに合うもので触っていたものはこんな感じでどれもモノになってないという

p5js.org
Processing.org
WarmPlace.Ru. Pixilang Programming Language
LÖVE - Free 2D Game Engine

  • それで一番最後のLÖVEを久しぶりに調べていたら音をサウンドファイルの再生じゃなくていじるってページがあって楽しそうだった

www.headchant.com

  • LÖVEはLuaで書けるSDLを中心とした2Dゲーム向けフレームワークで、公式ページとか何だかファンシーなテイストなのが持ち味
    • スクリプト読ませず立ち上げるとそれぞれのバージョンごとにカワイイサンプルが立ち上がる
    • 最新バージョンはこれ

f:id:SenjiNiban:20161004114402j:plain

  • 公式Wikiも一部日本語訳されていたのは知っていたのだけれど、結構ごっそり日本語訳されてDLできるようにもなっていて調べやすくなった
  • LinuxMintでも0.10.Xバージョン対応していたから対応速いのかも