ラベル *scratch* の投稿を表示しています。 すべての投稿を表示
ラベル *scratch* の投稿を表示しています。 すべての投稿を表示

2011-11-17

dumb raytracer-ish

ダウンロード

ray.zip

gist:1369770

去年できそこないのレイトレーサを作った。オブジェクトの配置がハードコードで、反射を一度しかしていないので3Dエンジンとしては使えない。シェーダの勉強をしていたと思ったらいつのまにか出来上がっていたものだが、これ以上ほうっておくと忘れそうなのでまとめておく。

操作

操作 | 効果
-- | --
左ドラッグ | ライトを操作
マウスホイール | カメラ前進・後退
右ドラッグ | カメラ見回し
右クリック | モード切り替え (鏡面とか)
左クリックしながらマウスホイール | ズーム (視野角の調整)
右クリックしながらマウスホイール | スレッドの増減 (増やすと早くなるかも)
マウスホイールをクリック | リセット
Hキー | ヘルプを隠す

2011-07-15

vvvvでSkypeの声にエフェクトをかける

ヘリウム声で通話がしたかったので調べた。ノイズ対策にも使おうとしたがあまりうまくいかなかった。

ループバックするサウンドデバイスとVSTホストがあれば何でもいいが、TiVSoundとvvvvを使った例をメモする。

手順

  1. SkypeのデバイスにTiVSoundを指定する
  2. vvvvでAudioInとAudioOutだけ置いたパッチを動かす
  3. 間に好きなVSTエフェクトを挟む

エフェクトひとつ

設定はこうする。

加工する対象SkypeのスピーカSkypeのマイクvvvvのAudioInvvvvのAudioOut
自分の声通常のスピーカTiVSound通常のマイクTiVSound
通話相手の声TiVSound通常通りTiVSound通常のスピーカ

vvvvの使い方

vvvvはノードを配線して色々なことができる多目的ツール。配線したものをパッチと呼ぶ。パッチをファイルに保存する時の拡張子は.v4p (vvvv patchの略)。保存や開くのは中クリックで行う。

どこか空白をダブルクリックするとノードの一覧が出る。名前を打ちこんで絞り込むことができる。選択するとノードが出現する。

ノードの追加

ノードの上辺には入力端子が並んでいる。ノードの下辺には出力端子が並んでいる。端子の数はノードによって異なる。

端子を左クリックすると配線が伸び、右クリックすると値を変える事ができる。例えばAudioInとAudioOutは右上の端子を右クリックすると接続先のデバイスを選択できる。また、AudioOut の上の左から2番目の端子は右クリックしながら上下に動かすとボリュームを調整することができる。

AudioOutのボリューム端子

端子が通る信号には種類があり、種類の合わない端子はつなぐことができない。例えば IOBox (Value Advanced) は数値を入出力するが、これをAudioOutにつないで音を鳴らす事はできない。AudioOutはAudioという種類の端子を持つからだ。

端子の種類

AudioInはAudioを出力するので、これをAudioOutにそのまま繋げばとりあえずアンプができあがる。

identity

vvvvとVSTエフェクト

vvvvは起動時にvstというフォルダ以下にあるDLLをすべて読み込む。

VSTエフェクトは、vvvvではAudio入力とAudio出力が一つずつあるノードになる。ということで、AudioInとAudioOutの間に配線すれば音を変えることが出来る。demuxはSwitcherというノードでできるようだが、muxやミキサーをするノードが見当たらない。これは気が向いたら探そうと思う。

エフェクトひとつ

VST自体のウィンドウはノードを右クリックすると出したり隠したりできる。

注意

エフェクト内部のパラメータはノードを置いただけでは保存されず消えてしまう。パラメータを保存するには、つまみの値をノードの端子として引き出す必要がある。

中クリックでNew Inspektor [Ctrl+I]を選択すると、ノードの詳細ウィンドウが開く。VSTのノードを選択すると端子になっていない隠れパラメータを見ることができる。

保存したい値の左の所をクリックして色を濃くすると端子になる。

エフェクトひとつ

値を端子にすると、そのつまみの制御はvvvvが握ることになるので、VST側のウィンドウでつまみを動かしてもすぐに元に戻ってしまう。AudioInのボリュームなどと同様、vvvvの端子を右クリックして設定することになる。

エフェクトとパラメータ

IOBoxとつなぐと値が視認できて便利。この上にvvvv標準のオシレータなどをつなぐと自動で値の変わるアレが作れる。

VSTiと組み合わせればリズムマシンなども作れると思うが、Skypeで使ってもうるさがられただけだったので割愛する。

2011-02-14

Thumbs.dbのフォーマット

WindowsのThumbs.dbはOLE Compound DocumentとかStructured Storageという形式でできている。Wordのdocファイルにも使われていて、要はアーカイブの一種らしい。

この形式を解凍する方法自体はメモしない。ここでは内部にどういうファイルが入っているかだけ書く。

これを読み込むライブラリは、Rubyではruby-oleジェム、PerlならWin32::OLE、JavaならApache POIのPOIFS、CならCOMのIStorageとかPOLEというライブラリがある。

ディレクトリの内容

そのたぐいのライブラリで解凍すると、中身のディレクトリはこうなっている。フォルダはなく、いくつかバイナリファイルが入っているだけ。

  • Catalog
  • 01
  • 1
  • 11
  • 2
  • 21
  • 3
  • 4
  • 5
  • ...

