<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #graphics</title>
    <description>Posts tagged “graphics” — Blog of independent game and app developer Matt Sephton. Featuring vintage Macintosh, game development, digital artwork, Japanese esoterica, video game reviews, hacks and tips, and much more.</description>
    <link>https://blog.gingerbeardman.com/tag/graphics/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/graphics/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 03 Jul 2026 20:16:48 +0000</pubDate>
    <lastBuildDate>Fri, 03 Jul 2026 20:16:48 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <item>
          <title>Shibuya Pixel Art Contest 2024</title>
          <description>&lt;p&gt;For June and July of 2024 the &lt;a href=&quot;https://pixel-art.jp/contesten&quot;&gt;Shibuya Pixel Art Contest&lt;/a&gt; has been running, a welcome return after it not happening in 2023. Entries are open all over the world, but can only be submitted to Twitter using the hashtag &lt;a href=&quot;https://twitter.com/hashtag/shibuyapixelart2024?f=live&quot;&gt;#shibuyapixelart2024&lt;/a&gt;. You have to include a name for the artwork and its original pixel dimensions (though it’s OK to rescale small artwork so it can be seen more easily). There are special categories for 16×16px and 32×32px artwork, and then a category for anything bigger up to the maximum of 512×512px. Full rules at &lt;a href=&quot;https://pixel-art.jp/contesten&quot;&gt;pixel-art.jp/contesten&lt;/a&gt; and there’s still time to enter! Selected works will go on display around the Shibuya district of Tokyo in August and September.&lt;/p&gt;

&lt;p&gt;For my entries I thought it would be cool to use different, unexpected software to produce my artwork.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pico-8&quot;&gt;PICO-8&lt;/h2&gt;

&lt;p&gt;These three entries are based on graphics I created for a game I started making when my wife was pregnant with our first child. We were house bound for a while, waiting for the birth, and I drew these cards using &lt;a href=&quot;https://www.lexaloffle.com/pico-8.php&quot;&gt;PICO-8&lt;/a&gt; for a game which remains unfinished. At least I finished the graphics!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;16×16px = 「花見」hanami card, (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1808102421077295350&quot;&gt;link&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;32×32px = 「花見酒」hanami-sake yaku, (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1808102225857720725&quot;&gt;link&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;128×128px = 「花札」hanafuda koi-koi game layout, (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1806905446805938219&quot;&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The smaller cards shown in the full game layout are just the regular sized cards downscaled to 8×11px in code using nearest neighbour resizing. For all cards the border is drawn seperately. One or the other size of card are most likely the smallest Hanafuda ever pixelled!?&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div id=&quot;carousel0&quot; class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0c&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanami.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanami.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanami-sake.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanami-sake.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanafuda.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-pico8-hanafuda.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 100%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3 {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;#carousel0 .carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;rorschach-for-playdate&quot;&gt;Rorschach for Playdate&lt;/h2&gt;

&lt;p&gt;This entry was created with &lt;a href=&quot;https://gingerbeardman.itch.io/rorschach&quot;&gt;Rorschach&lt;/a&gt; a creative toy/game I made for the &lt;a href=&quot;https://play.date&quot;&gt;Playdate&lt;/a&gt; handheld gaming system. This piece was created by moving the “pen” using the accelerometer and relying on the dynamic ink colour which is relative to the movement. It’s a fullscreen grab at 400×240px, titled 「キクぞく」”Kikuzoku” or “Chrysanthemum”.&lt;/p&gt;

&lt;p&gt;It would be tremendously complicated and time-consuming to create artwork like this pixel-by-pixel, or even with dither brushes, unless you had some sort of pressure sensitive stylus. But Rorschach and the Playdate accelerometer makes light work of it.&lt;/p&gt;

