<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[dzw]]></title><description><![CDATA[Here is some stuff I made.]]></description><link>https://dzw.zentormey.com/</link><image><url>https://dzw.zentormey.com/favicon.png</url><title>dzw</title><link>https://dzw.zentormey.com/</link></image><generator>Ghost 5.87</generator><lastBuildDate>Sat, 11 Apr 2026 13:46:19 GMT</lastBuildDate><atom:link href="https://dzw.zentormey.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[The Weather Widget]]></title><description><![CDATA[It was a simple request.  I wanted a weather widget for my phone home screen.  Something I could use at a glance to tell me what it is doing outside without all of the hassle of having to turn my head and look out the window.  I mean, really.  Who wants to do that?]]></description><link>https://dzw.zentormey.com/the-weather-widget/</link><guid isPermaLink="false">68b9b22032b9b90167b7118e</guid><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Thu, 11 Sep 2025 19:45:47 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2025/09/baconweather.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2025/09/baconweather.jpeg" alt="The Weather Widget"><p>I glanced down at my phone home screen.  I had made a simple weather widget using the home assistant app.  It was...fine.  It dutifully reported the current temp, the high and low for today, had a one-three word label for the weather itself (cloudy, partly cloudy, snowstorm, etc), and as a bonus, it even looked at my daily calendar and put reminders there.  Like I said, it was fine.  It was also very dull looking and kinda boring.<br><br>All of the big weather companies out there have nice looking weather widgets with images, icons, nice gradients, etc.  It is just a nicer looking way to convey information.  They also usually have ads, logos, trackers, etc.  All of that stuff that makes the current technology industries terrible.</p><p>It was a simple request.  I wanted a weather widget for my phone home screen.  Something I could use at a glance to tell me what it is doing outside without all of the hassle of having to turn my head and look out the window.  I mean, really.  Who wants to do that?  So I set out to see what I could get away with.</p><p>At the time, I was mostly using <a href="https://huggingface.co/HiDream-ai/HiDream-I1-Full">HiDream</a> as my main image model.  It isn&apos;t the fastest, but has amazingly good prompt following capabilities.  I wrote a quick one-paragraph prompt template, just to feel things out and see how it would work.   I included variables to insert the current conditions, temps, calendar reminders, etc.  Everything I was used to having.  I also gave it a random &quot;theme&quot; just for the hell of it.<br>The first prompt looked like this:<br></p><pre><code>A thumbnail image for a weather forecast. The text is large and readable, and the background is a nice representation of the current conditions with the current theme applied. Use these colors for the background and text: Mahogany Brown, Navy Blue, Champagne Gold Use a puzzle theme for this image. Today is Friday, June 27 The Weather Report should mention the current conditions: Currently 75&#xB0; (Feels like 76&#xB0;) Mostly clear starting this evening. High: 81&#xB0; Low: 61&#xB0;</code></pre><p>Which resulted in this image:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/09/2025-06-27_08-49-02.png" class="kg-image" alt="The Weather Widget" loading="lazy" width="1024" height="1024" srcset="https://dzw.zentormey.com/content/images/size/w600/2025/09/2025-06-27_08-49-02.png 600w, https://dzw.zentormey.com/content/images/size/w1000/2025/09/2025-06-27_08-49-02.png 1000w, https://dzw.zentormey.com/content/images/2025/09/2025-06-27_08-49-02.png 1024w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Not terrible, but not great, either.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/09/Screenshot-from-2025-09-11-14-36-27.png" class="kg-image" alt="The Weather Widget" loading="lazy" width="1838" height="811" srcset="https://dzw.zentormey.com/content/images/size/w600/2025/09/Screenshot-from-2025-09-11-14-36-27.png 600w, https://dzw.zentormey.com/content/images/size/w1000/2025/09/Screenshot-from-2025-09-11-14-36-27.png 1000w, https://dzw.zentormey.com/content/images/size/w1600/2025/09/Screenshot-from-2025-09-11-14-36-27.png 1600w, https://dzw.zentormey.com/content/images/2025/09/Screenshot-from-2025-09-11-14-36-27.png 1838w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Here is an assortment of a few more made with HiDream:</span></figcaption></figure><p>As you can see, the numbers are fairly clear, but the format is all over the place.  There wasn&apos;t much consistency at all.  Also, the &quot;dark theme&quot; and &quot;day theme&quot; weren&apos;t working the way I wanted them to.</p><p>The text capabilities of this model were all right, but I wanted something more predictable and reliable.  Thankfully, soon after I got this working, the new <a href="https://huggingface.co/Qwen/Qwen-Image">Qwen Image</a> Model was released.  This model has far better text capabilities, and even ups the prompt following a little bit.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/09/2025-09-11_14-15-34.png" class="kg-image" alt="The Weather Widget" loading="lazy" width="1024" height="1024" srcset="https://dzw.zentormey.com/content/images/size/w600/2025/09/2025-09-11_14-15-34.png 600w, https://dzw.zentormey.com/content/images/size/w1000/2025/09/2025-09-11_14-15-34.png 1000w, https://dzw.zentormey.com/content/images/2025/09/2025-09-11_14-15-34.png 1024w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Well the text is certainly nicer.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/09/Screenshot-from-2025-09-11-14-41-48.png" class="kg-image" alt="The Weather Widget" loading="lazy" width="1838" height="811" srcset="https://dzw.zentormey.com/content/images/size/w600/2025/09/Screenshot-from-2025-09-11-14-41-48.png 600w, https://dzw.zentormey.com/content/images/size/w1000/2025/09/Screenshot-from-2025-09-11-14-41-48.png 1000w, https://dzw.zentormey.com/content/images/size/w1600/2025/09/Screenshot-from-2025-09-11-14-41-48.png 1600w, https://dzw.zentormey.com/content/images/2025/09/Screenshot-from-2025-09-11-14-41-48.png 1838w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">This looks far more consistent also. </span></figcaption></figure><p>The images generate every 15 minutes and a script copies the most recent image onto my webserver, which is then fetched by my phone.  The whole thing is pretty invisible, I have a nice weather widget on my phone, with no corporate bullshit telling me what to buy when I look at it.  It doesn&apos;t scan my phone or my network, and it doesn&apos;t send any data to the internet.  Just how I wanted it.</p><p>If you are curious, the final version of the prompt didn&apos;t change much.  Here is one from while I was typing this up:</p><pre><code>A weather forecast widget. The text is large, readable at a glance, and the background is a representation of the current conditions. It is daytime, with a pizza theme, including shades of Tangerine Orange, Emerald Green, Cobalt Blue.The Weather Report includes the current conditions: Currently 71&#xB0; (Feels like 69&#xB0;) Clear High: 77&#xB0; Low: 54&#xB0; Humidity: 74% Nice. Today: Thursday, September 11</code></pre><p>Weather info, a random theme, the color palette of the day, and the date.  If any of the temps are 69, it adds the word Nice.  Nice.</p>]]></content:encoded></item><item><title><![CDATA[Tank Songs]]></title><description><![CDATA[An AI-Assisted Tribute Album to the Oldest Fish I Know]]></description><link>https://dzw.zentormey.com/tank-songs/</link><guid isPermaLink="false">681125c5122cbd01684b05b5</guid><category><![CDATA[art]]></category><category><![CDATA[music]]></category><category><![CDATA[artificial intelligence]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Tue, 29 Apr 2025 20:19:06 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2025/04/cover_1024.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2025/04/cover_1024.jpg" alt="Tank Songs"><p>Kitchen Fish has been a member of the family for close to two decades.  My youngest won him at a local fair by tossing a <a href="https://en.wikipedia.org/wiki/Wiffle_ball">Wiffle Ball</a> onto a table filled with fishbowls from about six feet away.  This was in 2008.  As was our tradition with goldfish, we didn&apos;t give it a name because they don&apos;t typically live very long.  The fishbowl was kept in the Kitchen, so &quot;Kitchen Fish&quot; became the identifier, and it kind of stuck.</p><p>There were originally two fish in the bowl.  Kitchen Fish and another who would eventually be named &quot;Brownie&quot;.  As expected, the former consumed the later, and our kids learned some things about how Metal nature is.  Kitchen Fish would go on to consume anything else alive that was added to its tank, so eventually we learned our lesson and stopped putting things into it.</p><p>Over the years, Kitchen Fish grew.  We upgraded the fish bowl twice, and finally got a proper tank of 36 gallons, with the associated plumbing, filters, and what have you.  </p><p>I had been thinking of a way to honor Kitchen Fish&apos;s 17th year of life, while simultaneously thinking of some ideas for an AI Music Generation model I had been toying with (more details on that in a future post).  It occured to me to put these projects together and create a concept EP of songs &quot;by&quot; Kitchen Fish.  As I told my (now adult) youngest kid - I would prefer this be a &quot;Tribute Album&quot; and not a &quot;Memorial Album&quot; so I had better get writing. <br><br>I got through four more or less complete songs and a handful of half written songs before my ADHD sent me to another project.  They are linked below.  Because of the demeanor of Kitchen Fish, there was never any question of genre.  The album would be Metal.</p><p>I wrote all of the lyrics to these songs, and guided the generations closely.  I&apos;ll write more about my workflow in a future article.  These were made with the <a href="https://github.com/multimodal-art-projection/YuE">YuE Model</a>, which is adequate for the task.  I would configure the model with the lyrics, genre, style, timbre, and vocal preferences, and generate in short increments (usually about 4-6 seconds of audio at a time) until I got what I was looking for.  Sometimes this took awhile, sometimes it came easily. </p><p>This is the first time I tried to do any intentional composition with this model, and I think it came out all right.  Refining the toolset will make the process (and the output) much better.<br></p>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/tanksongs/embed/1/" style="min-width: 480px;" title="Audio player widget for &quot;Zen Tormey - Tank Songs - 01 - No One&apos;s Bitch.mp3&quot;">
</iframe>
<!--kg-card-end: html-->
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">No One&apos;s Bitch - Lyrics:</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">in the land of colored gravel</span><br><span style="white-space: pre-wrap;">there was a legend that they told</span><br><span style="white-space: pre-wrap;">about a fish of ancient years</span><br><span style="white-space: pre-wrap;">and mysterious powers to behold</span></p><p><span style="white-space: pre-wrap;">He swam in peace</span><br><span style="white-space: pre-wrap;">never leaving his post</span><br><span style="white-space: pre-wrap;">near the old stargate</span><br><span style="white-space: pre-wrap;">he always knew what was going on</span><br><span style="white-space: pre-wrap;">no matter how much he ate!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">No one&apos;s bitch</span><br><span style="white-space: pre-wrap;">don&apos;t know which</span><br><span style="white-space: pre-wrap;">species he is</span></p><p><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">Donchu Wish</span><br><span style="white-space: pre-wrap;">that you (that you)</span><br><span style="white-space: pre-wrap;">could be free?</span></p><p><span style="white-space: pre-wrap;">[guitar solo]</span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">deep under the waves</span><br><span style="white-space: pre-wrap;">thirty six gallon sea</span><br><span style="white-space: pre-wrap;">keeping watch across the depths</span><br><span style="white-space: pre-wrap;">he will never run or flee</span></p><p><span style="white-space: pre-wrap;">swimming close he protects us</span><br><span style="white-space: pre-wrap;">from dangers near and far</span><br><span style="white-space: pre-wrap;">when we leave the house he keeps it safe</span><br><span style="white-space: pre-wrap;">no matter where we are! (KITCHEN FISH!)</span></p><p><span style="white-space: pre-wrap;">[prechorus]</span><br><span style="white-space: pre-wrap;">whoah-oh-oh kitchen fish!</span><br><span style="white-space: pre-wrap;">ooooooooooo kitchen fish!</span><br><span style="white-space: pre-wrap;">ahhhhhhhhhh kitchen fish!</span><br><span style="white-space: pre-wrap;">ooooooooooo kitchen fish!</span><br><span style="white-space: pre-wrap;">ahh ahhh ahhhh ahhhhh!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">No one&apos;s bitch</span><br><span style="white-space: pre-wrap;">don&apos;t know which</span><br><span style="white-space: pre-wrap;">species he is</span></p><p><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">Donchu Wish</span><br><span style="white-space: pre-wrap;">that you (that you)</span><br><span style="white-space: pre-wrap;">could be free?</span></p><p><span style="white-space: pre-wrap;">[guitar solo]</span></p><p><span style="white-space: pre-wrap;">[bridge]</span><br><span style="white-space: pre-wrap;">He came from a small bowl</span><br><span style="white-space: pre-wrap;">The prize of the river fair</span><br><span style="white-space: pre-wrap;">Rescued by a young child</span><br><span style="white-space: pre-wrap;">Who threw a whiffle ball in there!</span></p><p><span style="white-space: pre-wrap;">He came home to protect us</span><br><span style="white-space: pre-wrap;">To stay with us until the end</span><br><span style="white-space: pre-wrap;">We give him more food every day</span><br><span style="white-space: pre-wrap;">And he ate all his friends!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">Kitchen Fish!</span><br><span style="white-space: pre-wrap;">No one&apos;s bitch</span><br><span style="white-space: pre-wrap;">don&apos;t know which</span><br><span style="white-space: pre-wrap;">species he is</span></p><p><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">Donchu Wish</span><br><span style="white-space: pre-wrap;">that you (that you)</span><br><span style="white-space: pre-wrap;">could be free?</span></p><p><span style="white-space: pre-wrap;">[guitar solo]</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">No one&apos;s bitch</span><br><span style="white-space: pre-wrap;">don&apos;t know which</span><br><span style="white-space: pre-wrap;">species he is</span></p><p><span style="white-space: pre-wrap;">Kitchen Fish</span><br><span style="white-space: pre-wrap;">Donchu Wish</span><br><span style="white-space: pre-wrap;">that you (that you)</span><br><span style="white-space: pre-wrap;">could be free?</span></p><p><span style="white-space: pre-wrap;">[guitar solo]</span></p><p><span style="white-space: pre-wrap;">[end]</span></p></div>
        </div>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/tanksongs/embed/2/" style="min-width: 480px;" title="Audio player widget for &quot;Zen Tormey - Tank Songs - 02 - Delicious Brownies.mp3&quot;">
</iframe>
<!--kg-card-end: html-->
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Delicious Brownies - Lyrics</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">This is the story</span><br><span style="white-space: pre-wrap;">the story of a fish named brownie</span><br><span style="white-space: pre-wrap;">he lived in the tank with me</span><br><span style="white-space: pre-wrap;">and now he&apos;s dead</span></p><p><span style="white-space: pre-wrap;">this is the story</span><br><span style="white-space: pre-wrap;">the story of a fish named brownie</span><br><span style="white-space: pre-wrap;">he lived in the tank with me</span><br><span style="white-space: pre-wrap;">and now he&apos;s dead</span></p><p><span style="white-space: pre-wrap;">[chorus]</span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">brownie, he came home with me</span><br><span style="white-space: pre-wrap;">he and me</span><br><span style="white-space: pre-wrap;">we were traveling</span><br><span style="white-space: pre-wrap;">and now he&apos;s dead!</span></p><p><span style="white-space: pre-wrap;">in the tank he stayed with me</span><br><span style="white-space: pre-wrap;">we lived happily</span><br><span style="white-space: pre-wrap;">we thought perpetually</span><br><span style="white-space: pre-wrap;">and now he&apos;s dead!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span></p><p><span style="white-space: pre-wrap;">[bridge]</span><br><span style="white-space: pre-wrap;">oh brownie why did you have to taste so good?</span><br><span style="white-space: pre-wrap;">I wasn&apos;t even very hungry that day</span><br><span style="white-space: pre-wrap;">I just thought I&apos;d take a bite and I&apos;d be good</span><br><span style="white-space: pre-wrap;">soon I had eaten you away-ay!</span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">Brownie!</span><br><span style="white-space: pre-wrap;">You taste magically!</span><br><span style="white-space: pre-wrap;">in my belly!</span><br><span style="white-space: pre-wrap;">that&apos;s where you&apos;ll stay!</span></p><p><span style="white-space: pre-wrap;">My friend brownie</span><br><span style="white-space: pre-wrap;">he swims here with me</span><br><span style="white-space: pre-wrap;">in my belly</span><br><span style="white-space: pre-wrap;">never go away</span></p><p><span style="white-space: pre-wrap;">[outro]</span><br><span style="white-space: pre-wrap;">oh brownie why did you have to taste so good</span><br><span style="white-space: pre-wrap;">I just thought I&apos;d take a bite and I&apos;d be good</span><br><span style="white-space: pre-wrap;">soon I had eaten you away</span><br><span style="white-space: pre-wrap;">eaten you</span><br><span style="white-space: pre-wrap;">away</span></p><p><span style="white-space: pre-wrap;">[end]</span></p></div>
        </div>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/tanksongs/embed/3/" style="min-width: 480px;" title="Audio player widget for &quot;Zen Tormey - Tank Songs - 03 - Chew Your Food.mp3&quot;"></iframe>
