<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Webgl on NicoLabs</title>
		<link>http://blog.hellonico.info/ja/tags/webgl/</link>
		<description>Recent content in Webgl on NicoLabs</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Thu, 02 Jul 2026 12:00:00 +0900</lastBuildDate>
		
			<atom:link href="http://blog.hellonico.info/ja/tags/webgl/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Coniにおけるプロシージャル・オーディオとWebGL WebAssemblyのエクスペリエンス</title>
				<link>http://blog.hellonico.info/ja/posts/coni/procedural-audiovisual-wasm/</link>
				<pubDate>Thu, 02 Jul 2026 12:00:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/procedural-audiovisual-wasm/</guid>
				<description>&lt;p&gt;過去24時間だけで、私たちは&lt;strong&gt;Coni WebAssembly&lt;/strong&gt;エコシステムの限界を押し広げ、プロシージャル・オーディオビジュアルのウェブ体験スイート全体を作成しました。Coniのマクロシステムと生のWebGL、そしてWebAudio APIを組み合わせることで、複雑なグラフィックスと音楽システムを外部アセットへの依存を一切持たずに、ブラウザ上でネイティブに構築、コンパイル、展開することに成功しました。&lt;/p&gt;&#xA;&lt;p&gt;今回構築した5つの新しいアプリケーションを見てみましょう。これらはすべて&lt;a href=&#34;https://coni-lang.org/wasm-apps/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;Coni WASM Gallery&lt;/a&gt;で、ブラウザ上でネイティブに体験できます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-minimal-techno-visualizer&#34;&gt;1. Minimal Techno Visualizer&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;テーマ:&lt;/strong&gt; ダークでドライビングなアルゴリズミック・クラブエナジー。&#xA;&lt;em&gt;リンク:&lt;/em&gt; &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/minimal-techno/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;Minimal Techno App&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Coniがリアルタイムのプロシージャル音楽生成をオーケストレーションし、それを重い3Dジオメトリのレンダリングと完璧に同期できることを証明したかったのです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;オーディオエンジン:&lt;/strong&gt; カスタムの140 BPMタイムラインエンジンが、16分音符の裏拍でアナログスタイルのノコギリ波ベースラインをトリガーし、808スタイルの合成キックと組み合わせ、ドロップ部分ではクリスピーなノイズベースのスネア/クラップを導入します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WebGLの繊細さ:&lt;/strong&gt; 16小節の「ブレイクダウン」中に重力を逆転させる5,000個の雨のパーティクルと、キックの打撃ごとにアグレッシブに広がる高密度の脈動する3Dジオメトリコアをマッピングしました。シーケンサーの状態に基づいて冷たいシアンから燃えるようなオレンジ色へと変化します。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-divine-infinity-999hz&#34;&gt;2. Divine Infinity 999Hz&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;テーマ:&lt;/strong&gt; エーテル的で数学的なヒーリング。&#xA;&lt;em&gt;リンク:&lt;/em&gt; &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/infinity-999hz/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;Divine Infinity 999Hz&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;神聖な周波数ヒーリングのコンセプトを中心に据えたこのアプリケーションは、純粋な数学とアンビエントオーディオの融合です。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;オーディオエンジン:&lt;/strong&gt; 深いリラクゼーションを誘発するために、微細な8Hzのシータ波バイノーラルビートで補完された999Hzの「エンジェル周波数」のサイン波を生成します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WebGLの繊細さ:&lt;/strong&gt; GLSLの頂点シェーダー内の純粋な三角関数を使用して、500,000個のパーティクルを「ベルヌーイのレムニスケート」（無限大の記号）上にマッピングしました。繊細なアンビエントグローと深度に基づいた不透明度のフェードにより、3D空間で完璧にレンダリングされます。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-clear-brain-fog-40hz&#34;&gt;3. Clear Brain Fog 40Hz&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;テーマ:&lt;/strong&gt; 幾何学的な明晰さと集中。&#xA;&lt;em&gt;リンク:&lt;/em&gt; &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/brain-fog-40hz/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;Clear Brain Fog 40Hz&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;精神的な混乱を払拭することを目的としたこのアプリは、魅惑的な幾何学とグラウンディング周波数を組み合わせています。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;オーディオエンジン:&lt;/strong&gt; 2つのオシレーター（左耳に432Hz、右耳に472Hz）をデチューンして作成された純粋な40Hzのバイノーラルビート。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;WebGLの繊細さ:&lt;/strong&gt; 頂点シェーダーに5枚の花びらが回転する3Dスピログラフをプログラムしました。複雑に重なり合う曲線が、カメラを全く動かすことなく前進し続ける錯覚を生み出し、目をフロー状態に引き込みます。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;4-webgl-guided-breathing-app&#34;&gt;4. WebGL Guided Breathing App&lt;/h3&gt;&#xA;&lt;p&gt;&lt;strong&gt;テーマ:&lt;/strong&gt; 制御されたリズミカルな瞑想。&#xA;&lt;em&gt;リンク:&lt;/em&gt; &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/breathing-app/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;Breathing App&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>WebGLによるガイド付き呼吸法: 6-2-6のインタラクティブ体験</title>
				<link>http://blog.hellonico.info/ja/posts/coni/breathing-app-webgl/</link>
				<pubDate>Mon, 29 Jun 2026 23:35:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/breathing-app-webgl/</guid>
				<description>&lt;p&gt;ペースの速い今日のデジタル世界において、メンタルヘルスと集中力は非常に重要です。脳波同調（ブレインウェーブ・エントレインメント）アプリケーションの成功に続き、私たちはウェルビーイングのもう一つの側面である「&lt;strong&gt;意識的な呼吸&lt;/strong&gt;」に取り組むことにしました。&lt;/p&gt;&#xA;&lt;p&gt;私たちの最新のConi WASMアプリケーション、&lt;strong&gt;WebGL Breathing App&lt;/strong&gt;を発表できることを嬉しく思います。これは、落ち着きをもたらす6-2-6の呼吸エクササイズ（6秒吸って、2秒止め、6秒吐く）をガイドするためにゼロから構築された、視覚的および聴覚的な体験です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;生きたuiを作成する&#34;&gt;生きたUIを作成する&lt;/h3&gt;&#xA;&lt;p&gt;単に拡大する円を表示する従来の呼吸タイマーとは異なり、私たちは「生きている」と感じられるものを作りたいと考えました。そこで、&lt;em&gt;Calm&lt;/em&gt;（シアン）、&lt;em&gt;Warm&lt;/em&gt;（オレンジ）、&lt;em&gt;Focus&lt;/em&gt;（パープル）から&lt;strong&gt;ムード&lt;/strong&gt;を設定できるインタラクティブなメニューを設計しました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;http://blog.hellonico.info/svg/loading.min.svg&#34;&#xA;        data-src=&#34;../breathe_in_01.png&#34;&#xA;        data-srcset=&#34;../breathe_in_01.png, ../breathe_in_01.png 1.5x, ../breathe_in_01.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;../breathe_in_01.png&#34;&#xA;        title=&#34;Breathing App Interface - Calm&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;エクササイズを開始すると、バックグラウンドの環境ノイズとプロシージャルに生成されたチャイムが再生され始めます。これらのサウンドはWeb Audio APIのみによって駆動され、ネイティブのConi関数によってシームレスにスケジューリングされます。ロジックを標準的なJSランタイムの遅延（ヒカップ）から分離することで、オーディオは完全に一貫性を保ち、ジッター（乱れ）のない状態を維持します。&lt;/p&gt;&#xA;&lt;h3 id=&#34;gpuのパワー&#34;&gt;GPUのパワー&lt;/h3&gt;&#xA;&lt;p&gt;内部では、アプリケーションはネイティブに計算され、WebAssemblyにキャッシュされた&lt;strong&gt;30,000個の幾何学的なパーティクル&lt;/strong&gt;のクラスターを生成します。これらのポイントは、選択したムードカラーと連続的な &lt;code&gt;u_breath_factor&lt;/code&gt; とともにWebGLシェーダーに渡されます。&lt;/p&gt;&#xA;&lt;p&gt;息を吸うと、球体は拡大し、頂点シェーダーで直接適用される三角関数のサインとコサインの操作によって頂点が緩やかに波打ちながら、半径が動的に拡大します。色の強さも増し、エネルギーの膨張を模倣します。&lt;/p&gt;&#xA;&lt;p&gt;息を吐くと、球体はタイトなコアへと収縮します。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;http://blog.hellonico.info/svg/loading.min.svg&#34;&#xA;        data-src=&#34;../breathe_in_02.png&#34;&#xA;        data-srcset=&#34;../breathe_in_02.png, ../breathe_in_02.png 1.5x, ../breathe_in_02.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;../breathe_in_02.png&#34;&#xA;        title=&#34;Breathing App WebGL Particle Sphere&#34; /&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; フェーズを完全にWASM内で計算します&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;defn &lt;/span&gt;update-phase [t phase-text]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;[cycle-time (&lt;span style=&#34;color:#a6e22e&#34;&gt;fmod&lt;/span&gt; t &lt;span style=&#34;color:#ae81ff&#34;&gt;14000.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        inhale-time &lt;span style=&#34;color:#ae81ff&#34;&gt;6000.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        hold-time &lt;span style=&#34;color:#ae81ff&#34;&gt;2000.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        exhale-time &lt;span style=&#34;color:#ae81ff&#34;&gt;6000.0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(&amp;lt; cycle-time inhale-time)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;;; ... 拡張をスムーズに緩和するための数学ロジック&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;視覚的な変換をGPUにオフロードし、厳格な状態の同期をネイティブにWASM内で維持することで、ロボット的ではなく有機的に感じられる、シルクのように滑らかな60fpsの体験を実現しました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;今すぐ試す&#34;&gt;今すぐ試す&lt;/h3&gt;&#xA;&lt;p&gt;新しいアプリケーションを私たちのWASMアプリ環境にデプロイしました。こちらから直接アクセスできます：&lt;/p&gt;</description>
			</item>
			<item>
				<title>ConiのネイティブFloat32配列のためのハードコア・カオステスト</title>
				<link>http://blog.hellonico.info/ja/posts/coni/float32-chaos-testing/</link>
				<pubDate>Sun, 28 Jun 2026 11:30:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/float32-chaos-testing/</guid>
				<description>&lt;p&gt;ブラウザで高性能なアプリケーションを構築する場合、JavaScriptの汎用的な&lt;code&gt;Number&lt;/code&gt;型では不十分なことがよくあります。連続した生のメモリ配列が必要になるのです。Coni WASMでは、最も数学的に集約的なアプリケーションのために、ネイティブなWebAssemblyの&lt;code&gt;float32&lt;/code&gt;配列に大きく依存しています。&lt;/p&gt;&#xA;&lt;h3 id=&#34;float32は実際にconiのどこで使われているのか&#34;&gt;Float32は実際にConiのどこで使われているのか？&lt;/h3&gt;&#xA;&lt;p&gt;ネイティブの&lt;code&gt;float32&lt;/code&gt;配列（&lt;code&gt;make-float32-array&lt;/code&gt;、&lt;code&gt;f32-set!&lt;/code&gt;、&lt;code&gt;f32-get&lt;/code&gt;）は、Coniのパフォーマンス・レイヤーの絶対的なバックボーンです。これらは以下のような機能を駆動しています：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;WebGLジオメトリ:&lt;/strong&gt; &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/deep-focus-webgl/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;&lt;code&gt;deep-focus-webgl&lt;/code&gt;&lt;/a&gt;アプリでは、&lt;code&gt;float32&lt;/code&gt;配列を使用して80,000頂点のブレイン・マトリックス（240,000個の浮点数！）をネイティブに数学的に形成し、その後&lt;code&gt;js/float32-buffer&lt;/code&gt;を介して一撃でGPUに転送します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ゲームエンジンのパーティクルシステム:&lt;/strong&gt; &lt;code&gt;flappy-bird&lt;/code&gt;や&lt;code&gt;neon-boids&lt;/code&gt;のようなゲームでは、並行する&lt;code&gt;float32&lt;/code&gt;配列が数千のX/Y座標、速度、寿命を、ガベージコレクションの停止を発生させることなく追跡します。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;生（Raw）のDSPオーディオ:&lt;/strong&gt; 私たちの&lt;code&gt;sound-nodes&lt;/code&gt;シンセサイザーは、複雑なインパルス応答とノイズ波形をWebAudioチャンネルにマッピングする前に、&lt;code&gt;float32&lt;/code&gt;配列を使用してネイティブに計算します。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;バグ型強制とf64reinterpret_i64&#34;&gt;バグ：型強制と&lt;code&gt;f64.reinterpret_i64&lt;/code&gt;&lt;/h3&gt;&#xA;&lt;p&gt;これらの配列は非常に重要であるため、そこでのバグは壊滅的です。最近、正確な整数（例えば&lt;code&gt;150&lt;/code&gt;）を&lt;code&gt;f32-set!&lt;/code&gt;に渡すと、なぜか&lt;code&gt;0.0&lt;/code&gt;が返ってくるという問題を発見しました。&lt;/p&gt;&#xA;&lt;p&gt;何が起きていたのでしょうか？以前のバージョンのWASMコンパイラでは、整数を浮動小数点数のセッターに渡すと、コンパイラがビットを解釈するために誤って&lt;code&gt;f64.reinterpret_i64&lt;/code&gt;を使用し、基礎となる値を完全に文字化けさせていたのです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;解決策float32カオステスト&#34;&gt;解決策：Float32カオステスト&lt;/h3&gt;&#xA;&lt;p&gt;私たちはコンパイラにパッチを当て、メモリへの挿入前に整数を正しく浮動小数点数に強制（コアーション）するようにしましたが、二度と退行（リグレッション）しないという保証が欲しかったのです。そこで&lt;strong&gt;カオステスト&lt;/strong&gt;の登場です。&lt;/p&gt;&#xA;&lt;p&gt;新しい&lt;code&gt;float32_coercion_test.coni&lt;/code&gt;スイートに、ハードコアなカオステストを構築しました。少数のハッピーパス（正常系）の数値をテストするだけでなく、巨大な配列を割り当て、決定論的な擬似ランダムループでそれを激しく叩きます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;deftest&lt;/span&gt; test-f32-chaos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;float32配列の境界と型強制のためのハードコアなカオステスト&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;[size &lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        arr (&lt;span style=&#34;color:#a6e22e&#34;&gt;make-float32-array&lt;/span&gt; size)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;loop &lt;/span&gt;[i &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(&amp;lt; i size)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        (&lt;span style=&#34;color:#66d9ef&#34;&gt;let &lt;/span&gt;[&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#75715e&#34;&gt;;; 極端なエッジケースを混ぜて生成：&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          val (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(= (&lt;span style=&#34;color:#a6e22e&#34;&gt;mod&lt;/span&gt; i &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;) (- &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; i)                   &lt;span style=&#34;color:#75715e&#34;&gt;;; 負の整数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(= (&lt;span style=&#34;color:#a6e22e&#34;&gt;mod&lt;/span&gt; i &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) (* i &lt;span style=&#34;color:#ae81ff&#34;&gt;10000&lt;/span&gt;)             &lt;span style=&#34;color:#75715e&#34;&gt;;; 大きな正の整数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                  (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(= (&lt;span style=&#34;color:#a6e22e&#34;&gt;mod&lt;/span&gt; i &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) (+ i &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;)             &lt;span style=&#34;color:#75715e&#34;&gt;;; 正確なfloat32の分数&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;)))                                    &lt;span style=&#34;color:#75715e&#34;&gt;;; ゼロ（整数）&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;f32-set!&lt;/span&gt; arr i val)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          (&lt;span style=&#34;color:#a6e22e&#34;&gt;recur&lt;/span&gt; (+ i &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nil))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;;; ... 検証ループ ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;極端な正の整数、負の境界値、純粋なゼロ、そして小数部を持つ浮動小数点数の残酷なミックスを意図的に1,000回&lt;code&gt;f32-set!&lt;/code&gt;関数に投げつけることで、WASMのトラップを回避し、型強制が防弾（完璧）であることを保証します。&lt;/p&gt;</description>
			</item>
			<item>
				<title>Coni WASMによる40Hzの認知的集中アプリの構築</title>
				<link>http://blog.hellonico.info/ja/posts/coni/brain-waves-wasm/</link>
				<pubDate>Sun, 28 Jun 2026 07:30:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/brain-waves-wasm/</guid>
				<description>&lt;p&gt;ブラウザ上のWebAssemblyは常に信じられないほどのパフォーマンスを約束してきましたが、WebAudioやWebGLといったWeb APIとスムーズに連携させることは、時にパズルを解くような感覚になることがあります。本日は、Coniエコシステムがこれをいかにエレガントに解決するかを、認知的集中のために設計された2つの新しいWebアプリを通じて紹介できることを嬉しく思います。&lt;/p&gt;&#xA;&lt;p&gt;これら2つのアプリケーションは、バイノーラルビートを使用して、深い集中力、記憶の想起、認知機能の向上に関連する特定の脳波周波数である&lt;strong&gt;40Hzのガンマ波&lt;/strong&gt;を生成します。しかし、本当の魔法はその裏側にあります。これらはすべて完全に&lt;strong&gt;Coni WASM&lt;/strong&gt;で書かれているのです。&lt;/p&gt;&#xA;&lt;h3 id=&#34;40hzガンマ波の科学&#34;&gt;40Hzガンマ波の科学&lt;/h3&gt;&#xA;&lt;p&gt;技術的な話に入る前に、なぜ40Hzなのでしょうか？ガンマ波は脳波の中で最も速い周波数です。研究によると、脳が40Hzの範囲で活動している時、それは知覚の高まり、問題解決、そしてピーク時の集中力と相関しています。&lt;/p&gt;&#xA;&lt;p&gt;左耳に60Hz、右耳に100Hzのサイン波を流すことで、脳は正確に40Hzの周波数差（ビート）を知覚します。このプロセスは脳波の同調（ブレインウェーブ・エントレインメント）として知られ、あなたの認知状態を優しくガンマ波へと導きます。&lt;/p&gt;&#xA;&lt;p&gt;この体験を提供する上でのConiアーキテクチャの柔軟性を実証するために、2つの異なるバージョンのアプリを構築しました。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-canvasエディション-deep-focus-40hz&#34;&gt;1. Canvasエディション: &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/deep-focus-40hz/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;&lt;code&gt;deep-focus-40hz&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;http://blog.hellonico.info/svg/loading.min.svg&#34;&#xA;        data-src=&#34;../deepfocus.png&#34;&#xA;        data-srcset=&#34;../deepfocus.png, ../deepfocus.png 1.5x, ../deepfocus.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;../deepfocus.png&#34;&#xA;        title=&#34;Deep Focus 40Hz Screenshot&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;最初のアプリケーションは、従来の2D CanvasとDOM APIに依存しています。私たちは独自の&lt;code&gt;reframe_wasm&lt;/code&gt;ライブラリを活用し、WebAssemblyから直接HiccupスタイルのDOM生成を行うことでUIの状態とレンダリングを処理しました。&lt;/p&gt;&#xA;&lt;p&gt;オーディオエンジンは、オシレーターをネイティブに近い速度で完全に管理しています。さらに、その場でエンベロープを変調する自動ジェネレーティブ・チャイムシステムを構築し、JSのオーバーヘッドを完全に回避しました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; JSバインディング不要の表現力豊かなWebAudioエンベロープ！&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(doto (&lt;span style=&#34;color:#a6e22e&#34;&gt;.-gain&lt;/span&gt; gain)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;.linearRampToValueAtTime&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.15&lt;/span&gt; (+ now &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;.exponentialRampToValueAtTime&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.001&lt;/span&gt; (+ now &lt;span style=&#34;color:#ae81ff&#34;&gt;8.0&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは、純粋なConiでリアクティブで高性能なオーディオエンジンを構築する完璧な例です。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-webglパワーハウス-deep-focus-webgl&#34;&gt;2. WebGLパワーハウス: &lt;a href=&#34;https://coni-lang.org/wasm-apps/apps/deep-focus-webgl/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreffer &#34;&gt;&lt;code&gt;deep-focus-webgl&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img&#xA;        class=&#34;lazyload&#34;&#xA;        src=&#34;http://blog.hellonico.info/svg/loading.min.svg&#34;&#xA;        data-src=&#34;../deepfocus-webgl.png&#34;&#xA;        data-srcset=&#34;../deepfocus-webgl.png, ../deepfocus-webgl.png 1.5x, ../deepfocus-webgl.png 2x&#34;&#xA;        data-sizes=&#34;auto&#34;&#xA;        alt=&#34;../deepfocus-webgl.png&#34;&#xA;        title=&#34;Deep Focus WebGL Screenshot&#34; /&gt;&lt;/p&gt;&#xA;&lt;p&gt;Canvasバージョンも素晴らしいですが、Coniのネイティブ処理能力をどこまで押し上げることができるか試してみたくなりました。そこで登場したのが&lt;code&gt;deep-focus-webgl&lt;/code&gt;（社内呼称：Amplifocus）です。&lt;/p&gt;&#xA;&lt;p&gt;2D Canvasに依存するのではなく、このバージョンは純粋なWebGLを使用して&lt;strong&gt;80,000パーティクルのブレイン・マトリックス&lt;/strong&gt;をレンダリングします。&#xA;何がそんなにエキサイティングなのでしょうか？&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;100%純粋なConi:&lt;/strong&gt; GPUで加速される頂点変換と大規模なパーティクル配列のロジックは、Coni WASM内でネイティブに処理されます。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;数学計算のJSオーバーヘッド・ゼロ:&lt;/strong&gt; Coniの数学ライブラリ（&lt;code&gt;libs/math&lt;/code&gt;）を使用することで、高価なJS-WASMブリッジを渡ることなく、数万の頂点に対する複雑な三角関数の変換を計算します。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ネイティブのFloatバッファで3Dジオメトリを形成し、それをGPUに送るのがいかに簡単かをご覧ください。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; WASMメモリ内で80kの頂点を計算し、一気にGPUへ送信！&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;f32-set!&lt;/span&gt; *base-points* idx final-x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;f32-set!&lt;/span&gt; *base-points* (+ idx &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) final-sy)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;f32-set!&lt;/span&gt; *base-points* (+ idx &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;) (* z &lt;span style=&#34;color:#ae81ff&#34;&gt;1.1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;;; 静的ジオメトリを一度だけアップロード&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;gl/upload-static-data&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;@&lt;/span&gt;*gl-state* (&lt;span style=&#34;color:#a6e22e&#34;&gt;js/float32-buffer&lt;/span&gt; *base-points*))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Float配列を一度割り当て、ネイティブにジオメトリを計算し、バッファリングされた一撃でGPUに転送します。&lt;/p&gt;</description>
			</item>
			<item>
				<title>純粋なConi LispでWebGLシェーダーを書く！</title>
				<link>http://blog.hellonico.info/ja/posts/coni/coni-webgl-shaders/</link>
				<pubDate>Sun, 28 Jun 2026 07:30:00 +0900</pubDate>
				<guid>http://blog.hellonico.info/ja/posts/coni/coni-webgl-shaders/</guid>
				<description>&lt;p&gt;前回の記事では、80,000パーティクルのWebGLマトリックスをオーケストレーションすることで、Coni WASMの生み出すパワーを紹介しました。しかし、WebGLのパイプラインには常に一つの厄介な問題が残っていました。それは&lt;strong&gt;シェーダーそのもの&lt;/strong&gt;です。&lt;/p&gt;&#xA;&lt;p&gt;WebGLコードを書いたことがある人なら、その面倒さを知っているはずです。頂点シェーダーとフラグメントシェーダーを、コードベース全体に連結された巨大で厄介な文字列リテラルとして書くことになります。構文のハイライトもフォーマットも失われ、さらにLispハッカーにとって最も悲劇的なことに、構造的編集（Paredit/Slurp/Barf）も失われてしまいます。&lt;/p&gt;&#xA;&lt;p&gt;本日、新しい&lt;code&gt;libs/webgl/src/glsl.coni&lt;/code&gt;ライブラリにより、私たちがその最後のフロンティアを征服したことを発表できることを嬉しく思います。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;GLSLシェーダーをConiのネイティブLisp構文で完全に記述できるようになりました。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;defshaderの登場&#34;&gt;&lt;code&gt;defshader&lt;/code&gt;の登場&lt;/h3&gt;&#xA;&lt;p&gt;Coniの強力なAST（抽象構文木）とマクロシステムを活用することで、私たちは&lt;code&gt;defshader&lt;/code&gt;を構築しました。これは標準的なLispのフォーム、型、数学的演算を受け取り、それらがGPUに到達する前に自動的に厳密なGLSLへとトランスパイルします。&lt;/p&gt;&#xA;&lt;p&gt;私たちのAmplifocusパーティクルエンジンのために、このフラグメントシェーダーがいかに美しく書かれているかを見てください：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;libs/webgl/src/glsl.coni&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;:all&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;defshader&lt;/span&gt; fs-src&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;precision&lt;/span&gt; mediump float)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#a6e22e&#34;&gt;varying&lt;/span&gt; vec4 v_color)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;defn &lt;/span&gt;void main []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;;; ネイティブの数学と座標マッピング！&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (set vec2 coord (- gl_PointCoord (&lt;span style=&#34;color:#a6e22e&#34;&gt;vec2&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (set float dist (&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; coord))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;if &lt;/span&gt;(&amp;gt; dist &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (&lt;span style=&#34;color:#a6e22e&#34;&gt;discard&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;;; LispのS式を使った発光（グロー）の計算&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (set float glow (- &lt;span style=&#34;color:#ae81ff&#34;&gt;1.0&lt;/span&gt; (* dist &lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (set vec4 final_color (* v_color glow))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (set gl_FragColor final_color)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;なぜこれがゲームチェンジャーなのか&#34;&gt;なぜこれがゲームチェンジャーなのか？&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;文字列リテラルからの解放:&lt;/strong&gt; シェーダーはファーストクラスのコードになります。アプリケーションの他の部分と完全にフォーマットが統一されます。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ASTレベルの検証:&lt;/strong&gt; Coniコンパイラは、ブラウザでWebGLプログラムをコンパイルしようとする前に、シェーダーの構造をパースして検証できます。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;構造的編集:&lt;/strong&gt; 標準的なLispの構造的編集ツールを使用して、複雑なGPU計算をスラープ、バーフ、そして操作することができます。CスタイルのGLSL文字列でそれをやろうとしてみてください！&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;シームレスな統合:&lt;/strong&gt; 使用可能なWebGLシェーダーへのコンパイルは、&lt;code&gt;core-gl/gl-shader&lt;/code&gt;関数を呼び出すだけというシンプルさです：&lt;code&gt;(core-gl/gl-shader gl (.-FRAGMENT_SHADER gl) fs-src)&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;ブラウザのためのフルスタックlisp&#34;&gt;ブラウザのためのフルスタックLisp&lt;/h3&gt;&#xA;&lt;p&gt;このアップデートにより、パイプラインは完成しました。&lt;code&gt;reframe&lt;/code&gt;によるDOM操作から、WebAudioの合成、WASMのFloatバッファ、そして今や実際のGPU頂点変換に至るまで、100% Coniで実現できます。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