内容としては、名前が数字のファイルがJPEGファイルにヘッダがくっついたもので、Catalogにその数字と実ファイル名の対応付けが記録されている。

各サムネイルにはIDがついている。

不思議なのはIDとファイル名が文字列として反転しているというところ。

idが5のサムネイルは5というファイルに入っているが、idが13のサムネイルは31というファイルに入る。

カタログ (Catalog ファイル)

Catalogのフォーマットは先頭からこう。数値は全てUint32LE。

  • ヘッダが16バイト
    • 4バイト~8バイト目にサムネイル数
  • サムネイル数だけ以下を繰り返し(各エントリのサイズは不定)
    • エントリ全体のサイズ
    • ID
    • 更新日時
    • 何かの数値
    • UTF16LEでファイル名
    • 0でパディング

サムネイル (0, 1, 11, 2, 21 ..)

サムネイル画像のファイルの内容は以下のとおり。

  • ヘッダ (12バイトか16バイト)
  • JPEGファイル

ヘッダの長さは可変というか、12バイトか16バイトかのどちらからしい。

本来ならヘッダにあるタイプを調べるべきなのだろうが、とりあえずJPEGファイルの頭にあるマジックナンバー(0xFF 0xD8)を目印にすればヘッダの内容を読む必要はない。

実装

画像を吐き出すだけのツールを作るなら、流れはこうなる。

  • Structured Storageのライブラリを使ってthumbs.dbを読み込む
  • Catalogファイルを取り出して上のフォーマットで解釈する
  • 各ファイル名についてサムネイルを取り出し、JPEGファイルをその辺に書き出す

これをRubyとC++で書いた。

手抜き

以上はlibforensicsというPythonのライブラリのlf.win.shell.thumbsdbのコードを読んだだけなので、このライブラリを使うのが一番早いかもしれない。

こういった解体処理をする必要があるのは元のファイル名が欲しいときだけで、サムネイル画像を取り出したいだけならまじめに読み込む必要はない。

無圧縮で暗号化もされていないので、thumbs.dbを普通に開き、JPEGのSOI(0xFF 0xD8)とEOI(0xFF 0xD9)を探して次々書き出せばすむ。

(copied from tumblr)

2010-09-01

マンデルブロ/ジュリア/バーニングシップ集合ビューア

Mandelbrot

よくあるマンデルブロー集合のビューアを作った。マウスだけでつかんで4次元で切片を動かせる。緑が発散までの回数、赤青は発散した向き。

ダウンロード

mandelbrot.zip

gist:525284

操作

操作効果
ドラッグ移動
ダブルクリック移動
マウスホイール拡大・縮小
右ドラッグ定数の調整
右クリックモード切り替え (ジュリア集合とか)
左クリックしながらマウスホイール繰り返し回数の調整
右クリックしながらマウスホイールモード切り替え (ジュリア集合とか)
マウスホイールをクリックリセット

(copied from tumblr)

2010-03-23

プレーンテキストの画像形式

少し前から「プレーンテキストの画像形式」というものを探していた。

レイトレーシングなど、絵が出力結果であるプログラムを作って遊んでいると、レンダリングの結果を出す先に困ることがある。

画面表示のできるライブラリを持ってくるのも大仰だ。画像に保存したいところだ。しかも、printfとかで適当に。

BMPの構造体の定義や、PNGやGIFのアルゴリズムを空で書き下すには修行が必要だ。(windows.hは反則)

UNIX系列であればPNMというかなり理想的な形式がある。しかし、残念ながらWindows付属のビューアでは見られない。

SVG形式も考えたが、これはビットマップには向かない。rectを一面に並べる変換器を作ってみたら200KB程度の画像が9MBに膨れ上がった。

サイズはテキストの時点である程度諦めるべきところだが、どちらにしろ表示が極端に重たかった。

SVGの形式を眺めていて、HTMLで一時期流行った遊びを思い出した。

「tableタグでbgcolorを指定したtdをひたすら並べる」

<code><html>
  <head>
    <style>
      tr{height:1px}
      td{width:1px}
    </style>
  </head>
  <body>
    <table border="0" cellpadding="0" cellspacing="0">
      <tr><td bgcolor="#000000"></td><td bgcolor="#000000"></td><td bgcolor="#000000"></td><td...
      <tr><td bgcolor="#000000"></td><td bgcolor="#000000"></td><td bgcolor="#000000"></td><td...
      ...
    </table>
  </body>
</html>
</code>

本当にfprintfしか使わない実装。

void dump(int w, int h, const char *pixels, FILE *fp)
{
    int x, y;

    fprintf(fp, "<html><head><style>tr{height:1px}td{width:1px}</style></head><body><table cellpadding=0 cellspacing=0 width=%d height=%d>", w, h);

    for(y=0; y<h; y++)
    {
        fprintf(fp, "<tr>");

        for(x=0; x<w; x++)
        {
            fprintf(fp, "<td bgcolor=#%02x%02x%02x></td>", pixels[x + y * w], pixels[x + y * w + 1], pixels[x + y * w + 2]);
        }

        fprintf(fp, "</tr>");
    }

    fprintf(fp, "</body></html>");
}

これでとりあえずブラウザに表示させてプリントスクリーンすれば画像になる。

いまどきならCanvasでImageDataなどを使うのかもしれない。

(copied from tumblr)