<!--kg-card-end: html-->
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">Chew Your Food - Lyrics</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">[intro]</span></p><p><span style="white-space: pre-wrap;">[bridge]</span><br><span style="white-space: pre-wrap;">The mouth opens up and lets in the light</span><br><span style="white-space: pre-wrap;">Giants nearby you must stay out of sight</span><br><span style="white-space: pre-wrap;">Try to stay silent try not to breathe</span><br><span style="white-space: pre-wrap;">if you survive then you&apos;ll get to eat</span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">Do you know where your food comes from?</span><br><span style="white-space: pre-wrap;">Little fish I&apos;ll tell you a tale</span><br><span style="white-space: pre-wrap;">It comes not from the reef or plants</span><br><span style="white-space: pre-wrap;">It comes not from a whale! (ick!)</span></p><p><span style="white-space: pre-wrap;">Your food doesn&apos;t swim or sing or bite</span><br><span style="white-space: pre-wrap;">Food is very very nice.</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">food comes from the land of air</span><br><span style="white-space: pre-wrap;">food comes down from way up there</span><br><span style="white-space: pre-wrap;">food comes to us for us to eaaaat</span><br><span style="white-space: pre-wrap;">give me all the (food)</span></p><p><span style="white-space: pre-wrap;">give me</span><br><span style="white-space: pre-wrap;">all the</span><br><span style="white-space: pre-wrap;">(food)</span></p><p><span style="white-space: pre-wrap;">[post chorus]</span><br><span style="white-space: pre-wrap;">Gimmie your food</span><br><span style="white-space: pre-wrap;">yummy</span><br><span style="white-space: pre-wrap;">gimmie your food</span><br><span style="white-space: pre-wrap;">yummy</span><br><span style="white-space: pre-wrap;">gimmie your food</span></p><p><span style="white-space: pre-wrap;">I will eat it all</span></p><p><span style="white-space: pre-wrap;">chew your food</span></p><p><span style="white-space: pre-wrap;">Gimmie your food</span><br><span style="white-space: pre-wrap;">yummy</span><br><span style="white-space: pre-wrap;">gimmie your food</span><br><span style="white-space: pre-wrap;">yummy</span><br><span style="white-space: pre-wrap;">gimmie your food</span><br><br><span style="white-space: pre-wrap;">I will eat it all</span></p><p><span style="white-space: pre-wrap;">[end]</span></p></div>
        </div>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/tanksongs/embed/4/" style="min-width: 480px;" title="Audio player widget for &quot;Zen Tormey - Tank Songs - 04 - I Survive.mp3&quot;"></iframe> 