&lt;p&gt;The final image was my 12th attempt at getting a convincing flower! With many of my earlier attempts I was slow to hide the cursor and beautiful flowers were ruined by rogue strokes of ink after I’d technically finished. Perhaps I should have added the ability to record/playback or some sort of undo to the app. (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1810481363046318410&quot;&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-rorschach.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;deneba-artworks-for-classic-macintosh&quot;&gt;Deneba artWORKS for Classic Macintosh&lt;/h2&gt;

&lt;p&gt;I thought it would be fun to use my favourite classic Macintosh drawing app—Deneba &lt;a href=&quot;/tag/deneba/&quot;&gt;artWORKS&lt;/a&gt;—to create pixel art using vector shapes, its bundled external tools (plugins), and the infinite fills best known from their appearance in MacPaint. There are only 20 objects in this drawing, which is 200×300px in size and titled 「黄金比」 or “the golden ratio”. (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1812491599789576474&quot;&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Spiral: flower heads (2)&lt;/li&gt;
  &lt;li&gt;Resistor: hairs (3)&lt;/li&gt;
  &lt;li&gt;Bezier: stems, branch, leaves (5)&lt;/li&gt;
  &lt;li&gt;Arc: shoots, stems, midrib (7)&lt;/li&gt;
  &lt;li&gt;Round rect: planter (2)&lt;/li&gt;
  &lt;li&gt;Polygon: planter inner shadow (1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Calligraphic pen nibs to get variable line thickness&lt;/li&gt;
  &lt;li&gt;Infinite fills to get dithered patterns and textures&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div id=&quot;carousel1&quot; class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel1&quot; id=&quot;1a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel1&quot; id=&quot;1b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel1&quot; id=&quot;1c&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;1c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;1b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;1a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;1c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;1b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;1a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks1.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks1.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks2.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks2.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks3.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks3.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;1a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;1b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;1c&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 75%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3 {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;#carousel1 .carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;bonus&quot;&gt;Bonus!&lt;/h2&gt;

&lt;p&gt;I was having too much fun with dither patterns, so I drew one more piece just for kicks. This one is called 「生け花」”Ikebana” (“flower arranging”) and was exported at 200% because I miscalculated my document size at the beginning. I drew the shears and then transformed them with Free Rotate and Scale. There was minor pixel touch-up after export, and the final thing measures 400×512px. Otherwise I used the same techniques as above. (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1812840849211851109&quot;&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div id=&quot;carousel2&quot; class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel2&quot; id=&quot;2a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel2&quot; id=&quot;2b&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;2b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;2b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;2a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;2a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-ikebana.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-ikebana.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-ikebana2.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-ikebana2.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;2a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;2b&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 128%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2 {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;#carousel2 .carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;extras-bonus&quot;&gt;Extras Bonus!&lt;/h2&gt;

&lt;p&gt;And I did one more just before the deadline. This is titled 「ラペルピン」”lapel pin” and is 512×512px and was created using the same vectors and fills technique. I decided to work in Canvas 3.0 rather than artWORKS, simply because it has a way of locking objects. The only new thing I did here is that I created two diagonal line fill patterns of my own for the collars. (&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1817609688210690392&quot;&gt;link&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-lapel-pin.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And here’s a screenshot of my working area, Macintosh System 7.5.5 running in 1-bit colour at 1025x768 in the BasiliskII emulator. This time I created it on my MacBook Pro with external Magic Trackpad, but &lt;a href=&quot;/2021/04/17/turning-an-ipad-pro-into-the-ultimate-classic-macintosh/&quot;&gt;sometimes I use my iPad Pro with Apple Pencil&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/shibuya-pixel-art-contest-2024-artworks-lapel-pin-working.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 14 Jul 2024 16:42:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/07/14/shibuya-pixel-art-contest-2024/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/07/14/shibuya-pixel-art-contest-2024/</guid>
        </item>
      
    
      
        <item>
          <title>Emigre typography and graphic design magazine (1984–2005)</title>
          <description>&lt;p&gt;&lt;em&gt;Emigre&lt;/em&gt; magazine was a highly influential graphic design publication. It was known for its innovative and experimental approach to typography and graphic design, pushing the boundaries of traditional design norms—for better or worse. The magazine was published from 1984 (year of the Macintosh launch) until 2005, and during its run it played a critical role in shaping the discourse around digital design and typography. It was founded by &lt;a href=&quot;https://www.emigre.com/Designer/RudyVanderLans&quot;&gt;&lt;em&gt;Rudy VanderLans&lt;/em&gt;&lt;/a&gt; and his wife &lt;a href=&quot;https://www.emigre.com/Designer/ZuzanaLicko&quot;&gt;&lt;em&gt;Zuzana Licko&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emigre-magazine.jpg&quot; alt=&quot;&quot; title=&quot;Selected covers from Emigre magazine (1984–2005)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;tell-me-about-it&quot;&gt;Tell me about it&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Emigre&lt;/em&gt; is notable for many reasons, and if you’re interested in 80s and 90s design there will surely be something in there for you. I first heard about &lt;em&gt;Emigre&lt;/em&gt; when I started work at London graphic design agency &lt;a href=&quot;https://form.uk.com&quot;&gt;&lt;em&gt;Form&lt;/em&gt;&lt;/a&gt; in 1998, so about three quarters through the run.&lt;/p&gt;

&lt;p&gt;Some features that stand out for me personally are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://wayback.archive-it.org/9432/20190926205616/http://goldstein.design.umn.edu/collection/emigre/typefaces/Lores.html&quot;&gt;Early bitmap fonts&lt;/a&gt; (1984) and &lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0006&amp;amp;targPic=lfa_emigre_0006_009.jpg&quot;&gt;emoji-like pictograms&lt;/a&gt; (1986) created by &lt;a href=&quot;https://www.emigre.com/Designer/ZuzanaLicko&quot;&gt;&lt;em&gt;Zuzana Licko&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0003&amp;amp;targPic=lfa_emigre_0003_004.jpg&quot;&gt;Early 1-bit Macintosh art&lt;/a&gt; by &lt;a href=&quot;https://www.hersey.com/about&quot;&gt;&lt;em&gt;John Hersey&lt;/em&gt;&lt;/a&gt; (1985) and many other lovely period details&lt;/li&gt;
  &lt;li&gt;Designs by such luminaries as &lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0013&amp;amp;targPic=lfa_emigre_0013_015.jpg&quot;&gt;&lt;em&gt;Neville Brody&lt;/em&gt;&lt;/a&gt;, &lt;a href=&quot;https://oa.letterformarchive.org/?dims=Name_KEY&amp;amp;vals0=SPIEKERMANNERIK&amp;amp;friendly0=Spiekermann%comma%20Erik&quot;&gt;&lt;em&gt;Erik Spiekermann&lt;/em&gt;&lt;/a&gt;, and &lt;a href=&quot;https://wayback.archive-it.org/9432/20190926160800/http://goldstein.design.umn.edu/collection/emigre/&quot;&gt;many more&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Articles on people like font designer &lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0026&amp;amp;targPic=lfa_emigre_0026_018.jpg&quot;&gt;&lt;em&gt;Aldo Novarese&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Issues dedicated to the record label &lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0009&quot;&gt;&lt;em&gt;4AD&lt;/em&gt;&lt;/a&gt; (1988) and &lt;a href=&quot;https://oa.letterformarchive.org/item?workID=lfa_emigre_0029&quot;&gt;&lt;em&gt;The Designers Republic&lt;/em&gt;&lt;/a&gt; (1994)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;online-archives&quot;&gt;Online archives&lt;/h2&gt;

&lt;p&gt;I recently wanted to read some of the issues again and found a couple of online archives:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://oa.letterformarchive.org/?dims=Collection&amp;amp;vals0=Emigre%20Collection&amp;amp;sortby=title&quot;&gt;Letterform Archive: Emigre Collection&lt;/a&gt; (browsable magazines, simplified cross references)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://wayback.archive-it.org/9432/20190926160800/http://goldstein.design.umn.edu/collection/emigre/&quot;&gt;University of Minnesota: Emigre Magazine Index&lt;/a&gt; (only comprehensive cross references)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;digital-versions&quot;&gt;Digital versions&lt;/h2&gt;

&lt;p&gt;If you want to take the magazine with you today it’s available in the &lt;a href=&quot;https://www.emigre.com/Emigre-Fonts-App&quot;&gt;Emigre Fonts app&lt;/a&gt; for iPad/iPhone, which allows you to download the issues for offline reading.&lt;/p&gt;

&lt;p&gt;If you can’t use, or would rather not use, the official app &lt;a href=&quot;https://archive.org/details/emigre-magazine-archive-1984-2005&quot;&gt;I’ve converted the issues to CBZ files&lt;/a&gt;. Read those with &lt;a href=&quot;https://panels.app&quot;&gt;Panels&lt;/a&gt;, &lt;a href=&quot;https://apps.apple.com/gb/app/simple-comic/id1497435571?mt=12&quot;&gt;Simple Comic&lt;/a&gt;, &lt;a href=&quot;https://www.cdisplayex.com&quot;&gt;CDisplayEx&lt;/a&gt;, or another comic reader app of your choice.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;related-reading&quot;&gt;Related reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Emigre_(magazine)&quot;&gt;Emigre (magazine)&lt;/a&gt; at &lt;em&gt;Wikipedia&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://luc.devroye.org/fonts-27441.html&quot;&gt;Emigre&lt;/a&gt; entry at &lt;em&gt;Type Design Information Page&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.emigre.com/BooksCds/Type-90-HyperCard&quot;&gt;Type ‘90 HyperCard Video&lt;/a&gt; video of a HyperCard Stack&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.researchgate.net/publication/303776354_Designing_the_Emigre_Magazine_Index_Theory_and_Practice_in_an_Alternative_Research_Tool&quot;&gt;Designing the Emigre Magazine Index&lt;/a&gt;, &lt;em&gt;Jessica Barness, 2016&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/merztoemigrebeyo0000hell/&quot;&gt;Merz to Emigre and Beyond&lt;/a&gt; Avant-Garde Magazine Design of the Twentieth Century&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2019/07/10/verbum-journal-of-personal-computer-aesthetics/&quot;&gt;Verbum “The Journal of Personal Computer-Aesthetics”&lt;/a&gt;, &lt;em&gt;Michael Gosney, 1986–&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 24 May 2024 20:19:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/05/24/emigre-typography-and-graphic-design-magazine-1984-2005/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/05/24/emigre-typography-and-graphic-design-magazine-1984-2005/</guid>
        </item>
      
    
      
        <item>
          <title>Emoji history: the missing years</title>
          <description>&lt;p&gt;During &lt;a href=&quot;/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/&quot;&gt;my research into vintage Japanese drawing software&lt;/a&gt;, I came across some devices that had built in sketch or handwritten memo functions. I bought a couple of them to see if they did anything cool or interesting. These sorts of devices are pre-internet, so there’s not much about them online, and they can’t be emulated, so the only way to find out what they do is to get first hand experience by reading the manual or, better, using one yourself. It’s difficult to find these devices in working condition, as most of them have screen polarisers that have gone bad over time, but if you’re lucky you can find one.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1994&quot;&gt;1994&lt;/h2&gt;

&lt;p&gt;One such device &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1748017395585683751&quot;&gt;I bought&lt;/a&gt; was the Sharp PI-4000, from 1994. This is a pocket computer that rolled out of Sharp’s involvement in the development and manufacturing of Apple’s Newton MessagePad. In 1993 Sharp did their own licenced version of the &lt;a href=&quot;https://apple.fandom.com/wiki/MessagePad_H1000&quot;&gt;Apple Newton MessagePad H1000&lt;/a&gt;, the &lt;a href=&quot;https://apple.fandom.com/wiki/Sharp_Expert_Pad_PI-7000&quot;&gt;Expert Pad PI-7000&lt;/a&gt;, but just like Apple’s device it wasn’t as successful as they’d hoped. But before that, in 1992, they’d made a device called the PV-F1 which was the first touchscreen-only PDA. After the Expert Pad failure, Sharp took another attempt at the concept and came up with the PI-3000 in 1993. This solved all the problems with the PV-F1, most notably size and cost. The device I have, the PI-4000, was released a year later and features higher memory capacity. The PI-3000/4000 devices could transfer data via infrared, connect to a modem to send faxes, and by the PI-5000 in 1995 could connect to cell phones to send emails. They all use a simplified—but still quite complicated—version of the multi-window operating system that had been developed for the PV-F1.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pi-3000.jpg&quot; alt=&quot;&quot; title=&quot;Sharp Zaurus PI-3000 “Personal Information Tool” (1993)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So I was trying out the PI-4000, the memo function is pretty cool allowing you to draw in different dither shades and pen widths, and use stamps to add symbols to your memo. These are mostly map-related things like road and rail junctions, buildings, and train stations. Pretty cool. Then I tried typing some messages on the device and as I explored the myriad of keyboard input mechanisms I came across something rather familiar (sorry about the awful photo—it’s the best I could do, honest—the screen is very reflective and the pixels are so far from the backing they cast individual shadows!):&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pi-4000-emoji-picker.jpg&quot; alt=&quot;PNG&quot; title=&quot;Look! It&apos;s an emoji picker on the Sharp PI-4000 (1994)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At this point, I couldn’t quite believe what I was seeing because I was under the impression that the first emoji were created by an anonymous designer at &lt;a href=&quot;https://emojipedia.org/softbank/1997&quot;&gt;SoftBank in 1997&lt;/a&gt;, and the most famous emoji were created by Shigetaka Kurita at &lt;a href=&quot;https://emojipedia.org/docomo/1999&quot;&gt;NTT DoCoMo in 1999&lt;/a&gt;. But the Sharp PI-4000 in my hands was released in 1994, and it was chock full of recognisable emoji. Then down the rabbit hole I fell. 🕳️🐇&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pi-4000-emoji-table-16-16.png#pi4000&quot; alt=&quot;PNG&quot; title=&quot;Emoji present on the Sharp PI-4000 (1994)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1990&quot;&gt;1990&lt;/h2&gt;

&lt;p&gt;A little more reading, and a tip from my friend &lt;a href=&quot;https://twitter.com/chame&quot;&gt;@chamekan&lt;/a&gt; on Twitter, unearthed the fact that the NEC PI-ET1 in 1990 also contained emoji&lt;sup id=&quot;fnref:piet1&quot;&gt;&lt;a href=&quot;#fn:piet1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. I also found a &lt;a href=&quot;https://www.reddit.com/r/retrobattlestations/comments/vzm9gm/nec_piet1_the_first_and_only_electronic_organizer/&quot;&gt;collector who owned a device&lt;/a&gt;, and we’ll hear more from them later on. The device is literally the coolest thing you’ve ever seen. With system software written by video game developer Hudson Soft its character set features emoji that can be typed inline, and it also features a &lt;a href=&quot;https://youtu.be/8_w8elG3w0Y?t=248&quot;&gt;“montage function” that allows you to create faces for each of your contacts&lt;/a&gt;—15 years later we’d see something similar in Mii on Nintendo Wii in 2006. The emoji on this device are a lot less well designed, in my humble opinion, than those on the Sharp devices.&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 16/9;&quot; videoid=&quot;8_w8elG3w0Y&quot; params=&quot;start=503&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-nec-pi-et1-emoji-table-20-20.png#piet1&quot; alt=&quot;PNG&quot; title=&quot;Emoji present on the NEC PI-ET1 (1990)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;a-word-about-word-processors&quot;&gt;A word about word processors&lt;/h2&gt;

&lt;p&gt;By now I was in contact with Keith at &lt;a href=&quot;https://emojipedia.org&quot;&gt;Emojipedia&lt;/a&gt;, who mentioned that he remembered a Sharp device with emoji, a word processor. I found one in the Sharp WD-A521, from November 1990, which &lt;a href=&quot;http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/Emoji/SHARP-WD-A521p457-458.pdf&quot;&gt;featured higher resolution versions of the emoji designs&lt;/a&gt; found on my Sharp PI-4000.&lt;/p&gt;

&lt;p&gt;There’s also the Panasonic FW-U1S50 from 1990, &lt;a href=&quot;https://archive.org/details/panasonic-fw-u-1-s-50/Panasonic%20パーソナルワープロ%20FW-U1S50%20リファレンスマニュアル/page/n311/mode/1up&quot;&gt;which contains 110 famiiar emoji&lt;/a&gt; under a section called “illustrations”, and also contains &lt;a href=&quot;https://archive.org/details/panasonic-fw-u-1-s-50/Panasonic%20パーソナルワープロ%20FW-U1S50%20リファレンスマニュアル/page/n311/mode/1up&quot;&gt;another 99 “audio/visual” symbols&lt;/a&gt; some of which coincide with modern emoji.&lt;/p&gt;

&lt;p&gt;Perhaps there are other word processors from around that time that also contain emoji? I understand from my friend &lt;a href=&quot;https://twitter.com/haeckel&quot;&gt;Izumi Okano&lt;/a&gt; that Japanese software developer Enzan-Hoshigumi, &lt;a href=&quot;/2021/12/16/tomoya-ikeda-macintosh-artist/&quot;&gt;most famous for their Macintosh software and clipart&lt;/a&gt;, had created pictograms for one of the Canoword word processors around 1986. So at this point I’m thinking, why would the emoji on a word processor be ignored on the timeline of emoji history? Was there anything else being ignored?&lt;/p&gt;

&lt;p&gt;Before cell phones became prevalent there were pagers, or beepers, in Japan these were known as Pocket Bell. Initially they would only beep and show a number, and &lt;a href=&quot;https://twitter.com/s7ephenwithaph/status/1785939813432254950&quot;&gt;people would use “beeper slang”&lt;/a&gt; to form words by using numbers whose pronunciation was similar to words and syllables. Necessity is the mother of invention! Eventually pagers would be able to send and receive text. It was perhaps only natural that emoji find a home on these devices, with the most notable being the heart ❤️ emoji. But the date of this transition is 1995, which is earlier than the SoftBank emoji from 1997 but later than my Sharp PI-4000 device.&lt;/p&gt;

&lt;h2 id=&quot;a-note-about-beepers&quot;&gt;A note about beepers&lt;/h2&gt;

&lt;p&gt;As an aside, it’s interesting to understand how emoji were typed on pagers/beepers. They weren’t selected using a picker, which would have required cycling through a huge range of characters, but rather typed in numeric digits which narrows the cycling down to far less characters.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-pocket-bell-pager.jpg&quot; alt=&quot;JPG&quot; title=&quot;Pager cheat sheet, photo by 山下メロ &amp;lt;a href=https://ima.goo.ne.jp/column/article/6981.html&amp;gt;https://ima.goo.ne.jp/column/article/6981.html&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The numeric code: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;21 91 15 24 12 23 78&lt;/code&gt;&lt;br /&gt;
…would map to: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;カラオケイク？&lt;/code&gt;&lt;br /&gt;
…which means: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KARAOKE?&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wild. Typing text this way must have felt like programming machine code directly in hexadecimal!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-makes-it-emoji&quot;&gt;What makes it emoji?&lt;/h2&gt;

&lt;p&gt;I was chatting to a fellow designer, who has designed many emoji in his career, discussing the earlier emoji I had found in my 1994 device. They asked me to confirm that I could type emoji inline with text, giving me the example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;W😲W&lt;/code&gt;, which was his criteria for the symbols to qualify as emoji. If I couldn’t do that, he suggested we could only consider the symbols as icons.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pi-4000-emoji-wow.jpg&quot; alt=&quot;PNG&quot; title=&quot;Passing the Emoji test on the Sharp PI-4000&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So if I can type them inline amongst text on my device from 1994 that was capable of connecting to other devices and sending messages, then surely they should be considered the first emoji? Why do we, currently, only count emoji as emoji if they’re on a mobile phone? I’m also wondering when these emoji might have been designed. Were they created in 1994 for the PI-4000, in 1993 for the PI-3000, or earlier for another device?&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1988&quot;&gt;1988&lt;/h2&gt;

&lt;p&gt;So I kept looking. I was aware of another line of Sharp devices, electronic organisers, known as the Bware range in Japan and Wizard in the USA. These were pretty popular at the time, so much so that the USA device even &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Wizard_(Seinfeld)&quot;&gt;got it’s own episode of Seinfeld&lt;/a&gt; in 1998. I’d come back into contact with these devices just last year as they had the interesting capability of being able to &lt;a href=&quot;https://forums.insertcredit.com/t/stay-sharp-with-sc-denshi-system-techo-games/2326&quot;&gt;play video games&lt;/a&gt; stored on solid-state application “IC” cards. You can play a version of Tetris by BPS that is quite different to the Game Boy version, and both were released in 1989. You can also play versions of Sokoban by Thinking Rabbit, and Fortress by SSI/Victor, amongst others.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pa-8500-1988.jpg&quot; alt=&quot;JPG&quot; title=&quot;Sharp PA-8500 (1988)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Thanks to a collector, &lt;a href=&quot;https://www.reddit.com/r/OldHandhelds/comments/sr51ze/may_i_present_you_the_whole_family_of_sharp/&quot;&gt;Akuji&lt;/a&gt;, I was able to confirm that the Japanese PA-8500 device, released in 1988, contains emoji&lt;sup id=&quot;fnref:pa8500&quot;&gt;&lt;a href=&quot;#fn:pa8500&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; similar in design to those found on my PI-4000 and on the WD-A521. When redrawing these it was obvious that all the Sharp emoji sets are based on the same master design. (I’d love to know more about the Sharp artwork if anybody knows anything.)&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-sharp-pa-8500-emoji-table-20-20.png#pa8500&quot; alt=&quot;PNG&quot; title=&quot;Emoji present on Sharp PA-8500 (1988)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And if you need to see the word 絵文字 (emoji) next to these symbols to be satisfied, then look no further than this table column header in the manual of 1988’s Toshiba Rupo JW95F word processor.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-wapuro-toshiba-jw95f.png&quot; alt=&quot;IMG&quot; title=&quot;絵文字 as column header in Toshiba&apos;s Rupo JW95F word processor manual (1988)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;how-old-is-an-emoji&quot;&gt;How old is an emoji?&lt;/h2&gt;

&lt;p&gt;At this point we’ve wiped almost a decade off the creation date of emoji, but can we go further? Is there a way to date a set of emoji? In Japanese 絵文字 means emoji — and it turns out that word has its own surprisingly long history, which I’ll come back to at the end of this post.&lt;/p&gt;

&lt;p&gt;If we think about the PA line of devices, the PA-8500 was released in 1988, and it’s predecessor the (emoji-less) PA-7000 was released in 1987. So maybe the emoji set was created around this time? We can get closer by looking at a couple of characters present in the emoji that give us &lt;a href=&quot;https://srad.jp/~yasuoka/journal/495877/&quot;&gt;a clue to the date of creation&lt;/a&gt;. That is indeed the case with the Sharp PI-4000 and WD-A521.&lt;/p&gt;

&lt;p&gt;The characters &lt;a href=&quot;https://ja.wikipedia.org/wiki/渡辺和博#○金・○ビ&quot;&gt;○金 and ○ビ&lt;/a&gt; (&lt;em&gt;maru-kin&lt;/em&gt; meaning rich/successful/winner and &lt;em&gt;maru-bi&lt;/em&gt; meaning poor/unsuccessful/loser) were invented by the author &lt;a href=&quot;https://ja.wikipedia.org/wiki/渡辺和博#○金・○ビ&quot;&gt;Kazuhiro Watanabe&lt;/a&gt; in 1984 in his book &lt;a href=&quot;https://www.amazon.co.jp/dp/4072734365&quot;&gt;Kinkonkan&lt;/a&gt; which was later &lt;a href=&quot;https://www.nikkatsu.com/movie/26211.html&quot;&gt;made into a movie&lt;/a&gt;. These were quickly accepted into Japanese vocabulary, winning the 84年の日本流行語 (Japanese Buzzwords Award 1984). And they are right there in the Sharp PI-4000 emoji, represented as characters enclosed in circles. They were in common use throughout Japan’s bubble-era, 1986-1991, but eventually fell out of fashion and are now considered obsolete. It’s interesting to note that they are not featured in either the &lt;a href=&quot;https://emojipedia.org/softbank/1997&quot;&gt;1997 SoftBank&lt;/a&gt; or &lt;a href=&quot;https://emojipedia.org/docomo/1999&quot;&gt;1999 NTT DoCoMo&lt;/a&gt; emoji sets.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1986&quot;&gt;1986&lt;/h2&gt;

&lt;p&gt;Around the same time, the day after I published this post, I did a Twitter search and found an &lt;a href=&quot;https://x.com/NagoyaAB388/status/1789249098379575319/photo/1&quot;&gt;image of the November 1987 issue of ラジオの製作 (“Radio Production”) magazine&lt;/a&gt;, which featured a full page on a Sanyo SANWORD personal word processor and its emoji table. That sent me hunting for Sanyo manuals.&lt;/p&gt;

&lt;p&gt;The earliest I tracked down was the &lt;a href=&quot;https://archive.org/details/sanword-mini-s-swp-m21-portable-word-processor/&quot;&gt;Sanyo SWP-M21 “Sanword mini S”&lt;/a&gt;, a budget personal word processor from 1986. It has the usual cast — smiley face, snowman, fleur-de-lis, pointing finger, weather symbols, faces, hand gestures — but the genuinely fun bit is its 外字 editor. Sanyo let users design up to 94 of their own 24×24 dot characters and save them out to floppy. Build-your-own-emoji on a 1986 home appliance. 🎨&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/sanyo-swp-m21-brochure-emoji.jpg&quot; alt=&quot;Emoji on SANWORD mini S&quot; title=&quot;Emoji as shown on a brochure for SANWORD mini S [SWP-M21]&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The manual shows off the kinds of things you could make: a cat, a turtle, a mushroom, an elephant, a ship, a hand making a peace sign, a heart with an arrow through it, an orca. The accompanying copy brags 「とてもワープロとは思えないような、ユニークな印刷を楽しむことができます」 — “you can enjoy unique printing you’d hardly think a word processor could do.”&lt;/p&gt;

&lt;p&gt;Somewhere out there, there were Japanese homes in the late 80s with floppy disks full of personal pictographic vocabulary — family crests, drawings of pets, in-joke symbols between friends. Almost all of those floppies are presumably long gone now. If anyone has one in a drawer, I’d love to see it. 💾&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1984&quot;&gt;1984&lt;/h2&gt;

&lt;p&gt;Once you accept that emoji existed in the 1980s, more things come to light. The Ishii Award 「石井賞創作タイプフェイスコンテスト」 was a &lt;a href=&quot;https://news.mynavi.jp/article/font-history-19/&quot;&gt;typeface design contest organised by the community of type designers in 1970&lt;/a&gt;. By 1984 it was in its 8th year. Yutaka Satoh of Type-Labo proposed a typeface consisting of emoji. Because they weren’t on screen they were created by arranging dots in various shapes, but they are recognisably emoji.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Coincidentally, I used a hybrid of this sort of approach &lt;a href=&quot;/2023/11/26/easter-egg-emoji-converting-pixels-into-particles/&quot;&gt;when I added emoji to my game YOYOZO&lt;/a&gt; in September 2023: I plot the emoji as points but define them on a pixel grid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-type-labo-typeface-1984.jpg&quot; alt=&quot;JPG&quot; title=&quot;Yakumono typeface (partial/proposed), created by Yutaka Satoh (TYPE-LABO) in 1984&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In Matt Alt’s book &lt;a href=&quot;https://www.goodreads.com/book/show/30631850-the-secret-lives-of-emoji&quot;&gt;“The Secret Lives of Emoji: How Emoticons Conquered the World”&lt;/a&gt;, there is a brief mention of ASCII emoticons on the Japanese internet (JUNET) in 1984, and then it fast forwards to 1995 to begin talking about the Pager, missing a decade of emoji usage in the process.&lt;/p&gt;

&lt;p&gt;In the &lt;a href=&quot;https://www.type-labo.jp/Ohbun.html&quot;&gt;Yakumono typeface, created by Yutaka Satoh&lt;/a&gt; (TYPE-LABO), we can clearly see many of the key emoji that would persist throughout the years: smiley faces, food, drink, cigarettes, sweat, umbrella, paperclip, lips, envelope, and most interestingly the (not smiling) pile of poo. This typeface received an honourable mention at the awards. Some 40 years later, I think it’s safe to say it deserved more. 🏆&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1979&quot;&gt;1979&lt;/h2&gt;

&lt;p&gt;We can see &lt;a href=&quot;http://kanji.zinbun.kyoto-u.ac.jp/~yasuoka/JUGYO/2009-12-21.pdf&quot;&gt;emoji in the character sets of Japanese home computers&lt;/a&gt; such as the Sharp MZ-80K, which included a UFO, smiley faces, stick figures, car, snake, and more. I won’t include them here but you can click the above link to see some in a PDF. 💾&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1965&quot;&gt;1965&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://ja.wikipedia.org/wiki/BA-90&quot;&gt;“Full Moon With Face”, also known as BA-90&lt;/a&gt; which was listed in a book of typesetting symbols, published by Sha-ken in 1965. A &lt;a href=&quot;https://emojipedia.org/full-moon-face&quot;&gt;smiling moon is still present in the emoji set today&lt;/a&gt;. 🌝&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-ba-90-full-moon-with-face.png#ba90&quot; alt=&quot;PNG&quot; title=&quot;image courtesy of &amp;lt;a href=https://commons.m.wikimedia.org/wiki/File:BA-90.png&amp;gt;Wikimedia&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;1959&quot;&gt;1959&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://ja.wikipedia.org/wiki/CO-59&quot;&gt;CO-59 is a character set created in 1959&lt;/a&gt; for exchange of data between Japanese newspapers. In it is included a symbol of a baseball, which again is &lt;a href=&quot;https://emojipedia.org/baseball&quot;&gt;still present in emoji&lt;/a&gt; ⚾️ and &lt;a href=&quot;https://www.fileformat.info/info/unicode/char/26be/index.htm&quot;&gt;at Unicode codepoint U+26BE&lt;/a&gt; ⚾︎ today.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-co-59-baseball.png&quot; alt=&quot;PNG&quot; title=&quot;image courtesy of &amp;lt;a href=http://etlcdb.db.aist.go.jp/etlcdb/&amp;gt;ETL character database&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;comparing-emoji&quot;&gt;Comparing Emoji&lt;/h2&gt;

&lt;p&gt;I was interested in how the emoji that I have redrawn compared to the 1997 SoftBank and 1999 DoCoMo sets, and an early Pocket Bell, so here’s a little table.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt; &lt;/th&gt;
      &lt;th&gt;Sharp&lt;br /&gt;PA-8500&lt;/th&gt;
      &lt;th&gt;NEC&lt;br /&gt;PI-ET1&lt;/th&gt;
      &lt;th&gt;Sharp&lt;br /&gt;PI-4000&lt;/th&gt;
      &lt;th&gt;Pocket Bell&lt;br /&gt;R-FAHC&lt;/th&gt;
      &lt;th&gt;SoftBank&lt;/th&gt;
      &lt;th&gt;NTT&lt;br /&gt;DoCoMo&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Year&lt;/td&gt;
      &lt;td&gt;1988&lt;/td&gt;
      &lt;td&gt;1990&lt;/td&gt;
      &lt;td&gt;1994&lt;/td&gt;
      &lt;td&gt;1995&lt;/td&gt;
      &lt;td&gt;1997&lt;/td&gt;
      &lt;td&gt;1999&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Quantity (approx)&lt;/td&gt;
      &lt;td&gt;100&lt;/td&gt;
      &lt;td&gt;130&lt;/td&gt;
      &lt;td&gt;170&lt;/td&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;90&lt;/td&gt;
      &lt;td&gt;176&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Resolution&lt;/td&gt;
      &lt;td&gt;16×16&lt;/td&gt;
      &lt;td&gt;16×16&lt;/td&gt;
      &lt;td&gt;12×12&lt;/td&gt;
      &lt;td&gt;5×7&lt;/td&gt;
      &lt;td&gt;12×12&lt;/td&gt;
      &lt;td&gt;12×12&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;a-word-about-the-word&quot;&gt;A word about the word&lt;/h2&gt;

&lt;p&gt;A side discovery: the word 絵文字 (emoji) itself has a much longer paper trail. The earliest citation I’ve found is &lt;a href=&quot;https://archive.org/details/kenkyushasnewjap0000unse_h0k7/page/228/mode/2up?q=絵文字&quot;&gt;Kenkyūsha’s New Japanese-English Dictionary&lt;/a&gt;, 1954—the standard postwar bilingual reference. It defines:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/kenkyushas-new-japanese-english-dictionary-1954.png&quot; alt=&quot;e&apos;-mo&apos;ji 絵文字 n. a picture word; a pictorial symbol; picture writing; a pictograph; hieroglyphics (象形文字). 1954.&quot; title=&quot;e&apos;-mo&apos;ji 絵文字 n. a picture word; a pictorial symbol; picture writing; a pictograph; hieroglyphics (象形文字). 1954.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A settled dictionary headword forty-five years before DoCoMo. “Pictorial symbol” is the second listed sense — more central, by lexicographers’ ordering convention, than “hieroglyphics.”&lt;/p&gt;

&lt;p&gt;The word kept showing up in places I wasn’t expecting:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1975: &lt;a href=&quot;https://archive.org/details/sony-system-equipment-handbook/Sony%20System%20Equipment%20Handbook?q=絵文字&quot;&gt;A Sony catalogue describes its ETV-4010 school AV mixing console&lt;/a&gt; as having 「パネル面の絵文字、色分け表示」 — “emoji on the panel face, colour-coded indicators”. The 絵文字 are the small pictographic labels on the control panel. Same functional concept as digital emoji, applied to industrial hardware, twenty-four years before i-mode.&lt;/li&gt;
  &lt;li&gt;1984: The graphic designer &lt;a href=&quot;https://archive.org/details/trademarkssymbol00kuwa&quot;&gt;Kuwayama Yasaburō publishes a 431-page reference book&lt;/a&gt; titled simply 『世界の絵文字』 (Sekai no Emoji / “Emoji of the World”) on global logos, pictograms, and trademark design, spanning the years 1970–1983.&lt;/li&gt;
  &lt;li&gt;1984: &lt;a href=&quot;https://archive.org/details/ascii-august-1984/ASCII_August_1984?q=絵文字&quot;&gt;ASCII magazine reviews the Canon PW-10 word processor&lt;/a&gt; in its August news section, noting that “各種記号、絵文字をワンタッチで表示することができる” — “various symbols and emoji can be displayed at the touch of a button”. Here are &lt;a href=&quot;https://newsletter.shifthappens.site/archive/new-in-the-collection-pt-3-canon-pw-101530/&quot;&gt;some great photos thanks to Marcin Wichary&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;1985: &lt;a href=&quot;https://archive.org/details/ascii-msx-magazine-supplement-198510/ASCII%20MSX%20Magazine%20supplement%20198510-MsxBeanDictionary?q=絵文字&quot;&gt;MSX Magazine’s MSX 豆辞典 pocket dictionary supplement&lt;/a&gt;, distributed via Japan National Railways station kiosks, uses 絵文字 as the umbrella term in its entry for アイコン (icon), and gently complains that American influence has wrongly promoted “icon” into the same umbrella role.&lt;/li&gt;
  &lt;li&gt;1988: &lt;a href=&quot;/images/posts/emoji-wapuro-toshiba-jw95f.png&quot;&gt;Toshiba’s Rupo JW95F word processor manual uses 絵文字&lt;/a&gt; as a column header in its emoji-input reference table, no gloss whatsoever — the most casual possible use of a technical term.&lt;/li&gt;
  &lt;li&gt;1993: Nojima Hisao publishes “絵文字の心理的効果” (“Psychological Effects of Emoji”) in the intellectual monthly 現代のエスプリ. By January 1994 it was being cited internationally in the &lt;a href=&quot;https://archive.org/details/ERIC_ED370541?q=emoji&quot;&gt;Pacific Telecommunications Council conference proceedings&lt;/a&gt; in Honolulu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What DoCoMo’s 1999 set did was become the international reference point — which is why English borrowed 絵文字 as “emoji” rather than Sharp’s or Toshiba’s or Sanyo’s much earlier sets. The word’s invention is fiction. Its globalisation via DoCoMo is real, but only in English. 🌍&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;So what does this all mean? I’d say mostly that the history emoji isn’t as clean cut as you might have thought. You can decide for yourself on what you consider to be the first emoji. It depends on our own personal definition, so there is no right or wrong answer. 😎&lt;/p&gt;

&lt;p&gt;Personally, I define the start date of emoji as the point in time when sets of these symbols first appeared for use whilst composing text. I don’t think the timeline should start at mobile phones, as this feels like a somewhat arbitrary decision that dismisses a lot of history. It’s like saying music only began to exist from the moment it could be recorded and listened to without the actual muscians being present. 🤔&lt;/p&gt;

&lt;p&gt;As to whether the timeline of emoji history will be rewritten with this knowledge, it’s difficult to say. Much of this falls in the grey area of happening around the time the internet was taking hold, plus most things about the origin of emoji are in Japanese language, so there are unlikely to be sources Wikipedia would consider verifiable enough. The best we could do is quote the pages of the manuals for devices, and for the rest hope that there’s some record in Japanese literature that could be cited.&lt;/p&gt;

&lt;p&gt;I won’t be running the Wikipedia editing gauntlet, but if you do please let me know how it goes! 🧨&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/emoji-history-piskel.png&quot; alt=&quot;PNG&quot; title=&quot;I added a new tool to the Piskel app to make redrawing hundreds of emoji a little bit easier&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;terms-of-use&quot;&gt;Terms of use&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;I painstakingly recreated the emoji sets on this page, pixel by pixel, over many days of hard work. I even went so far as &lt;a href=&quot;/2023/05/10/piskel-for-playdate/&quot;&gt;adding a new tool to the pixel art app I use&lt;/a&gt;, so as to make the task of redrawing hundreds of emoji a little less daunting. Feel free to utilize the emoji images, just remember to credit @gingerbeardman and include a link to this page. With one exception: I object to the use of these images for the purpose of creating NFTs. Thanks for your understanding!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;printed-citations&quot;&gt;Printed citations&lt;/h2&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:piet1&quot;&gt;
      &lt;p&gt;NEC Electronic Tool PI-ET1, Instruction Manual, p.131, システム外字数 (“Non System Kanji”) &lt;a href=&quot;#fnref:piet1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:pa8500&quot;&gt;
      &lt;p&gt;Sharp Electronic Notebook PA-8500, Operating Instructions, p.201, 記号一覧表 (“Symbol List”) &lt;a href=&quot;#fnref:pa8500&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 10 May 2024 20:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/05/10/emoji-history-the-missing-years/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/05/10/emoji-history-the-missing-years/</guid>
        </item>
      
    
      
        <item>
          <title>Barbara Nessim at The Ginza Art Space (1986)</title>
          <description>&lt;p&gt;At the end of 2023 I bought a one-in-a-million find from Japan: it’s a postcard from &lt;a href=&quot;/2023/11/09/early-computer-art-by-barbara-nessim/&quot;&gt;Barbara Nessim&lt;/a&gt;’s residency at &lt;a href=&quot;https://gallery.shiseido.com/en/access/&quot;&gt;&lt;em&gt;The Ginza Art Space&lt;/em&gt;&lt;/a&gt;, September 26 thru October 19 1986. This residency came on the back of &lt;a href=&quot;/2023/11/09/early-computer-art-by-barbara-nessim/&quot;&gt;her breakthrough early computer art&lt;/a&gt; that was done on a Telidon system, a type of Teletext graphics system that displayed rudimentary vector graphics.&lt;/p&gt;

&lt;p&gt;The postcard artwork is not digital and is dated 6-86. The details on the rear are set in the Chicago typeface designed by Susan Kare for the Apple Macintosh just a couple of years prior.&lt;/p&gt;

&lt;p&gt;As well as Barbara’s residency there was an accompanying exhibition &lt;em&gt;“The Work of Barbara Nessim”&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-01.webp&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-01.webp&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-02.webp&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-02.webp&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 140%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },10000);
  
&lt;/script&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;made-in-japan&quot;&gt;Made in Japan&lt;/h2&gt;

&lt;p&gt;During her time at The Ginza Art Space, Barbara used an NEC PC-100 to draw new work and printed them on one of the earliest wide-format colour inkjet printers, the &lt;a href=&quot;https://www.jstage.jst.go.jp/article/isjepj/24/4/24_278/_pdf/-char/ja&quot;&gt;&lt;em&gt;Fujix JetGraphy 3000&lt;/em&gt;&lt;/a&gt; (I’d love to be able to read &lt;a href=&quot;https://www.researchgate.net/publication/294487702&quot;&gt;this article at ResearchGate&lt;/a&gt;). Given the use of early technology and non-archival inks, the prints are prone to fading and are now very fragile.&lt;/p&gt;

&lt;p&gt;The choice of PC-100 computer is interesting because its display could be rotated between portrait and landscape. In portrait orientation it had a resolution of 512×720, which is seven times more pixels than the Telidon system and twice as tall as the Macintosh Plus. The PC-100 displayed bitmap graphics so it was more similar to the Macintosh than the vector graphics of the Telidon system.&lt;/p&gt;

&lt;p&gt;Colours were limited: the PC-100 hardware could display 16 colours from a palette of 512. The printer used CMYK and could produce around 10,000 colours, some of which printed better than others. This combination may have imposed some limitations as to which colours could, or should, be used.&lt;/p&gt;

&lt;p&gt;Below are three examples of the work Barbara produced at The Ginza Art Space: they are &lt;em&gt;Flowers in the Wind&lt;/em&gt;, &lt;em&gt;Hand Memory&lt;/em&gt;, and &lt;em&gt;The Gift&lt;/em&gt;. A description of the creative process is featured in &lt;a href=&quot;https://archive.org/details/PC_Computing_1988_10/page/n101/mode/2up&quot;&gt;Carol Olsen Day’s article &lt;em&gt;“The Art of Barbara Nessim”&lt;/em&gt;, in the October 1988 issue of PC Computing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1758166965330272503&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-03.png&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;what-software&quot;&gt;What software?&lt;/h2&gt;

&lt;p&gt;My ongoing &lt;a href=&quot;/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/&quot;&gt;research into early Japanese pixel art software&lt;/a&gt; shows that Barbara most likely used ASCII’s エアーブラシ “Airbrush” painting software on the NEC PC-100, as it is the only graphics software for that platform I’ve been able to find &lt;a href=&quot;https://archive.org/details/login-april-1984/LOGiN%20-%20April%201984/page/n242/mode/2up&quot;&gt;advertised for sale&lt;/a&gt; or &lt;a href=&quot;https://archive.org/details/login-june-1984/LOGiN%20-%20June%201984/page/n113/mode/2up&quot;&gt;featured in period literature&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-ginza-1986-04.jpg&quot; alt=&quot;JPG&quot; title=&quot;LOGiN magazine, June 1984, page 117: Tachibana Hajime&apos;s article on CG mentions Airbrush&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 15 Feb 2024 23:22:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/02/15/barbara-nessim-at-the-ginza-art-space-1986/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/02/15/barbara-nessim-at-the-ginza-art-space-1986/</guid>
        </item>
      
    
      
        <item>
          <title>JINZO Paint: vintage mobile drawing app</title>
          <description>&lt;p&gt;At my core I’m a software guy. I don’t really get attached to hardware: in my mind it exists only as a conduit to software. I use emulation whenever I can to benefit from the increased convenience and reliability. But when I can’t… I buy old devices, and with old devices come old problems.&lt;/p&gt;

&lt;p&gt;I’m fascinated by &lt;a href=&quot;/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/&quot;&gt;vintage digital art software&lt;/a&gt;, from my beginnings on Atari ST, though classic Macintosh and vintage Japanese PCs, to handhelds like Palm devices or, in this case, a PocketPC running Windows CE. As with all software, many great ideas have been abandoned in the name of “progress”.&lt;/p&gt;

&lt;h2 id=&quot;zen-and-the-art-of-software-design&quot;&gt;Zen and the Art of Software Design&lt;/h2&gt;

&lt;p&gt;Japanese art software is notable in a number of ways because their drawing tools evolved differently to those in the West, at least until Photoshop took hold. In Japan the first breakthrough digital art software was the PC-98’s &lt;a href=&quot;https://www.youtube.com/watch?v=nIdFor2WOnw&quot;&gt;Multi Paint System&lt;/a&gt; (MPS, マルチペイントシステム) released by C-Lab in 1992, though an earlier version was released in 1991 as Maguro Paint System, or Tuna Paint System (鮪ペイントシステム) both of which were programmed by Woody_RINN.&lt;/p&gt;

&lt;p&gt;MPS introduced &lt;a href=&quot;https://twitter.com/_blubot_/status/1727397680895476153&quot;&gt;the ability to lock colours and prevent them from being drawn over&lt;/a&gt;. You might think of it as a mask featuring every instance of that particular colour. You could also replace colours in a similar way. This was done through an intuitive mechanism of a toolbar button or key press to lock one or more specific colours on the palette, which is quite different to the selection or mask approaches popularised by Photoshop and common today.&lt;/p&gt;

&lt;p&gt;Regardless of whether or not the method of handling colours in MPS is novel or unique, it was adopted as a standard by most Japanese art software for many years. JINZO Paint (JZP), a digital art app for PocketPC (Windows CE) created by t-ueno (&lt;a href=&quot;http://www.tomozon.sakura.ne.jp/wince/&quot;&gt;Tomohiro Ueno&lt;/a&gt;), was one such app that adopted the MPS way of doing things and I’ve been using it a bunch recently. It offers first class support for drawing in dither patterns, and you can load in custom patterns. If you like HyperCard, NewtPaint, TealPaint, you’ll love it. &lt;em&gt;Jinzo&lt;/em&gt; is the Japanese word for kidney, which is also the icon of the app.&lt;/p&gt;

&lt;p&gt;If you’re interested in reading about the interface and functions of JINZO Paint &lt;a href=&quot;https://www.gingerbeardman.com/jzpaint/&quot;&gt;I’ve mirrored the manuals for two early versions on my website&lt;/a&gt; as the original location is no longer available. A later version supports full 24-bit colour, but removes some useful functions. Regardless, all versions use a similar interface so they’re easy to use once you’re familiar with the general operation. One thing I would say is that the toolbars can be opened and selected with a single tap-drag-release action, which a huge win for usability and one that reminds me of the original Apple Macintosh and Palm OS. If you’re lucky your operating system today will support such fluidity.&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;c&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;d&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;e&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;f&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;g&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;h&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;h&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;f&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;g&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;f&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;h&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;g&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-1.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-1.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-2.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-2.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-3.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-3.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-4.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-4.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-5.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-5.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-6.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-6.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-7.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-7.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-8.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-ui-8.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;f&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;g&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;h&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 133%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}

.carousel__activator:nth-of-type(4):checked ~ .carousel__track {
  -webkit-transform: translateX(-300%);
          transform: translateX(-300%);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__slide:nth-of-type(4) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__controls:nth-of-type(4) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(4) {
  opacity: 1;
}

.carousel__activator:nth-of-type(5):checked ~ .carousel__track {
  -webkit-transform: translateX(-400%);
          transform: translateX(-400%);
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__slide:nth-of-type(5) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__controls:nth-of-type(5) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(5) {
  opacity: 1;
}

.carousel__activator:nth-of-type(6):checked ~ .carousel__track {
  -webkit-transform: translateX(-500%);
          transform: translateX(-500%);
}
.carousel__activator:nth-of-type(6):checked ~ .carousel__slide:nth-of-type(6) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(6):checked ~ .carousel__controls:nth-of-type(6) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(6):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(6) {
  opacity: 1;
}

.carousel__activator:nth-of-type(7):checked ~ .carousel__track {
  -webkit-transform: translateX(-600%);
          transform: translateX(-600%);
}
.carousel__activator:nth-of-type(7):checked ~ .carousel__slide:nth-of-type(7) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(7):checked ~ .carousel__controls:nth-of-type(7) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(7):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(7) {
  opacity: 1;
}

.carousel__activator:nth-of-type(8):checked ~ .carousel__track {
  -webkit-transform: translateX(-700%);
          transform: translateX(-700%);
}
.carousel__activator:nth-of-type(8):checked ~ .carousel__slide:nth-of-type(8) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(8):checked ~ .carousel__controls:nth-of-type(8) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(8):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(8) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(4) {
  -webkit-transform: translateX(300%) translateZ(0);
          transform: translateX(300%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(5) {
  -webkit-transform: translateX(400%) translateZ(0);
          transform: translateX(400%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(6) {
  -webkit-transform: translateX(500%) translateZ(0);
          transform: translateX(500%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(7) {
  -webkit-transform: translateX(600%) translateZ(0);
          transform: translateX(600%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(8) {
  -webkit-transform: translateX(700%) translateZ(0);
          transform: translateX(700%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(4),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(4) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(5),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(5) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(6),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(6) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(7),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(7) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(8),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(8) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },10000);
  
&lt;/script&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;for-my-next-trick-i-will-run-it-on-a-dictionary&quot;&gt;For my next trick I will run it on a Dictionary&lt;/h2&gt;

&lt;p&gt;My Windows CE device is a bit odd because it’s a Brain. These are a range of electronic dictionaries made by Sharp and sold only in Japan. With a bit of gentle coaxing it can be used as a little computer running Windows CE. My particular model is the PW-SH1 which is a 3rd generation device with a high resolution screen whose hinge can rotate 360° so it’s back-to-back against the keyboard, effectively becoming a tablet computer. Some years ago it was figured out that you could sideload apps and even force these devices to open the Windows CE desktop and do all manner of crazy things. Japanese hackers and modders seem to love using these devices to run emulators for old computers like Sharp MZ-series and NEC PC-series. If you want to know more check out the &lt;a href=&quot;https://brain.fandom.com/ja/wiki/Brain_Wiki&quot;&gt;Brain Wiki&lt;/a&gt; and if you want to pick up a device &lt;a href=&quot;https://brain.fandom.com/ja/wiki/Brain機種別解説&quot;&gt;here’s a list of them all&lt;/a&gt; (browser translation required for those links).&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint.jpg&quot; alt=&quot;JPG&quot; title=&quot;JINZO Paint, 4-colour version&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;a-problem-with-file-selection&quot;&gt;A problem with file selection&lt;/h2&gt;

&lt;p&gt;Anyway, I noticed whilst using JZP that the file selector would often fail to open properly. It worked the first time but subsequent attempts saw it open and then immediately vanish. The source code to the first two versions is available, and with the help of Brain Hackers’ &lt;a href=&quot;https://twitter.com/watamario15&quot;&gt;@watamario15&lt;/a&gt; the reason for the problem was traced. He found that the value of the parameter being passed to the file selector was invalid, and provided proof by modifying the source code to those versions resulting in new working binaries. But with the final full-colour version has no source code, so how do we fix that?&lt;/p&gt;

&lt;h2 id=&quot;multiple-solutions&quot;&gt;Multiple solutions&lt;/h2&gt;

&lt;p&gt;The binaries for my device are ARM so there’s good support for debugging that type of code. I fired up Ghidra and started poking around in the earliest, smallest version of JZP. I quickly found the section of code that defined the parameters, helped by the placement of the setup of the strings used in the file selector. &lt;a href=&quot;https://www.coalfire.com/the-coalfire-blog/reverse-engineering-and-patching-with-ghidra&quot;&gt;A quick tutorial later&lt;/a&gt; and I knew how to use Ghidra to find references to data, patch instructions, and save a new binary. The workaround was to set the parameter to NULL, which works nicely but removes the ability for the app to remember the most recently used directory.&lt;/p&gt;

&lt;p&gt;However the source is available for the two earlier versions, which I prefer using, so more complete changes could be implemented. Rather than simply nulling out the parameter we could set it to the correct initial value: the root directory. Additional changes were needed to make sure the program would cope with saving and loading from the root directory of the device directly. And finally, just for good measure, the 16-colour version’s extremely slow bitmap saving has been optimised!&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href=&quot;https://twitter.com/watamario15&quot;&gt;@watamario15&lt;/a&gt; for his invaluable help with debugging and his generous source code wrangling. And to &lt;a href=&quot;https://brain.fandom.com/ja/wiki/&quot;&gt;Brain Wiki&lt;/a&gt; for being such a valuable resource for crazy old software nerds like me!&lt;/p&gt;

&lt;h2 id=&quot;keyboard-controls&quot;&gt;Keyboard controls&lt;/h2&gt;

&lt;p&gt;I’ve also added keyboard control to JINZO Paint 16, with standard Photoshop keys to switch tools, plus keys for undo, set zoom, quick zoom (hold space bar), and more. If I get permission from the original author I’ll release a patch.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/jinzo-paint-dev.png&quot; alt=&quot;JPG&quot; title=&quot;JINZO Paint 16, source code modifications&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;repo&quot;&gt;Repo&lt;/h2&gt;

&lt;p&gt;My changes to the 16-color version are now available at the BRAIN hackers GitHub:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/brain-hackers/jinzo-paint/tree/16-color&quot;&gt;github.com/brain-hackers/jinzo-paint/tree/16-color&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://brain.fandom.com/ja/wiki/JINZO_Paint&quot;&gt;JINZO Paint page on Brain Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://discord.com/channels/759813579120836608/1198349406878060646&quot;&gt;JINZO Paint thread on Brain Hackers Discord Server&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.gingerbeardman.com/jzpaint/&quot;&gt;JINZO Paint documentation mirror&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.tomozon.sakura.ne.jp/wince/JINZO_COLLECTION/DATA_BOOK/JZP_DATA/tel/howtojzp/howtojzp.htm&quot;&gt;JINZO Paint tutorial (4-colours)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.tomozon.sakura.ne.jp/wince/JINZO_COLLECTION/DATA_BOOK/JZP_DATA/emugaro/cgmake.htm&quot;&gt;JINZO Paint tutorial (16-colours)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=nIdFor2WOnw&quot;&gt;Playback of Woody_RINN drawing in Multi Paint System&lt;/a&gt; watch the dithering by blending at &lt;a href=&quot;https://www.youtube.com/watch?v=nIdFor2WOnw&amp;amp;t=434&quot;&gt;07:14&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Mon, 22 Jan 2024 20:53:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2024/01/22/jinzo-paint-vintage-mobile-drawing-app/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2024/01/22/jinzo-paint-vintage-mobile-drawing-app/</guid>
        </item>
      
    
      
        <item>
          <title>Easter egg emoji: converting pixels into particles</title>
          <description>&lt;p&gt;I’m &lt;a href=&quot;/2019/08/14/moai-games/&quot;&gt;fascinated with Moai&lt;/a&gt; so I always try to squeeze an appearance into my games. Moai in video games is a meme, or &lt;a href=&quot;https://en.wikipedia.org/wiki/Easter_egg_(media)&quot;&gt;easter egg&lt;/a&gt;, going all the way back to 1983. But my game YOYOZO (&lt;a href=&quot;https://play.date/games/yoyozo/&quot;&gt;out now for the Playdate handheld&lt;/a&gt;) is about capturing stars in space using a yoyo, so how could I get a Moai in it?&lt;/p&gt;

&lt;p&gt;The source of my inspiration was a trip to Japan back in 2004 (my only one, so far). Visiting in August meant that one of the things we did was go to an &lt;a href=&quot;https://www.japan-guide.com/e/e2267.html&quot;&gt;annual hanabi fireworks festival&lt;/a&gt;, where I saw &lt;a href=&quot;https://blog.gaijinpot.com/four-types-of-japanese-fireworks/&quot;&gt;katamono&lt;/a&gt; for the first time. These are fireworks that explode in the shapes of drawings, like a smiley face or a magic 8-ball. I was amazed and the experience has stuck with me for over 20 years. Maybe I could add Moai into YOYOZO by making the explosions appear like the katamono?&lt;/p&gt;

&lt;p&gt;I started off by coding the patterns by hand, as a test, but my calculations weren’t precise enough and the whole endeavour quickly grew too complicated to manage by hand. I needed a better, more automated way. The method that I arrived at is what I’ll document in this post.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pixels-as-code&quot;&gt;Pixels as code&lt;/h2&gt;

&lt;p&gt;Instead of plotting values by hand in code I figured that it would make more sense if I could draw the patterns and then somehow convert them into coordinates. I use &lt;a href=&quot;/2023/05/10/piskel-for-playdate/&quot;&gt;Piskel&lt;/a&gt; as my Playdate-centric graphics editor. It’s a really useful tool. So I drew a few emoji-like patterns, keeping in mind that they would be converted into a cluster of points and exploded from an origin. This took a bit of experimentation but I ended up with a sort of already exploded look.&lt;/p&gt;

&lt;p class=&quot;screen&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-emoji.png#pixel&quot; alt=&quot;EMOJI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To get the pixel data out of Piskel in text form I make use of its “export as a C file” feature. This results in code definitions similar to the below. (I use a script that does some simple regex search/replace to reformat these definitions to be a little more succinct and readable in my Lua code.)&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define EMOJI-TABLE-11-11_FRAME_COUNT 3
#define EMOJI-TABLE-11-11_FRAME_WIDTH 11
#define EMOJI-TABLE-11-11_FRAME_HEIGHT 11
&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;/* Piskel data for &quot;emoji-table-11-11&quot; */&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;emoji&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;121&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
&lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0xff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x00&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pixels-as-points&quot;&gt;Pixels as points&lt;/h2&gt;

&lt;p&gt;With this data in hand, my plan was to convert them into points expressed as an angle and distance from an origin. This way of expressing points is the &lt;a href=&quot;https://en.wikipedia.org/wiki/Polar_coordinate_system&quot;&gt;polar coordinate system&lt;/a&gt; so there was no need to invent anything, I just needed to code a function that would take a grid of pixels expressed as &lt;em&gt;(x, y)&lt;/em&gt; and convert them to a series of distances and angles expressed as &lt;em&gt;(r, θ)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The way I do this is to read the point data in from a grid of pixels, offsetting that data by half the width and height of the &lt;em&gt;odd-sized&lt;/em&gt; grid so that the centre of the grid &lt;em&gt;(0, 0)&lt;/em&gt; is the middle of the centre pixel. And finally I convert those adjusted &lt;em&gt;(x, y)&lt;/em&gt; values to polar &lt;em&gt;(r, θ)&lt;/em&gt; coordinates. This worked really well!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Below is a work-in-progress GIF captured on 14 September 2023, shortly after getting the feature working. This animation also shows an early version of the HUD and debug values for ball size and the length of the beam.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-emoji.gif#playdate&quot; alt=&quot;EMOJI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The finishing touches (not shown in the above animation) were to add some small amount of &lt;em&gt;pseudo-randomisation&lt;/em&gt; to the initial rotation of the emoji, the initial “colour” of each particle, and changing the coordinates of each point slightly so they appear more organic and move at slightly different speeds. I eventually settled on over a dozen such pixel patterns in the game (how many have you spotted?). Once your score is higher than 50M points every explosion is an emoji! &lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;Check out the game manual&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;pseudo-random&quot;&gt;Pseudo-random?&lt;/h2&gt;

&lt;p&gt;I try to limit my use math.random values if I can help it, or at least use it in controlled way. I already use that for the positions of the stars, so if I also used it for explosions that would mean it would become far less controlled. Controlling the use of random is important in making a game system deterministic, if you want it to react the same way every time.&lt;/p&gt;

&lt;p&gt;If you’re wondering how you can get pseudo-random values, the main method I use is a trick I learned from the old arcade game &lt;a href=&quot;/2011/10/26/flicky-1984/&quot;&gt;Flicky (1984, SEGA)&lt;/a&gt; which is a game &lt;a href=&quot;https://www.flicky1984.com/post/709058873877790720/just-a-quick-reminder-that-you-can-play-my-flicky&quot;&gt;I own as a physical cabinet&lt;/a&gt;. Anyway, in Flicky there is a diamond that appears under seemingly random conditions.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;One of the MAME programmers was kind enough &lt;a href=&quot;https://www.flicky1984.com/post/54534135892/the-best-jewel-thief-in-the-world&quot;&gt;reverse engineer Flicky on my behalf and figured out what makes the diamond appear&lt;/a&gt;. It turns out the diamond will appear only if you knock out an enemy cat and it disappears outside of the centre third of the play area &lt;em&gt;and&lt;/em&gt; if the x coordinate at which the cat finally comes to rest is even. So, about 50% chance &lt;em&gt;but&lt;/em&gt; only if you position the screen correctly during play.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, taking a cue from that wonderful Flicky logic, I use modulus—which returns the remainder of a division—as my main mechanism of generating pseudo-random values. It ensures a value in the range &lt;em&gt;[0,n-1]&lt;/em&gt;. They key thing to note is that if you base it on values in your game system that are constantly changing you can get seemingly random values that have the benefit of being deterministic if the player is skilled enough at repeating their inputs. The deterministic thing is how pretty much all the old school arcade games operated from Pac-Man to Flicky and more.&lt;/p&gt;

&lt;p&gt;Common game variables I use are: game tick (my alternative to timer), x-coordinate, y-coordinate, speed, angle, or combinations of more than one of these. I also used this approach in YOYOZO for the starfield particles, and in &lt;a href=&quot;/2023/04/13/sparrow-solitaire-for-playdate/&quot;&gt;Sparrow Solitaire&lt;/a&gt; for the falling particles that make up the &lt;a href=&quot;https://www.reddit.com/r/PlaydateConsole/comments/12vcrm6/dynamic_weather_effects_and_more_in_the_sparrow/&quot;&gt;weather effects&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;playdate-particles&quot;&gt;Playdate particles&lt;/h2&gt;

&lt;p&gt;There are &lt;a href=&quot;https://github.com/PossiblyAxolotl/pdParticles&quot;&gt;one or more libraries&lt;/a&gt; available that can be used to manage particles in a performant way on Playdate. Though I tend to code my own system that is bespoke to the game I’m working on at the time (I start each game from a blank file and use minimal libraries, force of habit). But the important thing for such limited platforms, especially when using Lua, is to use a pool of particles so that you’re not constantly creating and destroying particles which would wreak havoc on performance through overuse of Lua’a garbage collector.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;further-reading&quot;&gt;Further reading&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/&quot;&gt;&lt;em&gt;YOYOZO&lt;/em&gt; (or, how I made a Playdate game in 39KiB)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/12/09/dynamic-music-and-sound-techniques-for-video-games/&quot;&gt;Dynamic music and sound techniques for video games&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;&lt;em&gt;YOYOZO&lt;/em&gt; manual/player’s guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 26 Nov 2023 20:41:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/11/26/easter-egg-emoji-converting-pixels-into-particles/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/11/26/easter-egg-emoji-converting-pixels-into-particles/</guid>
        </item>
      
    
      
        <item>
          <title>YOYOZO (or, how I made a Playdate game in 39KB)</title>
          <description>&lt;blockquote&gt;
  &lt;p&gt;2023-12-27—&lt;a href=&quot;https://arstechnica.com/gaming/2023/12/ars-technicas-best-video-games-of-2023/7&quot;&gt;Ars Technica: YOYOZO wins GOTY accolade!&lt;/a&gt; almost unbelievable to be listed alongside such games as: Chants of Sennaar, Cocoon, Dave the Diver, Humanity, The Legend of Zelda: Tears of the Kingdom, Pikmin 4, Puzzmo, Super Mario Bros. Wonder, Venba and Viewfinder.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A game I made for the Playdate handheld was released today! &lt;a href=&quot;https://play.date/games/yoyozo/&quot;&gt;Go buy it&lt;/a&gt; and then come back to read this blog post.&lt;/p&gt;

&lt;p&gt;It’s called YOYOZO and in it you control a space yo-yo and have to collect stars in a sort of cosmic ballet. Well, at first it might feel a little like being on a fairground ride, but eventually you’ll become good enough for it to feel like ballet. The concept is based on my memory of a game called &lt;a href=&quot;https://archive.org/details/Pendulumania-v1.3&quot;&gt;Pendulumania&lt;/a&gt; that I played 20 years ago.&lt;/p&gt;

&lt;p&gt;The most amazing thing about this game, for me, is that launch version weighs in at a file size of &lt;em&gt;only 39KiB&lt;/em&gt;. I’m using the KiB unit of measurement which equates to 1024 bytes. I still find it hard to believe as the game contains so much! In this blog post I’ll go into some of the nerdy details.&lt;/p&gt;

&lt;h2 id=&quot;playdate&quot;&gt;Playdate?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://play.date&quot;&gt;Playdate&lt;/a&gt; is a handheld gaming system with a unique crank input method. I don’t use the crank in this game, but I have done in the past and will do again in the future.&lt;/p&gt;

&lt;p&gt;If you own a Playdate you can buy the game now at &lt;a href=&quot;https://play.date/games/yoyozo/&quot;&gt;play.date/games/yoyozo/&lt;/a&gt;. If you don’t own a Playdate, well, &lt;a href=&quot;https://play.date&quot;&gt;what are you waiting for&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-teaser.gif#playdate&quot; alt=&quot;YOYOZO&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;butwhy&quot;&gt;But…&lt;em&gt;why?&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;The drive to produce a small game started after I sent the first playable version to testers. Steve at &lt;a href=&quot;http://scenicroutesoftware.com&quot;&gt;&lt;em&gt;Scenic Route Software&lt;/em&gt;&lt;/a&gt;, purveyor of quality video games, commented how tiny the game was. At that point it was 18KiB, but had no music or sound effects or polish. There was a long way to go.&lt;/p&gt;

&lt;p&gt;Even so, I wondered how doable it would be to build the game out with an eye on keeping file size “low”. I thought back to the days of my youth where whole games would fit on a single floppy disk, with room to spare. If they could do it, shouldn’t I give it a try?&lt;/p&gt;

&lt;p&gt;It’s worth noting that even with this mindset, I didn’t make a huge sustained effort to meet the goal. On the contrary, it was just something I simply kept in mind as development proceeded. For that reason, I’m sure there are more ways the game could be made even smaller than it is, with the exact same code and content. For example, I never tried finding the most optimal format for things like music and particle data which are the two largest sets of embedded data.&lt;/p&gt;

&lt;p&gt;Finally, this is not a challenge, or me throwing down the gauntlet in any way. It’s easy enough to make a smaller game, be it similar or entirely different, you’d just have to make different choices along the way. This was just me doing something nerdy as an additional constraint on top of the already enjoyable constraints of developing for Playdate.&lt;/p&gt;

&lt;p&gt;That said, I think every game developer should regularly make a point of writing code for an underpowered device as part of their own personal development—there are so many lessons to learn.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;reasons&quot;&gt;Reasons&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The main reason for the small file size is the fact that &lt;em&gt;the game does not use any digital sound files, and very few bitmap images&lt;/em&gt; (the launch card and animation have to be bitmaps, and in-game only the logo and fonts are bitmaps). Game graphics are all drawn using only shapes (lines, rects, circles) and fills (black, white, and dither patterns).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A second reason is that whilst I use the base Playdate Lua SDK, &lt;em&gt;I don’t use any of the additional “CoreLibs”&lt;/em&gt;. The only extra graphics functions I needed were for drawing outlined or filled circles, so I use two of my own wrapper functions that are similar to those from CoreLibs/graphics but mine are smaller and more specific. For timers, I use a simple frame/tick system, an approach which has pros and cons, but it’s good enough for me.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A third reason is that I made the tough decision to reduce system assets, which means &lt;em&gt;there is no animated launcher card&lt;/em&gt;. This was a tough one, but it added so much to the file size I decided against it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finally, I noticed that &lt;em&gt;including data inside your game code&lt;/em&gt; often trumps how well you can compress it and store it externally. For example I tried compressing the music data and storing it in an external file, but the game final file size was larger than if I embedded the data in my Lua code. Plus, it’s faster as it doesn’t need to load an additional external file.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;breakdown&quot;&gt;Breakdown&lt;/h2&gt;

&lt;p&gt;I thought it would be cool to outline the main features and how each contributes to the total file size. Note that the sizes are expressed as quantities of the compiled binary, rather than uncompiled source code. It’s also worth noting that a blank project with an empty update function results in a compiled binary of only 147 bytes. Playdate compiles to Lua bytecode.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-chart.png&quot; alt=&quot;CHART&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Content&lt;/th&gt;
      &lt;th&gt;Kilobytes&lt;/th&gt;
      &lt;th&gt;%&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Main code&lt;/td&gt;
      &lt;td&gt;19&lt;/td&gt;
      &lt;td&gt;49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Two music tracks&lt;/td&gt;
      &lt;td&gt;5.5&lt;/td&gt;
      &lt;td&gt;14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Three bitmap fonts&lt;/td&gt;
      &lt;td&gt;2.5&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Synthesized sound effects&lt;/td&gt;
      &lt;td&gt;2.5&lt;/td&gt;
      &lt;td&gt;6&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Custom particle system&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Animated system icon&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Animated system card&lt;/td&gt;
      &lt;td&gt;2.0&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Pulp music engine (modified)&lt;/td&gt;
      &lt;td&gt;1.5&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Online scoring system&lt;/td&gt;
      &lt;td&gt;0.5&lt;/td&gt;
      &lt;td&gt;1.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;How to play instructions&lt;/td&gt;
      &lt;td&gt;0.4&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Custom soundtrack capability&lt;/td&gt;
      &lt;td&gt;0.1&lt;/td&gt;
      &lt;td&gt;0.25&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;“Main code” contains: physics simulation, game structure and state management, multi-layered scoring and bonus system, score/stat tracking, loading and saving stats and settings, path recording and playback, animated introduction, plus the following &lt;em&gt;dynamic&lt;/em&gt; systems: scrolling starfield, screen shake, music system, sound effects system. All running at 40fps.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;abandoned-and-removed-features&quot;&gt;Abandoned and removed features&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;I tried a bunch of stuff during development. Such as asteroid fields or meteor showers that introduced obstacles that needed to be avoided, and black holes that would magnetically attract the ball. But I felt they detracted from the pureness of the concept, so I didn’t go any further with them.&lt;/li&gt;
  &lt;li&gt;The positions of stars are randomly generated, but I have implemented a fixed “daily” layout in the game, which is really fun. It’s a different experience to be able to play the same layout over and over, improving your execution of the same moves and eking out higher and higher scores. I did plan to reintroduce that option when Playdate Catalog got score boards that reset daily, but by the time that happened &lt;a href=&quot;/2025/04/15/when-playdate-stopped-being-fun/&quot;&gt;I was no longer developing Playdate&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;manualguide&quot;&gt;Manual/Guide&lt;/h2&gt;

&lt;p&gt;I really loved the manuals that came with games in the 8-bit and 16-bit era. So I thought it would be fun to write a manual/player’s guide in the old-school style. I love reading those sorts of manuals, where the developer gives you a little glimpse behind the curtain so you get an understanding of how the game works, with some small hints and tips littered throughout—for the most inquisitive players! If that sounds like your thing, &lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;download the manual from the game page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/yoyozo-manual.png&quot; alt=&quot;YOYOZO Manual&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;timeline&quot;&gt;Timeline&lt;/h2&gt;

&lt;p&gt;I worked on YOYOZO from September 5th to 27th, submitting it to Catalog on 21st and polishing it for the final week after that. After the game was approved I added online score boards one evening just prior to launch. It was in review and waiting for release longer than it was in development!&lt;/p&gt;

&lt;p&gt;The purpose of this section is not to say that developing a game quickly is better than developing one slowly, or vice versa, but rather to show the importance of scoping a game well and then sticking to the plan.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2023-09-05—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699108587732119834&quot;&gt;initial prototype&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-09-07—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699784106505290093&quot;&gt;playable prototype&lt;/a&gt; (3 days)&lt;/li&gt;
  &lt;li&gt;2023-09-07—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1699890693366517890&quot;&gt;quick progress&lt;/a&gt; (3 days)&lt;/li&gt;
  &lt;li&gt;2023-09-09—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1700612152707461396&quot;&gt;came up with the name&lt;/a&gt; (5 days)&lt;/li&gt;
  &lt;li&gt;2023-09-14—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1702103698749505670&quot;&gt;polishing and balancing&lt;/a&gt; (10 days)&lt;/li&gt;
  &lt;li&gt;2023-09-20—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1704608465522487681&quot;&gt;revelatory physics tweak&lt;/a&gt; (16 days)&lt;/li&gt;
  &lt;li&gt;2023-09-21—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1704991183573831711&quot;&gt;addicted to my own game&lt;/a&gt; (17 days)&lt;/li&gt;
  &lt;li&gt;2023-09-21—submitted to Catalog (17 days)&lt;/li&gt;
  &lt;li&gt;2023-09-23—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1705676134245875750&quot;&gt;game over replay&lt;/a&gt; (19 days)&lt;/li&gt;
  &lt;li&gt;2023-09-26—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1706765228879253972&quot;&gt;layout design using spreadsheet&lt;/a&gt; (22 days)&lt;/li&gt;
  &lt;li&gt;2023-09-26—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1706772586510643560&quot;&gt;game over stats screen&lt;/a&gt; (22 days)&lt;/li&gt;
  &lt;li&gt;2023-09-27—final version (23 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and then some waiting until:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2023-10-10—approved for Catalog (36 days)&lt;/li&gt;
  &lt;li&gt;2023-11-19—added online scoreboards (76 days)&lt;/li&gt;
  &lt;li&gt;2023-11-21—&lt;a href=&quot;https://twitter.com/gingerbeardman/status/1727030817116053611&quot;&gt;released on Catalog&lt;/a&gt; (78 days)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…so that is 78 days (11 weeks) from initial prototype to being live on the Catalog store!&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;credits&quot;&gt;Credits&lt;/h2&gt;

&lt;p&gt;YOYOZO is a game by Matt Sephton, with music by Jamie Hamshere.&lt;/p&gt;

&lt;p&gt;Thanks to CANO-Lab and Testers.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;further-reading&quot;&gt;Further reading&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/11/26/easter-egg-emoji-converting-pixels-into-particles/&quot;&gt;Easter egg emoji: converting pixels into particles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2023/12/09/dynamic-music-and-sound-techniques-for-video-games/&quot;&gt;Dynamic music and sound techniques for video games&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.date/games/yoyozo/#gameListingMoreInfo&quot;&gt;&lt;em&gt;YOYOZO&lt;/em&gt; manual/player’s guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;elsewhere&quot;&gt;Elsewhere&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;2024-10-16—&lt;a href=&quot;https://gamerepublic.net/news/best-indie-game-made-in-the-north-of-england-2024-award/&quot;&gt;Game Republic 2024 Awards: Best Indie Game Made in the North of England&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2024-03-08—&lt;a href=&quot;https://play.date/games/community-awards-2023/&quot;&gt;Playdate Community Awards 2023: Best Arcade Game&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-12-27—&lt;a href=&quot;https://arstechnica.com/gaming/2023/12/ars-technicas-best-video-games-of-2023/7&quot;&gt;Ars Technica: YOYOZO wins GOTY accolade!&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-30—&lt;a href=&quot;https://arstechnica.com/gaming/2023/11/my-long-quest-to-revive-a-90s-windows-gaming-cult-classic/&quot;&gt;Ars Technica&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-24—&lt;a href=&quot;http://eepurl.com/iEHB8M&quot;&gt;Hacker Newsletter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-23—&lt;a href=&quot;https://www.timeextension.com/news/2023/11/yoyozo-is-a-new-playdate-game-inspired-by-the-japanese-cult-classic-pendulumania&quot;&gt;Time Extension&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-22—&lt;a href=&quot;https://news.ycombinator.com/item?id=38372936&quot;&gt;Hacker News&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2023-11-22—&lt;a href=&quot;https://tildes.net/~games/1cbz/yoyozo_or_how_i_made_a_playdate_game_in_39kb&quot;&gt;Tildes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 21 Nov 2023 23:59:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/11/21/yoyozo-how-i-made-a-playdate-game-in-39kb/</guid>
        </item>
      
    
      
        <item>
          <title>Early computer art by Barbara Nessim (1984)</title>
          <description>&lt;p&gt;Whilst searching for something else entirely I stumbled across these images and was struck by just how beautiful they are. The &lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/mode/2up&quot;&gt;September 1984 (Vol 9, No 10) issue of BYTE magazine&lt;/a&gt; features cover artwork by &lt;a href=&quot;https://en.wikipedia.org/wiki/Barbara_Nessim&quot;&gt;Barbara Nessim&lt;/a&gt; and section pages by Liz Gutowski under direction of Barbara Nessim. Larger versions are &lt;a href=&quot;#scans&quot;&gt;at the bottom&lt;/a&gt; of this blog post.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;#scans&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-thumbnails.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They were drawn during a residency at Time Life in NYC, simply because that was the easiest way Barbara could gain access to a colour computer with suitable capabilities: a Norpak IPS-2 Videotex (NAPLPS/Telidon) system. This offered 6 drawing modes (arc, rectangle, circle, line, dot and polygon) and 12 colours, of which half where shades of grey, plus black and white. And at a resolution of 256x200. That equates to a computer system roughly equivalent to an Apple II running a rudimentary graphics application, in fact you could get an add-on card for the Apple II to give it full &lt;a href=&quot;https://wiki.preterhuman.net/Norpak_Telidon_Graphics_System&quot;&gt;Norpak Telidon capabilities&lt;/a&gt;. The main benefit of the Norpak IPS-2 computer system was that it had pen/stylus input. The system comprised two monitors, one showed the artwork and the other showed the software status menu system. The software was controlled by keyboard and the points that specify the shapes were entered using the pen input.&lt;/p&gt;

&lt;p&gt;My first thought was “such cool pixel art!” but a little bit more reading shows that they are actually vector illustrations. &lt;a href=&quot;https://en.wikipedia.org/wiki/NAPLPS&quot;&gt;NAPLPS&lt;/a&gt; is an early graphics format which could &lt;a href=&quot;https://archive.org/details/telidonbook0000unse/page/116/mode/2up&quot;&gt;represent both text and vector graphics&lt;/a&gt; with all coordinates and other properties—such as size, fill pattern, density—encoded as ASCII for easy transmission. It was &lt;a href=&quot;https://www.friendsofcrc.ca/Projects/Telidon/Telidon.html&quot;&gt;designed to display information on TVs&lt;/a&gt;, and also used for display on terminals, in BBS software, and on the &lt;a href=&quot;https://en.wikipedia.org/wiki/Prodigy_(online_service)&quot;&gt;Prodigy online service&lt;/a&gt;. Readers from around the world might be more familiar with Teletext, which is a close relative of Videotex.&lt;/p&gt;

&lt;p&gt;Doing pure illustration using a system meant for creating pages of information is exactly the type of software subversion I love to discover!&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-telidon.jpg&quot; alt=&quot;JPG&quot; title=&quot;How arcs and rectangles are defined and stored using minimal data, from &amp;lt;em&amp;gt;The Telidon Book&amp;lt;/em&amp;gt; (1981)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.barbaranessim.com&quot;&gt;Barbara Nessim&lt;/a&gt; is a name I was already familiar with, as I’d seen her mentioned and &lt;a href=&quot;https://archive.org/details/verbum502unse/page/8/mode/1up&quot;&gt;interviewed&lt;/a&gt; in &lt;a href=&quot;/2019/07/10/verbum-journal-of-personal-computer-aesthetics/&quot;&gt;Verbum magazine&lt;/a&gt;, &lt;a href=&quot;https://archive.org/details/compute-magazine&quot;&gt;COMPUTE magazine&lt;/a&gt;, in various books about illustration, and regarding her groundbreaking interactive art exhibition/installation &lt;a href=&quot;https://digitalartarchive.siggraph.org/artwork/random-access-memories-400/&quot;&gt;Random Access Memories&lt;/a&gt; (1991/2)—which addressed world issues such as migration and population growth and allowed visitors to operate a Macintosh containing the work, selecting images and printing their own customised booklet of her work with their choice of national flag on the cover. &lt;a href=&quot;https://archive.org/details/computersinartde0000kerl/page/12/mode/1up&quot;&gt;Source 1&lt;/a&gt; &lt;a href=&quot;https://archive.org/details/cyberartsexplori0000unse/page/n207/mode/1up&quot;&gt;and 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whilst I had seen other early computer work by Barbara—&lt;a href=&quot;https://collections.vam.ac.uk/item/O1257731/ode-to-the-statue-of-photograph-barbara-nessim/&quot;&gt;portraits&lt;/a&gt;, &lt;a href=&quot;https://collections.vam.ac.uk/item/O1257732/reclining-nude-photograph-barbara-nessim/&quot;&gt;nudes&lt;/a&gt;, &lt;a href=&quot;https://barbaranessim.squarespace.com/1980s-computer-works/cikairn7mb0di14fz72fvzubvplcu4&quot;&gt;abstract&lt;/a&gt; (all of which are worth checking out!)—I had never seen work quite like these images from BYTE.&lt;/p&gt;

&lt;p&gt;The chunky scan-line gaps in between the rows of pixels are the result of these images being photographs of the monitor on which they were displayed. Screenshots had existed since the 1960s but in the 1980s getting such an image off a mainframe was not yet easy or universal. Instead images were saved by pointing a camera at the screen, in this case a Polaroid Palette Video Image Recorder, capturing the image on 35mm slide film, and printing them by &lt;a href=&quot;https://www.npg.org.uk/collections/explore/glossary-of-art-terms/cibachrome-print&quot;&gt;cibachrome process&lt;/a&gt;. Which is really saying something! Of course, I think the photos are much better than screenshots because of the scan-lines, the phosphor glow, the bleeding of colours, and the general analog feel to the whole thing.&lt;/p&gt;

&lt;p&gt;Barbara was one of few people to embrace computers for art in the early-1980s, when the rest of the art world considered them at best a “fad” and at worst a threat to their existence. The dismissal was near-total: she &lt;a href=&quot;https://youtu.be/--BAMGqbb8c?t=1115&quot;&gt;couldn’t persuade a single one of her artist friends&lt;/a&gt; to come and try the computer with her, and was left wondering whether she was the only one who wanted to. That attitude held for around a decade. It wasn’t until the mid-1990s—when affordable colour arrived and &lt;a href=&quot;https://en.wikipedia.org/wiki/Adobe_Photoshop#History&quot;&gt;Photoshop went mainstream&lt;/a&gt;—that the resistance finally broke and, as Barbara puts it, “&lt;a href=&quot;https://bgccraftartdesign.org/items/show/29&quot;&gt;that’s when the change happened, and then it was all over&lt;/a&gt;”. Before and after the 1980s Barbara carved out a hugely successful career for herself, encompassing many different forms of &lt;a href=&quot;https://www.printmag.com/culturally-related-design/gloria-steinem-barbara-nessim-writers-artists-role-models/&quot;&gt;art, teaching and activism&lt;/a&gt;. She continues to &lt;a href=&quot;http://www.barbaranessim.com&quot;&gt;create and exhibit her art&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-portrait.webp&quot; alt=&quot;WEBP&quot; title=&quot;Barbara Nessim at the &amp;lt;em&amp;gt;School of Visual Arts&amp;lt;/em&amp;gt;, 1986. Photographed by Seiji Kakizaki. &amp;lt;a href=https://www.printmag.com/culturally-related-design/gloria-steinem-barbara-nessim-writers-artists-role-models/&amp;gt;Source&amp;lt;/a&amp;gt;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;further-reading-chronological&quot;&gt;Further reading (chronological)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/volume-7-2_202511/Volume%2010-4/page/36/mode/2up&quot;&gt;U&amp;amp;lc (Upper &amp;amp; Lower Case) Magazine, Vol. 10, No. 4 (1983)&lt;/a&gt; &lt;strong&gt;Essential reading.&lt;/strong&gt; “From pencils to pixels: artist Barbara Nessim explores the new tool” by &lt;em&gt;Marion Muller&lt;/em&gt;. Published at a time when there was great unease about the arrival of computers in the world of graphics. This is a fantastic piece that goes into how the works were created, even down to which tools or shapes were used to achieve particular aspects of a drawing and how they were layered, and mostly shows Barbara’s love for the arc tool! It also describes the IPS-2 computer system. And look at that page layout!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/12QcmZ0Z0srtZBkNTvh5p36En71lSUOXi/view&quot;&gt;BYTE magazine, Vol. 08, No. 07—Videotex (July 1983)&lt;/a&gt; 49 pages on Videotex and NAPLPS graphics. Excerpted PDF provided by the &lt;a href=&quot;https://sites.google.com/view/telidonartproject/&quot;&gt;Telidon Art Project&lt;/a&gt;. Full magazine available at &lt;a href=&quot;https://archive.org/details/byte-magazine-1983-07-rescan/page/n85/mode/2up&quot;&gt;archive.org&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://store.graphis.com/products/issue-232-digital-version&quot;&gt;Graphis 232 (1984)&lt;/a&gt; “Computer Images” Barbara writes a small introduction to a selection of computer art created by other artists. Notable for her description of how a Video Image Recorder works.&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://www.youtube.com/watch?v=vAKWR2b6yB8&quot;&gt;Face To Face (1984)&lt;/a&gt; a video made to document her work on the last night of her residency at Time Life, featuring the images loading and displaying in real-time. Very cool!&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/innovatorsofamer0000unse_v4p1/page/122/mode/2up&quot;&gt;Innovators of American Illustration (1986)&lt;/a&gt; an interview by &lt;em&gt;Steven Heller&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/PC_Computing_1988_10/page/n101/mode/2up&quot;&gt;PC Computing Magazine (1988)&lt;/a&gt; “The Art of Barbara Nessim” by &lt;em&gt;Carol Olsen Day&lt;/em&gt; showing the work Barbara did on the NEC PC-100 whilst in Japan, on her Commodore Amiga, and on her Macintosh Plus, plus mention of her Polaroid Palette video image recorder.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/isbn_9781581150759/page/8/mode/2up&quot;&gt;The Education of an Illustrator (2000)&lt;/a&gt; an essay by &lt;em&gt;Barbara Nessim&lt;/em&gt; on her thinking and process as an illustrator.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/digitalcreativit0000wand/page/76/mode/2up&quot;&gt;Digital Creativity: Techniques for Digital Media and the Internet (2001)&lt;/a&gt; a short interview by &lt;em&gt;Bruce Wands&lt;/em&gt; with details about her process.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.artnet.com/usernet/awc/awc_historyview_details.asp?aid=424871289&amp;amp;awc_id=39038&amp;amp;info_type_id=7&quot;&gt;3×3: The Magazine of Contemporary Illustration, Vol. 1, No. 3 (2004)&lt;/a&gt; Interview by &lt;em&gt;Charles Hively&lt;/em&gt;, formerly of Graphis magazine. Touches on the timeless quality of Barbara’s human figures and has a succinct description of her digital work along with the challenges of showing it.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://archive.org/details/PanelbordersBarbaraNessim&quot;&gt;Panel Borders: Barbara Nessim—a (comics) artful life (2013)&lt;/a&gt; interview by &lt;em&gt;Alex Fitch&lt;/em&gt; looking through a comic book and sequential image lens.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.commarts.com/columns/barbara-nessim&quot;&gt;Communication Arts: Barbara Nessim (2014)&lt;/a&gt; interview by &lt;em&gt;Anne Telford&lt;/em&gt; where Barbara speaks about archiving and keeping her work fresh.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bgccraftartdesign.org/items/show/29&quot;&gt;BGC Craft, Art &amp;amp; Design Oral History Project (2014)&lt;/a&gt; &lt;strong&gt;Essential reading.&lt;/strong&gt; A great, long interview by &lt;em&gt;Emily Banas&lt;/em&gt;. Barbara talks about her use of the IPS-2, Apple Macintosh, and Commodore Amiga.&lt;/li&gt;
  &lt;li&gt;Video/Presentation: &lt;a href=&quot;https://youtu.be/--BAMGqbb8c?t=1115&quot;&gt;Barbara Nessim: From There to Here (2014)&lt;/a&gt; &lt;strong&gt;Essential viewing.&lt;/strong&gt; Barbara talks about her work as a pioneer in using computer technology to make art. Featuring work done on a Japanese NEC PC-100 and Commodore Amiga. Also includes “Face to Face” and a Q&amp;amp;A afterwards with info about the IPS-2 work.&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://www.youtube.com/watch?v=vjMUe7hkwRs&quot;&gt;The Lost Art of Canada’s Doomed Pre-Internet Web (2015)&lt;/a&gt; &lt;em&gt;Motherboard&lt;/em&gt; video about the Telidon/NAPLPS system, including footage of some cool art created using it.&lt;/li&gt;
  &lt;li&gt;Video: &lt;a href=&quot;https://www.youtube.com/watch?v=skHHummCJY4&quot;&gt;SVA Career Development presents: Gloria Steinem and Barbara Nessim: In Conversation (2018)&lt;/a&gt; an evening of conversation featuring Gloria Steinem and Barbara Nessim as they discuss their lives as pioneering young women starting their careers in New York City.&lt;/li&gt;
  &lt;li&gt;Audio: &lt;a href=&quot;https://illustrationdept.com/podcast/barbara-nessim-talks-to-giuseppe-castellano&quot;&gt;The Illustration Department: Barbara Nessim (2021)&lt;/a&gt; talks to &lt;em&gt;Giuseppe Castellano&lt;/em&gt; about the early days of her illustrious career.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dinaburgarts.com/barbara-nessim&quot;&gt;DinaburgArts: Barbara Nessim (2021)&lt;/a&gt; profile by &lt;em&gt;Jessica Eisenthal&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Audio: &lt;a href=&quot;https://www.sighswhispers.com/episodes/episode-21-barbara-nessim&quot;&gt;Sighs &amp;amp; Whispers: Episode 21 (2021)&lt;/a&gt; &lt;strong&gt;Essential listening.&lt;/strong&gt; An interview by &lt;em&gt;Laura McLaws Helms&lt;/em&gt;. Includes Barbara describing how she operated the IPS-2 using a combination of keyboard commands and pen input.&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-uandlc-quote.png&quot; alt=&quot;If you have anything in the world to do with graphics, you would have to be pretty thick-skinned not to have &amp;quot;feelings&amp;quot; about the computer revolution. The truth is, when you &apos;re reached a certain level of accomplishment in your chosen vocation, it&apos;s more than a little disconcerting to have your pencil and T-square plucked from your hands and your drawing table kicked out from under you. Here you are at the peak of your powers and... VAVOOM...a whole new technology has come tumbling down on your head, without as much as an &amp;quot;If you please..&amp;quot; More exasperating still, is the army of mere &amp;quot;children&amp;quot; who are in cahoots with the devilish machines, tickle their keys and speak computerese fluently—a language that is quite foreign to many of us. Small wonder that some graphics people have entrenched themselves in on anti-computer stance, which they cling to like shipwrecked victims to a life raft. And the more they see of the fantastic hijinks of the new tool——the more threatening it becomes.&quot; title=&quot;Quote from U&amp;amp;lc (Upper &amp;amp; Lower Case) Magazine, Vol. 10, No. 4 (1983)&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;scans&quot;&gt;Scans&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-01.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/page/n113/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-02.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/page/n163/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-03.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/page/n305/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-04.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/BYTE_Vol_09-10_1984-09_Computer_Graphics/page/n361/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/barbara-nessim-byte-1984-09-image-05.jpg&quot; alt=&quot;JPG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 09 Nov 2023 01:25:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/11/09/early-computer-art-by-barbara-nessim/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/11/09/early-computer-art-by-barbara-nessim/</guid>
        </item>
      
    
      
        <item>
          <title>List of vintage Japanese pixel/dot art software</title>
          <description>&lt;p&gt;For a while now I’ve been collecting references to old Japanese pixel/dot art software. My main sources of information are the treasure trove of scanned magazines on Internet Archive, Twitter archives, YouTube videos, Yahoo! Japan Auctions listings, and Google search. I’ve been keeping this list for a while, and the release of &lt;a href=&quot;https://myanimelist.net/anime/54041/16bit_Sensation__Another_Layer&quot;&gt;&lt;em&gt;16bit Sensation: Another Layer&lt;/em&gt;&lt;/a&gt; and its inclusion of &lt;a href=&quot;https://www.youtube.com/watch?v=nIdFor2WOnw&quot;&gt;&lt;em&gt;Multi Paint System&lt;/em&gt;&lt;/a&gt; made me realise I should make the list public.&lt;/p&gt;

&lt;p&gt;A long term goal would be to find files for each of these so they can be actively used and documented more fully. Most have them can be found in archives of preserved software, with clues in the spreadsheet below, and you can try them using emulation or &lt;a href=&quot;https://virtualosmuseum.org&quot;&gt;Virtual Machines&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/login-march-1985/LOGiN%20-%20March%201985/page/n75/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/list-of-vintage-japanese-pixel-dot-art-software.jpg&quot; alt=&quot;Funny (pixel art software) &amp;amp; CANDY (technical drawing software)&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;selected-columns-from-the-big-list&quot;&gt;Selected columns from the big list&lt;/h2&gt;

&lt;p&gt;The table below is a snapshot of &lt;a href=&quot;https://docs.google.com/spreadsheets/d/17RhWfM2wXW4A-MkQdC6W-w00zHM2tbLfpzuSTD8woMs/edit#gid=0&quot;&gt;selected columns of a Google Sheet&lt;/a&gt; that I’m updating over time. The full spreadsheet contains links to downloads, videos, web pages, magazine mentions, and many other references. So be sure to check, bookmark or subscribe to that link for the very latest information. Since January 2024 I’ve been adding some non-Japanese software that was “big in Japan”.&lt;/p&gt;

&lt;p&gt;Regarding the empty cells: software missing a Japanese name was mostly referred to only by an English title. The rest of the missing information is TBC.&lt;/p&gt;

&lt;p&gt;ドット絵（ドットえ）作成に使えるビンテージ日本語ソフトの一覧です。&lt;/p&gt;

&lt;p&gt;Total entries: 272&lt;/p&gt;

&lt;div class=&quot;table-wrapper&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Platform&lt;/th&gt;
        &lt;th&gt;English&lt;/th&gt;
        &lt;th&gt;Japanese&lt;/th&gt;
        &lt;th&gt;Year&lt;/th&gt;
        &lt;th&gt;Developer&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-7, X1&lt;/td&gt;
        &lt;td&gt;Art Creator&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;MDBA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-7/8&lt;/td&gt;
        &lt;td&gt;Graphic Editor&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1983&lt;/td&gt;
        &lt;td&gt;Hiroshi Ichikawa&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-7/8&lt;/td&gt;
        &lt;td&gt;Super Graphic Editor&lt;/td&gt;
        &lt;td&gt;スーパーグラフィック エディター&lt;/td&gt;
        &lt;td&gt;1983&lt;/td&gt;
        &lt;td&gt;T&amp;amp;E SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-77&lt;/td&gt;
        &lt;td&gt;FM Graphic Editor&lt;/td&gt;
        &lt;td&gt;FMグラフィックエディタⅡ V1.0&lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Fujitsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-R50/60&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid FP&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-R60/70&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid FP&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;ARTemis&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Ryosuke Matsuuchi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;DRAW BOARD2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Souji Yamakawa&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;G-Pen32K&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;rice&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;many COLORS&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Amorphous&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;many COLORS II&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Amorphous&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Meta Paint 2&lt;/td&gt;
        &lt;td&gt;メタペイント2&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;Oizumi Shigeru&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;New Transfer&lt;/td&gt;
        &lt;td&gt;ニュートランスファー&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;Hiroshi Toda&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Oops, anime-kun&lt;/td&gt;
        &lt;td&gt;おっとアニメ君&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Nihon Mi-Com Hanbai&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Otome / Towns Paint System&lt;/td&gt;
        &lt;td&gt;乙女座&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Yabara&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Power Paint&lt;/td&gt;
        &lt;td&gt;パワーペインター&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Wave Train&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Towns PAINT&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Fujitsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;TownsFullcolor&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Fujitsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;FM-Towns&lt;/td&gt;
        &lt;td&gt;Z’s STAFF PRO-TOWNS&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Mac OS X&lt;/td&gt;
        &lt;td&gt;DotEditerSE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2016&lt;/td&gt;
        &lt;td&gt;tokyoconsaruai&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Mac OS X&lt;/td&gt;
        &lt;td&gt;DotShot X&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2007&lt;/td&gt;
        &lt;td&gt;Studio Shin&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Mac OS X&lt;/td&gt;
        &lt;td&gt;FireAlpaca&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2011&lt;/td&gt;
        &lt;td&gt;FireAlpaca&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Mac OS X&lt;/td&gt;
        &lt;td&gt;PikoPixel&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2013&lt;/td&gt;
        &lt;td&gt;Twilight Edge Software&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Mac OS X&lt;/td&gt;
        &lt;td&gt;PoCo&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;KAENRYUU Koutoku&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;BluePaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Shungo Onozuka&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;DotShot&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Studio Shin&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;Leo paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Reona Takahashi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;SketchBook 68K&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Shibutaro Kimura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;Solid Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Masatoshi Utashiro&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Macintosh&lt;/td&gt;
        &lt;td&gt;WishDraw&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Motoo Tanaka&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MPC-X&lt;/td&gt;
        &lt;td&gt;MPC-X Lightpen Graphics&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;Sanyo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;ACE-tools DRAW-SET&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Akio Hiramatsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Animation editor EDDY&lt;/td&gt;
        &lt;td&gt;アニメエディタＥＤＤＹ&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;ANIMECHA Ver. 2.00&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;MAR’Z PROJECT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Art Paper&lt;/td&gt;
        &lt;td&gt;アートペーパー&lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Mitsubishi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;CHEESE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;NEOS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;CHEESE 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;NEOS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Computer Painting&lt;/td&gt;
        &lt;td&gt;描きくけコン&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Casio&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Creative Tool&lt;/td&gt;
        &lt;td&gt;クリエイティブツール&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Da Vinci&lt;/td&gt;
        &lt;td&gt;ダ・ビンチ&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Shinkikakusha Corp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Dot Designers Club&lt;/td&gt;
        &lt;td&gt;ＤＤ倶楽部&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;T&amp;amp;E SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Dream Block&lt;/td&gt;
        &lt;td&gt;ドリームブロック&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Nikkoh Thinking&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;EDDY II&lt;/td&gt;
        &lt;td&gt;エディー&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Gaban&lt;/td&gt;
        &lt;td&gt;がばん&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Micronet&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Garakuta&lt;/td&gt;
        &lt;td&gt;画楽多&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Southern Create&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graph Saurus 1&lt;/td&gt;
        &lt;td&gt;グラフサウルス&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Bit²&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graph Saurus 2&lt;/td&gt;
        &lt;td&gt;グラフサウルスVer2.0&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Bit²&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graph Saurus 2.1&lt;/td&gt;
        &lt;td&gt;グラフサウルスVer2.1&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Bit²&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Artist&lt;/td&gt;
        &lt;td&gt;グラフィックアーティスト&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;YAMAHA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Editor&lt;/td&gt;
        &lt;td&gt;グラフィックエディター&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Editor ANGLE&lt;/td&gt;
        &lt;td&gt;グラフィック エディタ アングル&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Hiroshi Ichikawa&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Editor XV&lt;/td&gt;
        &lt;td&gt;グラフィックエディター&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;HAL Laboratory?&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Master Lab&lt;/td&gt;
        &lt;td&gt;グラフィックマスターラボ&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Studio Pro&lt;/td&gt;
        &lt;td&gt;カラー・グラフィック・エディター&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Graphic Tool for screen 12&lt;/td&gt;
        &lt;td&gt;専用簡易グラフィックツール&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;KNKKY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Illustration Word Processor&lt;/td&gt;
        &lt;td&gt;絵はがき用ワープロ&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Hitachi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Joy Graph&lt;/td&gt;
        &lt;td&gt;ジョイグラフ&lt;/td&gt;
        &lt;td&gt;1983&lt;/td&gt;
        &lt;td&gt;Victor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Kakikuke kon&lt;/td&gt;
        &lt;td&gt;かきくけこん&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Casio&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Leonard&lt;/td&gt;
        &lt;td&gt;レオナルド&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Omega System&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Leonard Plus Kanji&lt;/td&gt;
        &lt;td&gt;レオナルドプラス漢字&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Omega System&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Lightpen Graphics&lt;/td&gt;
        &lt;td&gt;ライトペングラフィックス&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;MOKO&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Toshio Tabeta&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;MOKO II Improved Version&lt;/td&gt;
        &lt;td&gt;改良版 MOKO II&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Maeda Mameo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;MSX’s TOOLS&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Hitori Circle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;The Painter&lt;/td&gt;
        &lt;td&gt;ザ・ペインター&lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;YAMAHA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Tiny Joygraph&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Victor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Pattern Editor Robin&lt;/td&gt;
        &lt;td&gt;パターンエディターRobin&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Hirohumi Ino&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Pixel 2&lt;/td&gt;
        &lt;td&gt;ピクセル２&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;T&amp;amp;E SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Pixel 3&lt;/td&gt;
        &lt;td&gt;ピクセル３&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;T&amp;amp;E SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;(Graphic Editor) Sha Ga Raku&lt;/td&gt;
        &lt;td&gt;写・画・楽&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Victor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;UniPaint&lt;/td&gt;
        &lt;td&gt;ユニペイント&lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Matsushita&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX&lt;/td&gt;
        &lt;td&gt;Video Graphics&lt;/td&gt;
        &lt;td&gt;ビデオグラフィックス&lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Matsushita&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MSX, WAVY&lt;/td&gt;
        &lt;td&gt;Light Pen Graphics&lt;/td&gt;
        &lt;td&gt;ライトペングラフィックス&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;Sanyo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MZ-2500&lt;/td&gt;
        &lt;td&gt;G-EDIT2500&lt;/td&gt;
        &lt;td&gt;グラフィックエディタ2500&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Data West&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MZ-2500&lt;/td&gt;
        &lt;td&gt;ILLUST BOX&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Rhodes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MZ-2500&lt;/td&gt;
        &lt;td&gt;Palette&lt;/td&gt;
        &lt;td&gt;ぱれっと&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Dynaware&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MZ-2500&lt;/td&gt;
        &lt;td&gt;Quick MZ Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Minoru Morinaka&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MZ-2500&lt;/td&gt;
        &lt;td&gt;Super Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;S.B.C Software&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Newton&lt;/td&gt;
        &lt;td&gt;HexPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;HexDump&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Newton&lt;/td&gt;
        &lt;td&gt;NewtPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Glen Raphael&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;OS/2&lt;/td&gt;
        &lt;td&gt;QueenCy&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;masami&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;CLIE Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Sony&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;MoePaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;Toshiyuki Hayashi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;PenPenCol&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Shigeyuki Seko&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;PenPenW&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;Shigeyuki Seko&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;PixMarker&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;wernyv&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;Sphere the PAINTER&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Katsunori Sakuragi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Palm&lt;/td&gt;
        &lt;td&gt;yapp&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Ines&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-100&lt;/td&gt;
        &lt;td&gt;Airbrush&lt;/td&gt;
        &lt;td&gt;エアーブラシ&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;ASCII&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-6001&lt;/td&gt;
        &lt;td&gt;Picture Editor&lt;/td&gt;
        &lt;td&gt;ピクチャーエディタ&lt;/td&gt;
        &lt;td&gt;1983&lt;/td&gt;
        &lt;td&gt;ASCII&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Adventure Maker mk2&lt;/td&gt;
        &lt;td&gt;アドベンチャーツクールmkII&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;T.Ueno&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;ART MASTER 88&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;SystemSoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;da Vinci ~Super Graphic Tool~&lt;/td&gt;
        &lt;td&gt;ダヴィンチ&lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;POPCOM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Emi&lt;/td&gt;
        &lt;td&gt;絵美&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;MIINA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;HR-PAINT3&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Ink Pot M&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;H.Komatsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;LALF ~Hyper Graphic Tool~&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Technopolis&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;LUNA&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;MEW&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Magic Paint 88 v2.0&lt;/td&gt;
        &lt;td&gt;マジックペイント88&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Atsushi Oshima&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Magic Paint 88 v3.0&lt;/td&gt;
        &lt;td&gt;マジックペイント88&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Atsushi Oshima&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Magic Paint 98&lt;/td&gt;
        &lt;td&gt;マジックペイント98&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Atsushi Oshima&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Magic Paint VA&lt;/td&gt;
        &lt;td&gt;マジックペイントVA&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Atsushi Oshima&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;nedi3.bin&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;TA(O)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Super Artist 256&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Seed Software&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Yukara art&lt;/td&gt;
        &lt;td&gt;ユーカラart&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Tokai Create&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid VA&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid88&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-88, X1&lt;/td&gt;
        &lt;td&gt;Ink Pot&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;H.Komatsu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;256 Color Drawing Tool&lt;/td&gt;
        &lt;td&gt;256色お 絵描きツール&lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;6 Coloured Pencils&lt;/td&gt;
        &lt;td&gt;6色鉛筆&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;tsutosan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Actor98&lt;/td&gt;
        &lt;td&gt;アクター98&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Soft Studio Panther&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Adventure Maker 98&lt;/td&gt;
        &lt;td&gt;アドベンチャー ツクール98&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;ASCII/LOGiN&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Akane&lt;/td&gt;
        &lt;td&gt;あかね&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;Miruhi Takahara&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Art Frontier&lt;/td&gt;
        &lt;td&gt;アートフロンティア&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Bijutech&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;ArtCore (Art/V?)&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;SystemSoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Assist Art&lt;/td&gt;
        &lt;td&gt;アシストアート&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Assist Co., Ltd.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Ayako&lt;/td&gt;
        &lt;td&gt;彩子&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Art Function&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Camel&lt;/td&gt;
        &lt;td&gt;キャメル&lt;/td&gt;
        &lt;td&gt;?&lt;/td&gt;
        &lt;td&gt;Nazca Corporation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;CANDY&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;ASCII&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;CANDY2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;ASCII&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Character Maker 98&lt;/td&gt;
        &lt;td&gt;キャラクターツクール98&lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Pegasus Japan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Doodle Book / Rakugaki-chō&lt;/td&gt;
        &lt;td&gt;落書き帳&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Toshiya Hayashi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;DynaPix V&lt;/td&gt;
        &lt;td&gt;ダイナビックスV&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Dynaware&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;ESQUISSE&lt;/td&gt;
        &lt;td&gt;電子水彩エスキース&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;SAPIENCE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Funny&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Garakuta98&lt;/td&gt;
        &lt;td&gt;画楽多98&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Southern Create&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;GIOTTO&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Art Function&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;GRAPHIC HENSHIN&lt;/td&gt;
        &lt;td&gt;ぐらひっく へんしん&lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Taro Namae&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;GREEN&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Yoshito Takemura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;GREM&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Yoshito Takemura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Hyper Ayako&lt;/td&gt;
        &lt;td&gt;HYPER 彩子&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Art Function / Digital Arts&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;JEDAI&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;D.O. CORP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Kureyon-chan&lt;/td&gt;
        &lt;td&gt;くれよん ちゃん&lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Fusao Saito&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Maguro/Tuna Paint System&lt;/td&gt;
        &lt;td&gt;鮪ペイントシステム&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Woody_RINN&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Mapping Paint&lt;/td&gt;
        &lt;td&gt;写像ペイント&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;CAST&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Marupa&lt;/td&gt;
        &lt;td&gt;まるぱ&lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Ichikawa Soft Labratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;MEDI-98 / nedi3&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;NOZUMU&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Monopen&lt;/td&gt;
        &lt;td&gt;ものぺん&lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;OEAO&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Multi Paint System / MPS&lt;/td&gt;
        &lt;td&gt;マルチペイントシステム&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;C-Lab&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Paint System Tool / PST&lt;/td&gt;
        &lt;td&gt;似非キース&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;hironon&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Paper&lt;/td&gt;
        &lt;td&gt;紙&lt;/td&gt;
        &lt;td&gt;?&lt;/td&gt;
        &lt;td&gt;Irem&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Penta-kun&lt;/td&gt;
        &lt;td&gt;ぺん太くん&lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;NEG&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Sadayan Paint&lt;/td&gt;
        &lt;td&gt;さだやんペイント&lt;/td&gt;
        &lt;td&gt;?&lt;/td&gt;
        &lt;td&gt;Irem&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;SANDY&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Wataru Ishihara&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Small CANDY&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;ASCII&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Super Tableau&lt;/td&gt;
        &lt;td&gt;スーパータブロー&lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;SAPIENCE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Tableau&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;SAPIENCE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Tetsujin&lt;/td&gt;
        &lt;td&gt;鉄人&lt;/td&gt;
        &lt;td&gt;?&lt;/td&gt;
        &lt;td&gt;Irem&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;TrueLine&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;OEAO&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Z’s STAFF&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1986&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid98&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PC-98&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Kid98 v3.0&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PS-55&lt;/td&gt;
        &lt;td&gt;Z’s STAFF TRAD&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;SMC&lt;/td&gt;
        &lt;td&gt;Graphic Editor&lt;/td&gt;
        &lt;td&gt;グラフィックエディター&lt;/td&gt;
        &lt;td&gt;1984&lt;/td&gt;
        &lt;td&gt;Sony&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;TRON-OS&lt;/td&gt;
        &lt;td&gt;Pelistina&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;KAENRYUU Koutoku&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;TRON-OS&lt;/td&gt;
        &lt;td&gt;Pelistina 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;KAENRYUU Koutoku&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;TRON-OS&lt;/td&gt;
        &lt;td&gt;Sketchbook&lt;/td&gt;
        &lt;td&gt;楽描き帳&lt;/td&gt;
        &lt;td&gt;2011&lt;/td&gt;
        &lt;td&gt;Satoshi Sera&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;TRON-OS&lt;/td&gt;
        &lt;td&gt;Xbrush for Chokanji&lt;/td&gt;
        &lt;td&gt;Xbrush for 超漢字&lt;/td&gt;
        &lt;td&gt;2013&lt;/td&gt;
        &lt;td&gt;Akira Tasaki&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Twin Famicom&lt;/td&gt;
        &lt;td&gt;Game Maker&lt;/td&gt;
        &lt;td&gt;ゲームメーカー&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;HAL Laboratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 2K&lt;/td&gt;
        &lt;td&gt;4thPaint&lt;/td&gt;
        &lt;td&gt;よつばペイント&lt;/td&gt;
        &lt;td&gt;2007&lt;/td&gt;
        &lt;td&gt;4th Paint Project&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 2K&lt;/td&gt;
        &lt;td&gt;Let’s Draw F&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2007&lt;/td&gt;
        &lt;td&gt;Oscar Creation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;Daisy Art&lt;/td&gt;
        &lt;td&gt;デイジーアート&lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Ichikawa Soft Labratory&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;Draw Unit&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Type-甲&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;GOINDRW&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Yasuhiro Nakata&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;ImgFinish&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Syouichi Hattori&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;Pattern Editor PE&lt;/td&gt;
        &lt;td&gt;パターンエディタ PE&lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;Sailing Draw++&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Jun Satomi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;SUPER KiD&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;SUPER KiD v2.0&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 3.1&lt;/td&gt;
        &lt;td&gt;Tsuruniha○○mushi&lt;/td&gt;
        &lt;td&gt;つるニハ○○ムシ&lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Mr Dad&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 7&lt;/td&gt;
        &lt;td&gt;EDGE2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2006&lt;/td&gt;
        &lt;td&gt;TAKABO SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;1bitPaper&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;shiden&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;ArtistX&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;ARINOKI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;ArtistX Labolt&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;ARINOKI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;AZPainter&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2006&lt;/td&gt;
        &lt;td&gt;Azel&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;AZPainter2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2009&lt;/td&gt;
        &lt;td&gt;Azel&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Camel2&lt;/td&gt;
        &lt;td&gt;キャメル2&lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;Nazca Corporation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;D-Pixed&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Jun Doi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;DoggyPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;HKR.Jon&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Dot Art Kakiko&lt;/td&gt;
        &lt;td&gt;ドット絵カキコ&lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;YUUKI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Dot Art Vacation&lt;/td&gt;
        &lt;td&gt;ドット絵バケーション&lt;/td&gt;
        &lt;td&gt;2002&lt;/td&gt;
        &lt;td&gt;Arue&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Dot Editor Ver 4.0&lt;/td&gt;
        &lt;td&gt;ドットエディタVer4.0&lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;PSIKYO&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Dot Pictureditor&lt;/td&gt;
        &lt;td&gt;ドット絵でぃた&lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;shishido&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;DotPainterALFAR&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2003&lt;/td&gt;
        &lt;td&gt;Herohero&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Easy Paint Tool SAI&lt;/td&gt;
        &lt;td&gt;ペイントツールSAI&lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;TANE/KOJI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;eco paint&lt;/td&gt;
        &lt;td&gt;エコペイント&lt;/td&gt;
        &lt;td&gt;2006&lt;/td&gt;
        &lt;td&gt;tyty&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;EDGE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;TAKABO SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;FARLUX&lt;/td&gt;
        &lt;td&gt;ファーラックス&lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Studio BullTerrier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;FudeBoard&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;matumoto&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Gpen96&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Hiroshi Igami&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;GraphicsGale&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;HUMANBALANCE&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;HappyPaint32R&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Isao Maruoka&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Hyper KiD&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Fanfare&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Hyper-Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;kiriman&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;iDraw&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;hawk&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;ILLUSTMAKER&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;matumoto&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Janus&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2007&lt;/td&gt;
        &lt;td&gt;Rigeru&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Kakukakuoji&lt;/td&gt;
        &lt;td&gt;かくかくおうじ&lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;1BITMANIA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;L-Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;via&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Let’s Draw&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Oscar Creation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Let’s Draw Z&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2003&lt;/td&gt;
        &lt;td&gt;Oscar Creation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Light Painter&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Yoshi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;LitePaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Rigeru&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Matilda&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;ViikiSoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;mdiapp&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2007&lt;/td&gt;
        &lt;td&gt;nattou&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Mpaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;ura00&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Neko no Mori Graphic Editor&lt;/td&gt;
        &lt;td&gt;猫の森グラフィックエディタ&lt;/td&gt;
        &lt;td&gt;2009&lt;/td&gt;
        &lt;td&gt;Neko no Mori Soft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;PAL Paint 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;Togura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;PictBear&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Yasuyuki Kashiwagi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;PictBear 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2009&lt;/td&gt;
        &lt;td&gt;Yasuyuki Kashiwagi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;piroPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2011&lt;/td&gt;
        &lt;td&gt;piroyan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Pixia&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Isao Maruoka&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Pointillist Feng Chu 3&lt;/td&gt;
        &lt;td&gt;点画師鳳雛３&lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;Maya Takimoto&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;PRETTY ART&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;dmms_21&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;SPED4&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;TwinkleSoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;SUPER KiD 95&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;SUPER KiD FE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;The Graphics&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2002&lt;/td&gt;
        &lt;td&gt;Fanfare&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Ultra KiD&lt;/td&gt;
        &lt;td&gt;ウルトラキッド&lt;/td&gt;
        &lt;td&gt;1997&lt;/td&gt;
        &lt;td&gt;Fanfare&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Ultra KiD v2.0&lt;/td&gt;
        &lt;td&gt;ウルトラキッド&lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Fanfare&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows 9x&lt;/td&gt;
        &lt;td&gt;Yumeiro no Enogu&lt;/td&gt;
        &lt;td&gt;ゆめいろのえのぐ&lt;/td&gt;
        &lt;td&gt;2008&lt;/td&gt;
        &lt;td&gt;Kengo Watanabe&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;EDGE Pocket 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2009&lt;/td&gt;
        &lt;td&gt;TAKABO SOFT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;JINZO Paint 16&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Tomohiro Ueno&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;JINZO Paint 4&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Tomohiro Ueno&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;JINZO Paint full-colour&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Tomohiro Ueno&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;mdiapp mobile&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2008&lt;/td&gt;
        &lt;td&gt;nattou&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Windows CE&lt;/td&gt;
        &lt;td&gt;Pocket Artist&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Conduits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X-Windows&lt;/td&gt;
        &lt;td&gt;Gedo / Graphic EDitor OMNI&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1999&lt;/td&gt;
        &lt;td&gt;Yasuhito Sugiura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X-Windows&lt;/td&gt;
        &lt;td&gt;Xbrush&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Akira Tasaki&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X-Windows&lt;/td&gt;
        &lt;td&gt;xpx&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;yav&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X-Windows&lt;/td&gt;
        &lt;td&gt;XShodou&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1998&lt;/td&gt;
        &lt;td&gt;Hiroaki Sakai&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X1&lt;/td&gt;
        &lt;td&gt;turbo Z’s STAFF&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1985&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Art68K&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;OOYAMA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Easypaint SX-68K&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;First Class Technology&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;EEL&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;GORRY&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;EX-WIN (EX-System)&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;Oh! X&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Full Color Paint Tool SAI&lt;/td&gt;
        &lt;td&gt;フルカラーペイントツール-彩-&lt;/td&gt;
        &lt;td&gt;1996&lt;/td&gt;
        &lt;td&gt;TANE/KOJI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;G・TOOL&lt;/td&gt;
        &lt;td&gt;G・ツール&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Zainsoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;G68KversionII-PRO&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;OH! Bussiness&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;GE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Miki Hoshino&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;GLab&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;Ushi no shizuku&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;gm256.x&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1993&lt;/td&gt;
        &lt;td&gt;Kanzu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Graphics Editor ARTIST&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;T.Shimanuki/GCC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Magic Palette&lt;/td&gt;
        &lt;td&gt;マジックパレット&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Musical Plan Ltd&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Matier&lt;/td&gt;
        &lt;td&gt;マチエール&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;Meteor Art Tech&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;mfged.x&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Mamiyu Yuuki&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;MONOCRAYON&lt;/td&gt;
        &lt;td&gt;ＭＯＮＯくれよん&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Yasuhiro Sasama&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;MONOCRAYON Wide Edition&lt;/td&gt;
        &lt;td&gt;ワイド版 ＭＯＮＯくれよん&lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Noboru Ishii&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Monotone&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;GUNchan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Object Editor&lt;/td&gt;
        &lt;td&gt;オブジェクトエディタ&lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Tonbe&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Onazorikun&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1990&lt;/td&gt;
        &lt;td&gt;Muchi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Prism 68K&lt;/td&gt;
        &lt;td&gt;プリズム68K&lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;WOLF TEAM&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;RG&lt;/td&gt;
        &lt;td&gt;ＲＧ&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;RERO2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;RGBP&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1994&lt;/td&gt;
        &lt;td&gt;Tetsuya Kimura&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Usagi&lt;/td&gt;
        &lt;td&gt;うさぎ&lt;/td&gt;
        &lt;td&gt;1992&lt;/td&gt;
        &lt;td&gt;IKUTA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;XGE&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1995&lt;/td&gt;
        &lt;td&gt;KYA!,CHIAKI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;XPST&lt;/td&gt;
        &lt;td&gt;えせきーすX68&lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;kenna &amp;amp; PUNA&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Pro-68K&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1987&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;X68000&lt;/td&gt;
        &lt;td&gt;Z’s STAFF Pro-68K v2.0&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1989&lt;/td&gt;
        &lt;td&gt;Zeit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus&lt;/td&gt;
        &lt;td&gt;PetitPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;TOK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus&lt;/td&gt;
        &lt;td&gt;PrismPaint 3&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2001&lt;/td&gt;
        &lt;td&gt;Soga Juroh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus&lt;/td&gt;
        &lt;td&gt;PrismPocket&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2002&lt;/td&gt;
        &lt;td&gt;Soga Juroh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus&lt;/td&gt;
        &lt;td&gt;Zausuke&lt;/td&gt;
        &lt;td&gt;ざうすけ&lt;/td&gt;
        &lt;td&gt;2000&lt;/td&gt;
        &lt;td&gt;Soga Juroh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus Linux&lt;/td&gt;
        &lt;td&gt;CloverPaint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2005&lt;/td&gt;
        &lt;td&gt;Soga Juroh&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zaurus Linux&lt;/td&gt;
        &lt;td&gt;PetitPeinture&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;2004&lt;/td&gt;
        &lt;td&gt;Sakira&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;Aniputer&lt;/td&gt;
        &lt;td&gt;アニピュータ&lt;/td&gt;
        &lt;td&gt;1982&lt;/td&gt;
        &lt;td&gt;JVC&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;Hyper Paint 2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;Shima Seiki&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;Personal LINKS: PFB-2&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1991&lt;/td&gt;
        &lt;td&gt;LINKS Corporation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;Pyuta G-GRAPHIC&lt;/td&gt;
        &lt;td&gt;ぴゅう太 G-GRAPHIC&lt;/td&gt;
        &lt;td&gt;1982&lt;/td&gt;
        &lt;td&gt;Tomy&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;SGI-Pictoris&lt;/td&gt;
        &lt;td&gt;ピクトリス&lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;LINKS Corporation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Dedicated&lt;/td&gt;
        &lt;td&gt;SGX-Hyper Paint&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
        &lt;td&gt;1988&lt;/td&gt;
        &lt;td&gt;Shima Seiki&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

&lt;/div&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 21 Oct 2023 15:56:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/10/21/list-of-vintage-japanese-pixel-dot-art-software/</guid>
        </item>
      
    
      
        <item>
          <title>Kenichi Shinohara’s Pixel Art Ukiyo-e (1987)</title>
          <description>&lt;p&gt;From LOGiN Magazine (1987, No 5) comes the story of 篠原賢一 (Kenichi Shinohara), a “cheerful uncle” from Hyogo Prefecture, who at the age of 60 years old began using an NEC PC-98 to draw pixel art reproductions of Ukiyo-e. He also printed them and made folding screens and kites! Just “for something to do”. I like his style! What a guy.&lt;/p&gt;

&lt;p&gt;His process involved pasting copies of artwork from books and magazines to his monitor screen and then tracing them using the mouse. After that he would clean up, add colour, and after 4 to 5 days print it out on his NEC NM9900, check and repeat. Each piece would take 1 to 2 weeks of work.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This is pretty much the same process I used to create my &lt;a href=&quot;/tag/1bitwoodblocks/&quot;&gt;&lt;em&gt;1-bit Woodblocks&lt;/em&gt; series&lt;/a&gt;, though with a more modern set of tools, and similar to what &lt;a href=&quot;https://www.folklore.org/StoryView.py?project=Macintosh&amp;amp;story=MacPaint_Gallery.txt&quot;&gt;&lt;em&gt;Susan Kare&lt;/em&gt; did for her famous MacPaint artwork&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;happy-100th&quot;&gt;Happy 100th&lt;/h2&gt;

&lt;p&gt;Given that this feature was published in 1987, when Kenichi was 64, that would make him 100 this year. Happy Birthday for your centenary, Kenichi, wherever you are! 🎂&lt;/p&gt;

&lt;h2 id=&quot;the-setup&quot;&gt;The Setup&lt;/h2&gt;

&lt;p&gt;We can read that he used pixel art software such as Z’s STAFF, FUNNY and CANDY2. The kite goes further and advertises that its image was drawn using Z’s STAFF with Pluskit LEVEL 1, an NEC PC-9801E and printed on an NEC MultiImpact NM-9900 dot matrix printer.&lt;/p&gt;

&lt;p&gt;Handily, many of these tools are &lt;a href=&quot;https://archive.org/details/login-march-1986/LOGiN%20-%20March%201986/page/n103/mode/1up&quot;&gt;referenced in a repeated feature about &lt;em&gt;ASCII C.G. Tools Festival&lt;/em&gt;&lt;/a&gt; which ran from the middle of November 1985 to the end of February 1986. That feature was essentially an advertisement for Zeit software company and was sponsored by them.&lt;/p&gt;

&lt;p&gt;We can see that Funny was a pixel art package, CANDY2 was a technical drawing app, Z’s STAFF was a pixel art app (&lt;em&gt;Zeit&lt;/em&gt;’s most famous, in fact), Pluskit LEVEL 1 was an “image reader” software add-on. Interestingly, &lt;a href=&quot;https://archive.org/details/logi-n-october-1986-raw-scans/LOGiN%20-%20October%201986/page/n458/mode/1up&quot;&gt;&lt;em&gt;Pluskit LEVEL 2&lt;/em&gt;&lt;/a&gt; involved an interface board to allow for direct camera input.&lt;/p&gt;

&lt;h2 id=&quot;login-1987-no-5&quot;&gt;LOGiN 1987 No 5&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://www.gamingalexandria.com/wp/magazines/&quot;&gt;Gaming Alexandria&lt;/a&gt; for scanning the magazine and making it available at Internet Archive: &lt;a href=&quot;https://archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n169/mode/2up&quot;&gt;archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n169/mode/2up&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;陽気なおごさんに教わるグラフィックツールのひミーふな使い方&lt;br /&gt;
Learn how to use graphics tools from a jolly old man&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Click the images below to see a zoomable, browsable version of the magazine.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n169/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/kenichi-shinohara-pixel-art-ukiyoe-1.jpg&quot; alt=&quot;Kenichi Shinohara&apos;s pixel art Ukiyo-e, page 1 &amp;amp; 2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n171/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/kenichi-shinohara-pixel-art-ukiyoe-2.jpg&quot; alt=&quot;Kenichi Shinohara&apos;s pixel art Ukiyo-e, page 3 &amp;amp; 4&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n171/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/kenichi-shinohara-pixel-art-ukiyoe-3.jpg&quot; alt=&quot;Kenichi Shinohara&apos;s pixel art Ukiyo-e, close up&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://archive.org/details/login-may-1987/LOGiN%20-%20May%201987/page/n171/mode/2up&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/kenichi-shinohara-pixel-art-ukiyoe-4.jpg&quot; alt=&quot;Kenichi Shinohara&apos;s pixel art Ukiyo-e, profile&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 13 Oct 2023 10:43:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/10/13/kenichi-shinohara-pixel-art-ukiyo-e/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/10/13/kenichi-shinohara-pixel-art-ukiyo-e/</guid>
        </item>
      
    
      
        <item>
          <title>OpenSCAD to Sprite Sheet workflow</title>
          <description>&lt;p&gt;I just released the “OpenSCAD to Spritesheet” workflow I created for &lt;a href=&quot;/tag/dailydriver/&quot;&gt;Daily Driver&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/gingerbeardman/openscad-spritesheet&quot;&gt;github.com/gingerbeardman/openscad-spritesheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a Frankenstein mish-mash of a Makefile and several shell scripts that evolved over many months/years. Initial rendering is done using OpenSCAD, and post-processing is done using ImageMagick. Model poses and rendering variations are controlled by variables in either the shell script or passed through to the model. The whole process is optimised to do as much in parallel as I could figure. More info at the link above! 🚗💨&lt;/p&gt;

&lt;h2 id=&quot;post-processing&quot;&gt;Post Processing&lt;/h2&gt;

&lt;p&gt;After exporting all frames there is some &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;image magick&lt;/code&gt; work to process the files as follows:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;stitch frames together into a single sprite sheet&lt;/li&gt;
  &lt;li&gt;split sprite sheet into RGBA channels&lt;/li&gt;
  &lt;li&gt;process channels to recolour and dither as required&lt;/li&gt;
  &lt;li&gt;recombine processed channels into new sprite sheet image&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can read about that in a &lt;a href=&quot;/2021/06/05/channelling-rgb-into-1bit/&quot;&gt;previous blog post&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;benchmarks&quot;&gt;Benchmarks&lt;/h2&gt;

&lt;p&gt;A full build of 36 cars is as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;3GHz 6-core Intel Mac mini 32GB
    &lt;ul&gt;
      &lt;li&gt;100% CPU for ~26 minutes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;M1 Pro 10-core MacBook Pro 16GB
    &lt;ul&gt;
      &lt;li&gt;70% CPU for ~9 mins&lt;/li&gt;
      &lt;li&gt;about 3x speedup&lt;/li&gt;
      &lt;li&gt;approx 16 seconds per car&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s parallel 3D rendering, PNG writing &amp;amp; compositing &amp;amp; processing, and copying of ~140K files (which takes up ~0.5GB of disk space).&lt;/p&gt;

&lt;h2 id=&quot;example-model&quot;&gt;Example Model&lt;/h2&gt;

&lt;p&gt;Not to scale! Sizes of features are exagerated to allow for them to appear correct when rendered at a very small size.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/openscad-spritesheet-model-car.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;example-output&quot;&gt;Example Output&lt;/h2&gt;

&lt;p&gt;990 frames each for car and shadow, total of 1980 frames per sprite sheet. Each sprite sheet takes up about ~400KB of RAM on Playdate, and only one is loaded at a time.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/posts/openscad-spritesheet-car-table-38-38.png&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/openscad-spritesheet-car-table-38-38.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 04 Oct 2023 15:19:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2023/10/04/openscad-to-sprite-sheet/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2023/10/04/openscad-to-sprite-sheet/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Club GTi</title>
          <description>&lt;p&gt;My &lt;a href=&quot;/2023/06/07/gti-cub-supermini-festa/&quot;&gt;GTi Club: Supermini Festa!&lt;/a&gt; obsession has bled into my game &lt;a href=&quot;/tag/dailydriver/&quot;&gt;Daily Driver&lt;/a&gt;… the “Club GTi” car features smaller wheels than the standard size, more roll during turning, and lots of detail and decoration to show off the rendering workflow I spent so many hours on. A good choice for the autotesting/motorkhana/gymkhana stages.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-club-gti.gif#playdate&quot; alt=&quot;GIF&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here’s the 3D model, created in &lt;a href=&quot;https://openscad.org&quot;&gt;OpenSCAD&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-club-gti-model.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 08 Mar 2022 12:32:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2022/03/08/club-gti/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2022/03/08/club-gti/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: How big is a sprite sheet?</title>
          <description>&lt;p&gt;Since the early days of the project I’ve been generating the car sprites by rotating the 3D model 360 degrees in a sequence of 32 steps. It works well and I hadn’t given it much thought. Until over on the &lt;a href=&quot;https://discord.gg/zFKagQ2&quot;&gt;unofficial Playdate Discord server&lt;/a&gt; user Jono showed of a hot-dog trick rendered using 64 steps which looked super smooth! This got me thinking about increasing the number of rotation steps used in my workflow for Daily Driver.&lt;/p&gt;

&lt;h2 id=&quot;code-changes&quot;&gt;Code changes&lt;/h2&gt;

&lt;p&gt;I had to do a bit of code changing as I had used the value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;32&lt;/code&gt;, or the angular equivalent of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;11.25&lt;/code&gt; (degrees), in a few places throughout my code. Once I’d changed those to refer to a single variable I was set. I can now run the game with sprites of any number of steps.&lt;/p&gt;

&lt;h2 id=&quot;rendering-changes&quot;&gt;Rendering changes&lt;/h2&gt;

&lt;p&gt;Similar changes were also needed in my rendering workflow, moving any hardcoded steps or angle values into a variable. After replacing hard-coded magic numbers with variables, I spent way too long figuring out why angles were being rounded down to the nearest integer. Eventually I realised that in shell scripts the calculation &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$( 360/64 )&lt;/code&gt; gives an integer result of 5, whereas  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$( 360.0/64 )&lt;/code&gt; gives the more accurate floating point result of 5.625.&lt;/p&gt;

&lt;p&gt;Interestingly, I also needed to increase my filename pattern from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%03d&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%04d&lt;/code&gt; as there are now thousands of images being processed.&lt;/p&gt;

&lt;h2 id=&quot;how-high&quot;&gt;How high?&lt;/h2&gt;

&lt;p&gt;After making the necessary changes to my workflow it is very easy to render a new set of sprites. But what number of steps to use? My immediate thought was to simply double it to 64, which is higher than the frame rate I’m using and the result was definitely smoother.&lt;/p&gt;

&lt;p&gt;After this &lt;a href=&quot;https://twitter.com/mrgan&quot;&gt;Neven Mrgan&lt;/a&gt; asked if I’d explored whether there was a performance limit or upper boundary? I hadn’t but it sounded like a fun thing to explore.&lt;/p&gt;

&lt;p&gt;But why go higher? Well, even if we have more frames of animation that than refresh rate, we can still gain in terms of accuracy. The more steps there are the more discrete angles we can show the car pointing. That was good enough reason for me to try it out.&lt;/p&gt;

&lt;p&gt;I spent some time exporting a sprite at 32, 64, 90, 128, 180, 256, 360-steps to compare not only the smoothness of the animation but also other related implications.&lt;/p&gt;

&lt;h2 id=&quot;selected-results&quot;&gt;Selected results&lt;/h2&gt;

&lt;p&gt;Most modern browsers are well-behaved enough to only play an Animated GIF if it is on the page. So you’ll probably need to force reload the page (hold shift and click reload) to synchronise one or more of the below animations.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-32.gif#playdate&quot; alt=&quot;32 rotation steps&quot; title=&quot;Above: 32 rotation steps. After I&apos;ve mentioned looking for the &amp;quot;judder&amp;quot; you won&apos;t be able to unsee it&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-64.gif#playdate&quot; alt=&quot;64 rotation steps&quot; title=&quot;Above: Even with twice as many rotation steps there&apos;s still a slight judder&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-90.gif#playdate&quot; alt=&quot;90 rotation steps&quot; title=&quot;Above: 90 rotation steps give us one sprite every 4 degrees, judder becomes less noticable&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-180.gif#playdate&quot; alt=&quot;180 rotation steps&quot; title=&quot;Above: 180 rotation steps give us one sprite every 2 degrees, judder is even less noticable&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-360.gif#playdate&quot; alt=&quot;360 rotation steps&quot; title=&quot;Above: 360 rotation steps give us one sprite for every degree, as good as it gets&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;stats&quot;&gt;Stats&lt;/h2&gt;

&lt;div class=&quot;table-wrapper&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;steps #&lt;/th&gt;
        &lt;th&gt;render time Secs&lt;/th&gt;
        &lt;th&gt;frames #&lt;/th&gt;
        &lt;th&gt;width PX&lt;/th&gt;
        &lt;th&gt;pixels W×H&lt;/th&gt;
        &lt;th&gt;png KB&lt;/th&gt;
        &lt;th&gt;pdt KB&lt;/th&gt;
        &lt;th&gt;ram Bytes&lt;/th&gt;
        &lt;th&gt;ram MB&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;32&lt;/td&gt;
        &lt;td&gt;30s&lt;/td&gt;
        &lt;td&gt;704&lt;/td&gt;
        &lt;td&gt;1216&lt;/td&gt;
        &lt;td&gt;1016576&lt;/td&gt;
        &lt;td&gt;48&lt;/td&gt;
        &lt;td&gt;39&lt;/td&gt;
        &lt;td&gt;147404&lt;/td&gt;
        &lt;td&gt;0.15&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;64&lt;/td&gt;
        &lt;td&gt;59s&lt;/td&gt;
        &lt;td&gt;1408&lt;/td&gt;
        &lt;td&gt;2432&lt;/td&gt;
        &lt;td&gt;2033152&lt;/td&gt;
        &lt;td&gt;64&lt;/td&gt;
        &lt;td&gt;78&lt;/td&gt;
        &lt;td&gt;294807&lt;/td&gt;
        &lt;td&gt;0.29&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;90&lt;/td&gt;
        &lt;td&gt;82s&lt;/td&gt;
        &lt;td&gt;1980&lt;/td&gt;
        &lt;td&gt;3420&lt;/td&gt;
        &lt;td&gt;2859120&lt;/td&gt;
        &lt;td&gt;111&lt;/td&gt;
        &lt;td&gt;107&lt;/td&gt;
        &lt;td&gt;414572&lt;/td&gt;
        &lt;td&gt;0.41&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;128&lt;/td&gt;
        &lt;td&gt;114s&lt;/td&gt;
        &lt;td&gt;2816&lt;/td&gt;
        &lt;td&gt;4864&lt;/td&gt;
        &lt;td&gt;4066304&lt;/td&gt;
        &lt;td&gt;143&lt;/td&gt;
        &lt;td&gt;140&lt;/td&gt;
        &lt;td&gt;589614&lt;/td&gt;
        &lt;td&gt;0.59&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;180&lt;/td&gt;
        &lt;td&gt;159s&lt;/td&gt;
        &lt;td&gt;3960&lt;/td&gt;
        &lt;td&gt;6840&lt;/td&gt;
        &lt;td&gt;5718240&lt;/td&gt;
        &lt;td&gt;174&lt;/td&gt;
        &lt;td&gt;188&lt;/td&gt;
        &lt;td&gt;829145&lt;/td&gt;
        &lt;td&gt;0.83&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;256&lt;/td&gt;
        &lt;td&gt;192s&lt;/td&gt;
        &lt;td&gt;5632&lt;/td&gt;
        &lt;td&gt;9728&lt;/td&gt;
        &lt;td&gt;8132608&lt;/td&gt;
        &lt;td&gt;209&lt;/td&gt;
        &lt;td&gt;227&lt;/td&gt;
        &lt;td&gt;1179228&lt;/td&gt;
        &lt;td&gt;1.18&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;360&lt;/td&gt;
        &lt;td&gt;285s&lt;/td&gt;
        &lt;td&gt;7920&lt;/td&gt;
        &lt;td&gt;13680&lt;/td&gt;
        &lt;td&gt;11436480&lt;/td&gt;
        &lt;td&gt;240&lt;/td&gt;
        &lt;td&gt;264&lt;/td&gt;
        &lt;td&gt;1658290&lt;/td&gt;
        &lt;td&gt;1.66&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

&lt;/div&gt;

&lt;h2 id=&quot;charts&quot;&gt;Charts&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rotation-steps-charts.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;implications&quot;&gt;Implications&lt;/h2&gt;

&lt;p&gt;The increase from 32-steps to 360-steps is echoed by an increase of around a factor of ten across each of rendering time, number of frames and memory usage.&lt;/p&gt;

&lt;p&gt;In the above table we can see that related stats increase pretty much linearly, with a slight downward trend for file sizes and a slight upward trend for everything else.&lt;/p&gt;

&lt;p&gt;The increased smoothness is great, and very easy to notice. The benefits of the increased smoothness becomes less noticeable with each increase in step count. However, it’s important to remember there are other implications:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rendering time&lt;/li&gt;
  &lt;li&gt;File size&lt;/li&gt;
  &lt;li&gt;Memory usage&lt;/li&gt;
  &lt;li&gt;Performance in-game&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rendering-time&quot;&gt;Rendering time&lt;/h3&gt;
&lt;p&gt;This increases from what I would call a quick 30 seconds per render at 32-steps, to an extremely slow 284 seconds (4m45s) at 360-steps. For a full set of renders it’s not as easy as multiplying that number, there is some overhead that goes with it. This means a real world increase from ~20 minutes to multiple hours, which could be a problem. Cars aren’t generally re-rendered very frequently but when I do render them I do it many times as I make minor tweaks. So, at this point all numbers of steps are on the table but with a preference for those with shorter rendering times.&lt;/p&gt;

&lt;h3 id=&quot;file-size&quot;&gt;File size&lt;/h3&gt;
&lt;p&gt;Playdate’s compiled image format is very similar in file size to an optimised PNG. The file size increases by slightly more than double as the number of steps is doubled. Even the largest size at 360-steps is only 264KB (0.26MB) which seems OK in the grand scheme of things. All numbers of steps are on the table.&lt;/p&gt;

&lt;h3 id=&quot;memory-usage&quot;&gt;Memory usage&lt;/h3&gt;
&lt;p&gt;As we can see by the table below, memory usage is quite optimised on Playdate. The system is clever enough to trim transparent areas from cells of sprite sheets and store the offset of the image instead of the complete raw bitmap data. For this example sprite memory usage is roughly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(W×H÷8)*1.16&lt;/code&gt; rather than the expected &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(W×H÷8)*2.0&lt;/code&gt;. The car sprite is my largest occupier of memory. Only one is loaded at a time and even at 360-steps it fits comfortably in the Playdate’s 16MB RAM. All numbers of steps are on the table.&lt;/p&gt;

&lt;h3 id=&quot;performance-in-game&quot;&gt;Performance in-game&lt;/h3&gt;
&lt;p&gt;I’m targeting a refresh rate of 60fps on the device, so it’s important for me to check that any changes to rendering don’t have an adverse effect on performance. At 32-steps the car sprite was changed roughly every second update, with 64-steps and higher the car sprite will be changed every update. Looking at performance in broad terms, there does seem to be a small hit when using the large numbers of steps. It doesn’t prevent me hitting 60fps, but it does leave me less time to do other things I have planned.&lt;/p&gt;

&lt;h2 id=&quot;final-choice&quot;&gt;Final choice?&lt;/h2&gt;
&lt;p&gt;If you’ve read this far you’re probably wanting to know my choice. How many steps did I choose? Well, the jury is out. This is the sort of thing I’ll have to live with for a while before I settle on a choice.&lt;/p&gt;

&lt;p&gt;I’ll probably end up going somewhere in the middle with a choice that gives increased smoothness and accuracy, renders fairly quickly and doesn’t affect performance in-game.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 07 Aug 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/08/07/how-big-is-a-sprite-sheet/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/08/07/how-big-is-a-sprite-sheet/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: To GIF and Back</title>
          <description>&lt;p&gt;When rendering my vehicles I generate a single PNG containing all frames. Playdate SDK calls these image tables, or more specifically matrix image tables. You could also call them sprite-sheets, with the one qualification that every sprite has the same dimensions.&lt;/p&gt;

&lt;p&gt;Given that these are plain old images they can be viewed easily. Showing a grid on top of the image makes the layout obvious. You can edit the image as a whole easily enough, but what if you want to adjust the size of every cell? Then we have a problem.&lt;/p&gt;

&lt;p&gt;There are a few apps that can load image tables, asking for the cell size during loading. My favourite such app is &lt;a href=&quot;https://www.piskelapp.com&quot;&gt;Piskel&lt;/a&gt; which has good options for import, editing, and export.&lt;/p&gt;

&lt;p&gt;However there is another type of image that consists of multiple frames of the same dimensions: the Animated GIF. There are far more apps that can deal with this format, such as Acorn or Adobe Photoshop.&lt;/p&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;How can we convert a matrix image table to Animated GIF, and back again?&lt;/p&gt;

&lt;h2 id=&quot;thinking&quot;&gt;Thinking&lt;/h2&gt;

&lt;p&gt;We could use Piskel, but its GUI isn’t the most straightforward so using it twice at separate points in the conversion process gets old fast.&lt;/p&gt;

&lt;p&gt;So I had the idea of writing a couple of small shell scripts that leverage imagemagick and can be run from my Makefile, the command-line, macOS context menu, or all of the above.&lt;/p&gt;

&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;

&lt;p&gt;Below are both scripts, be sure to grab the Gist versions as they have error checking and “help” usage display.&lt;/p&gt;

&lt;h3 id=&quot;convert-image-table-to-animated-gif&quot;&gt;Convert image table to Animated GIF&lt;/h3&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/b85367a8e6b3d139d9c85f49e146af38&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/b85367a8e6b3d139d9c85f49e146af38.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;convert-animated-gif-to-image-table&quot;&gt;Convert Animated GIF to image table&lt;/h3&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/15a8e1e72745848190c0e7d583ca24e1&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/15a8e1e72745848190c0e7d583ca24e1.js&quot;&gt;&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 14 Jul 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/07/14/image-table-animated-gif/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/07/14/image-table-animated-gif/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Channelling RGB into 1-bit</title>
          <description>&lt;p&gt;After successfully splitting out dark and light elements of the sprites and rendering them in a HDR style, I figured: why stop there? Maybe I could squeeze another colour into the render - some specific shade of grey - that I could treat in a different way to introduce dithered areas to the sprite.&lt;/p&gt;

&lt;p&gt;This came together very quickly but it resulted in my Makefile, yet again, becoming too complicated. So I decided to rethink my approach.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit.gif&quot; alt=&quot;GIF&quot; title=&quot;Dither layer: specifying areas that should have a dither pattern applied, here the rear grille&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If only there was a way to encode information about three different colours in a single bitmap image. Hang on a minute, there already is: RGB!&lt;/p&gt;

&lt;h2 id=&quot;channels&quot;&gt;Channels&lt;/h2&gt;

&lt;p&gt;So my new idea was to use red, green and blue as the colours for my render, then split the image into those colour channels and process each individually to get separate light, dark and dithered elements.&lt;/p&gt;

&lt;p&gt;Using imagemagick it is easy to separate a single channel from an image:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;magick render.png -channel G -separate green.png
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;From this simple start things quickly become more complex. I always find building imagemagick commands a very time consuming process. Indeed, it took me a long time to arrive at a workflow that was just right. But I think of it as time well-spent as it will result in much quicker and easier iterations when designing vehicles.&lt;/p&gt;

&lt;p&gt;Overall, I did a few more tricks:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;threshold convert the channels to 1-bit colour&lt;/li&gt;
  &lt;li&gt;apply a dither pattern to the green channel&lt;/li&gt;
  &lt;li&gt;composite select layers back together as the final image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the process worked a treat!&lt;/p&gt;

&lt;p&gt;The resulting workflow takes half as long to execute as my previous workflow, with all vehicles rendering in ~8 minutes compared to ~16 minutes before that.&lt;/p&gt;

&lt;p&gt;Here are some example hi-res images showing the journey from initial render to final composite:&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-1-render.png&quot; alt=&quot;PNG&quot; title=&quot;Render, 8-bit colour&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-2-red.png&quot; alt=&quot;PNG&quot; title=&quot;Red channel, inverted, 1-bit colour&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-3-green.png&quot; alt=&quot;PNG&quot; title=&quot;Green channel, 1-bit colour&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-4-blue.png&quot; alt=&quot;PNG&quot; title=&quot;Blue channel, 1-bit colour&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-5-alpha.png&quot; alt=&quot;PNG&quot; title=&quot;Alpha channel, 1-bit colour&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-6-dither.png&quot; alt=&quot;PNG&quot; title=&quot;Green channel with Dither pattern applied&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-rgb-1bit-7-composite.png&quot; alt=&quot;PNG&quot; title=&quot;Final composite, 1-bit colour&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;elsewhere&quot;&gt;Elsewhere&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;2021-06-06—&lt;a href=&quot;https://news.ycombinator.com/item?id=27409371&quot;&gt;Hacker News&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 05 Jun 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/06/05/channelling-rgb-into-1bit/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/06/05/channelling-rgb-into-1bit/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Pseudo-HDR</title>
          <description>&lt;p&gt;I love OpenSCAD “the programmer’s solid 3D CAD modeller”, despite its idiosyncrasies. One of the quirks that causes me most pain is the lack of controls for scene lighting in the Preview render. Unfortunately, I use that very Preview render as my main output!&lt;/p&gt;

&lt;p&gt;This lighting issue manifests as shadows cast on the model. As I rotate the car some white “highlight” elements become darker. At this point the model is made up of many more shades of grey than I’d like.&lt;/p&gt;

&lt;p&gt;The problem escalates when I take the Preview renders and convert them to 1-bit (black and white) ready for display on Playdate. I use a simple threshold conversion where any pixels darker than the threshold value become black, and any lighter become white. The highlight elements that have been cast in shadow are now grey and in many cases after the threshold conversion they end up as black pixels when they should be white. The net visual result is a loss of detail as well as flashing elements as they disappearing on certain frames.&lt;/p&gt;

&lt;p&gt;My first attempt at solving this problem was to set model-specific threshold levels. This worked to a degree but there were still elements that would flash on and off as the car rotated, with headlights being the most noticeable. Whilst I lived with the issue for a long time it always bothered me as it did make the sprite feel buggy. Deep down I knew that the results could be better. However, looking at the OpenSCAD development roadmap made it clear that any improvements would have to come from me.&lt;/p&gt;

&lt;p&gt;One day, out of the blue, I realised that if black pixels are more reliably rendered then why don’t I take advantage of that and render the model in opposite colours so that the highlights are now black. After rendering I could simply negate the colours in the resulting image and the highlights would become white again. I tried a quick test and the results were good!&lt;/p&gt;

&lt;p&gt;Of course this means an additional render stage is added to my workflow, but that’s of little consequence since the Makefile is doing all the hard work. I also had to make some changes to my render scripts so that the normal and negative images are composited together into the final image. The resulting sprites have no flashing elements, maintain more fine detail, and appear a lot more solid as a result. Excellent!&lt;/p&gt;

&lt;p&gt;Afterwards it struck me that this process is similar to HDR photography where multiple photographs are combined to increase the dynamic range in the final image. So, just for kicks, I’m referring to this technique as HDR 1-bit rendering.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-sprites-old.gif&quot; alt=&quot;GIF&quot; title=&quot;Old rendering workflow: note the disappearing headlights&quot; /&gt;&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-sprites-new.gif&quot; alt=&quot;GIF&quot; title=&quot;New rendering workflow: headlights are present and correct&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/05/21/pseudo-hdr/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/05/21/pseudo-hdr/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Makefile</title>
          <description>&lt;p&gt;During the shadow rendering changes I was generating new sprites quite frequently, and I quickly realised that my mess of shell scripts just wasn’t a good enough system to be used in anger. I would have to call my scripts manually, with a variety of parameters, and remember a bunch of stuff unique to each script.&lt;/p&gt;

&lt;p&gt;So I spent a day converting the script system into a Makefile, with rules for:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rendering&lt;/li&gt;
  &lt;li&gt;stitching&lt;/li&gt;
  &lt;li&gt;post-processing&lt;/li&gt;
  &lt;li&gt;copying&lt;/li&gt;
  &lt;li&gt;cleaning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also improved the scripts to make them touch all their output files with the last-modified timestamp of the original 3D model, meaning the scripts could become self-aware and know which output files are up-to-date and which need re-rendering.&lt;/p&gt;

&lt;p&gt;With this system I can generate a full set of renders of all vehicles in ~minutes, or render just a single car in ~seconds. This is such a huge time saver and has enabled me to iterate on car designs more quickly and easily than ever before. I’m already seeing the gains in much better sprites.&lt;/p&gt;

&lt;p&gt;Believe it or not this was the first Makefile I’ve ever needed to write from scratch. I knew enough about them to know that they would be a good fit for this task, and it was fun to learn more about something I only knew in passing.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 19 May 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/05/19/makefile/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/05/19/makefile/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Pre-rendering Ranger</title>
          <description>&lt;p&gt;Since very early on shadows in Daily Driver have just been simple rectangles: one size fits all, rendered from a single 3D model, and post-processed to add dithering. &lt;abbr title=&quot;Minimum Viable Product&quot;&gt;MVP&lt;/abbr&gt;, you know? Over time I decided to do multiple shadows, one each for short cars and long cars.&lt;/p&gt;

&lt;p&gt;Sometime later I threw caution to the wind and decided to render per-car shadows. However, the OpenSCAD &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;projection()&lt;/code&gt; command that I was using was so slow! In fact it zapped my desire to finish implementing the feature. Instead, I let it sit for many months.&lt;/p&gt;

&lt;p&gt;Recently, I picked things up again to get the a new trailer and demo out. And then it hit me, that if I flatten a car on the z-axis—as if Looney Tunes dropped a heavy weight on it—then that flat thing will be a close enough equivalent of a shadow for my use. So I did just that and the results were great, and more importantly very quick to render!&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-shadows-anim.gif&quot; alt=&quot;GIF&quot; title=&quot;Animation showing the theory of a model being squished down into its shadow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So I went all in and decided to not only render one shadow per-car but to render shadows for each individual frame. So now the direction of the front wheels and details of the body shape are reflected in the shadow. It might sound like a small thing but it really makes a big difference. You can see old vs new shadows in the image carousel below.&lt;/p&gt;

&lt;p&gt;It’s in situations like these that I’m really proud I put a ton of early effort into the tooling and build process that generates my sprites.&lt;/p&gt;

&lt;p&gt;Result!&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-shadows-old.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-shadows-old.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-shadows-new.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-prerendered-shadows-new.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 82%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/05/18/prerendering-ranger/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/05/18/prerendering-ranger/</guid>
        </item>
      
    
      
        <item>
          <title>Macintosh drawing software compared</title>
          <description>&lt;p&gt;Below is a list of various drawing applications that are available to use with System 7 (68K).&lt;/p&gt;

&lt;p&gt;I’m mostly interested in apps that can do both pixel and vector, and that support layers and transparency. The table below might be useful for at-a-glance comparisons. Apps run in both mono or colour, unless stated otherwise.&lt;/p&gt;

&lt;p&gt;Deneba artWORKS can do both pixel and vector, has layers and partial transparency. The bottom layer is opaque and all layers on top are transparent. Collections of pixels are managed as a special object, and there’s a limit of 8 layers. The user interface is brilliant.&lt;/p&gt;

&lt;p&gt;SuperPaint has two layers: pixel and vector with transparency in all but the base layer. Though it allows cut/copy and paste from the pixel layer to the vector layer at which point those collections of pixels are managed as SuperBits objects and can be edited in isolation.&lt;a href=&quot;https://twitter.com/tumult/status/1432279388519763972&quot;&gt;ref&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Freehand is king of the vector apps. It really was so much better than Illustrator. Such a shame that it’s no longer around. To use it on iPad is quite something!&lt;/p&gt;

&lt;p&gt;Also interesting is how many early versions of successful apps didn’t support layers (Photoshop, Freehand) or full transparency (Photoshop).&lt;/p&gt;

&lt;p&gt;Almost every app has only a single level undo, with only Expression and Freehand offering multi-level undo. This is probably why everybody was using Freehand when I started work in graphic design in the mid-late 1990s.&lt;/p&gt;

&lt;p&gt;One small disappointment: Macromedia Fireworks requires the PPC architecture so won’t run on my iPad System 7 setup. Sad face. (But we can use &lt;a href=&quot;https://infinitemac.org&quot;&gt;infinitemac.org&lt;/a&gt;)&lt;/p&gt;

&lt;div class=&quot;table-wrapper&quot;&gt;
  &lt;table id=&quot;macintosh-drawing-software&quot;&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;APP&lt;/th&gt;
        &lt;th style=&quot;text-align: center&quot;&gt;PIXEL&lt;/th&gt;
        &lt;th style=&quot;text-align: center&quot;&gt;VECTOR&lt;/th&gt;
        &lt;th style=&quot;text-align: center&quot;&gt;LAYERS&lt;/th&gt;
        &lt;th style=&quot;text-align: center&quot;&gt;TRANSP.&lt;/th&gt;
        &lt;th style=&quot;text-align: center&quot;&gt;UNDO&lt;/th&gt;
        &lt;th&gt;NOTES&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;artWORKS&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Many layers, many objects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;BluePaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;PPC-only&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Canvas&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Many layers, many objects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;ClarisDraw&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Pixel drawing within specific objects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Cricket Draw&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Draw It Again Sam&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Drawing Table&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Expression&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td&gt;Colour required&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Freehand 1.0–2.0&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td&gt;Layers not managed visually&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Freehand 3.1–5.5&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Illustrator 88–3.0&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;ImageStudio 0.6&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Custom brushes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;LightningPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Polite palettes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MacDraw Pro&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MacPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;MacroPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Transparent patterns&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Photoshop 1.0–2.5&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Photoshop 3.0&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Full alpha channel transparency&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;PixelPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Special brush effects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;ShareDraw&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt; &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Studio/1&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Animation, 1-bit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Studio/8&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Animation, 8-bit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;SuperPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Two layers, many objects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;UltraPaint&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;○&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Eight layers, many objects&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zeus&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt;●&lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
        &lt;td&gt;Animation&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

&lt;/div&gt;
&lt;p&gt;Key: ● full support, ○ partial support&lt;/p&gt;

&lt;h3 id=&quot;related-posts&quot;&gt;Related posts&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/04/17/turning-an-ipad-pro-into-the-ultimate-classic-macintosh&quot;&gt;Turning an iPad Pro into the Ultimate Classic Macintosh&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/04/21/building-basiliskii-for-ios/&quot;&gt;How to install BasiliskII on your iPad&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/04/19/automating-interactions-using-apple-events/&quot;&gt;Exploring Custom Keyboards and Automation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/03/28/changing-the-size-of-toolbar-items-using-resedit/&quot;&gt;Optimising Macintosh app toolbars for touch&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Macintosh drawing software compared&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/04/25/mixing-external-tools-across-deneba-software/&quot;&gt;Mixing External Tools across Deneba software&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/04/30/my-system-7-software-choices/&quot;&gt;My System 7 software choices&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2021/05/03/interoperability-of-system-7-and-ios/&quot;&gt;About the interoperability of System 7 and iOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 24 Apr 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/04/24/macintosh-drawing-software-compared/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/04/24/macintosh-drawing-software-compared/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Happy New Year!</title>
          <description>&lt;p&gt;I hope you’re safe and well and wish you a great 2021. I’m back at it, and am confident this year will be the year of Daily Driver and more besides!&lt;/p&gt;

&lt;p&gt;Recent work on the game includes improvements to the physics of in-game objects and creation of yet more vehicles and levels.&lt;/p&gt;

&lt;p&gt;“The car’s the star”, as they say, so I have sunk untold hours into both the physics and graphics of many different cars to ensure that the depth of control and animation is enough to hold a players interest for the time I hope they will spend with my game. There’s no final vehicle line-up, as often some cars don’t look unique enough after the first rough model is tested in the game. But these two are keepers!&lt;/p&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-happy-new-year-a.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-happy-new-year-a.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-happy-new-year-b.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-happy-new-year-b.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 82%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

&lt;p&gt;Interestingly, both these vehicles show off one aspect of the game that I’ve not really talked about so far: reference and nods to classic games. Here we can see an RC car (whose antenna wobbles!) that is a nod to games like Re-volt, RC Revenge, Smash Cars, RC de Go!, Excite Truck, RC Pro-Am etc. And the forklift is a nod to Shenmue and the infamous New Yokosuka Harbor District.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-happy-new-year.gif#playdate&quot; alt=&quot;GIF&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 09 Jan 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/01/09/happy-new-year/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/01/09/happy-new-year/</guid>
        </item>
      
    
      
        <item>
          <title>デイリードライバー</title>
          <description>&lt;p&gt;The last couple of months have been tough going for a couple of reasons.&lt;/p&gt;

&lt;p&gt;Firstly, a new version of the Playdate SDK broke my game in a couple of important ways: my method of targeting 60fps stopped working, and more seriously the controls stopped working. The workaround for both of these issues was long and drawn out, but here’s a quick summary:&lt;/p&gt;

&lt;p&gt;Until this point I was waiting for the next frame update using the SDK &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wait()&lt;/code&gt; function: one line of code that waits for a required amount of time. A change in how this works meant I was stuck. My workaround was do it in a more naïve way - just constantly checking the system timestamp to see if the allowed time for the current frame has passed. Keep it simple, I guess.&lt;/p&gt;

&lt;p&gt;The overhead of idling the CPU—the time it takes for it to wind down, do the wait, and then wind back up—is actually quite substantial when it takes a few milliseconds and you only have sixteen of them for each update!&lt;/p&gt;

&lt;p&gt;The end result is that the game is now running… better than ever. Even after these issues were resolved at a higher level by the Playdate SDK team, I have kept using my workarounds as the game runs faster. So, silver linings and all that!&lt;/p&gt;

&lt;p&gt;Secondly, an important issue that remains unresolved is exactly how—and when—Daily Driver will be released. I’m hopeful that will be as part of a Playdate Season, where games are delivered to the device on a schedule and you don’t know what game you’ll be playing until you see the light flash and you pick up and wake up your device. That’s the magic I want my players to have a piece of. That might turn out to be later rather than sooner, so we’ll have to be patient.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-katakana.png#playdate&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Anyway, other news: I’ve been trying to decide how to render the name of the game in Japanese. The English title uses &lt;em&gt;&lt;strong&gt;Futura Bold Oblique&lt;/strong&gt;&lt;/em&gt; which is a style that does not translate directly into non-Roman typefaces. I had found some bold Japanese fonts, with a little bit of character, but they seemed too cute and not geometric enough. After much investigation and many mockups I opted to draw the necessary katakana characters by hand, on a grid, and it’s turned out rather well. I’d love to expand this into a full typeface, but that’s a project for another time.&lt;/p&gt;

&lt;p&gt;Doing this sort of graphics work, or car design/rendering, are my goto procrastination tasks when I don’t have enough mojo to dive into the code and tackle the remaining work. So I’m sort of treading water on the final push of work needed to get the game over the line.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Mon, 14 Dec 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/12/14/daily-driver/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/12/14/daily-driver/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Automation Improvements</title>
          <description>&lt;p&gt;The recent automation was really just help with organisation. As soon as I started looking at running OpenSCAD from the shell/command-line it became obvious that I could do the rendering and organisation in one step without having to use external apps like Hazel.&lt;/p&gt;

&lt;p&gt;So, that’s now done. I render all the frames, with more sensible filenames, to a single folder.&lt;/p&gt;

&lt;p&gt;If I run all the renders one after the other, maxing out a single CPU core (99% CPU usage), time taken:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~17 seconds 🐢&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But, using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;amp;&lt;/code&gt; directive and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wait&lt;/code&gt; command, I can run the renders in parallel (well, technically it’s one process each; and batches of 32 works best) using all 6 CPU cores (~485% CPU usage), time taken:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~10 seconds 🐇&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;…the beauty of the command line!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Note to self: don’t publish a post about an automation breakthrough until the dust has settled.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 09 Oct 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/10/09/automation-improvements/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/10/09/automation-improvements/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Automation</title>
          <description>&lt;p&gt;In preparation for regenerating my many cars with x3 the number of sprites, I thought I’d try to sort the rendered frames automatically into named folders because this is fiddly manual work I really don’t enjoy, and a bit of a bottleneck in my asset generation. For each pose I have to render the frames then group the new image files into a folder that describes that pose, as these multiple folders are later be used for batch processing.&lt;/p&gt;

&lt;p&gt;I could use macOS Folder Actions for this, but I’ve been using an app called &lt;a href=&quot;https://www.noodlesoft.com/&quot;&gt;Hazel&lt;/a&gt; for many years to do this sort of thing, so that was my first choice.&lt;/p&gt;

&lt;p&gt;The hard work is done with a shell script, as I’m quite comfortable writing those.&lt;/p&gt;

&lt;h2 id=&quot;flow&quot;&gt;Flow&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;get most recently saved .scad file&lt;/li&gt;
  &lt;li&gt;parse filename to capture car name&lt;/li&gt;
  &lt;li&gt;parse file contents for left/right/forward/backward tilt values&lt;/li&gt;
  &lt;li&gt;concatenate all this information as our new folder name&lt;/li&gt;
  &lt;li&gt;create new folder&lt;/li&gt;
  &lt;li&gt;move matching file into new folder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means that the folder name will change based on the render settings in the file—perfect!&lt;/p&gt;

&lt;p&gt;I still have to make 9 small sets of manual text changes to render each car pose, so that’s the next thing I’ll try to automate by running OpenSCAD from the command line.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-automation.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 07 Oct 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/10/07/automation/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/10/07/automation/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Post-processing workflow</title>
          <description>&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-post-processing.gif#playdate&quot; alt=&quot;GIF&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My post-processing to 1-bit is fairly simple. I use a bespoke tool that allows me to have “live” (realtime) manual control over a bunch of image filters so I can see the results immediately.&lt;/p&gt;

&lt;p&gt;But essentially it’s:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;convert to greyscale, using one of many algorithms&lt;/li&gt;
  &lt;li&gt;reduce colours to 1-bit, decide on dithering or threshold level on case-by-case basis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The grey shades that I applied to my model in OpenSCAD give an element of control during this conversion process. Greys can be pushed either way, towards black or white, depending on my need with the specific model I am working on.&lt;/p&gt;

&lt;p&gt;In this instance I desaturated the greys which blows them out to nearer white. And then I chose to threshold to reduce to b/w.&lt;/p&gt;

&lt;p&gt;I also have the wheels as a separate finished image so I don’t have to worry if their detail is lost during this phase, I can just paste over the accurate/finished wheels.&lt;/p&gt;

&lt;p&gt;Final result, unedited:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-post-processing.png&quot; alt=&quot;PNG&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I would later touch up the sprite by hand to reinforce any details I think have been lost. I use Piskel for edited sprites because it has really nice sprite sheet support, drag and drop loading, and quick and versatile exporting.&lt;/p&gt;

&lt;p&gt;Aside: 32 is a number that is a leftover from a different prototype and it’s stuck. I guess it should really be 36? or 24? or 18?. But it’s too late now! Actually it would be relatively easy to change but I have bigger fish to fry.&lt;/p&gt;

&lt;p&gt;The animations alone could run at 99fps—it’s anything that causes more drawing which slow things down. Collisions, not because they are computationally heavy, but because they cause a lot of sprite updates - which means drawing moving things - to happen. I’m working hard to maintain 60fps on device (50fps in simulator for… reasons) and am excited I’ve managed to get here.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Mon, 10 Aug 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/08/10/post-processing-workflow/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/08/10/post-processing-workflow/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: OpenSCAD workflow</title>
          <description>
&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;c&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;d&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel&quot; id=&quot;e&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-1.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-1.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-2.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-2.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-3.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-3.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-4.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-4.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-5.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-openscad-workflow-5.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;c&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;d&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;e&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 82%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__staticimage,
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}

.carousel__activator:nth-of-type(4):checked ~ .carousel__track {
  -webkit-transform: translateX(-300%);
          transform: translateX(-300%);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__slide:nth-of-type(4) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__controls:nth-of-type(4) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(4) {
  opacity: 1;
}

.carousel__activator:nth-of-type(5):checked ~ .carousel__track {
  -webkit-transform: translateX(-400%);
          transform: translateX(-400%);
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__slide:nth-of-type(5) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__controls:nth-of-type(5) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(5):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(5) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(4) {
  -webkit-transform: translateX(300%) translateZ(0);
          transform: translateX(300%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(5) {
  -webkit-transform: translateX(400%) translateZ(0);
          transform: translateX(400%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(4),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(4) {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(5),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(5) {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;.carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

&lt;p&gt;I took the plunge and upgraded to a Mac mini and 4K display so had to migrate my setup and then figure out why my workflow was broken (spoiler: retina!) compared to my old rMBP with non-retina display.&lt;/p&gt;

&lt;p&gt;So, my workflow uses the following apps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://openscad.org&quot;&gt;OpenSCAD&lt;/a&gt; “The Programmers Solid 3D CAD Modeller”&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://flyingmeat.com/retrobatch/&quot;&gt;Retrobatch&lt;/a&gt; “a unique application for automating actions on multiple images at the same time”&lt;/li&gt;
  &lt;li&gt;post-processing “greyscale and dithering tool” (I use my own realtime tool, but any image editor would do it to a degree, see this other thread)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is so I can re-run a workflow at any point (maybe in a make file) which I often do during development. These become executable assets, of sorts, in my project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenSCAD&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;define 3D models (I get a feeling like coding CSS in a strange way)&lt;/li&gt;
  &lt;li&gt;animate the model spinning through one 360-degree rotation&lt;/li&gt;
  &lt;li&gt;dump frames out as PNG files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the model definition to try out:&lt;/p&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/a0a0b967c480ab973d40aaf5e78fd47f&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/a0a0b967c480ab973d40aaf5e78fd47f.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;I love building 3D this way, it’s kind of like LEGO. I use basic geometric building blocks (cube, sphere, cylinder, polygon, etc) and some boolean operations (difference, intersection, union). There are some other cool things (hull, minkowski). I have the commands in &lt;a href=&quot;https://dash.app/&quot;&gt;Dash.app&lt;/a&gt;alongside the Playdate SDK docs.&lt;/p&gt;

&lt;p&gt;In the image 2 you can see what the model looks like with all the blocks I have used to make it visible at once.&lt;/p&gt;

&lt;p&gt;My particular approach is &lt;em&gt;subtractive&lt;/em&gt;— kind of like sculpting—I start with large blocks and cut away at them using other shapes and the &lt;em&gt;difference&lt;/em&gt; function. When finding the exact placement for a block I use the &lt;em&gt;#&lt;/em&gt; precedent which makes the blocks show up as semi-opaque red blocks. See main image.&lt;/p&gt;

&lt;p&gt;I colour each block in a one or two shades of grey, black and white. This is to help with the conversion to 1-bit later on. It’s not so obvious here as the lighting makes the colours look many different shades - for example the wheels are black with white centre but look grey here. See image 3.&lt;/p&gt;

&lt;p&gt;Using some simple programming constructs and variables I can add booleans to trigger different states, I use this for angled front wheels and tilted car body. See image 4.&lt;/p&gt;

&lt;p&gt;And also to set the distance and rotation of the camera relative to the model when in animation mode. In this mode I enter a speed (doesn’t matter but higher the better) number of frames = 32, and the tick the box to dump the images. The tick disappears when the images are all done. See image 5.&lt;/p&gt;

&lt;p&gt;I also rendered the skid marks, car shadow, and some other elements.&lt;/p&gt;

&lt;p&gt;There is a lot that is annoying about this app&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;not retina-optimised (so I run it in Low Resolution, set using Get Info on the app)&lt;/li&gt;
  &lt;li&gt;runs maxed out on a single core&lt;/li&gt;
  &lt;li&gt;doesn’t have configurable lighting (I’d prefer uniform or no lighting)&lt;/li&gt;
  &lt;li&gt;Qt Framework app, so not really macOS-native&lt;/li&gt;
  &lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…but I still use it! I am not aware of anything else quite like it.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 08 Aug 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/08/08/openscad-workflow/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/08/08/openscad-workflow/</guid>
        </item>
      
    
      
        <item>
          <title>Daily Driver: Chequered Flag</title>
          <description>&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/daily-driver-chequered-flag.gif#playdate&quot; alt=&quot;GIF&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bit of fun at lunch today.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 24 Jun 2020 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2020/06/24/chequered-flag/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2020/06/24/chequered-flag/</guid>
        </item>
      
    
      
        <item>
          <title>Hanafuda by ZAT SOFT</title>
          <description>&lt;p&gt;These beautiful cards were created in 1983 using only characters, without bitmap graphics. This was because the Sharp MZ-700, like many home computers of its era, couldn’t do bitmap graphics.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-zat-soft.png#pixel&quot; alt=&quot;PNG&quot; title=&quot;Hanafuda on Sharp MZ-700. By ZAT SOFT, 1983.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is a download of the &lt;a href=&quot;http://vectorpoem.com/playscii/&quot;&gt;Playscii&lt;/a&gt; art files for the above cards: &lt;a href=&quot;https://www.dropbox.com/s/7j8lyoi6twdderl/Sharp%20MZ-700%20Hanafuda.zip?dl=0&quot;&gt;Sharp MZ-700 Hanafuda.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also included are a set of blank cards so you can try creating something yourself.&lt;/p&gt;

&lt;p&gt;I encourage you to at least try as you’ll encounter some of the genius design decisions made by the original creator!&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/hanafuda-zat-soft-playscii.png#pixel&quot; alt=&quot;PNG&quot; title=&quot;Hanafuda October month recreated in Playscii using Sharp MZ-700 character set&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2019/12/02/hanafuda-by-zat-soft/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2019/12/02/hanafuda-by-zat-soft/</guid>
        </item>
      
    
      
        <item>
          <title>Verbum “The Journal of Personal Computer-Aesthetics”</title>
          <description>&lt;p&gt;Verbum “The Journal of Personal Computer-Aesthetics” (1986–1991) was an early computer lifestyle magazine focusing on interactive art and computer graphics.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;All issues (well, except issue 4.3): &lt;a href=&quot;https://archive.org/details/verbummagazine?&amp;amp;sort=date&quot;&gt;archive.org/details/verbummagazine?&amp;amp;sort=date&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Table of contents for all issues: &lt;a href=&quot;https://en.wikipedia.org/wiki/Verbum_(magazine)&quot;&gt;en.wikipedia.org/wiki/Verbum_(magazine)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Podcast interview with its creator Michael Gosney: &lt;a href=&quot;https://www.drfutureshow.com/drfutureblog/interview-media-pioneer-michael-gosney-on-the-renaissance-of.html&quot;&gt;www.drfutureshow.com/drfutureblog/interview-media-pioneer-michael-gosney-on-the-renaissance-of.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/verbum-the-journal-of-personal-computer-aesthetics.jpg&quot; alt=&quot;Verbum issue 5.2 front cover&quot; title=&quot;Verbum issue 5.2 front cover&quot; /&gt;&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2019/07/10/verbum-journal-of-personal-computer-aesthetics/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2019/07/10/verbum-journal-of-personal-computer-aesthetics/</guid>
        </item>
      
    
      
        <item>
          <title>Cease &amp; Desist: The Designers Republic</title>
          <description>&lt;p&gt;A letter I received from The Designers Republic after creating a font inspired by their work. They chose to order a cease and desist, rather than fostering creativity.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Matt Sephton created an original font called Block Out–a techno font that can still be found here. He had used Fontographer. It was, as he put it, influenced by the tDR font in the Wipeout series of games. He placed a free truetype font on his web site, but was confronted with a threatening letter from tDR and was forced to take down the free .ttf font from his site. They claimed their font 6x6 (even though Matt’s is based on a 7x7 grid) was what he was trying to sell. Another instance of corporate bullying. —Luc Devroye, from &lt;a href=&quot;http://luc.devroye.org/fonts-72415.html&quot;&gt;luc.devroye.org/fonts-72415.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/blockout-the-designers-republic.jpg&quot; alt=&quot;JPG&quot; title=&quot;Cease &amp;amp; Desist &amp;lt;!-- Ian Anderson, Corporate Bully --&amp;gt;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;My font was drawn completely from scratch using &lt;a href=&quot;https://macromedia.fandom.com/wiki/Macromedia_Fontographer&quot;&gt;Fontographer 4.1&lt;/a&gt;, so I find it perplexing that glyphs I had created straight from my own imagination were the same as those in the apparently identical font. I offered my font as a free download on my website, under the concept of &lt;a href=&quot;https://en.wikipedia.org/wiki/Shareware&quot;&gt;Shareware&lt;/a&gt; which encouraged others to also share the font for free, and if anybody felt like sending a donation they could do. As you might expect, this is a bit of a hippy thing to do and nobody ever donated anything! And I never did hear from the Head of the Department of Computer Science.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;An archived copy of the font can be found &lt;a href=&quot;https://discmaster.textfiles.com/browse/18365/fonte2.zip/dekorativ/blockout.zip&quot;&gt;on this CD-ROM from 2007&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 17 Jun 1997 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/1997/06/17/cease-and-desist-the-designers-republic/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/1997/06/17/cease-and-desist-the-designers-republic/</guid>
        </item>
      
    

  </channel>
</rss>
