<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: andy</title>
    <description>The latest articles on DEV Community by andy (@b1rdmania).</description>
    <link>https://dev.to/b1rdmania</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3824014%2F2169b4f6-ec83-4bb0-bd3b-2c2ca053b7a3.jpeg</url>
      <title>DEV Community: andy</title>
      <link>https://dev.to/b1rdmania</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/b1rdmania"/>
    <language>en</language>
    <item>
      <title>Shipping a Game Boy “Wario Synth” from real MIDI</title>
      <dc:creator>andy</dc:creator>
      <pubDate>Sat, 14 Mar 2026 13:32:09 +0000</pubDate>
      <link>https://dev.to/b1rdmania/shipping-a-game-boy-wario-synth-from-real-midi-152b</link>
      <guid>https://dev.to/b1rdmania/shipping-a-game-boy-wario-synth-from-real-midi-152b</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.wario.style/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.wario.style%2FwarioX.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.wario.style/" rel="noopener noreferrer" class="c-link"&gt;
            Wario Synthesis Engine 8-Bit Midi
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Turn any song into a Game Boy version
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
          wario.style
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;br&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/b1rdmania" rel="noopener noreferrer"&gt;
        b1rdmania
      &lt;/a&gt; / &lt;a href="https://github.com/b1rdmania/motif" rel="noopener noreferrer"&gt;
        motif
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Wario.Style. Game Boy Midi Synthesis Engine. Search any song. Get the 8-bit Game Boy version.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Wario Synthesis Engine 8-Bit Midi&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/b1rdmania/motif/public/wariosynthlogo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fb1rdmania%2Fmotif%2Fpublic%2Fwariosynthlogo.png" alt="Wario Synth Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Turn any song into a Game Boy version.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Live Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.wario.style" rel="nofollow noopener noreferrer"&gt;www.wario.style&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;WAH!&lt;/strong&gt; 🎮&lt;/p&gt;
&lt;p&gt;Type in literally any song. We'll find a MIDI file somewhere on the internet and absolutely demolish it through a janky homebrew Game Boy sound chip running in your browser.&lt;/p&gt;
&lt;p&gt;Is it accurate? Sometimes. Is it legal? Probably. Does it slap? &lt;strong&gt;Absolutely.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Four glorious channels of chiptune chaos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🟨 &lt;strong&gt;Pulse 1&lt;/strong&gt; — screamy lead melodies&lt;/li&gt;
&lt;li&gt;🟨 &lt;strong&gt;Pulse 2&lt;/strong&gt; — whatever pulse 1 forgot&lt;/li&gt;
&lt;li&gt;🟩 &lt;strong&gt;Wave&lt;/strong&gt; — chunky bass that hits different&lt;/li&gt;
&lt;li&gt;⬜ &lt;strong&gt;Noise&lt;/strong&gt; — percussion (tssss pshhhh)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zero samples. Zero server audio. Just raw oscillators having the time of their lives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.wario.style" rel="nofollow noopener noreferrer"&gt;wario.style&lt;/a&gt;&lt;/strong&gt; ← go make your favorite song worse&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/b1rdmania/motif/public/wario-sprite.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fb1rdmania%2Fmotif%2Fpublic%2Fwario-sprite.png" alt="Wario"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MIDI search&lt;/strong&gt; from BitMidi and other sources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser playback&lt;/strong&gt; with soundfont piano preview&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wario Synthesis Engine&lt;/strong&gt;: procedural Game Boy-style synthesis from parsed MIDI structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share links&lt;/strong&gt; with dynamic social previews&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/b1rdmania/motif" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;Built a fun little web app: search a song, find a real MIDI online, load it, then resynthesize it in-browser with a Game Boy-ish synth engine. Fast MVP, lots of edge cases, a surprising amount of “this slaps”.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we shipped (MVP)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MIDI search + ranking&lt;/strong&gt; across sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend fetch/proxy with SSRF protection&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic MIDI parsing + metadata&lt;/strong&gt; (stable, debuggable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable playback&lt;/strong&gt; with Web Audio + iOS “tap to enable audio” UX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motif / variation mode&lt;/strong&gt; (role-mapping: melody/bass/chords/texture → synth layers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The feature that derailed us: “Download MP3”
&lt;/h3&gt;

&lt;p&gt;We added an export button that:&lt;br&gt;
1) offline-renders (&lt;code&gt;OfflineAudioContext&lt;/code&gt;)&lt;br&gt;
2) encodes MP3 in JS (&lt;code&gt;lamejs&lt;/code&gt;)&lt;br&gt;
3) triggers a blob download&lt;/p&gt;

&lt;p&gt;It used to feel great:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Rendering audio…”&lt;/li&gt;
&lt;li&gt;“Encoding MP3…”&lt;/li&gt;
&lt;li&gt;“MP3 downloaded!”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then browsers started blocking it.&lt;/p&gt;

&lt;h4&gt;
  
  
  The real problem
&lt;/h4&gt;

&lt;p&gt;Modern browsers often &lt;strong&gt;silently block downloads that happen after long async work&lt;/strong&gt; (render/encode), because the “user gesture” is considered gone. No error, no file, just… nothing.&lt;/p&gt;

&lt;p&gt;We tried the usual workarounds (and complexity ballooned):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bundle the encoder (avoid CDN globals)&lt;/li&gt;
&lt;li&gt;two-click “prepare then download”&lt;/li&gt;
&lt;li&gt;Save File Picker (&lt;code&gt;showSaveFilePicker&lt;/code&gt;) where supported&lt;/li&gt;
&lt;li&gt;pre-open a tab/window on click, then navigate it to the blob&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At some point the export UX became the least reliable part of the app, so we &lt;strong&gt;removed the Download MP3 button&lt;/strong&gt; instead of shipping something flaky.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we learned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reliability beats cleverness&lt;/strong&gt;: a flaky button poisons trust.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser policies are product constraints&lt;/strong&gt;: autoplay unlock + download gesture rules define your UX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism makes iteration fun&lt;/strong&gt;: stable parsing/metadata keeps debugging sane.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How we can level it up next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build our own MIDI library&lt;/strong&gt;: crawl/cache “known good” MIDIs, normalize metadata, dedupe, rank by “sounds good in our synth”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better musical intelligence&lt;/strong&gt; (still lightweight): improved role mapping, basic key/scale heuristics, smarter drum/noise handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring export back properly&lt;/strong&gt;: either &lt;strong&gt;server-side rendering/export&lt;/strong&gt; or a deliberate “Save…” flow that’s actually reliable cross-browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still: turning random MIDIs into crunchy Game Boy performances is stupidly fun—and it’s a great playground for audio, MIDI weirdness, and shipping fast.&lt;/p&gt;

</description>
      <category>music</category>
      <category>gamedev</category>
    </item>
  </channel>
</rss>