<!--kg-card-end: html-->
<div class="kg-card kg-toggle-card" data-kg-toggle-state="close">
            <div class="kg-toggle-heading">
                <h4 class="kg-toggle-heading-text"><span style="white-space: pre-wrap;">I Survive - Lyrics</span></h4>
                <button class="kg-toggle-card-icon" aria-label="Expand toggle to read content">
                    <svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                        <path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/>
                    </svg>
                </button>
            </div>
            <div class="kg-toggle-content"><p><span style="white-space: pre-wrap;">[intro] </span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">I survive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I&apos;m alive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">there&apos;s no reprive heere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I survive heeeere</span><br><span style="white-space: pre-wrap;">Until I&apos;m belly up above the waaavesss</span></p><p><span style="white-space: pre-wrap;">[post chorus]</span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">I make my way from side to side</span><br><span style="white-space: pre-wrap;">swimming all around</span><br><span style="white-space: pre-wrap;">I move through plants and try to hide</span><br><span style="white-space: pre-wrap;">from the booming sounds</span><br><span style="white-space: pre-wrap;">There is no escape from my destiny</span><br><span style="white-space: pre-wrap;">I know how it will go</span><br><span style="white-space: pre-wrap;">floating high up above of me</span><br><span style="white-space: pre-wrap;">to the sun my belly shown!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">I survive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I&apos;m alive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">there&apos;s no reprive heere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I survive heeeere</span><br><span style="white-space: pre-wrap;">Until I&apos;m belly up above the waaavesss</span></p><p><span style="white-space: pre-wrap;">[post chorus] </span></p><p><span style="white-space: pre-wrap;">[verse]</span><br><span style="white-space: pre-wrap;">In spite of you I will survive</span><br><span style="white-space: pre-wrap;">you have trapped me in this cage</span><br><span style="white-space: pre-wrap;">and though I live two dozen years</span><br><span style="white-space: pre-wrap;">I will hate you to my grave</span><br><span style="white-space: pre-wrap;">there is no escape walls surround</span><br><span style="white-space: pre-wrap;">no where I can go</span><br><span style="white-space: pre-wrap;">I will fight until I make no sound</span><br><span style="white-space: pre-wrap;">and that&apos;s the day I will float!</span></p><p><span style="white-space: pre-wrap;">[chorus]</span><br><span style="white-space: pre-wrap;">I survive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I&apos;m alive heeere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">there&apos;s no reprive heere!</span><br><span style="white-space: pre-wrap;">in my aquatic home</span><br><span style="white-space: pre-wrap;">I survive heeeere</span><br><span style="white-space: pre-wrap;">Until I&apos;m belly up </span></p><p><span style="white-space: pre-wrap;">[outro]</span><br><span style="white-space: pre-wrap;">above the waaaaves</span><br><span style="white-space: pre-wrap;">(I survive, I survive here)</span><br><span style="white-space: pre-wrap;">above the waaaaves</span><br><span style="white-space: pre-wrap;">(I survive, I survive here)</span><br><span style="white-space: pre-wrap;">above the waaaaves</span><br><span style="white-space: pre-wrap;">(I survive, I survive here)</span><br><span style="white-space: pre-wrap;">above the</span></p><p><span style="white-space: pre-wrap;">[end]</span></p></div>
        </div><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/04/KitchenFish2019.jpg" class="kg-image" alt="Tank Songs" loading="lazy" width="480" height="360"><figcaption><span style="white-space: pre-wrap;">Kitchen Fish 2019</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/04/KitchenFish2024.jpg" class="kg-image" alt="Tank Songs" loading="lazy" width="480" height="361"><figcaption><span style="white-space: pre-wrap;">Kitchen Fish 2024</span></figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Live Loops]]></title><description><![CDATA[ I don't usually plan for this, I just play and whatever comes out is what I am making.]]></description><link>https://dzw.zentormey.com/live-loops/</link><guid isPermaLink="false">678029ef4479a9011b4377a6</guid><category><![CDATA[music]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Wed, 05 Feb 2025 16:06:58 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2025/02/loopartist.png" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2025/02/loopartist.png" alt="Live Loops"><p>Wikipedia defines <a href="https://en.wikipedia.org/wiki/Live_looping">live looping</a> like this:</p><blockquote>
<p>Live looping is the recording and playback of a piece of music in real-time using either dedicated hardware devices, called loopers or phrase samplers, or software running on a computer with an audio interface.</p>
</blockquote>
<p>In practice, this generally leads to a more complete (or at least more complex) output than what would be possible otherwise.  I first got into live looping when I had kids, and didn&apos;t have as much time for playing out with the band as I used to.  I still had music I wanted to make, but my schedule wasn&apos;t as flexible, so I had to make do with what time I could budget.</p><p>Mechanically speaking, I already had some experience with this sort of music production.  Without intending to, the rules I set up for my <a href="https://dzw.zentormey.com/60-seconds-to-go/" rel="noreferrer">60 Seconds to Go</a> project mirrored live loop production pretty closely.  I would pick an instrument, play for a minute, then repeat.  Adding more sound as I went.  Live looping just helped to automate the process so that I could do it performatively.</p><h1 id="the-gear">The Gear</h1>
<p>My first looper was a <a href="https://digitech.com/dp/rp155/">Digitech RP155</a> guitar pedal, and as these things went, pretty simple.  You tapped it when you wanted it to listen, and the next tap would stop the recording and start looping playback until you hit it again.  This worked all right, but the UX never really gelled with me.  It could only loop about 20 seconds or so.  I outgrew it quickly and started looking for something better.</p><p>The second piece of gear I utilized for this was a <a href="https://www.korg.com/us/products/dj/kaossilator_pro_plus/">Korg Kaossilator Pro+</a>.  This was a pretty major upgrade from the pedal.  It features four separate looping tracks, has some built in synthesis capability, and some built in drum loops.  I jammed with this setup for years, and it worked fine for my uses, but eventually its limitations caused me to look for something more purpose built.</p><p>In 2020, I picked up a <a href="https://www.boss.info/global/products/rc-505/">Boss RC505</a> Loop Station.  This had five separate looping tracks, a ton of built in effects, and much more versatility.  It enabled a ton more creativity over what I had before, both because of the added feature set, but also because it had a mess of inputs.  This allowed me to have more instruments connected at a time, reducing the friction inherent in using a wide variety of sounds.  Of course, I kept the Kaossilator in the mix, giving me 9 loop tracks without layering. </p><p>By 2024, My 505 had seen a ton of use (and abuse) and was starting to show signs of failing.  It worked reliably enough, but sometimes it would miss button hits or triggers, and I had a bit of <a href="https://medium.com/@danllerena59/the-psychology-behind-gear-acquisition-syndrome-459cce25967a">GAS</a> and wanted something new.  I looked to see if there was anything that would work better for my workflow, but didn&apos;t see anything I liked more than the updated <a href="https://www.boss.info/global/products/rc-505mk2/">Boss RC505 mkii</a>.</p><p>The 505mkii added 5 more loop tracks (14 now!  although don&apos;t really loop with the Kaossilator anymore) as well as a mess more inputs.  Combined with my mixer, this allowed me to connect virtually all of my instruments at once, which really reduced friction in playing whatever was in my head at the moment.</p><h1 id="workflow">Workflow</h1>
<p>So how does this all come together?   I can&apos;t speak to how other loop artists do it, but my process is something like this.</p><ol>
<li>Noodling around with random bass or percussive sounds until something catches my ear.</li>
<li>Play the beat/melody/riff/whatever until I get something catchy.</li>
<li>At this point I usually pause playing, briefly, to program the temp and rhythm information into my gear.</li>
<li>Start the looper and record whatever it was I liked.</li>
<li>Pick another instrument (sometimes I choose intentionally, sometimes I pick at random).</li>
<li>Noodle around for a few seconds until I have what seems like a good complimentary part.</li>
<li>Go back to step 4 and repeat until satisfied.</li>
</ol>
<p>Sometimes I have an entire song fully formed in my head, and just need to get it recorded (either for future expansion later, or so I can finally move on and think about something else!).  Other times the songs grow organically and proceed in unexpected directions.</p><p>About a third of the time, the loops will evolve and mix and mesh, and five minutes in will sound 100% different than the beginning.  I don&apos;t usually plan for this, I just play and whatever comes out is what I am making.</p><h1 id="live-only">Live Only</h1>
<p>I don&apos;t really care for audio production.  I don&apos;t like DAWs, I don&apos;t like most music software, and I am the type to easily fall into a black hole of perfectionism.  Because of this, I don&apos;t usually intend my liveloops to be &quot;finished songs&quot;.  Think of them more as &quot;live performances&quot; because, of course, that is what they are.  Sometimes I have an audience while playing, sometimes I am just playing for fun.  I am a strong believer that restrictions and rules breed creativity.  Mistakes sometimes make the song go in a new direction, and that can be fun.  </p><p>If I sat down and tried to &quot;produce&quot; any of these tracks, I&apos;d never release anything.  It will always be of slightly less quality than commercially available music because of the lack of production, but I don&apos;t really care about that.  I make music for me.  If other people like it, great!  If not, well, I still have the stuff I like.  Because of this, I never get too hung up on any one track or sound or whatever, and I am free to move on to new ideas without all of the mental baggage of &quot;unfinished work&quot;.</p><p>I recently made a &quot;<a href="https://dzw.zentormey.com/the-jam-button/" rel="noreferrer">Jam Button</a>&quot; that allows me to save stuff that I liked while playing, and because of that, I do have an ever growing list of recordings of stuff I liked.   I&apos;ll link some, below.</p><h1 id="patch-roulette">Patch Roulette</h1>
<p>I mentioned I try to introduce constraints in order to encourage creativity.  &quot;Patch Roulette&quot; is giving a name to a technique I&apos;ve used for a few years to accomplish this.  The idea is - when I record a sound, I then randomize the patches on my instrument, and whatever sound comes up (no matter how weird, silly, or discordant), that is my next patch.  The goal is to make a decent sounding track, live (of course), utilizing only the randomly selected sounds that come up.  This can not only lead to some crazy songs, it also forces me to gain experience with less common sounds and how to use them.  A lot (probably close to 1/4) of the &quot;Random Jams&quot; tracks linked below were made this way.  </p><p>I enjoy this style of songwriting a lot.  It is always fresh, avoids a lot of practice ruts, and forces me to think on my feet and improvise, which I like.</p><h1 id="random-jams">Random Jams</h1>
<p>So here is a link to my &apos;Random Jams&apos; folder, which has everything I&apos;ve saved with my &quot;Jam Button&quot; so far.  These tracks were all recorded live, utilizing the process and gear outlined above.  The only editing my jam button does is to cut the waveform to the largest contiguous section, and amplify.  I don&apos;t run any compression or effects after the fact.  Anything you hear is how it sounded when I played it live in my living room.  I try to limit these to around 10-15 minutes tops, which is short for a &quot;jam session&quot;, but long for a &quot;song&quot;.  The genres are all over the place, if you don&apos;t like what you are hearing, the next track is likely completely different.</p>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/randomjams/#tracks/" style="min-width: 480px;" title="Audio player widget for &quot;Random Jams (2025) (In Progress)&quot;">
</iframe>
<!--kg-card-end: html-->
<h1 id="older-jams">Older Jams</h1>
<p>Before I got the 505mkii and before I made my jam button, I would sometimes run the looper output to <a href="https://en.wikipedia.org/wiki/REAPER">Reaper</a>, (or sometimes just hit record on my mixer, which has a MTR).  The tracks below are from those sessions.  These are all from 2020 or before, are each far too long, and lack some of the refinement of my contemporary recordings.  Still, some of them are fun for driving or coding background music, so I am including them here.  These are more &quot;jam sessions&quot; than anything else.    There are a lot more psybient/ambient tracks here.</p>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/liveloops/#tracks/" style="min-width: 480px;" title="Audio player widget for &quot;Live Loops (2018)&quot;">
</iframe>
<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[The Jam Button]]></title><description><![CDATA[Some of those buttons make noise when I press them.  It has happened, upon occasion, that whilst randomly pressing buttons, I made noises that - in retrospect - may have been nice to save.  In order to solve this problem, I made a button that records music I have already played.]]></description><link>https://dzw.zentormey.com/the-jam-button/</link><guid isPermaLink="false">677fe17b4479a9011b4376f5</guid><category><![CDATA[music]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Thu, 09 Jan 2025 17:02:01 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2025/01/jam.png" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2025/01/jam.png" alt="The Jam Button"><p>I have often joked that I am not a proper musician, I just like to press buttons.  This, of course, has bled into my other various hobbies.  I have buttons around the house that do all manner of things.  Some of those buttons make noise when I press them.  It has happened, upon occasion, that whilst randomly pressing buttons, I made noises that - in retrospect - may have been nice to have saved.  In order to solve this problem, I made a button that records music I already played.</p><p>It may come as a surprise that I do not care for the mixture of music and computers.  I like electronic music well enough, and obviously I have several EPs of &quot;AI Music&quot; - what I mean is I don&apos;t like thinking about &quot;computer stuff&quot; when I am doing &quot;music stuff&quot;.  The two parts of my brain don&apos;t get along well.  If I am being creative, I want to be creative, not fight with drivers and interconnects and return channels.  I want to make music, not program a sequencer.  There are definitely moments in my life when I enjoy programming, tinkering, and making two completely unrelated things talk to one another - that last one being a particular talent of mine - but not while I am rocking out.</p><p>It is because of this disconnect that my studio setup has always remained a bit of an anachronism in my house.  I don&apos;t generally have a computer involved, I prefer old midi cables to usb, I prefer analog sounding synths vs digital ones, and I don&apos;t really care much for sound design, so I use a lot of stock sounds.  VSTs never work quite right, and they all have some obtuse, non-intuitive interface, that often looks like someone threw up on their screen, took a picture, and added knobs.</p><p>I am not a hipster, I don&apos;t have a stick up my butt about &quot;going dawless&quot; or whatever the kids call it.  I just don&apos;t want to do tech support during my creative time.  Eliminating the PC from the setup was just an easy way to do it.  I&apos;ll write more on my music setup in another article, this isn&apos;t about that.  This is how I solved one problem that arises as a consequence of not having an easy PC setup.  How do you save and organize the stuff worth keeping?</p><p>Years ago, I picked up a digital 12 channel mixer that could serve as a multitrack recorder was well. (The <a href="https://tascam.com/us/product/model_12">Tascam Model 12</a>)  This mixer allows to record directly from the board to SD card (or over USB if you are into that).  You can do a stereo mixdown, or record separate tracks.  The UI is fine, although a little clunky.  This works okay for just saving stuff I know I want to keep.  That isn&apos;t really how I make music, though.  I&apos;m not a sit down and compose symphonies kind of guy, I like to improvise, <a href="https://en.wikipedia.org/wiki/Live_looping">live loop</a>, and whatnot when I play, so I don&apos;t usually know ahead of time what will be good.  I don&apos;t want to record everything - it would be a nightmare to sort through and edit.  More time sitting at a computer &apos;working&apos; on music that isn&apos;t &apos;playing&apos; music.  </p><p>Sometimes you don&apos;t know that what you are making will be awesome until after you&apos;ve heard  it.  <br>So how do I save stuff I didn&apos;t already know I&apos;d want to keep?  </p><p>Well, while I don&apos;t <em>like</em> using computers with music, I <strong>am</strong> a nerd.  Yesterday, I did some thinking, some searching, and I built a solution.</p><p>Recently, I have begrudgingly been using a laptop as a midi routing device.  I have a couple of devices that support USB midi but not DIN.  Additionally, I like to switch what is controlling what from time to time.  I had been looking into hardware to take this over for me, but the more I read up on the available options, the more I realized nothing was going to do exactly what I wanted.</p><p>Since I had the laptop in the loop already, I went looking for something that could just get out of the way.  I know my tendencies, and I am unlikely to ever keep a system that requires reading words like ALSA and JACK and Pipewire while making music.  I needed something that I could set and forget and would stay the fuck out of my way, and (of course) it needed to &apos;just work&apos;.</p><p>My solution involved using <a href="https://github.com/kmatheussen/jack_capture">Jack Capture</a>.  It is a small program that can monitor jackd&apos;s ports, and dump the audio to disk on demand.  It also contained a &apos;time machine&apos; component (original idea by <a href="https://github.com/swh">Steve Harris</a>) that records constantly to a buffer in ram, writing to disk only when asked.</p><p>I went with Jack Capture because it supported remote control (via the <a href="https://en.wikipedia.org/wiki/Open_Sound_Control">OSC protocol</a>).  I had worked briefly with OSC for another project, so I was already familiar with how it worked.  This made it an easy choice.</p><pre><code>/usr/bin/jack_capture -O 7777 --format mp3 --mp3 --filename-prefix /home/zen/jams/ --port system:capture_1 --port system:capture_2 --timemachine --timemachine-prebuffer 1000</code></pre><p>This enables OSC listening on port 7777, selects the output format (I&apos;m not fancy), and a save location.  The port selection is set to the main system&apos;s sound device, so whatever the laptop is hearing should be recorded.  The timemachine option ensures that I have a full 15 minutes and change of buffer time.  The laptop has plenty of ram.</p><p>This done, I wrote a script to execute it and a systemd service to enable it.  If this is running all the time, it will always have the previous 15 minutes of audio buffered in memory.  Now I just needed a way to trigger it while I was playing.</p><p>There is a simple command line program called &apos;oscsend&apos; (it is in liblo-utils on debian, liblo-tools on ubuntu) that makes this quite easy.  I wrote a few more scripts to set this up.</p><pre><code class="language-jam_start.sh">#!/bin/sh
oscsend achoo.local 7777 /jack_capture/tm/start</code></pre><p>Simple enough, it connects to the osc server and sends the start recording command.<br>Here is another to stop recording:</p><pre><code class="language-jam_stop.sh">#!/bin/sh
oscsend achoo.local 7777 /jack_capture/tm/stop</code></pre><p>And finally, one to clear the buffer:</p><pre><code class="language-jam_clear.sh">#!/bin/sh
oscsend achoo.local 7777 /jack_capture/stop</code></pre><p>That last one actually kills the program, but my systemd service immediately restarts it.  This way, if I am playing and decide I definitely do NOT want to keep whatever I just did, I can simply wipe it out and begin anew.</p><p>Now that I  shell scripts, I&apos;ll need a way to fire them.  I reached for my usual toolbag here.  I added the following to my Home Assistant configuration and restarted it:</p><pre><code class="language-configuration.yaml">shell_command:
  music_desk_jam_stop: &apos;ssh -o StrictHostKeyChecking=no zen@achoo.local /home/zen/jam/jam_stop.sh&apos;
  music_desk_jam_start: &apos;ssh -o StrictHostKeyChecking=no zen@achoo.local /home/zen/jam/jam_start.sh&apos;
  music_desk_jam_clear: &apos;ssh -o StrictHostKeyChecking=no zen@achoo.local /home/zen/jam/jam_clear.sh&apos;
</code></pre><p>This creates three <s>services</s> actions that tell jack_capture to begin writing the buffer to disk, stop, and clear the buffer, respectively.</p>
<p>That part done, I just made some buttons to display on a touchscreen accessible from my music desk:</p><pre><code class="language-yaml">          - show_name: true
            show_icon: true
            type: button
            tap_action:
              action: perform-action
              perform_action: shell_command.music_desk_jam_start
              target: {}
            entity: input_boolean.dummy
            name: Save Jam
            icon: mdi:bookmark-music
          - show_name: true
            show_icon: true
            type: button
            tap_action:
              action: perform-action
              perform_action: shell_command.music_desk_jam_stop
              target: {}
            entity: input_boolean.dummy
            name: End Recording
            icon: mdi:archive-music
          - show_name: true
            show_icon: true
            type: button
            tap_action:
              action: perform-action
              perform_action: shell_command.music_desk_jam_clear
              target: {}
            entity: input_boolean.dummy
            name: Trash Buffer
            icon: mdi:recycle</code></pre><p>The end result looks something like this:<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2025/01/image.png" class="kg-image" alt="The Jam Button" loading="lazy" width="669" height="378" srcset="https://dzw.zentormey.com/content/images/size/w600/2025/01/image.png 600w, https://dzw.zentormey.com/content/images/2025/01/image.png 669w"><figcaption><span style="white-space: pre-wrap;">Record the past!</span></figcaption></figure><p>So while I am at my keyboards jamming, if I decide I like something I just played enough to keep, I tap the Save Jam button.  This tells the laptop to write the last 15 minutes of audio to disk, and then <em>keep recording</em> until I tap the stop button.  The audio will be saved as an MP3 in a place I can listen to it, edit it, whatever, later.  </p><p>This allows me to keep my head in the creative mindset and continue making music, and worry about the recording, editing, trimming, etc later on.</p>]]></content:encoded></item><item><title><![CDATA[60 Seconds to Go]]></title><description><![CDATA[ I wasn't interested in the minutia of making everything "perfect", what I wanted was to rapid fire through a ton of different songs and styles to give myself a crash course in how to use this thing.]]></description><link>https://dzw.zentormey.com/60-seconds-to-go/</link><guid isPermaLink="false">6703e11ea8bbdc010139a9a0</guid><category><![CDATA[music]]></category><category><![CDATA[fun]]></category><category><![CDATA[Retired Project]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Mon, 07 Oct 2024 19:33:56 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/10/60seconds.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/10/60seconds.jpg" alt="60 Seconds to Go"><p>Sometime around 1999-2000, I bought my first real instrument.  I had owned many instruments before this one, but this was the first one that felt professional.  This was the <a href="https://www.roland.com/us/products/va-7/">Roland VA-7</a>.  At the time, it was an amazing piece of tech.  Especially to 20 year old me.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/10/va7_main.jpg" class="kg-image" alt="60 Seconds to Go" loading="lazy" width="600" height="213" srcset="https://dzw.zentormey.com/content/images/2024/10/va7_main.jpg 600w"><figcaption><span style="white-space: pre-wrap;">Lots and lots of buttons to press.</span></figcaption></figure><p>I wanted to learn how to play this thing.  Not just what the buttons did, but to actually <em>play </em>it.  I wanted to be able to whip out that perfect melody or riff at just the right time.  I wanted to be able to produce exactly the sounds I wanted with just a few quick taps.  I wanted to appear to have bagpipes in my pockets, or whatever else the situation may call for, to unleash whatever sound I needed at a moment&apos;s notice.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/10/zen_instruments.jpg" class="kg-image" alt="60 Seconds to Go" loading="lazy" width="480" height="480"><figcaption><span style="white-space: pre-wrap;">I&apos;m just happy to see you. </span> <span style="white-space: pre-wrap;">Honestly, I don&apos;t even know what some of these are supposed to be.</span></figcaption></figure><p>This project was hosted on Bananafunk - an early media sharing website (currently on hiatus) that I made with my friend Matt Rose.  Bananafunk is a whole other thing I will cover in another article.  All you need to know for now was that it was a website you could make art, upload the art, and share it with others.  It would ask you to create a &quot;Vision&quot; to explain what you are trying to do with your project. <br><br>Well, to learn how to use my new keyboard, I had decided on a list of constraints.  (Taken directly from the project&apos;s vision.txt file):</p>
<!--kg-card-begin: html-->
<div align="left">I am composing an album that will contain sixty (60) songs, each about one minute long.<br><br>All songs will follow these guidelines:<br><br><lu><li>1. All songs will be done with zero mastering or production work.</li><li>2. Each track of each song will be recorded in one take, and done ad-lib, without writing the entire part.</li><li>3. Each song will be approximately sixty seconds long.</li><li>4. All songs will be recorded using just stock sounds from my Roland and nothing else.</li><li>5. I will record one song per day, minimum, until it is done.</li><li>6. Each song title will end with exactly one exclaimation point (!).</li></lu></div>
<!--kg-card-end: html-->
<p>I..mostly followed them.<br><br>The idea was to not get bogged down in post production and mastering (which can easily suck up &gt; 80% of the time while recording).  I wasn&apos;t interested in the minutia of making everything &quot;perfect&quot;, what I wanted was to rapid fire through a ton of different songs and styles to give myself a crash course in how to use this thing.<br><br>I would keep anything I wrote, even with mistakes.  Always forward, don&apos;t get hung up on any one thing.  Record for a minute, then go back and add another part.  I wouldn&apos;t write the parts first, it was all 100% improvised.  This usually worked out okay.  If you know me, you know I can work off the cuff fairly reliably.  Still, there were a few I wasn&apos;t happy with.  Track 39 failed so hard I re-recorded it, breaking essentially every rule of the project.  The original is still present, to keep me honest, I suppose.</p><p>The process was the same for each track.  I would pick a random instrument from the keyboard&apos;s data bank, noodle around for 5-10 seconds or so to get a feel for the sound, and then hit record.  Whatever came out is present in the tracks below.  After about a minute, I would reset, pick a second instrument at random, and repeat the process.  Playing along with my previous output as I recorded the new part.  After the second time through a track, I generally had an idea of what I wanted to do with it, so I would start picking out instruments intentionally - laying down a bass line, or drums, or whatever was missing from the song.  The track would be considered &quot;complete&quot; once it had a good full sound (or when I got sick of playing it).  I don&apos;t think I spent more than half an hour on any one song. <br><br>Little did I know, this method of music production would serve me very well a decade later when live-looping technology was more widely available.  The similarities are myriad.  Aside from a few fun short tracks, that is probably the biggest win from this experiment.  I would go on to use those skills to make a ton more fun music in later years.  </p><p>Some of these tracks have stories behind them, some are just random fun.  Very few were &quot;about&quot; anything, in the traditional sense.  Being tracks without lyrics, they can really be about whatever you want them to be.  Except Jen&apos;s Spreadsheet.  That track will always be about Jen Rose, and the spreadsheet that gave her so much trouble that, when I heard about it third-hand, I just had to write a song about it.</p><p>In true Zen fashion, I made it about 80% of the way through, stopping at 48-ish tracks in the initial run.  I tried to return to this and do a few more about a year later, thinking I would finish it up, but lost steam pretty quickly.  The spark that had ignited this project had already moved on to shinier things.<br><br>Some of the riffs/melodies found new homes in other tracks.  Some can only be found below.  Enjoy!</p>
<!--kg-card-begin: html-->
<iframe loading="lazy" src="https://faircamp.zentormey.com/60-seconds-to-go/#tracks/" title="Audio player widget for the release &quot;60 Seconds to Go!&quot;"></iframe>
<!--kg-card-end: html-->
]]></content:encoded></item><item><title><![CDATA[Unimatrix (Part 3)]]></title><description><![CDATA[This was originally going to be about software, and I will definitely cover some of that in this post.  It is also going to be about careful planning and restraint.

Just kidding, this is about the adventures of adding the fifth GPU to the system.]]></description><link>https://dzw.zentormey.com/unimatrix-part-3/</link><guid isPermaLink="false">66e0945d2d6ae0010ea4a75d</guid><category><![CDATA[computers]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Fri, 27 Sep 2024 16:13:39 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/09/unimatrix_3.png" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/09/unimatrix_3.png" alt="Unimatrix (Part 3)"><p>(This post is a followup to <a href="https://dzw.zentormey.com/unimatrix-part-2/" rel="noreferrer">Unimatrix</a> (Part 2)).</p><p>This was originally going to be about software, and I will definitely cover some of that in this post.  It is also going to be about careful planning and restraint.<br><br>Just kidding, this is about the adventures of adding the fifth GPU to the system.</p><p>When we last left Unimatrix, I had installed the fourth GPU, and they were sort of haphazardly piled into the case.  It was a careful sort of chaos, but chaos nonetheless.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240822_172644214_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/09/PXL_20240822_172644214_reasonably_sized.png 600w, https://dzw.zentormey.com/content/images/2024/09/PXL_20240822_172644214_reasonably_sized.png 638w"><figcaption><span style="white-space: pre-wrap;">Behold the horizontal installation!</span></figcaption></figure><p>I tried to do something similar with the fifth one with less than stellar results.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240907_110723050_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="361" height="480"><figcaption><span style="white-space: pre-wrap;">I promise I was as careful as I ever am. What?</span></figcaption></figure><p>Clearly, I needed to rethink this a bit.  I wanted to stand the cards up vertically, to provide room for all of them in a single plane.  There wasn&apos;t really room above Unimatrix on the rack for this, so it sort of turned into a whole thing.</p><p>I had to rearrange things a bit on the rack.  I hadn&apos;t taken the case out since I started installing things.  It eh.. it is heavier now.  I&apos;m not sure on the total exact weight, but when I lost one side of it taking it off the rack rails to move them down a few RUs, it definitely left a mark on my leg.<br><br>Unimatrix&apos;s case has support and space for a second power supply, which is good.  Unfortunately. it didn&apos;t have space for a third one, so that is just sitting on top of the case.  The picture above looks haphazard and dangerous, but I was careful to not allow any shorts or fan obstructions.  The airflow was good enough, temps on the GPUs didn&apos;t exceed 70c or so.  Still, even <em>I</em> had to admit it looked junky.</p><figure class="kg-card kg-image-card"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240907_110732826_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="361" height="480"></figure><p><br>I just shoved a jumper wire between the ground pin and power button detect pin on the 2nd and 3rd GPU.  (Just to test it!  I did fix this later..eventually).  Unimatrix runs 24/7, so this was good enough for punk.  I ordered a couple breakout boards to do this the &quot;right&quot; way.  (If there is a &quot;right&quot; way to connect 5 consumer GPUs to a server motherboard).<br>  <br>I headed over to my preferred 3D model site and found <a href="https://www.printables.com/model/406897-gpu-stand">these</a>.  Good enough for my purposes.  I&apos;ll take five.   Amusingly, I had allowed myself to get low on PETG, so I printed these in PLA instead.  I&apos;m sure it&apos;ll be fine.</p><p>Once all was said and done, I have the following:</p><p>Nvidia GTX 1080ti - 11gb<br>Plugged directly into the PCI-E slot.  I removed the fan housing from it to make room on the side.  It is the only thing currently powered by the tertiary power supply.  (an old 500w pull from a disused system).  <br><br>(2) Dell Nvidia RTX 3090 - 24gb each<br>Slotted into the PCI-E bay with PCI-Ex3 riser cables.  These are plugged into the SPF secondary power supply.  I like the form factor of these.  If I could even-trade the MSI and EVGA cards for two more of these, I would in a heartbeat.<br><br>(1) MSI Nvidia RTX 3090 - 24gb<br>Plugged into another PCI-Ex3 riser cable and powered by the primary 1200w power supply. </p><p>(1) EVGA Nvidia RTX 3090 - 24gb <br>This one also has a x3 riser cable and is plugged into the main 1200w power supply. <br> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240908_124200765_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/09/PXL_20240908_124200765_reasonably_sized.png 600w, https://dzw.zentormey.com/content/images/2024/09/PXL_20240908_124200765_reasonably_sized.png 638w"><figcaption><span style="white-space: pre-wrap;">This </span><b><strong style="white-space: pre-wrap;">IS</strong></b><span style="white-space: pre-wrap;"> an improvement, right?</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240909_115746231_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="361" height="480"><figcaption><span style="white-space: pre-wrap;">Here is a shot of the GPU stands.</span></figcaption></figure><p>Sure was a good thing I searched for a 5u case I could fit consumer-sized GPUs into, eh?  Anyways, once all was said and done, this was a nice sight to see after booting:</p><pre><code class="language-bash">root@unimatrix:~# lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
46:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 41)
81:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
82:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)
c1:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
c2:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)</code></pre><p>Some shots from the VMs themselves:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">&#x276F; ssh bob nvidia-smi
Fri Sep 27 10:33:20 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3090        On  | 00000000:01:00.0 Off |                  N/A |
| 30%   57C    P2             122W / 250W |  19534MiB / 24576MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A     16442      C   python                                    19528MiB |
+---------------------------------------------------------------------------------------+</code></pre><figcaption><p><span style="white-space: pre-wrap;">Bob</span></p></figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">zen@frigate:~$ nvidia-smi 
Fri Sep 27 10:41:00 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce GTX 1080 Ti     On  | 00000000:01:00.0 Off |                  N/A |
|  0%   71C    P2              70W / 125W |   8988MiB / 11264MiB |      1%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      2096      C   python                                     6218MiB |
|    0   N/A  N/A     91481      C   ffmpeg                                      175MiB |
|    0   N/A  N/A     91490      C   ffmpeg                                      159MiB |
|    0   N/A  N/A     91508      C   ffmpeg                                      158MiB |
|    0   N/A  N/A     91519      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91524      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91537      C   ffmpeg                                      159MiB |
|    0   N/A  N/A     91543      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91546      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91552      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91560      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91572      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91573      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91577      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91586      C   ffmpeg                                      161MiB |
|    0   N/A  N/A     91594      C   ffmpeg                                      161MiB |
|    0   N/A  N/A   1987775      C   ffmpeg                                      161MiB |
|    0   N/A  N/A   2721010      C   ffmpeg                                      175MiB |
+---------------------------------------------------------------------------------------+</code></pre><figcaption><p><span style="white-space: pre-wrap;">Frigate</span></p></figcaption></figure><figure class="kg-card kg-code-card"><pre><code class="language-bash">zen@meg:~$ nvidia-smi 
Fri Sep 27 10:41:54 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3090        On  | 00000000:01:00.0 Off |                  N/A |
| 32%   33C    P8              12W / 250W |  24166MiB / 24576MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce RTX 3090        On  | 00000000:02:00.0 Off |                  N/A |
| 31%   30C    P8              17W / 250W |  24108MiB / 24576MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   2  NVIDIA GeForce RTX 3090        On  | 00000000:03:00.0 Off |                  N/A |
|  0%   47C    P8              16W / 250W |  23022MiB / 24576MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A       869      C   python3                                   24160MiB |
|    1   N/A  N/A       869      C   python3                                   24102MiB |
|    2   N/A  N/A       869      C   python3                                   23016MiB |
+---------------------------------------------------------------------------------------+</code></pre><figcaption><p><span style="white-space: pre-wrap;">Meg</span></p></figcaption></figure><p>You may have noticed the TPD of each card is limited.  You are correct!  See, even tho I have enough total wattage in the power supplies to deliver enough oompf to each of these cards, I still need to have a governor on the power.  </p><p>With Nvidia cards in linux, this is fairly easy to do.  The same tool I used above to display GPU allocation can also control the hardware&apos;s capabilities.  I added these lines to the /etc/rc.local on each of the VMs with GPUs:</p><pre><code class="language-bash">#!/bin/sh -e

