<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lees Wal's Lab]]></title><description><![CDATA[Lees Wal's Lab]]></description><link>https://leeswal.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Lees Wal&apos;s Lab</title><link>https://leeswal.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 16:44:57 GMT</lastBuildDate><atom:link href="https://leeswal.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Building a Choice-Based Story Game That Runs in Any Browser]]></title><description><![CDATA[Choice-based story games look simple from the outside: text, a few buttons, an ending. But making one that feels good in a browser - no install, no account, three minutes per run - is a nice exercise ]]></description><link>https://leeswal.hashnode.dev/building-a-choice-based-story-game-that-runs-in-any-browser</link><guid isPermaLink="true">https://leeswal.hashnode.dev/building-a-choice-based-story-game-that-runs-in-any-browser</guid><category><![CDATA[Game Development]]></category><category><![CDATA[GameDev]]></category><dc:creator><![CDATA[Lees Wal]]></dc:creator><pubDate>Mon, 05 Oct 2026 02:17:51 GMT</pubDate><content:encoded><![CDATA[<p>Choice-based story games look simple from the outside: text, a few buttons, an ending. But making one that feels <em>good</em> in a browser - no install, no account, three minutes per run - is a nice exercise in constraint-driven engineering. Here is what goes into a game like <a href="https://threshingdaygame.xyz/">Threshing Day Game</a>, an original dragon-bonding story where eight choices decide which of six dragons bonds with you.</p>
<h2>The state machine is the game</h2>
<p>Every choice-based story is a state machine wearing a costume. Eight decisions with six endpoints sounds tiny, but the combinations matter more than the count. The clean way to build it: define the bond result as a function of the choice vector, not as hand-authored branches for every path. Six endpoints, one scoring function, and the "personality" of each dragon expressed as weights. Suddenly the content problem is tractable - you write six endings, not two hundred nodes.</p>
<h2>The saveable artifact does double duty</h2>
<p>At the end of a run, the player saves a dragon card. From an engineering view that is trivial: render a card with the result. From a product view it is the entire growth loop. The card is the share artifact - someone posts theirs, a friend clicks, and the friend lands on a game that starts instantly. No account wall anywhere in that path. When you design share artifacts, put them where the emotion peaks: the card appears at the bond moment, not on a menu.</p>
<h2>Everything is instant because everything is cheap</h2>
<p>A three-minute story game has no excuse for a loading screen. All content ships with the page, art is lightweight, and the "leaderboard" is one endpoint. The whole thing runs offline after first load if you add a service worker. The lesson generalizes: if your experience is short, make it load like it is short.</p>
<h2>What I would do differently</h2>
<p>Two things. First, persist a "dragons bonded" counter locally so replays show collection progress without any backend. Second, seed each dragon with one hint in the story text - players who fail to bond with their favorite will hunt for the branch they missed. Hint placement is free engagement.</p>
<p>Try the format before you build one: <a href="https://threshingdaygame.xyz/">Threshing Day Game</a> runs in any browser, about three minutes, six dragons. Pick apart why the eight choices feel meaningful - then steal the structure for your own state machine.</p>
]]></content:encoded></item><item><title><![CDATA[What Makes Singing Blob Toys So Delightful? A Look at the ML Behind Them]]></title><description><![CDATA[There is a genre of web toy that seems designed to make people smile: four round blobs standing on a snowy stage, singing four-part harmony. Drag one up and it sings higher. Drag it sideways and the v]]></description><link>https://leeswal.hashnode.dev/what-makes-singing-blob-toys-so-delightful-a-look-at-the-ml-behind-them</link><guid isPermaLink="true">https://leeswal.hashnode.dev/what-makes-singing-blob-toys-so-delightful-a-look-at-the-ml-behind-them</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[music]]></category><dc:creator><![CDATA[Lees Wal]]></dc:creator><pubDate>Sun, 04 Oct 2026 11:27:08 GMT</pubDate><content:encoded><![CDATA[<p>There is a genre of web toy that seems designed to make people smile: four round blobs standing on a snowy stage, singing four-part harmony. Drag one up and it sings higher. Drag it sideways and the vowel changes - ah to oh to oo. No instructions needed. Everyone who tries it starts experimenting within seconds.</p>
<p>These singing blob toys are more than a gimmick. They are a surprisingly good demonstration of how machine learning models can capture the <em>feel</em> of something - in this case, operatic singing - without pretending to replace a human performer.</p>
<h2>The trick: learning the space between notes and vowels</h2>
<p>A trained operatic voice is a continuous space, not a set of discrete samples. Pitch glides smoothly, vowels morph into each other, and dynamics respond to context. The models behind these toys learn exactly that continuum: given a pitch and a vowel position, they can interpolate a plausible singing sound between any two points a user drags to.</p>
<p>That is why the experience feels smooth instead of robotic. You are not pressing a "play sample" button. You are moving through a learned space, and the model fills in everything between your waypoints.</p>
<h2>Why four blobs specifically</h2>
<p>Four voices is the smallest arrangement that sounds like "a performance" rather than "a sound". Bass gives the floor, tenor carries the melody, and the two middle voices fill in the harmony. With four blobs you can hear the chord breathe - mute one and the whole balance tilts. It is a tiny masterclass in arrangement, delivered by cartoons.</p>
<h2>Two things to try</h2>
<ol>
<li><p><strong>Hold one blob on a single note</strong> and move the others around it. Listen for the moment the chord turns from stable to tense and back. That tension-and-release is the same machinery popular music runs on.</p>
</li>
<li><p><strong>Drag a vowel slowly</strong> instead of jumping. The morph between vowels is where the model shows its training - it is not crossfading two sounds, it is rendering the space between them.</p>
</li>
</ol>
<h2>Play one right now</h2>
<p>You do not need to install anything to try this. There is a free web version at <a href="https://blobopera.xyz/">Blob Opera</a> that runs entirely in the browser: four blobs, drag to sing, holiday songs optional. It is the kind of five-minute toy that quietly teaches more about machine learning than a lecture.</p>
<p>For developers: this genre is also a gentle introduction to thinking in learned representations. If you have ever wondered what "the model learned a latent space" means in practice, spend ten minutes dragging a singing blob around. The latent space is the reason the transition sounds smooth - and it is the same idea behind image interpolation, voice cloning and every other generative toy you have seen recently.</p>
]]></content:encoded></item></channel></rss>