p5rb_cli という RubyGems をつくりました。今まで p5.rb を使って Ruby でクリエイティブコーディングをしたい場合、ローカルに p5.rb スクリプトをダウンロードし、手動で読み込み用の HTML を作成する必要がありましたが、p5rb_cli を使うとコマンドを使って簡単にクリエイティブコーディングを始めることができます。
RubyKaigi で VJ ツールとして使っていただいた方がいらっしゃったと聞いてとても嬉しく思いました。 私自身も RubyMusicMixin2025VJ.rb を手元で動かしたりして楽しませてもらいました。 やっとパワーが出たので p5.rb CLI の紹介記事も書けました。 holygrail.hatenablog.com
インストール
gem install p5rb_cli
Ruby さえあれば誰でも簡単にインストールできるように、最小限の gem 依存で作成しています。webrick と thor しか使っていないので、大体どの OS でもインストールできると思います。
使い方
新しいスケッチの作成
p5rb new path/to/hello.rb # => Created hello.rb
作成された hello.rb は GitHub Copilot や Cursor がコードを生成しやすいように命名規則や代表的なメソッド名などがスクリプトのヘッダに添付されます。(不要なら削除しても問題ありません)
スケッチの実行
p5rb run path/to/hello.rb # => http://localhost:8000
このコマンドは指定したスケッチをローカルサーバーで実行し、ブラウザで表示します。
ウェブアプリ
p5rb run で指定したスクリプトの実行結果が画面に表示されます。
スクリプトを任意のエディタで編集してから Run ボタンを押すと画面が新しい実行結果で更新されます。
Save ボタンを押すとスクリーンショットがローカルに保存されます。
サンプルコード1(画像の表示)
ローカル環境での実行なので loadImage などのローカルアセットにアクセスする API が使えるようになります。
def setup createCanvas(600, 600) @cat = loadImage('asset/cat.png') @landscape = loadImage('asset/landscape.jpg') end def draw background(255) image(@landscape, 0, 0) img_width = width / 5 img_height = height / 5 (0...1).each do |i| (0...5).each do |j| push translate(i * img_width + img_width / 2, j * img_height + img_height / 2) rotate((i - j) * (PI / 5)) image(@cat, -img_width / 2, -img_height / 2, img_width, img_height) pop end end end
サンプルコード2(3D)
GitHub Copilot に手伝ってもらった書いた3Dデモです。(p5.js のこの辺りの API の知識は自分にはほとんどない状態で記述しています。)
]
def setup createCanvas(710, 400, WEBGL) @voxel_colors = Array.new(11) { Array.new(11) { [random(255), random(255), random(255)] } } end def draw background(100) orbitControl noStroke() fill(50) push() translate(-275, 175) rotateY(1.25) rotateX(-0.9) box(100) pop() noFill() stroke(255) push() translate(500, height * 0.35, -200) sphere(300) pop() push() translate(0, -200, 0) rotateY(frameCount * 0.01) rotateX(frameCount * 0.01) beginShape() (0..9).each do |i| phi = map(i, 0, 9, 0, TWO_PI) (0..9).each do |j| theta = map(j, 0, 9, 0, PI) x = 10 * sin(theta) * cos(phi) y = 10 * sin(theta) * sin(phi) z = 10 * cos(theta) vertex(x, y, z) end end endShape(CLOSE) pop() push() rotateY(frameCount * 0.01) draw_voxel_mountain pop() end def draw_voxel_mountain size = 20 (0..10).each do |i| (0..10).each do |j| h = noise(i * 0.1, j * 0.1) * 400 push() translate(i * size - 100, -h / 2 + 100, j * size - 100) fill(*@voxel_colors[i][j]) box(size, h, size) pop() end end end
まとめ
p5.rb がお気に入りのエディタやAI支援を受けながら開発することができるようになりました。Ruby でもクリエイティブコーディングを楽しんでいただけたら幸いです。 ご質問やフィードバックがございましたら、お気軽にお寄せください。