nvidia-smi -pm 1
nvidia-smi -pl 250
nvidia-smi -gtt 75

exit 0</code></pre><p>At boot, this script enables the power management on the cards, limits their total power draw to 250w (125 for the 1080), and sets a thermal limiter at 75c.  The driver is smart enough to modulate the clock speed and power draw of the chip to maintain these limits without exceeding.  So far, this has worked a treat.</p><p>This might seem like a bit of trouble.  It is because of my house wiring.<br>If you do a quick bit of math, you can see that my GPUs can top out at around 1125w for all 5 combined.  This is because the outlet the rack is plugged into can currently only supply 20 amps before popping the breaker.  Further, my house only has 100a to split between everything, and to say &quot;everything&quot; consumes a lot of power would be more or less correct.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/PXL_20240923_173457946_reasonably_sized.png" class="kg-image" alt="Unimatrix (Part 3)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/09/PXL_20240923_173457946_reasonably_sized.png 600w, https://dzw.zentormey.com/content/images/2024/09/PXL_20240923_173457946_reasonably_sized.png 638w"><figcaption><span style="white-space: pre-wrap;">Soon...</span></figcaption></figure><p>Thankfully, the electrician I hired to upgrade the house service to 200 amps also ran a new 30 amp outlet to my server closet.</p><p>Once these two upgrades are complete, I should be able to remove the governors and let the GPUs consume their full power.  If nothing else, this should help a bit with my heating bill this winter.</p><p>I picked up  a second 750w SPF power supply that I plan to install during the expected down time while my house power is offline during the upgrade.  This should allow me to move (2) of the 3090s to each of the 750w power supplies, leaving the main 1200w power supply to run the rest of the system and, eventually, the RTX 5090 that will take the spot the 1080ti is in now.</p>]]></content:encoded></item><item><title><![CDATA[Matrix Lights]]></title><description><![CDATA[An obvious application for these became clear when I figured out how to render fonts on them.]]></description><link>https://dzw.zentormey.com/matrix-lights/</link><guid isPermaLink="false">6691a7e613ea4106acfccc61</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><category><![CDATA[automation]]></category><category><![CDATA[sensors]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Mon, 23 Sep 2024 12:59:53 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210411710-1.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="bendy-retired">Bendy  (retired)</h2><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210411710-1.jpg" alt="Matrix Lights"><p>Bendy was just a flexible matrix panel and a piece of diffuser plastic scavenged from an old LCD. I flexed the plastic into a curve and tucked it between some books. The spacing in front of the panel is sufficient to give a nice effect.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/bendy_3_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/bendy_3.mp4" poster="https://img.spacergif.org/v1/768x1024/0a/spacer.png" width="768" height="1024" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/bendy_3_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:05</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Not bad for just setting it on a shelf.</span></p></figcaption>
        </figure><p>I didn&apos;t keep this one around for very long, it was just a proof of concept.  Some of the effects it ran were kind of neat, but I would go on to do better things with the hardware.</p><h2 id="clocks">Clocks</h2><p>An obvious application for these became clear when I figured out how to render fonts on them.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/matrix_test_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/matrix_test.mp4" poster="https://img.spacergif.org/v1/3840x2160/0a/spacer.png" width="3840" height="2160" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/matrix_test_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:21</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Why, how do you test your LEDs?</span></p></figcaption>
        </figure><p>That out of the way, I split the marque up into pieces and turned each of them into a clock. I&apos;ve tinkered with the firmware on these quite a bit over the years.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20230322_173718572.MP.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20230322_173718572.MP.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20230322_173718572.MP.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20230322_173718572.MP.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20230322_173718572.MP.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">An early version of the clock from before I added the acrylic. This one used a 3D Printed diffuser.</span></figcaption></figure><p>The current feature set is something like this:</p><ul><li>Displays the current time for four seconds</li><li>Displays today&apos;s date for two seconds</li><li>Indicates the day of the week passively while the above screens are active</li><li>Once per minute, display the current temperature for 4 seconds</li><li>Once per minute, display today&apos;s high/low temperatures for 4 seconds</li></ul><p>Then, the following can happen via trigger:</p><ul><li>Display time remaining on kitchen timer</li><li>Flash a warning if we head to the bedroom for the evening and any of the doors or garage doors are open.</li><li>Flashes a warning when any of the exterior doors open or close</li><li>If a family member has left work and is heading home, flash a warning</li><li>If a family member is currently at one of several stores, flash a warning</li><li>Display the title of any currently playing media (currently limited to music, movies, TV shows, steam games, and emulated games) in the current room when it begins playing</li><li>Flashes a warning if a squirrel or deer is recognized in the back yard by the deck</li><li>Displays reminders of any active events that day (pulling from home assistant)</li><li>Sends a good morning or good evening message around sunrise / sunset when the house changes modes</li><li>Provides a bluetooth proxy to Home Assistant for each room they are installed in (which is all of them, save for the bathrooms).</li></ul><p>Additionally, they automatically adjust their brightness setting throughout the day so they are visible in sunlight and not blinding at night.</p><p>They also have temperature, motion, and luminosity sensors connected which feed into home assistant.</p><p>These were at one point a mishmash. Each one was built a little differently. A couple years ago, I got sick of having to update each one by hand and I standardized them. They all have identical hardware and software now, and just ask where they are installed when they boot up. Additionally, I picked out sensors that were 5v tolerant so I didn&apos;t have to step down the voltage.</p><p>Each one is built with the following:</p><ul><li>ESP32</li><li>Flexible WS2812b matrix (8x32)</li><li>Dallas one-wire DS18B20 temp sensor</li><li>Aliexpress PIR sensor with motion and light outputs</li><li>3d Printed snap fit matrix stencil (this is a gridwork that snaps around the matrix to separate the lights from each other, so they appear as pixels)</li><li>13&quot; x 3-1/2&quot; Black LED Acrylic for the faceplate</li><li>Two black elastic hair bands to attach the acrylic</li><li>USB cable and 5v power supply</li></ul><p>These guys provide a basic sensor package to home assistant for each room (bluetooth, occupancy, motion, temperature, illumination) as well as providing sensor output passively to the household.</p><p>They are one of those things that you don&apos;t notice at all when they are working well, but you REALLY notice when they are not.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/07/ulE_cKqCTd-kO6UOWOy84A.jpg" width="2000" height="1125" loading="lazy" alt="Matrix Lights" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/ulE_cKqCTd-kO6UOWOy84A.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/ulE_cKqCTd-kO6UOWOy84A.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/ulE_cKqCTd-kO6UOWOy84A.jpg 1600w, https://dzw.zentormey.com/content/images/size/w2400/2024/07/ulE_cKqCTd-kO6UOWOy84A.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/07/tKkfhhY5SEK3JqpBGFM_qQ.jpg" width="2000" height="1125" loading="lazy" alt="Matrix Lights" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/tKkfhhY5SEK3JqpBGFM_qQ.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/tKkfhhY5SEK3JqpBGFM_qQ.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/tKkfhhY5SEK3JqpBGFM_qQ.jpg 1600w, https://dzw.zentormey.com/content/images/size/w2400/2024/07/tKkfhhY5SEK3JqpBGFM_qQ.jpg 2400w" sizes="(min-width: 720px) 720px"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/07/FUCJ4eD6TPiUaLWuZ4jSBA.jpg" width="2000" height="1125" loading="lazy" alt="Matrix Lights" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/FUCJ4eD6TPiUaLWuZ4jSBA.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/FUCJ4eD6TPiUaLWuZ4jSBA.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/FUCJ4eD6TPiUaLWuZ4jSBA.jpg 1600w, https://dzw.zentormey.com/content/images/size/w2400/2024/07/FUCJ4eD6TPiUaLWuZ4jSBA.jpg 2400w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption><p><span style="white-space: pre-wrap;">A few examples of screens these clocks have. They can also scroll text when needed.</span></p></figcaption></figure><h2 id="matrix">Matrix</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20230511_005034312.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20230511_005034312.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/08/PXL_20230511_005034312.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/08/PXL_20230511_005034312.jpg 1600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20230511_005034312.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A picture of a weeping angel becomes a weeping angel.</span></figcaption></figure>
<!--kg-card-begin: html-->
<center><h3>Behold, as I discover the SECOND DIMENSION</h3><center>
<!--kg-card-end: html-->
<p>This was my first attempt at making a 2d matrix art board. This one is 4 of the same 8x32 panels I used for the clocks, with a similar grid diffuser to give it a pixelated look.</p><p>I did two versions of this (the other is listed separately, below), one with the pixelated diffuser and one without. They run completely different effect stacks which take advantage of each of their designs.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/matrix.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/matrix.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/matrix.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/matrix.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/matrix.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">If you squint and tilt your head, you can almost make it out.</span></figcaption></figure><p>I essentially have a 32x32 resolution screen to play with. I&apos;ve converted a few images (like the bastardization of Edvard Munch&apos;s &apos;The Scream&apos; above - it works better at a distance) into pixelmaps, and it will rotate through a bunch of them, but I mostly focused on working with 2d animations. </p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/matrix__thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/matrix_.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/matrix__thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">This is just after I put it together, but before I decided to get black acrylic for the face.</span></p></figcaption>
        </figure><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/matrix__black_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/matrix__black.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/matrix__black_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:05</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">A short animation after I added the acrylic</span></p></figcaption>
        </figure><h2 id="upgrades">Upgrades</h2><p>So of course after I got the matrix code working well, I had to run around the house looking for any &quot;older&quot; projects that had an array of LEDs that could be convinced to represent themselves in an X/Y sort of way.  I had a few.  <a href="https://dzw.zentormey.com/frame/" rel="noreferrer">Frame</a> was an obvious contender, the strips in that were basically a matrix already.  I didn&apos;t have to adapt much in <a href="https://dzw.zentormey.com/honeycomb/" rel="noreferrer">Honeycomb</a>, either.   I tried playing around with 2d effects with my <a href="https://dzw.zentormey.com/panel_lights/" rel="noreferrer">Panel Lights</a>, but I never got anything I was happy with.  Taking a 2d image, turning it inside out, and just drawing the outline in color wasn&apos;t anywhere near cool enough to replace the effects I had already made for them.  Going forward, however, this would be a design consideration for future lights.</p><h2 id="bedroom-frame">Bedroom Frame</h2><p>Our bedroom has always gotten some of the cast offs lighting wise when compared to the rest of the house. It makes sense, I spend the least time there. With that in mind, I decided to put whichever of the matrix lights I liked better in the bedroom. It was definitely this one.</p><p>I made a few changes to the build plans for the second round of this build. First, I opted for (4) 16x16 panels, instead of the (4) 8x32 panels. This ended up not making a huge difference, but I had never used the square ones before, so it was decent excuse to try them out.</p><p>I also opted to not print a square pixel diffuser for this one. Instead, I found a scalable picture frame model on printables and modified it for my uses. It holds a piece of black LED acrylic, and a spacer. The matrix is attached to the wall, and the frame hung in front of it to create a throw distance of about an inch. This allows the light from the leds to blend before it contacts the diffuser, producing a much smoother image. This makes it terrible for pixel art, but amazing for other effects.</p><p>The other big difference was the controller. I traditionally utilize the venerable <a href="https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf">ESP8266</a> or its big brother the <a href="https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf">ESP32</a>. For this one, I needed a bit more beef, so I went with the <a href="https://www.pjrc.com/store/teensy41.html">Teensy 4.1</a>. This based on the recommendation of <a href="https://github.com/StefanPetrick" rel="noreferrer">Stefan Petrick</a>, who&apos;s temporal dithering code heavily inspired this build. I&apos;m actually using a few of his effects directly without a ton of modification.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/bedroom_frame_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/bedroom_frame.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/bedroom_frame_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">These videos are both from before I hung it up in our bedroom.</span></p></figcaption>
        </figure><p></p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/bedroom_frame_2_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/bedroom_frame_2.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/bedroom_frame_2_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">This light can grab your attention and hold it for minutes at a time.</span></p></figcaption>
        </figure><h1 id="tetris-clock">Tetris Clock</h1><figure class="kg-card kg-image-card"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210350950.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20240712_210350950.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20240712_210350950.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20240712_210350950.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210350950.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><p>Shoutout to Tetris Clock, which is the first matrix I ever worked with, as well as being one of the first micro-controller projects I built.  That said, I didn&apos;t write the code, and all I did to &quot;build&quot; it was flash someone else&apos;s code to a micro-controller (this originally used an arduino, I ported the code to an esp8266 a few years later) and connect it to a P5 LED Sign Panel.  I can&apos;t find the code or my order for the panel anymore, so I don&apos;t have any other details to share, other than it has been happily dropping blocks to advance the time for more than 12 years.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210410899.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20240712_210410899.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20240712_210410899.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20240712_210410899.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210410899.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The diffuser is literally just a sheet of printer paper covered in packing tape.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210411710.jpg" class="kg-image" alt="Matrix Lights" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20240712_210411710.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20240712_210411710.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20240712_210411710.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_210411710.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">I could remake this much nicer now, but I keep it around to remind myself where I started</span></figcaption></figure><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
