葉序
葉序はヒマワリの中心にある二重螺旋模様で、コードは驚くほど短い。著者はまずそれを描き、Voronoiで格子に分割し、89個のアドレス指定可能なLEDを各セルに組み込んで、音に反応して光る実体彫刻に仕上げ、スケッチからPCBまでの二版の試行錯誤を記録した。
日本語
コピー

自然界に現れるパターンをコードで理解し、宇宙に内在する創発的な秩序と対話することに、ずっと惹かれてきた。
葉序もそのひとつで、ヒマワリや多肉植物の中心に見られる、外側へ広がる二重螺旋の形だ。コードは驚くほど単純:
// Inner and outer are throw-away,
// just for spacing the cells that are used
float[][] points = new float[numCells + numOuter + numInner][2];
float outerRadius = width / 2;
final int total = numCells + numInner + numOuter;
for (int i = 0; i < total; i++)
{
float f = i / float(total);
float a = i * 1.6180339887;
float distance = f * outerRadius;
float x = -cos(a * TWO_PI) * distance;
float y = sin(a * TWO_PI) * distance;
points[i][0] = x;
points[i][1] = y;
}
```python
在一个圆的径向线上取若干个等距的点,再让每个点按黄金比例的递增倍数依次旋转。
You get a neat point cloud out of this that already looks very much like a sunflower. Voronoi tessellating it looks quite interesting and seed-pod-like:

*The shape emerges when plotting the points*

*Voronoi tessellation result*
しばらく試しているうちに、こんな考えが浮かんだ。これを実物にして、各セルにアドレス指定可能な RGB LED を一つずつ入れたらどうだろう? いわば細胞状の LED マトリクスだ。高校時代に長方形の neopixel マトリクスは作ったことがあるが、次の一台にはもっと面白い形を待っていた。
## デジタルから実体へ
processing のスケッチからセルの輪郭データを書き出し、CadQuery ライブラリを使って python のスケッチに読み込んだ。
Wrote some code to build physical geometry out of the data:
```python
# Create the negative space of a single cell
# shrunk with a negative offset-2d
cell_shape = (cq.Workplane("XY")
.polyline(vertices)
.close()
.offset2D(-wall_thickness/2, kind='intersection')
.extrude(total_height)
.translate((0, 0, base_height)))
# Cut it out of the total to create a shell with walls
total_shape = total_shape.cut(cell_shape)
# Cut the shape of the hole to fit the LED in the center of the cell
total_shape = total_shape.cut(
led_hole.rotate((0, 0, 0), (0, 0, 1), math.degrees(angle))
.translate((centerX, centerY, 0)))
このコードはまず、結合されたすべてのボロノイセルの総体積を計算し、そこから個々のセルを収縮させた体積を引いて、各セルに LED サイズの穴を掘る。すべてのセルに対してこれを行うと、下の黄色い形になる。この時点でジオメトリをほぼ等分の4象限に分割し、それぞれが自分の 3D プリンタのビルドプレートに収まるようにした。
STEP ファイルを書き出し、FreeCAD で後処理してネジ穴を追加し、薄いバージョンを作って、下に紙を敷く「面板」にした。紙を切り抜いて薄いバージョンの底に貼り、ネジ穴でセルの壁に固定した。

各象限の CadQuery モデル

FreeCAD で CadQuery の出力を変換した面板モデル
これらの形を 3D プリントし、光をよく拡散する半透明の紙を見つけた。光が通ると有機的で遊び心のある見え方になる。桑の紙のこの外観が気に入っている。実に美しい有機的な繊維だ。

89 個の LED をはんだ付けするのは退屈だった。でもフロー状態に入ってしまえば、リラックスできる作業になった。手元にあった使っていない STM32 blackpill ボードにつなぎ、SPI で小さな neopixel ドライバを書いた。基本的なテストパターンだけでも十分かっこよかった。
簡単な sketch フレームワークを作り、LED 用に processing 風の「シェーダー」コードを書けるようにした。ルックアップテーブルを使い、各 LED の浮動小数点の位置を単位円上のものとして扱うことで、フラグメントシェーダーのように感じられるコードを簡単に書けた:
void radial_spirals(LEDBuffer leds) {
for (int i = 0; i < NUM_LEDS; i++) { // iterate every cell
// Get LED position from LUT
float x = led_positions[i][0];
float y = led_positions[i][1];
// Polar coordinates
float r = sqrtf(x*x + y*y);
float theta = atan2f(y, x); // Angle in radians [-π, π]
// Spiral pattern: combine angle and radius
float spiral = sinf(theta * 2.0f + r * 5.0f - seconds * 2.0f);
float brightness = (spiral + 1.0f) * 0.5f;
uint8_t level = (uint8_t)(brightness * 255.0f);
leds[i] = rgb(level, 0, 0);
}
}
なかなか巧妙だ。
すぐにお気に入りの放射状パターンが見つかった。中心から外へ向かって明るさを変調する、脈打つ正弦波だ。後にオーディオ反応のスケッチを作る際、これが主要な視覚効果の実装になった。
オーディオを加える
プリセットのパターンを再生するだけでなく、部屋の音に反応して動いたらもっとかっこよくないか? 生きているように、反応しているように見えてほしい。
これを動かしている STM32 ボードは浮動小数点演算に対応し、ARM DSP 命令もあるので、フーリエ変換を回してオーディオ解析ができる。ブレッドボード回路にデジタル I2S マイクの INMP441 を接続した。

