drawbar 0.7.1

Your Nord's sounds, in a window: browse, edit and send programs, samples and pianos, in the browser or on the desktop
Documentation
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title>drawbar: edit the sounds on your Nord keyboard</title>
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, user-scalable=no"
    />
    <meta
      name="description"
      content="An unofficial editor for Nord keyboards. Read, edit and send programs, samples and pianos over USB, in Chrome or Edge or on the desktop."
    />
    <link rel="canonical" href="https://drawbar.app/" />
    <link rel="icon" type="image/svg+xml" href="favicon.svg" />
    <meta name="theme-color" content="#161719" />
    <meta name="color-scheme" content="dark" />

    <meta property="og:type" content="website" />
    <meta property="og:site_name" content="drawbar" />
    <meta property="og:url" content="https://drawbar.app/" />
    <meta property="og:title" content="drawbar: edit the sounds on your Nord keyboard" />
    <meta
      property="og:description"
      content="An unofficial editor for Nord keyboards. Read, edit and send programs, samples and pianos over USB, in Chrome or Edge or on the desktop."
    />
    <meta property="og:image" content="https://drawbar.app/docs/assets/screenshot.png" />
    <meta property="og:image:width" content="2000" />
    <meta property="og:image:height" content="1331" />
    <meta
      property="og:image:alt"
      content="drawbar with an instrument attached and a piano library open in its editor"
    />
    <meta name="twitter:card" content="summary_large_image" />

    <script type="application/ld+json">
      {
        "@context": "https://schema.org",
        "@type": "WebApplication",
        "name": "drawbar",
        "url": "https://drawbar.app/",
        "description": "An unofficial editor for Nord keyboards. Read, edit and send programs, samples and pianos over USB, in Chrome or Edge or on the desktop.",
        "applicationCategory": "MultimediaApplication",
        "operatingSystem": "Windows, macOS, Linux",
        "browserRequirements": "Requires WebUSB and WebAssembly: Chrome or Edge.",
        "screenshot": "https://drawbar.app/docs/assets/screenshot.png",
        "license": "https://opensource.org/license/bsd-3-clause",
        "isAccessibleForFree": true,
        "offers": { "@type": "Offer", "price": "0", "priceCurrency": "USD" },
        "sameAs": ["https://github.com/jmoo/drawbar"]
      }
    </script>
    <style>
      html,
      body {
        margin: 0;
        padding: 0;
        width: 100%;
        height: 100%;
        overflow: hidden;
        /* Matches the app's panel fill, so the page does not flash white while the
           module downloads. */
        background: #161719;
        color: #cfd2d6;
        font-family: ui-sans-serif, system-ui, sans-serif;
      }

      /* eframe observes the canvas's own content box and sizes its framebuffer to
         match, so the CSS size is what makes the app fill the window. */
      canvas {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
        display: block;
      }

      #status {
        position: absolute;
        top: 50%;
        left: 0;
        width: 100%;
        text-align: center;
        transform: translateY(-50%);
        font-size: 0.95rem;
        letter-spacing: 0.02em;
      }

      noscript p {
        padding: 0 16px;
      }

      /* Over the canvas, so the page answers a screen the shell cannot lay out in
         before the module that would answer has loaded. */
      #toosmall {
        display: none;
        position: absolute;
        inset: 0;
        z-index: 1;
        box-sizing: border-box;
        padding: 0 16px;
        background: #161719;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        text-align: center;
      }

      #toosmall p {
        margin: 0 0 8px;
        max-width: 32rem;
      }

      #toosmall .head {
        font-size: 1.15rem;
        font-weight: 600;
      }

      #toosmall a {
        color: #e05040;
      }

      /* `drawbar::shell::LEAST`, which a test holds these two numbers to. A CSS pixel
         is the point the app lays itself out in. */
      @media (width < 660px), (height < 430px) {
        #toosmall {
          display: flex;
        }
      }
    </style>
  </head>
  <body>
    <canvas id="drawbar"></canvas>
    <div id="status">loading drawbar…</div>
    <noscript>
      <p>drawbar is an unofficial editor for Nord keyboards. It needs JavaScript and WebAssembly to run. Read the <a href="docs/">user guide</a>.</p>
    </noscript>
    <div id="toosmall">
      <p class="head">drawbar needs a larger screen</p>
      <p>It is a desktop application: its panels need more room than a phone or a narrow window has. Open it on a larger screen, or make this window wider.</p>
      <p><a href="docs/">User guide</a></p>
    </div>
    <script type="module">
      import init, { start } from "./pkg/drawbar.js";

      const status = document.getElementById("status");
      try {
        await init();
        await start(document.getElementById("drawbar"));
        status.remove();
      } catch (e) {
        status.textContent = `drawbar failed to start: ${e}`;
        throw e;
      }
    </script>
  </body>
</html>