</center></center>]]></content:encoded></item><item><title><![CDATA[Hanging Globes]]></title><description><![CDATA[I was very much in the "No, why would it, and what are you doing in my bedroom?" category for all three of these questions a few years ago.  This light is how I went about fixing it. ]]></description><link>https://dzw.zentormey.com/hanging-globes/</link><guid isPermaLink="false">66c63c5099cd4c00d07eb4d9</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Tue, 10 Sep 2024 18:45:47 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174138851_reasonably_sized.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174138851_reasonably_sized.jpg" alt="Hanging Globes"><p>What does the ceiling above your bed look like?  You spend a good amount of time lying there.  Is it interesting?  Thought provoking?  Does it capture your attention?<br><br>I was very much in the &quot;No, why would it, and what are you doing in my bedroom?&quot; category for all three of these questions a few years ago.  Well, my answers have since evolved, and this light is how I went about it. </p><p>I built this light in or around March of 2021.  I know this because I found the receipt for the materials, dated late Feb of that year.  It was a year into the pandemic, vaccines were becoming available, we were all still shut in at home much of the time, and I decided it was time to pretty up the ceiling.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174012461_reasonably_sized.jpg" class="kg-image" alt="Hanging Globes" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174012461_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174012461_reasonably_sized.jpg 638w"><figcaption><span style="white-space: pre-wrap;">For some..wide..definitions of &apos;pretty&apos;, perhaps?</span></figcaption></figure><p>I don&apos;t actually recall the idea genesis for this lamp, which makes for a terrible build write-up.  What I do remember is that it was a few months after we had made the Tube Lights, and I was experimenting with different sorts of diffusers.</p><p>These lights are simple in design, just a clamshell crafting globe (<a href="https://www.amazon.com/gp/product/B0756L2QWZ/" rel="noreferrer">these</a>), diffuser material which varied per light, some 4-conductor wire, the controller (this one is on an esp8266), and a power supply to tie them together.  Each globe splits in half, and I cut a strip of about 16 LEDs to feed in and around whichever diffuser I stuffed into each one.<br><br>I used 4-conductor wire so that I could have each sphere independently connected via a terminal/manifold block, but still wire them in series.  (+5v, G, D+ and D-).  I ran the wires back to three manifolds mounted on the ceiling, which I conveniently forgot to take pictures of, but they are these:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/image.png" class="kg-image" alt="Hanging Globes" loading="lazy" width="418" height="468"><figcaption><span style="white-space: pre-wrap;">Power go in, Power go out.</span></figcaption></figure><p>The blocks are fed by a 5v 15a supply, also mounted on the ceiling.  This supply is overkill for just these lights, but it supplies some other projects as well.  For the data wires, I just removed the bridge from the manifold, and connected each globe in a Z pattern.</p><p>I made six globes total, two with each diffuser type.  Fiber Fill, Peanuts, and LCD Diffuser.</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174057975_reasonably_sized.jpg" width="638" height="480" loading="lazy" alt="Hanging Globes" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174057975_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174057975_reasonably_sized.jpg 638w"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174102007_reasonably_sized.jpg" width="638" height="480" loading="lazy" alt="Hanging Globes" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174102007_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174102007_reasonably_sized.jpg 638w"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174120879_reasonably_sized.jpg" width="638" height="480" loading="lazy" alt="Hanging Globes" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174120879_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174120879_reasonably_sized.jpg 638w"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174138851_reasonably_sized-1.jpg" width="361" height="480" loading="lazy" alt="Hanging Globes"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174129434_reasonably_sized.jpg" width="361" height="480" loading="lazy" alt="Hanging Globes"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174109974_reasonably_sized.jpg" width="638" height="480" loading="lazy" alt="Hanging Globes" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174109974_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174109974_reasonably_sized.jpg 638w"></div></div></div><figcaption><p><span style="white-space: pre-wrap;">The fiber fill came out the best. The peanuts are neat because you get a real sense of &apos;depth&apos; with them. The Diffuser material came out the least impressive. It has a &apos;hammered glass&apos; look, but doesn&apos;t wow like the others.</span></p></figcaption></figure><p>They are suspended on ceiling hooks with armature wire that I purchased for the purpose and ended up being VERY overkill.  These are so light, poster putty would have been enough.  Still, the hanging look is neat from underneath, and when the windows are open, the breeze can make them sway, so they are still hanging on the wire on hooks.</p><p>I wanted the wiring to be more &apos;organic&apos; looking, and less &apos;wires hanging on the ceiling&apos;, so I tried to route them in a branching pattern.  It was moderately successful.  I may wrap the wires to give them a more trunk-and-branch look in the future, but they are fine for now.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174044027_reasonably_sized.jpg" class="kg-image" alt="Hanging Globes" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174044027_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174044027_reasonably_sized.jpg 638w"><figcaption><span style="white-space: pre-wrap;">This is roughly the view from looking up from the pillow.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174021764_reasonably_sized.jpg" class="kg-image" alt="Hanging Globes" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240819_174021764_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240819_174021764_reasonably_sized.jpg 638w"><figcaption><span style="white-space: pre-wrap;">View from the foot of the bed.</span></figcaption></figure><p>This was a fun project, and definitely gives the room a &quot;different&quot; sort of look.  The patterns on these lights can work in sync, with effects flowing from one globe to another, or they can operate as six independent lights, each playing different effects.  I also have a mode set up where they can sync into <a href="https://dzw.zentormey.com/canvas/" rel="noreferrer">Canvas</a>, which is mounted on either side of the screen in our room, and share effects from those lights as well.  Both lights can also tie into the Hyperion setup in the same room, which makes for a neat effect! </p><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item><item><title><![CDATA[Amnimuls]]></title><description><![CDATA[Sort of like an elaborate AI version of the Telephone Game.  Normally this would be undesirable, but when I am looking for random variety, it can actually be a boon.]]></description><link>https://dzw.zentormey.com/amnimuls/</link><guid isPermaLink="false">66d6599e3b24cc00d03620a9</guid><category><![CDATA[art]]></category><category><![CDATA[artificial intelligence]]></category><category><![CDATA[fun]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Tue, 03 Sep 2024 20:37:40 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/09/ComfyUI_00921_.png" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/09/ComfyUI_00921_.png" alt="Amnimuls"><p>So one of the neat advantages of using language models to <a href="https://dzw.zentormey.com/automated-appreciation/" rel="noreferrer">assist</a> in art prompt expansion is that you can be relatively vague in your seed prompts.   You can be specific when you need to be, but if what you want is some variety over time, a simple seed prompt like, &apos;tragedy at the waterpark&apos; (for example) can result in a wide variety of images as your LLM scours latent space, coming up with all manner of trouble for your poor vacationers to endure.  <br>I recently switched <a href="https://dzw.zentormey.com/bob/">Bob</a>&apos;s main generation model over to <a href="https://huggingface.co/black-forest-labs/FLUX.1-dev" rel="noreferrer">Flux.1-dev</a>, which includes a <a href="https://en.wikipedia.org/wiki/T5_(language_model)" rel="noreferrer">T5 text encoder</a> model.  This potentiates the effect, by providing an additional point of inference with the seed prompt.  So I give a short vague prompt, Meg elaborates into a full art prompt, and Bob re-interprets that again when creating the art.  Sort of like an elaborate AI version of the <a href="https://en.wikipedia.org/wiki/Telephone_game" rel="noreferrer">Telephone Game</a>.  Normally this would be undesirable, but when I am looking for random variety, it can actually be a boon.</p><p>I put this technique to task this weekend when I developed Amnimuls mode for the Gallery.  Give it a shot, click the button below:</p>
<!--kg-card-begin: html-->
<script>
const oneA = ["Red","Yellow","Boob","Green","Blue","Polkadot","Hairy","Under","Long","Short","Ugly","Tiny","No","Robber","Fiber","Yarn","Knit","Crochet","Purple","Fat","Boob","Sparkle","Bacon","Nose","Duck","Sumo","Pidgeon","Yes","Pig","Duck","Trunk","Fluffy","Squishy","Cuddle","Snuggie","Foodle","Phallus","Four","Coffee","Mithril","Adamantium","Hairy","Furry","Dirty","Tasty"];
const oneB = ["Sparkled","Bellied","Billed","Brained","Bottomed","Ribbed","Yarned","Knitted","Crocheted","Knotted","Stained","Backed","Pickled","Flowered","Boned","Feathered","Scaled","Nose","Faced","Mouthed","Headed","Skinned","Armoured","Coloured","Favoured","Eaten","Toed","Nippled","Raisin","Jetted","Headed","Legged","Assed","Ass","Palmed","Fingered","Testicaled","Sphinctered","Muffin","Breasted","Spotted","Striped","Stripped","Hammed"];
const twoA = ["Fish","Swammy","Warble","Funkycold","Jelly","Lake","Blanket","Sleepingbag","Shit","Sky","Pit","Garbage","Swamp","Flower","Fart","Burp","Snore","Snot","Shagg","Shoggoth","Bacon","Titty","Suffi","Banga","Huffle","Grabby","Droppy","Droopy","Snarf","Thumba","Hump","Slipper","Yarn","Fiber","Silk","Thread","Ninny","Bronc","Flip","Stuff","Bone","Cabin","Fluff","Bonk","Butt"];
const twoB = ["swarmer","spinner","weaver","wumpus","spanner","twat","knitter","spitter","jammy","bong","wobbler","jammy","goo","twister","seater","taster","oinker","bouncer","donger","jumper","boo","moo","weasel","frog","owl","bitch","head","barker","skitter","hatcher","squeeker","medina","doot","wammy","staffle","scratcher","breeder","booper","back","scale","nose","claw","brow","tail","seeker","song","boober"];
const middle = ["Satanic","Angry","Masturbating","Horny","Hungry-Hungry","Hotdog","Weaving","Spinning","Soaked","Moist","Wet","Dry","Finger-Licking","Spawning","Cinnamin","Parasitic","Booby","Caffinated","Tasselled","Screaming","Fried-Egg","Common-Name","Borrowed","Married","Harem","Puppet","Lantern","Exploding","Meringue","Hurricane","Glowing","Invisible","Lighthouse","Flashlight","Vibrating","Blowjob","Sparkling","Flying","Burrowing","Humping","Motorboating","Floating","Mimicing"];
const action = ["looking for food","attracting a mate","doing its dance","performing for its peers","hunting in packs","living a solitary life","hides under the covers","in its natural habitat","in an unfamiliar place","playing gleefully","finding a new toy","meeting a new friend","putting the pussy on the chainwax","in a mating ritual","spinning a web","making a nest","receiving important training","guarding its young","abiding","knitting a sweater","marking its territory","flaunting its colors","displaying dominance","using its psychic powers","casting a spell","getting an education","providing for its family","with its fall coat","playing with friends","being adorable","with its natural best friend","cleaning itself","preening itself","reaching for a bite","trapped under this jar","in a glass sphere","in this terrarium","in this habitat","in this diarama","in its natural state","doing what tiggers do best","served whole, with rice and wine","running a fortune 500 company","in its nest","tumbling over a waterfall"];
const adj = ["Ferocious","Adorable","Poisonous","Infectious","Contagious","Predatory","Kawaii","Cute-and-Lovable","Mysterious","Ancient","Alien","Delicious","Curious","Harmless","Accident-Prone","Endearing","Teensy-Tiny","Gigantic","Oversized","Apex-Predator","Invincible","Lovecraftian","Apocalyptic","Misunderstood","Vulnerable","Suess","Big-Boobed","Comical","Photogenic","Highly-detailed","disected","main-course,"];