デジタル信号を出力するので配線は簡単で、アナログノイズを気にする必要もない。ARM CMSIS ライブラリはオーディオ信号の処理や解析にちょうどよかった。自動ゲイン制御とマルチバンド分割を加えれば、異なる周波数のエネルギーを分析できる。オーディオに動的に反応するコードを書くための、いい土台ができた。
大量のパラメータ調整と、グローバルタイマーと雑然とした状態を詰め込んだ非常に乱雑なスケッチを経て、最終的にこのオーディオ反応プログラムができた。今もボード上で動いている基本だ。Jon Hopkins の Neon Pattern Drum を聴きながらだと、生きているように見える。
仕上げ
残るは細かい点だけ。もっと丈夫な取り付け面が必要だった。竹のまな板を見つけて円形にフライス加工した。天然竹の木目と有機的な紙の質感はとてもよく合う。

MCU とマイクを制御する基板をユニバーサル基板にはんだ付けし、3D プリントのケースに押し込み、上にギターペダルのスイッチを取り付けた。しかし電子部分は粗雑でノイズの影響を受けやすく、ケースを動かすと LED がちらついた。PCB の作り方を学び、blackpill、マイク、ボタンを載せたちゃんとした基板に置き換えることにした。ロジックレベルコンバータを載せる適切な場所も確保し、マイコンがクリーンな 5V 信号を出力できるようにした。うまくいったし、PCB を作るのは思ったより簡単だった。少なくともこの程度の複雑さなら。

乱雑なユニバーサル基板を隠した初期の筐体

設計した何も実装していない PCB
第2版を作る
2026年の年越しパーティーにこれを持っていったところ、なかなか好評だった。欲しいと言う友人も数人いた。そこで第2版を作ろうと思い立った。組み立てやすく、もっと頑丈にしたい。ちょうどPCB設計を学び終えたところだったので、LEDを固定している3Dプリント板をPCBのバックプレートに置き換えてみることにした。外形も少し手を入れて、五回対称にした。PCBは一度の発注で5枚になる。4種類の違う部品を3Dプリントするより、同じPCBを5枚注文して環状に組み上げるほうがいい。

やってみると、はんだごてでneopixel LEDを手はんだするのは悪夢の上位版だった。単体のneopixelはパッドが部品の下側にあり、そもそもPCB全体を加熱するリフローはんだ向けの設計で、はんだごてを使うようにはなっていない。プロジェクトはしばらく放置された。
2026年の夏、Recurse Centerのプログラミングレジデンシーに参加するにあたって、プロジェクトの部品も持っていった。そこで知り合った友人のほうがヒートガンのはんだづけがずっと上手で、なんとかすべてのはんだづけを終えられた。新しいセル壁も設計して3Dプリントし、PCBにはめ込んで、ねじで互いに締められるようにした。

Recurseの滞在中に新バージョンを完成させたあと、これはRecurse Centerにインスタレーションとして置いていくことにした。ESP32に載せ替えて、そこのwifiにつながるようにし、ファームウェアもRustで書き直した。コントローラはローカルのウェブサイトを動かしていて、RCの人はごく小さなwebassemblyバックエンドと最小限のAPIを通してスケッチやゲームをアップロードできる。
次は何をする?
このプロジェクトには、今でも完全には満足していない。
気に入ってくれる人は多いので、いくつか作りたいと思っている。売り物にしなくても、せめて友人に配れるくらいには。ただ、制作の工程は理想的とは言えない。2回のはんだづけはどちらも苦行で、しかも理由がそれぞれ違った。ステッカーを貼る工程も面倒で、紙そのものが脆く、一度破れると直しにくい。改善のアイデアはいくつかあって、試す価値はありそうだ。手はんだしやすいLEDに変える、PCBアセンブリに出す、紙を保護する透明アクリルを一枚重ねてみる、紙のパネルを磁石で固定する……今後試したいことは山ほどある。
今はこのプロジェクトを少し休ませて、頃合いを見てversion 3へ!