function generateSentence() {
  const wordOneA   = oneA[Math.floor(Math.random() * oneA.length)];
  const wordOneB   = oneB[Math.floor(Math.random() * oneB.length)];
  const wordTwoA   = twoA[Math.floor(Math.random() * twoA.length)];
  const wordTwoB   = twoB[Math.floor(Math.random() * twoB.length)];
  const wordMiddle = middle[Math.floor(Math.random() * middle.length)];
  const wordAction = action[Math.floor(Math.random() * action.length)];
  const wordAdj    = adj[Math.floor(Math.random() * adj.length)];
  
  const sentence = `a farcical animal, the ${wordAdj} ${wordOneA}-${wordOneB} ${wordMiddle} ${wordTwoA}${wordTwoB} seen here ${wordAction}`;
  document.getElementById("output").innerText = sentence;
}
</script>
<button onclick="generateSentence()">Generate Sentence</button>
<div id="output"></div>
<!--kg-card-end: html-->
<p>This is another <a href="https://en.wikipedia.org/wiki/Mad_Libs">mad-libs</a> style prompt, this time with six different slots to fill.  They are:</p><pre><code class="language-javascript">const oneA = [&quot;Red&quot;, &quot;Yellow&quot;, &quot;Boob&quot;, &quot;Green&quot;, &quot;Blue&quot;, &quot;Polkadot&quot;, &quot;Hairy&quot;, &quot;Under&quot;, &quot;Long&quot;, &quot;Short&quot;, &quot;Ugly&quot;, &quot;Tiny&quot;, &quot;No&quot;, &quot;Robber&quot;, &quot;Fiber&quot;, &quot;Yarn&quot;, &quot;Knit&quot;, &quot;Crochet&quot;, &quot;Purple&quot;, &quot;Fat&quot;, &quot;Boob&quot;, &quot;Sparkle&quot;, &quot;Bacon&quot;, &quot;Nose&quot;, &quot;Duck&quot;, &quot;Sumo&quot;, &quot;Pidgeon&quot;, &quot;Yes&quot;, &quot;Pig&quot;, &quot;Duck&quot;, &quot;Trunk&quot;, &quot;Fluffy&quot;, &quot;Squishy&quot;, &quot;Cuddle&quot;, &quot;Snuggie&quot;, &quot;Foodle&quot;, &quot;Phallus&quot;, &quot;Four&quot;, &quot;Coffee&quot;, &quot;Mithril&quot;, &quot;Adamantium&quot;, &quot;Hairy&quot;, &quot;Furry&quot;, &quot;Dirty&quot;, &quot;Tasty&quot;];
const oneB = [&quot;Sparkled&quot;, &quot;Bellied&quot;, &quot;Billed&quot;, &quot;Brained&quot;, &quot;Bottomed&quot;, &quot;Ribbed&quot;, &quot;Yarned&quot;, &quot;Knitted&quot;, &quot;Crocheted&quot;, &quot;Knotted&quot;, &quot;Stained&quot;, &quot;Backed&quot;, &quot;Pickled&quot;, &quot;Flowered&quot;, &quot;Boned&quot;, &quot;Feathered&quot;, &quot;Scaled&quot;, &quot;Nose&quot;, &quot;Faced&quot;, &quot;Mouthed&quot;, &quot;Headed&quot;, &quot;Skinned&quot;, &quot;Armoured&quot;, &quot;Coloured&quot;, &quot;Favoured&quot;, &quot;Eaten&quot;, &quot;Toed&quot;, &quot;Nippled&quot;, &quot;Raisin&quot;, &quot;Jetted&quot;, &quot;Headed&quot;, &quot;Legged&quot;, &quot;Assed&quot;, &quot;Ass&quot;, &quot;Palmed&quot;, &quot;Fingered&quot;, &quot;Testicaled&quot;, &quot;Sphinctered&quot;, &quot;Muffin&quot;, &quot;Breasted&quot;, &quot;Spotted&quot;, &quot;Striped&quot;, &quot;Stripped&quot;, &quot;Hammed&quot;];
const twoA = [&quot;Fish&quot;, &quot;Swammy&quot;, &quot;Warble&quot;, &quot;Funkycold&quot;, &quot;Jelly&quot;, &quot;Lake&quot;, &quot;Blanket&quot;, &quot;Sleepingbag&quot;, &quot;Shit&quot;, &quot;Sky&quot;, &quot;Pit&quot;, &quot;Garbage&quot;, &quot;Swamp&quot;, &quot;Flower&quot;, &quot;Fart&quot;, &quot;Burp&quot;, &quot;Snore&quot;, &quot;Snot&quot;, &quot;Shagg&quot;, &quot;Shoggoth&quot;, &quot;Bacon&quot;, &quot;Titty&quot;, &quot;Suffi&quot;, &quot;Banga&quot;, &quot;Huffle&quot;, &quot;Grabby&quot;, &quot;Droppy&quot;, &quot;Droopy&quot;, &quot;Snarf&quot;, &quot;Thumba&quot;, &quot;Hump&quot;, &quot;Slipper&quot;, &quot;Yarn&quot;, &quot;Fiber&quot;, &quot;Silk&quot;, &quot;Thread&quot;, &quot;Ninny&quot;, &quot;Bronc&quot;, &quot;Flip&quot;, &quot;Stuff&quot;, &quot;Bone&quot;, &quot;Cabin&quot;, &quot;Fluff&quot;, &quot;Bonk&quot;, &quot;Butt&quot;];
const twoB = [&quot;swarmer&quot;, &quot;spinner&quot;, &quot;weaver&quot;, &quot;wumpus&quot;, &quot;spanner&quot;, &quot;twat&quot;, &quot;knitter&quot;, &quot;spitter&quot;, &quot;jammy&quot;, &quot;bong&quot;, &quot;wobbler&quot;, &quot;jammy&quot;, &quot;goo&quot;, &quot;twister&quot;, &quot;seater&quot;, &quot;taster&quot;, &quot;oinker&quot;, &quot;bouncer&quot;, &quot;donger&quot;, &quot;jumper&quot;, &quot;boo&quot;, &quot;moo&quot;, &quot;weasel&quot;, &quot;frog&quot;, &quot;owl&quot;, &quot;bitch&quot;, &quot;head&quot;, &quot;barker&quot;, &quot;skitter&quot;, &quot;hatcher&quot;, &quot;squeeker&quot;, &quot;medina&quot;, &quot;doot&quot;, &quot;wammy&quot;, &quot;staffle&quot;, &quot;scratcher&quot;, &quot;breeder&quot;, &quot;booper&quot;, &quot;back&quot;, &quot;scale&quot;, &quot;nose&quot;, &quot;claw&quot;, &quot;brow&quot;, &quot;tail&quot;, &quot;seeker&quot;, &quot;song&quot;, &quot;boober&quot;];
const middle = [&quot;Satanic&quot;, &quot;Angry&quot;, &quot;Hungry-Hungry&quot;, &quot;Hotdog&quot;, &quot;Weaving&quot;, &quot;Spinning&quot;, &quot;Soaked&quot;, &quot;Moist&quot;, &quot;Wet&quot;, &quot;Dry&quot;, &quot;Finger-Licking&quot;, &quot;Spawning&quot;, &quot;Cinnamin&quot;, &quot;Parasitic&quot;, &quot;Booby&quot;, &quot;Caffinated&quot;, &quot;Tasselled&quot;, &quot;Screaming&quot;,  &quot;Horny&quot;, &quot;Fried-Egg&quot;, &quot;Common-Name&quot;, &quot;Borrowed&quot;, &quot;Married&quot;, &quot;Harem&quot;, &quot;Puppet&quot;, &quot;Lantern&quot;, &quot;Exploding&quot;, &quot;Meringue&quot;, &quot;Hurricane&quot;, &quot;Glowing&quot;, &quot;Invisible&quot;, &quot;Masturbating&quot;, &quot;Lighthouse&quot;, &quot;Flashlight&quot;, &quot;Vibrating&quot;, &quot;Sparkling&quot;, &quot;Flying&quot;, &quot;Burrowing&quot;, &quot;Humping&quot;, &quot;Motorboating&quot;, &quot;Floating&quot;, &quot;Mimicing&quot;];
const action = [&quot;looking for food&quot;, &quot;attracting a mate&quot;, &quot;doing its dance&quot;, &quot;performing for its peers&quot;, &quot;hunting in packs&quot;, &quot;living a solitary life&quot;, &quot;hides under the covers&quot;, &quot;in its natural habitat&quot;, &quot;in an unfamiliar place&quot;, &quot;playing gleefully&quot;, &quot;finding a new toy&quot;, &quot;meeting a new friend&quot;, &quot;putting the pussy on the chainwax&quot;, &quot;in a mating ritual&quot;, &quot;spinning a web&quot;, &quot;making a nest&quot;, &quot;receiving important training&quot;, &quot;guarding its young&quot;, &quot;abiding&quot;, &quot;knitting a sweater&quot;, &quot;marking its territory&quot;, &quot;flaunting its colors&quot;, &quot;displaying dominance&quot;, &quot;using its psychic powers&quot;, &quot;casting a spell&quot;, &quot;getting an education&quot;, &quot;providing for its family&quot;, &quot;with its fall coat&quot;, &quot;playing with friends&quot;, &quot;being adorable&quot;, &quot;with its natural best friend&quot;, &quot;cleaning itself&quot;, &quot;preening itself&quot;, &quot;reaching for a bite&quot;, &quot;trapped under this jar&quot;, &quot;in a glass sphere&quot;, &quot;in this terrarium&quot;, &quot;in this habitat&quot;, &quot;in this diarama&quot;, &quot;in its natural state&quot;, &quot;doing what tiggers do best&quot;, &quot;served whole, with rice and wine&quot;, &quot;running a fortune 500 company&quot;, &quot;in its nest&quot;, &quot;tumbling over a waterfall&quot;];
const adj = [&quot;Ferocious&quot;, &quot;Adorable&quot;, &quot;Poisonous&quot;, &quot;Infectious&quot;, &quot;Contagious&quot;, &quot;Predatory&quot;, &quot;Kawaii&quot;, &quot;Cute-and-Lovable&quot;, &quot;Mysterious&quot;, &quot;Ancient&quot;, &quot;Alien&quot;, &quot;Delicious&quot;, &quot;Curious&quot;, &quot;Harmless&quot;, &quot;Accident-Prone&quot;, &quot;Endearing&quot;, &quot;Teensy-Tiny&quot;, &quot;Gigantic&quot;, &quot;Oversized&quot;, &quot;Apex-Predator&quot;, &quot;Invincible&quot;, &quot;Lovecraftian&quot;, &quot;Apocalyptic&quot;, &quot;Misunderstood&quot;, &quot;Vulnerable&quot;, &quot;Suess&quot;, &quot;Big-Boobed&quot;, &quot;Comical&quot;, &quot;Photogenic&quot;, &quot;Highly-detailed&quot;, &quot;disected&quot;, &quot;main-course,&quot;];</code></pre><p></p><p>The script just builds a new creature name out of these arrays when you push the button.  I found giving the creature a demeanor (the &apos;adj&apos; array) and a task (the &apos;action&apos; array) gave Meg a bit more to chew on when describing the creature.  Here are some examples of what she came up with:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_09-43-46_reasonably_sized.png" class="kg-image" alt="Amnimuls" loading="lazy" width="271" height="480"><figcaption><span style="white-space: pre-wrap;">The Kawaii hairy-nippled Hotdog Snotnose</span></figcaption></figure><p>Meg&apos;s Description: image of a kawaii furry hot dog creature with nipple hair. The background should be simple and clean. The colors are Tangerine Orange, Emerald Green, Cobalt Blue. The hotdog snotnose should have a big grin on its face and should be wearing sunglasses that match the color scheme. Its body is hairy, but it has tufts of hair around its nipples.I want the creature to be the star, so dont include any other elements besides what I described. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_09-48-52_reasonably_sized.png" class="kg-image" alt="Amnimuls" loading="lazy" width="271" height="480"><figcaption><span style="white-space: pre-wrap;">The Curious sparkle-boned Tasselled Snarfsqueeker </span></figcaption></figure><p>Meg&apos;s Description: A curious creature with tangerine orange fur,Emerald eyes that sparkle and gleam.Cobalt blue tassels sprout from each ear,Snuffling, squeaking, dancing through the scene.Farcical and silly this critter appears,Flaunting its hues to attract a mate.In the forest glade it frolics with glee,The Snarfsqueekers antics never abate.Sparkle-bone skeleton shines from within,A magical creature, both strange and divine. Behold the Tassled Snarfsqueeker in all its might!An absurd wonder to behold with eyes bright!Prompt: Sparkle bone tassled snarfsqueeker creature with tangerine orange fur, emerald green sparkly eyes and cobalt blue ear tassels. Silly farcical expression, dancing pose. Magic sparkle-bone skeleton visible beneath translucent skin. Forest glade background. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_19-52-31_reasonably_sized.png" class="kg-image" alt="Amnimuls" loading="lazy" width="271" height="480"><figcaption><span style="white-space: pre-wrap;">The disected Fat-Knotted Exploding Swammytwister</span></figcaption></figure><p>Meg&apos;s Description: Bob, I need you to create an absurdist artwork based on the following prompt:Theme: A disfigured animal called the Fat-Knotted Exploding Swammytwister searching for food. Color Palette: Tangerine Orange, Emerald Green, Cobalt BlueInclude these elements:- Warped shapes and colors - Trippy hallucinogenic visuals- Punk rock flyers taped to the background walls- An ice blast emanating from somewhere in the scene- Glitter makeup on the animals face- Bright glowing color effects - Sprinkles of avocado on the groundThe style should be bizarre, psychedelic and over-the-top. Really push the boundaries! I want this piece to look completely wild and surreal.Title: The Fat-Knotted Exploding Swammytwisters Trippy Hunger Quest. Got it? Now get drawing! Lets make Amy proud with a truly mind-bending work of art.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_15-06-08_reasonably_sized.png" class="kg-image" alt="Amnimuls" loading="lazy" width="271" height="480"><figcaption><span style="white-space: pre-wrap;">The Accident-Prone Purple-Palmed Motorboating Huffleknitter</span></figcaption></figure><p>Meg&apos;s Description: a Huffleknitter, looking quite silly, motorboating a large pair of faux breasts while surrounded by its peers who look on in bemusement. The Huffleknitter has an accident-prone look about it, with bandages and bruises visible. Its palms are a vivid purple color that contrasts with the orange fur covering most of its body. In the background, green foliage and blue skies set the scene for this absurd display in a whimsical forest setting. The Huffleknitters peers appear to be various anthropomorphic animal creatures, each one looking on with a unique expression of confusion or amusement at their friends antics. Lets make it funny and silly while still being visually appealing!</p><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_10-05-07_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_10-22-05_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_13-41-27_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_14-52-16_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_16-11-23_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_16-31-07_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_17-11-44_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_17-21-14_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_17-52-13_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div></div></div><figcaption><p><span style="white-space: pre-wrap;">1. The Ugly-skinned Floating Tittysqueeker. 2. Furry-Ribbed Swampjammy 3. Four-Bellied Harem Snorebooper 4. The Phallus Breated Angry Tittybowwow 5. Yes-Ribbed Spinning Flowerbreeder 6. Long-nosed Sparkling Bonespitter 7. Poisonous Tasy-Armoured Weaving Yarntwister 8. No-Brained Mimicing Fluffswarming 9. Robber-Boned Parasitic Flipjumper</span></p></figcaption></figure><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_18-27-30_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_18-33-03_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_21-12-47_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div></div><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_21-22-33_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_21-43-11_reasonably_sized.png" width="271" height="480" loading="lazy" alt="Amnimuls"></div><div class="kg-gallery-image"><img src="https://dzw.zentormey.com/content/images/2024/09/2024-09-02_22-12-28.png" width="768" height="1360" loading="lazy" alt="Amnimuls" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/09/2024-09-02_22-12-28.png 600w, https://dzw.zentormey.com/content/images/2024/09/2024-09-02_22-12-28.png 768w" sizes="(min-width: 720px) 720px"></div></div></div><figcaption><p><span style="white-space: pre-wrap;">1. Trunk-Knotted Floating Bonknose 2. Ancient Fat-Testicled Parasitic Humpspitter 3. Long-Jetted Exploding Bonkwumpus 4. the Misunderstood Yellow Fingered Bangascratcher 5. Pig-muffin Mimicing Shaggsong 6. Purple Fingered Blowjob Slipperseeker</span></p></figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Mushroom (Mushroom!)]]></title><description><![CDATA[I like the easy ones. This one was fun, and looks neat.]]></description><link>https://dzw.zentormey.com/mushroom/</link><guid isPermaLink="false">6691a6d013ea4106acfccc4d</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Thu, 22 Aug 2024 14:42:45 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_215849094.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_215849094.jpg" alt="Mushroom (Mushroom!)"><p>This is a little one off I made as a gift for Amy. I found the model while looking for something unrelated and I thought it would make a cool light. Since I already had all of the parts in my workshop, it took less than half an hour to make once the print finished.</p><p>It is just an LED ring under the mushroom dome, with a D1 mini sandwiched between that and the stem piece. The cord comes out a gap in the bottom and goes to a usb plug.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/mushroom__thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/mushroom_.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/mushroom__thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">He&apos;s just a little guy</span></p></figcaption>
        </figure><p>I like the easy ones. This one was fun, and looks neat.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_215911610.jpg" class="kg-image" alt="Mushroom (Mushroom!)" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20240712_215911610.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20240712_215911610.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20240712_215911610.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_215911610.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The wire is to secure the led ring to the top. The rest is held together by hot glue.</span></figcaption></figure><p>I don&apos;t recall when exactly I built this, I would guess sometime around 2019 or 2000.  It doesn&apos;t do much to illuminate the room, but it looks nice sitting on the shelf.</p><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item><item><title><![CDATA[Fancy Frame]]></title><description><![CDATA[This is the project that convinced me that soldering is something I know how to do and can do, but is not something I really enjoy.]]></description><link>https://dzw.zentormey.com/fancy-frame/</link><guid isPermaLink="false">6691a62913ea4106acfccc33</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Mon, 19 Aug 2024 15:08:32 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/fancyframe-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/07/fancyframe-1.jpg" alt="Fancy Frame"><p>Fancy Frame was the evolution and unholy combination of what I did with <a href="https://dzw.zentormey.com/canvas/" rel="noreferrer">Canvas</a> and the <a href="https://dzw.zentormey.com/untitled-3/" rel="noreferrer">other</a> <a href="https://dzw.zentormey.com/honeycomb/" rel="noreferrer">Frame</a> projects. It utilizes the same 3d printed base and black acrylic diffuser of the Circle Frame and Honeycomb lights, but it has the individual 3d printed stencil shapes from Canvas. In fact, they are the exact shapes - I built Fancy Frame almost entirely out of leftover pieces from the other projects.  (I did buy the LEDs)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/FancyFrame.jpg" class="kg-image" alt="Fancy Frame" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/FancyFrame.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/FancyFrame.jpg 638w"><figcaption><span style="white-space: pre-wrap;">Not bad for an upcycle.</span></figcaption></figure><p>I took some lessons from the previous projects and wired the LEDs differently in this one. No LED Strips! Each LED in this was hand soldered and wired (and I will not be doing that again). This is the project that convinced me that soldering is something I know how to do and can do, but is not something I really enjoy. If you have never worked with WS2812b before, they take at least 4 connections per LED (power in, ground in, data in, data out). That is if you wire them in parallel. I, unfortunately, wanted them in series.  I wanted to  reduce the wire clutter in the cramped space, which increased the job to 6 connections to each LED. These are pinky-nail sized LEDs (<a href="https://www.amazon.com/gp/product/B01D1FFVOA/">these, if you are curious</a>). I cannot express how long of a slog this was. (and this is coming from someone who has hand wired a keyboard).</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/fancy_frame_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/fancy_frame.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/fancy_frame_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">This guy is fun to watch.</span></p></figcaption>
        </figure><p>Still, you can&apos;t argue much with the end result. Not using rigid rows of LEDs allowed me to be much more free and organic with the ordering and placement of them. Gone are the columns and rows which are obvious (to me anyway) in the previous iterations.  The control path being random looking means your eyes don&apos;t &quot;see&quot; the path as clearly, and you mind doesn&apos;t naturally predict the next light, which leads to a feel of artificiality.  If I were to make one to sell as a product, it might resemble this. (and someone else would solder it!)</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/08/fancyframe_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/08/fancyframe.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/08/fancyframe_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:13</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Cool in the dark, too.</span></p></figcaption>
        </figure><p>Of course, the down side of the organic flows of light is that I never got a satisfactory matrix built on this one.  It didn&apos;t need it, but that didn&apos;t stop me from trying.</p><p>I think the success if this one is due to a few factors - the variety of shapes that illuminate, for one.  That is a lesson I carried forward.  Additionally, I think control path through the panel has a lot to do with it.  </p><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item><item><title><![CDATA[Unimatrix (Part 2)]]></title><description><![CDATA[It would allow me to make use of idle resources, use more efficient power, and consolidate everything into a single place.  It also meant a ton of software work, re-configuring all of my existing services.  Joy.]]></description><link>https://dzw.zentormey.com/unimatrix-part-2/</link><guid isPermaLink="false">668f3ac713ea4106acfcc783</guid><category><![CDATA[computers]]></category><category><![CDATA[artificial intelligence]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Fri, 16 Aug 2024 19:47:24 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/output_2024-07-10_20-57-06.png" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/07/output_2024-07-10_20-57-06.png" alt="Unimatrix (Part 2)"><p>(This post is a followup to <a href="https://dzw.zentormey.com/unimatrix-part-1/" rel="noreferrer">Unimatrix</a>).</p><p><a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/PreviouslyOn">When we last left our heroes</a>, the network switch had been installed, and parts were being ordered for what would be a pretty major build.  I am no stranger to assembling computers by hand.  (I built my first PC from parts sometime around 1992).  I hadn&apos;t delved too far into enterprise gear yet, however.  Turns out, it is just more of the same, and the old muscle memory works just fine.  With one exception - <a href="https://pcpartpicker.com/" rel="noreferrer">PC PartPicker</a> doesn&apos;t do much with enterprise parts, so I would be building this one the old fashioned way, lots of meticulous research.</p><p>My original plan was to build out two servers.  One would handle all of the automation tasks, the security system, the media fetchers, and other various containers, services, and self hosted whatsits while the other would be tasked with the AI generation tasks.   After all, the hardware they need for their given tasks is pretty dissimilar.<br><br>It made sense to me at the time, but the more I thought about it and priced out components,  the more I started leaning towards a single bigger server.  It would allow me to make use of idle resources, use more efficient power, and consolidate everything into a single place.  It also meant a ton of software work, re-configuring all of my existing services.  Joy.</p>
<!--kg-card-begin: html-->
<table style="-webkit-box-shadow: none;-moz-box-shadow: none;box-shadow: none;white-space: normal;">
<thead>
<tr>
<th style="width:8%">Part</th>
<th style="width:25%">Selection</th>
<th style="width:25%">Description</th>
</tr> 
</thead>
<tbody>
<tr><td> CPU0 </td><td> <a href="https://www.cpubenchmark.net/cpu.php?cpu=AMD+EPYC+7F52&amp;id=3753">Epyc 7F52</a> </td><td> It is second hand from a datacenter pull, and a bit power hungry, but it was cheap and has 128 PCIe lanes.  I will likely swap this out for a Milan chip next year when the used price comes down.</td></tr>
<tr><td> MOBO </td><td> <a href="https://www.supermicro.com/en/products/motherboard/h12ssl-i">Supermicro H12SSL-I</a> </td><td> I like this board a lot.  It has all sorts of fun features to play with.  Being able to adjust bios settins in a web browser over the LAN with the server offline is really useful.  Tons of room for expansion, and lots of connectivity.  Shame about the lack of built in SFP+ ports, but we can add those.  This was one of the few brand new parts I payed (almost) full price for, like a sucker.</td></tr>
<tr><td> RAM </td><td> 512gb (Half a <a href="https://dzw.zentormey.com/terb/">Terb</a>) DDR4-3200.</td><td>  I got these used off eBay.  Not cheap, but not too spendy.</td></tr>
<tr><td> GPU0 </td><td>GTX <a href="https://www.nvidia.com/en-gb/geforce/graphics-cards/">1080ti</a> </td><td> Frigate video decoding, Audio wake word detection from 17 camera feed audio streams, and two xtts servers.  For an old guy, he does all right.  This was the original 2nd GPU in Jim, before I picked up the second 3090.  I picked it up used on eBay last summer.  Still runs just fine.</td></tr>
<tr><td> GPU1 </td><td>EVGA <a href="https://www.evga.com/products/Specs/GPU.aspx?pn=e2763314-163f-4391-8935-ea2c5dffd06b">RTX 3090</a> </td><td>This one is used for the LLM Inference Server (currently <a href="https://github.com/ollama/ollama">Ollama</a>, but I swap it out for others based on need.  I got it used for about $700 when I built Jim last year.  I have it capped at 250W.  It runs a bit slower, but makes very little noise and stays cool (around 38C most of the time).</td></tr>
<tr><td> GPU2 </td><td>Dell/Alienware RTX 3090</td><td> This was also picked up used on eBay, to take strain off of the MSI card which doesn&apos;t handle high loads well.  It handles the Graphics Inference Server (A1111, Comfy, Forge, or Swarm based on need).  I also capped this one at 250W.</td></tr>
<tr><td> GPU3 </td><td><a href="https://us.msi.com/Graphics-card/GeForce-RTX-3090-GAMING-X-TRIO-24G">MSI RTX 3090</a> </td><td> This was purchased (also used) last year for Jim when I decided to upgrade to two GPUs.  When I moved the AI tasks to Unimatrix, this card went with it.  It works fine most of the time, but at significant loads (sustained 100% gpu load) it trips the power supply.  I haven&apos;t gotten around to troubleshooting this yet, so currently, this guy only takes overflow load from the EVGA card.</td></tr>
<tr><td> SSD0 </td><td>Intel 1.92terb U.2 SAS Enterprise SSD SSDPF2KX019T9N</td><td> I didn&apos;t know what <a href="https://en.wikipedia.org/wiki/Serial_attached_SCSI">SAS</a> or <a href="https://en.wikipedia.org/wiki/U.2">U.2</a> were before starting this build.  Cool tech.  The main reason I spent the extra on enterprise storage was sustained speeds and write cycles. </td></tr>
<tr><td> SSD1 </td><td>Intel 1.92terb U.2 SAS Enterprise SSD SSDPF2KX019T9N</td><td> I have two of these in a ZFS mirror for redundancy and read speeds.  It absolutely flies.  Combined with the fiber, moving big files around my network is very fast.</td></tr>
<tr><td> SSD2 </td><td>WD_BLACK SN850X 2000GB - M.2 NVME</td><td> I reluctantly picked up another SSD for model non-custom storage.  Models are all easily replaceable from the Internet if I have a drive failure, and having lots of models (mirrored) on my U.2 drives was proving to be unsustainable.  This is fast enough and reliable.</td></tr>
<tr><td> SSD3 </td><td>Samsung SSD 850 EVO 500GB - M.2 NVME</td><td> This was left over from a previous system, and still at 100% health.  At only 1/2 Terb, it can&apos;t hold much, but it is plenty big to hold an extra copy of critical data.</td></tr>
<tr><td> SSD4 </td><td>Intel 60GB SATAIII SSDSC2CW060A3</td><td> This was also just laying around collecting dust, so it is now providing a tiny amount of extra headroom.</td></tr>
<tr><td> NIC0 </td><td> Mellanox MCX312B (2x10gb/s)</td><td> This has two SFP+ ports, both have fiber running to Switch.  Once I realized how fast these links were, I disconnected the Ethernet.  You can get these used on eBay for a song.  Upgrading from copper to fiber has never been cheaper.</td></tr>
<tr><td>PSP0</td><td>1200w <a href="https://www.bequiet.com/en/powersupply/4108">Be Quiet Straight Power 12</a> ATX</td><td>I started the build with this one alone, but when I decided to add the third GPU, I knew this was never going to be enough.</td></tr>
<tr><td> PSP1 </td><td> 750w <a href="https://seasonic.com/focus-spx-2021/">Seasonic SPX Focus-750</a> SPX </td><td> I added this guy before I even finished the initial build.  I really like the SPX form factor.  This guy is adorable.</td></tr>
<tr><td>FANS</td><td> 2x 180mm intake fans<br>1x 140mm exhaust behind the CPU
<br>2x 80mm Noctua exhaust fans behind the PCI bay</td><td>the server runs pretty quietly.  You can&apos;t hear the 180mm fans at all.  When the load is high, you can hear the GPU fans over the case fans pretty easily.</td></tr>
<tr><td>CASE</td><td><a href="https://www.silverstonetek.com/en/product/info/server-nas/RM51/">Silverstone RM51</a></td><td>The case was where I splurged.  I wanted something rack mount, with slide rails, with enough verticality that I could load multiple GPUs (with their power connecors! sorry 4u cases) and still have a fairly &apos;neat&apos; design.  This case fit the bill, but the bill didn&apos;t fit my wallet very well.  I do really like it, though.</td></tr>
<tr><td> UPS0</td><td><a href="https://www.apc.com/us/en/product/SMX2000RMLV2UNC/apc-smartups-x-line-interactive-2000va-rack-tower-convertible-2u-100v127v-3x-515r+3x-520r+1x-l520r-nema-nmc-extended-runtime/">APC SMX2000RMLV2UNC 200va Rack UPS</a></td><td>This can handle the power draw of the entire rack, and run everything for awhile in the case of a blip, or shut down non-essential systems and run just automation and security for about an hour and a half in the even of a blackout.  This was used, but the battiers are new and should last a good while.</td>
</tr><tr><td> RACK </td><td><a href="https://tripplite.eaton.com/25u-smartrack-4-post-open-frame-rack-organize-secure-network-rack-equipment~SR4POST25">Tripp Lite 25U 4 Post Frame</a></td><td> I really only had one choice for the rack itself.  My closet space is 21-1/2&quot; wide.  Unless I wanted to do drywalling, I needed something very narrow (Rack components are 19&quot; wide, so this isn&apos;t a lot of wiggle room).  Any others I found that would fit were cheaply made.  I like this one enough.  It is sturdy and holds all my gear.</td></tr>
</tbody>
</table>
<!--kg-card-end: html-->
<p>So, admittedly, that is a lot of machine.  I saved a lot by being patient and acquiring the parts over the course of about a year, keeping my eye on the used market and buying when I saw good deals.  I re-used a lot of parts from other systems as well.  The only brand-spanking-new parts in the machine are the Case, Motherboard, Power Supplies and the two-terb NVME.  Everything else was upcycled, reused, or purchased second hand.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240518_164454934_reasonably_sized.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="361" height="480"><figcaption><span style="white-space: pre-wrap;">Bub the Sloth hanging out on the rack before everything went in.</span></figcaption></figure><p>After a couple false starts (ordered the wrong casters for the rack - oops!) I got enough assembled to test fit into the closet.  It was tight, but manageable.  Satisfied, I took the rack out and primed and painted the walls, drilled a few holes, and installed brush plates.  Then I got to work with running all of the cable (Covered briefly in the previous <a href="https://dzw.zentormey.com/unimatrix-part-1/" rel="noreferrer">Unimatrix</a> post).  </p><p>I added Switch to the rack, along with the old network infrastructure (a UGS Pro gateway, a 24 port Unifi switch, and a Synology NAS).  Finally, I installed the UPS and new UPS batteries.  I am VERY glad I waited to put the batteries in until after I had racked the UPS.  The rails were a bit of a pain to get locked in, and with the whole thing being over 100lbs, it was a bit much.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240529_181903006_reasonably_sized.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="361" height="480"><figcaption><span style="white-space: pre-wrap;">So many ports for activities!</span></figcaption></figure><p>Once parts started arriving, assembly for Unimatrix itself went pretty quickly.  I took my time and did everything the &apos;right way&apos;, more or less.  Okay, I had some fun as well.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/08/rain_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/08/rain.mp4" poster="https://img.spacergif.org/v1/1080x1440/0a/spacer.png" width="1080" height="1440" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/08/rain_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:03</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Making it rain, nerdy style.</span></p></figcaption>
        </figure><p>The initial deployment looked a bit like this:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171330807_reasonably_sized.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240615_171330807_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171330807_reasonably_sized.jpg 638w"><figcaption><span style="white-space: pre-wrap;">Top of rack</span></figcaption></figure><p>(2) 48 port patch panels straddling Switch, a 48p POE L3 Switch <br>Ubiquity 24p Switch <br>Ubiquity UGS-Pro <br>The green wires are all cat6a links to cameras, other stuff on the rack, and other computers in the house.  <br>The blue wires are all 10g/s fiber connections.  Mostly intra-rack, but there is one that goes under the floor and across the room to Jim, also.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171337358_reasonably_sized.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240615_171337358_reasonably_sized.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171337358_reasonably_sized.jpg 638w"><figcaption><span style="white-space: pre-wrap;">Middle Rack</span></figcaption></figure><p>Next down are the servers.  Pictured here are Unimatrix (top), Tubs (bottom left) and House (bottom right).  This picture was taken during the build process, house has since had all of its services moved to Unimatrix and was decommissioned.  It is now a backup Proxmox node in another room.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171345062_reasonably_sized-1.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="638" height="480" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240615_171345062_reasonably_sized-1.jpg 600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240615_171345062_reasonably_sized-1.jpg 638w"><figcaption><span style="white-space: pre-wrap;">Bottom of the Rack</span></figcaption></figure><p>At the bottom is the UPS and some room to grow.  Since these pictures were taken, the wires have been cleaned up a lot, and Unimatrix and Tubs switched spots to give Unimatrix some more head room.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/08/PXL_20240607_012844034.jpg" class="kg-image" alt="Unimatrix (Part 2)" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/08/PXL_20240607_012844034.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/08/PXL_20240607_012844034.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/08/PXL_20240607_012844034.jpg 1600w, https://dzw.zentormey.com/content/images/2024/08/PXL_20240607_012844034.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Lots of blinkies!</span></figcaption></figure><p>Stay tuned for our next exciting installment when I will cover software choices, structure, and final touches.</p>]]></content:encoded></item><item><title><![CDATA[Canvas]]></title><description><![CDATA[Canvas started as four (and then, a few years later, six) separate lights, but they have since been rebuilt into a single light with one controller to run them all in sync. This allowed the effects to flow from one frame to another, which made for a neat look.]]></description><link>https://dzw.zentormey.com/canvas/</link><guid isPermaLink="false">6691a5a313ea4106acfccc20</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Fri, 09 Aug 2024 14:46:46 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/canvas_early-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/07/canvas_early-1.jpg" alt="Canvas"><p>I had printed a bunch of different shapes to try out when I was making the circle frame, and had some odd pieces left over. I try not to throw stuff away when it can be repurposed, and that is how these lights came to be.</p><p>Canvas started as four (and then, a few years later, six) separate lights, but they have since been rebuilt into a single light with one controller to run them all in sync. This allowed the effects to flow from one frame to another, which made for a neat look.</p><p>This project is really just the evolution of the combination of ideas I had with <a href="https://dzw.zentormey.com/frame/" rel="noreferrer">Frame</a> and the <a href="https://dzw.zentormey.com/untitled-3/" rel="noreferrer">Circle Light</a>.  I had already discovered that painters canvas makes a decent diffuser, and I had a bunch of ideas on how to make more of them.</p><p>These are made with 6&quot; Pre-Stretched Canvas Frames (like $9 for a stack of them) that I fit over a piece of heavy cardboard (from the fridge box again) on which I had hot glued a few LED strips in rows. I stuck a bunch of <a href="https://en.wikipedia.org/wiki/Tessellation">tesselating</a> stencil shapes I had 3d printed on them, (a tessellated lizard, the Starfleet insignia, some leftover hexagons from Honeycomb, and some of the center shapes I used in the circle light).</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/old-canvas_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/old-canvas.mp4" poster="https://img.spacergif.org/v1/2160x3840/0a/spacer.png" width="2160" height="3840" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/old-canvas_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:21</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Some of the effects move quickly, some are meant to be subtle and change slowly</span></p></figcaption>
        </figure><p>Originally, I had nested all of the shapes together (like <a href="https://dzw.zentormey.com/honeycomb/" rel="noreferrer">Honeycomb</a>), but after playing around a bit, I decided the effect worked better with spacing between them.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/canvas-old-right_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/canvas-old-right.mp4" poster="https://img.spacergif.org/v1/2160x3840/0a/spacer.png" width="2160" height="3840" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/canvas-old-right_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:13</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">The top canvas here (originally called &apos;Trekkie&apos;) was rebuilt since this video. The extra red tint was caused by using Red PLA for the inset stencils. Who woulda thought?</span></p></figcaption>
        </figure><p>While printing these, I used any old PLA I had laying around.  That was a mistake.  It turns out that the color of the stencils has a pretty significant impact on the output.  The &apos;Trekkie&apos; light was printed in red PLA, and you could definitely tell!  I rebuilt it a couple months later, after deciding it was too much.  I replaced most of the red starfleet logos with other shapes in neutral colors.</p><p>I made four of these lights at first, and stacked them in pairs on Amy and I&apos;s nightstands in our bedroom.  They were good accent lights that gave the room a nice vibe without throwing too much light.  A few years later I decided to make a couple more, this time on 10&quot; canvas. For the second batch, I drew a couple <a href="https://en.wikipedia.org/wiki/Mandala">mandalas</a> (with a mechanical pencil, like a cave man), took a picture, imported the image into modeling software, and made it 1/2&quot; tall. Then I placed this in the frame before placing the cardboard backing behind it. The idea was that I could have a variety of shapes without printing a bunch of <a href="https://notoneoffbritishisms.com/2016/06/01/fiddly-fiddly-bits/">fiddly bits</a>.  Here is a shot of one of the inserts before it went in:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20230510_213357281.jpg" class="kg-image" alt="Canvas" loading="lazy" width="2000" height="1506" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20230510_213357281.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20230510_213357281.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20230510_213357281.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20230510_213357281.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The dabs of poster putty were for securing the LEDs. Way quicker than hot glue!</span></figcaption></figure><p>Having been horribly burned out on soldering individual LEDs from a previous project, I decided to try out string leds. These are WS2811 leds in a string light (or fairy light) format. I just cut the ends off and soldered my own controller in. They aren&apos;t terribly bright (I wouldn&apos;t buy them again) but they are okay for this purpose.   With the insert and the LEDs pre-soldered, these two lights came together really quickly.  They ran on their own, hanging on my wall, for about 6 months before I decided to integrate them all together.<br><br>At the time, all six of these had their own 5v power supplies, ESP8266 controller, and were more or less self contained.  I disconnected them all, soldered new connectors where the controllers were, got a single (much bigger) 5v supply to power them all, and added a single ESP32 to drive the whole thing.  Now what were six lights are now a single light with six individual &quot;zones&quot;.    The effects can run independently, across the entire multipart installation, or they can flow from one frame to the next. </p><p>Here are a few more shots of these:</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/canvas_new_left_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/canvas_new_left.mp4" poster="https://img.spacergif.org/v1/1080x1920/0a/spacer.png" width="1080" height="1920" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/canvas_new_left_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:11</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">This turned out all right. The bottom one is the one that used to be &quot;Trekkie&quot;</span></p></figcaption>
        </figure><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/canvas_new_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/canvas_new.mp4" poster="https://img.spacergif.org/v1/1080x1920/0a/spacer.png" width="1080" height="1920" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/canvas_new_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:11</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">These are the two new ones I made when I combined them into a single light.</span></p></figcaption>
        </figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_223008332.jpg" class="kg-image" alt="Canvas" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20230714_223008332.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20230714_223008332.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20230714_223008332.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_223008332.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Dark shot of older four with one of the matrix clocks.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_222958043.jpg" class="kg-image" alt="Canvas" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20230714_222958043.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20230714_222958043.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20230714_222958043.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_222958043.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Same lights with the overhead lighting on.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240530_035757869.jpg" class="kg-image" alt="Canvas" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20240530_035757869.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20240530_035757869.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20240530_035757869.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20240530_035757869.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Yay, colors!</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_222917734.jpg" class="kg-image" alt="Canvas" loading="lazy" width="2000" height="2656" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/PXL_20230714_222917734.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/PXL_20230714_222917734.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/PXL_20230714_222917734.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/PXL_20230714_222917734.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">These two have a neat stained glass look to them.</span></figcaption></figure><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item><item><title><![CDATA[Panel Lights]]></title><description><![CDATA[I don't know what most people do when a major piece of electronics fails, but for someone like me, a big LCD display with backlights, speakers, panel, several diffusers, etc? It was whale fall. ]]></description><link>https://dzw.zentormey.com/panel_lights/</link><guid isPermaLink="false">6691a27413ea4106acfccbc5</guid><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Tue, 30 Jul 2024 20:00:04 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_224423716.jpg" medium="image"/><content:encoded><![CDATA[<h1 id="table">Table</h1><img src="https://dzw.zentormey.com/content/images/2024/07/PXL_20240712_224423716.jpg" alt="Panel Lights"><p>This was the first panel light I ever built. It sort of happened by accident, I wasn&apos;t setting out to invent a new style of accent light for my living room, it just sortof happened.  This one started life as the touch surface for a very early touchscreen interface I was working on around 2009 and 2010. This used an IR camera (I used an old playstation eye camera with a modifed lens) sitting on the floor to look up at the surface of the acrylic (roughly 28&quot; above) and watch for disruptions in the light. I then picked up a piece of fancy Endlighten acrylic (Now called <a href="https://www.acrylite.co/products/our-brands/acrylite-led">Acrylite LED</a> and edge wrapped it with 850nm IR leds. The way this acrylic works, it bounces the light inside the medium until it is disrupted by an external distortion (like your finger touching the panel). I coupled this with a short throw VGA projector bounced off a mirror, and I had a multi-touch capable PC interface with a table sized display within a couple years of the first iphone. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/edited_C360_2012-03-27-17-42-49.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="1536" height="2048" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/edited_C360_2012-03-27-17-42-49.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/edited_C360_2012-03-27-17-42-49.jpg 1000w, https://dzw.zentormey.com/content/images/2024/07/edited_C360_2012-03-27-17-42-49.jpg 1536w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Sadly I have very few pictures of this setup. Here is one of my son playing Minecraft on it.</span></figcaption></figure><p>I&apos;ll do a separate write-up on that in the future.  (ETA: I did that, <a href="https://dzw.zentormey.com/the-table/" rel="noreferrer">it is here</a>)</p><p>After a time, the novelty wore off (and Microsoft released a commercial version using similar tech) and I lost interest in the table project, so I began experimenting to see if the optical properties that worked well for IR light extended to the visible spectrum as well. It turns out, they do pretty well.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/edited_table.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="1836" height="1816" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/edited_table.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/edited_table.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/edited_table.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/edited_table.jpg 1836w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Try and ignore the festivities, I&apos;m working with the pictures I could find.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20140912_202611.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="1836" height="2988" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/edited_IMG_20140912_202611.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/edited_IMG_20140912_202611.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/edited_IMG_20140912_202611.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20140912_202611.jpg 1836w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The table surface is opaque whether on or off, but it is only PRETTY when on.</span></figcaption></figure><p></p><h2 id="panel">Panel</h2><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/VID_20180324_170211_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/VID_20180324_170211.mp4" poster="https://img.spacergif.org/v1/720x1280/0a/spacer.png" width="720" height="1280" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/VID_20180324_170211_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">This light can do single color and dominate a room&apos;s vibe, or average toward white light to provide illumination.</span></p></figcaption>
        </figure><p>Eventually, it was decided the roughly 8&apos; x 4&apos; table was just too large for our living room, so I disassembled it. The computer was recycled into other systems, the wood surface had new LEDs installed and would become a headboard, and the panel itself was lifted out of the table and hung from the ceiling as an art piece. It really catches your eye when you walk in, especially after dark.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/IMG_20180324_170010.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="2667" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/IMG_20180324_170010.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/IMG_20180324_170010.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/IMG_20180324_170010.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/IMG_20180324_170010.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">I honestly don&apos;t remember making the LED strip light around the door frame there. Oh the panel? Yes, sorry, it is large and purple.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/IMG_20180324_210050.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="2667" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/IMG_20180324_210050.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/IMG_20180324_210050.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/IMG_20180324_210050.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/IMG_20180324_210050.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Orange light is Orange. So is the ceiling above it. Turns out 205 WS2812Bs throw some light.</span></figcaption></figure><h1 id="wallguy">Wallguy</h1><p>Wallguy is one of my favorites. It has a really neat look that is hard to convey without seeing it in person. It isn&apos;t unique or terribly different looking than some of the other lights I&apos;ve made (heck, I have made half a dozen or so panel style lights) but this one came together really easily and has one of the best diffusers I&apos;ve ever worked with.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/MVIMG_20200113_182757.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1500" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/MVIMG_20200113_182757.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/MVIMG_20200113_182757.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/MVIMG_20200113_182757.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/MVIMG_20200113_182757.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">I love the way the colors blend on this one. There are no lights on the sides, only the top and bottom. This allows for nice looking gradients.</span></figcaption></figure><p>This is similar in design to the Endlighten panels above, but it uses a very different acrylic as the base piece. The diffuser from a 32&quot; Sony Bravio. The TV was our media center TV for a few years until we upgraded to a 4k resolution panel around 2015 or so. After that, the Sony was stripped down to just the panel, diffuser, power supply, speakers, and input board. I stuffed all of that in our <a href="https://dzw.zentormey.com/the-smart-mirror/">bathroom mirror</a>, where it lived for a good number of years until it failed and was replaced by a similarly disassembled TV in 2019.</p><p>I don&apos;t know what most people do when a major piece of electronics fails, but for someone like me, a big LCD display with backlights, speakers, panel, several diffusers, etc? It was <a href="https://en.wikipedia.org/wiki/Whale_fall">whale fall</a>. The main backlight diffuser on this TV was an over-engineer piece of optical acrylic that seems to be designed to take light from one edge and illuminate the entire panel with it, while still allowing light to pass straight through front to back without distortion.</p><p>I experimented a bunch and found that edge lighting on two sides magnified this effect, but four disrupted it. So two sides it is. When it is off, it looks like a clear piece of glass or empty frame on the wall. When it is on, it creates some wonderful lighting gradients.</p><h2 id="poopy-panel">Poopy Panel</h2><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/poopypanel_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/poopypanel.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/poopypanel_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:16</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">The mirror means I get a second one for free!</span></p></figcaption>
        </figure><p>Continuing on my success with the Panel light, I wanted to try something similar in the bathroom above the mirror. While I had the wall torn apart to install the smart mirror, I built a rack above the mirror to mount another Endlighten panel. This one is basically identical to Panel, just a slightly different size to fit the space. Since the room is so small, it really fills the area with color.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/poopy_panel.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="1836" height="937" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/poopy_panel.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/poopy_panel.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/poopy_panel.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/poopy_panel.jpg 1836w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Light Blue near the mirror mixes with the lavender at the opposite side to make a nice relaxing mix in the middle.</span></figcaption></figure><p>This one can really shade a wall.  I set the rack at about 3/5 to the ceiling to create this nice color space above the light.  There is never anything up there, so it just takes whatever color the panel is throwing at it.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20161005_205241.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1485" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/edited_IMG_20161005_205241.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/edited_IMG_20161005_205241.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/edited_IMG_20161005_205241.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20161005_205241.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">I experimented a bit with texturing the acrylic, but didn&apos;t end up liking it enough to keep it.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20161005_205035.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1485" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/edited_IMG_20161005_205035.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/edited_IMG_20161005_205035.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/edited_IMG_20161005_205035.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/edited_IMG_20161005_205035.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Don&apos;t mind the old pictures, it means I don&apos;t have to make new ones.</span></figcaption></figure><h1 id="headboard">Headboard</h1><figure class="kg-card kg-video-card kg-width-regular" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/headboard_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/headboard.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/headboard_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:04</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            
        </figure><p>I had mentioned the table surface became our headboard. I had always wanted to try building an infinity mirror, and this seemed like a good opportunity. With Panel removed from the table, I had a nice big gap to fill with another piece of acrylic (this time, just standard plexiglass, nothing fancy). I popped in a strip of WS2812b leds, then added a 2-way mirror film (the sort you get as privacy screens to stop your creepy neighbor from watching you shower), applied so the light passed out, but not in. Then another piece of acrylic on top of that to finish the sandwich.<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/IMG_20150221_204424.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1125" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/IMG_20150221_204424.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/IMG_20150221_204424.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/IMG_20150221_204424.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/IMG_20150221_204424.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">First pic I took after lighting it up. Headboard is just laying on the floor, here.</span></figcaption></figure><p>Satisfied with my results, I added a new microcontroller, and installed it vertically on the wall behind our bed. It turned out all right.<br></p><figure class="kg-card kg-image-card"><img src="https://dzw.zentormey.com/content/images/2024/07/IMG_20180308_202617.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1500" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/IMG_20180308_202617.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/IMG_20180308_202617.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/IMG_20180308_202617.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/IMG_20180308_202617.jpg 2000w" sizes="(min-width: 720px) 720px"></figure><p>The mirror isn&apos;t good enough to do your makeup in or anything, but it enhances the light effect really well. Creates just enough to read by (if your reading device doesn&apos;t already emit its own light).</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/hd-panel_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/hd-panel.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/hd-panel_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:08</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">These are mini versions of the previous panels, each with their own style.</span></p></figcaption>
        </figure><h2 id="hd-panel-ld-panel-and-panel-five">HD Panel, LD Panel, and Panel Five</h2><p>These three are all made with the same basic parts. Only difference is the number of LEDs. I was experimenting with different LED densities, layering acrylic, mixing colors, that sort of thing. HD Panel was 144 leds/m, LD Panel was 30 leds/m, and Panel Five 60 leds/m.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/IMG_20180427_184732.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="2000" height="1500" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/IMG_20180427_184732.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/IMG_20180427_184732.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/IMG_20180427_184732.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/IMG_20180427_184732.jpg 2000w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Someone with finishing skills could make these look &quot;nice&quot;. That isn&apos;t me, my job stops at &quot;neat&quot;, though I will occasionally push forward to &quot;Whoah&quot;</span></figcaption></figure><p>They each have 1/2&quot; aluminium channel around 1&apos; square endlighten acrylic, a strip of WS2812b leds, and a power supply. They channel acts both as a bezel and also a heatsink.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/green_ld_panel.jpg" class="kg-image" alt="Panel Lights" loading="lazy" width="1052" height="739" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/green_ld_panel.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/green_ld_panel.jpg 1000w, https://dzw.zentormey.com/content/images/2024/07/green_ld_panel.jpg 1052w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">You can read the book spines through the panel, but sadly, you have to move it to take them off the shelf.</span></figcaption></figure><p>They could be opaque with color if all leds were on and a complimentary shade, or they could be translucent if only a portion were on, or the colors blended to white.</p><p>These lived on my book shelf in our living room as accent lights for a decade or so. Two of them are still in service.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/ld-panel_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/ld-panel.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/ld-panel_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:03</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">LD Panel</span></p></figcaption>
        </figure><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/panel5-and-bendy_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/panel5-and-bendy.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/panel5-and-bendy_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:06</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">Panel 5 and a brief look at Bendy</span></p></figcaption>
        </figure><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item><item><title><![CDATA[Spaceship Lamp]]></title><description><![CDATA[The shape of the lamp was absolutely inspired by UFOs. Specifically the ones commonly blamed for cow abductions. This one has a much bigger dome at the top, presumably to hold more cows.]]></description><link>https://dzw.zentormey.com/spaceship-lamp/</link><guid isPermaLink="false">6691a1e713ea4106acfccbba</guid><category><![CDATA[Retired Project]]></category><category><![CDATA[leds]]></category><category><![CDATA[art]]></category><category><![CDATA[esp8266]]></category><dc:creator><![CDATA[Zen Tormey]]></dc:creator><pubDate>Fri, 19 Jul 2024 15:35:40 GMT</pubDate><media:content url="https://dzw.zentormey.com/content/images/2024/07/edited_MVIMG_20190716_183301-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://dzw.zentormey.com/content/images/2024/07/edited_MVIMG_20190716_183301-1.jpg" alt="Spaceship Lamp"><p>This one had a few names over the years. It started out as &quot;gardenhose&quot; because of the way I built it.<br><br>The bottom is an old hanging lamp I picked up at the local Salvation Army Thrift Store for a smile. I gave it a new paint job (I wasn&apos;t fond of the nicotine stain theme it came with), and replaced the electronics inside. The bulb socket in the center is a regular 110v e26 base (with a wifi-controllable led bulb inside, of course) that is used for task lighting or gaming. There is also a 64 led (ws2812b) ring on the underside of the shade that can be controlled independently from the bulb as an accent light. In addition, the globe at the top (which I cut out of an old kids toy and hot glued to the top of the lamp) has an armature wire scaffold inside which supports a length of rubber garden hose about 8&quot; long. Around this hose (which has a slight curve, giving it a bit of a banana shape) I tightly wound an LED strip from bottom to top (around 80 to a hundred total). This could also be controlled independently from the other two light sources. This guy looked really cool in person. The pictures really don&apos;t do it justice.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://dzw.zentormey.com/content/images/2024/07/MVIMG_20190725_212630.jpg" class="kg-image" alt="Spaceship Lamp" loading="lazy" width="1920" height="1440" srcset="https://dzw.zentormey.com/content/images/size/w600/2024/07/MVIMG_20190725_212630.jpg 600w, https://dzw.zentormey.com/content/images/size/w1000/2024/07/MVIMG_20190725_212630.jpg 1000w, https://dzw.zentormey.com/content/images/size/w1600/2024/07/MVIMG_20190725_212630.jpg 1600w, https://dzw.zentormey.com/content/images/2024/07/MVIMG_20190725_212630.jpg 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Black base coat with some abstract doodling I did over it with masking tape before applying the metallic silver.</span></figcaption></figure><p>The colors morphed and blended very slowly and subtly.  I&apos;ve sped up some of the videos below so you don&apos;t have to sit for 5 minutes watching it.  This one hung above our gaming table in our kitchen for years. It is currently out of service, but I have all the parts and plan on rebuilding it. The diffuser globe on top is amazing at grabbing color and I want another opportunity to make use of it.  It doesn&apos;t light up the area around it much (although the bottom section definitely does), the color hits the inside surface of the globe and just lights it up.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/VID_20190721_164728_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/VID_20190721_164728.mp4" poster="https://img.spacergif.org/v1/1920x1080/0a/spacer.png" width="1920" height="1080" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/VID_20190721_164728_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:12</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">(Time lapse)</span></p></figcaption>
        </figure><p>The shape of the lamp was absolutely inspired by UFOs.  Specifically the ones commonly blamed for cow abductions.  This one has a much bigger dome at the top, presumably to hold more cows.<br><br>The high density led strip (the strip wrapped around the hose is of the 144 leds per meter variety) projects a ton of light and very rich colors.  The diffuser plastic shows bright saturated colors, even in full daylight. <br><br>I built this one before I was comfortable working with mains voltage, so it actually had two separate power rails.  One was 110v AC to power the standard bulb (running down one side of the chain from the ceiling).  The other side had 5v DC, powering the LEDs and ESP8266 attached to the underside of the saucer section.  My son and I had to belly crawl through insulation in our attic to install the transformer and feed the wires down from above.  Sure was a pretty light, though.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://dzw.zentormey.com/content/media/2024/07/VID_20200407_084523_LS_thumb.jpg" data-kg-custom-thumbnail>
            <div class="kg-video-container">
                <video src="https://dzw.zentormey.com/content/media/2024/07/VID_20200407_084523_LS.mp4" poster="https://img.spacergif.org/v1/1024x768/0a/spacer.png" width="1024" height="768" loop autoplay muted playsinline preload="metadata" style="background: transparent url(&apos;https://dzw.zentormey.com/content/media/2024/07/VID_20200407_084523_LS_thumb.jpg&apos;) 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container kg-video-hide">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"/>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:10</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1&#xD7;</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"/>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"/>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">(Slightly sped up)</span></p></figcaption>
        </figure><p>We moved our gaming table into a dedicated tabletop room downstairs after our kids moved out.  I plan on reinstalling this one down there, above the table where it belongs.</p><hr>
<blockquote>
<p><em>This article is part of a series on LED Art as I attempt to document all of the different LED projects I have built over the years.<br>
More will be added as time goes on.  The list of currently available articles can be found here: <a href="https://dzw.zentormey.com/tag/leds/">https://dzw.zentormey.com/tag/leds/</a></em></p>
</blockquote>
<hr>
]]></content:encoded></item></channel></rss>