<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Grit blog</title>
<link>https://mixwithgrit.com/blog/</link>
<description>News and stories from the team building Grit.</description>
<language>en</language>
<atom:link href="https://mixwithgrit.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
<item>
<title>Introducing Grit</title>
<link>https://mixwithgrit.com/blog/introducing-grit/</link>
<guid isPermaLink="true">https://mixwithgrit.com/blog/introducing-grit/</guid>
<pubDate>Tue, 29 Sep 2026 12:00:00 GMT</pubDate>
<description>&lt;p&gt;Most DJ software is built around a simple idea: one track follows another. You beatmatch, you blend, you move on. That model has carried dance music for decades, and it is still the right tool for a long night of records.&lt;/p&gt;
&lt;p&gt;Grit starts somewhere else. It is built for the moment when the drums from one song sit under the bassline of a second and a vocal from a third. Not one track after another, but several tracks against each other, live.&lt;/p&gt;
&lt;h2&gt;What Grit is&lt;/h2&gt;
&lt;p&gt;Grit is a stem performance instrument for Mac. You give it your music, it pulls every track apart, and you play the parts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Up to eight decks.&lt;/strong&gt; Load tracks side by side. Every detected section of a track becomes a pad you can fire in any order.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stems on tap.&lt;/strong&gt; Switch each deck between Full, a cappella and instrumental with one key, or toggle drums, bass, vocals and other parts one by one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Launch quantize.&lt;/strong&gt; Hit a pad early and Grit waits for the next beat, bar, four bars or eight bars before it lands. Free mode fires immediately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scenes.&lt;/strong&gt; Capture the tempo, the playing sections, the stems and the mix of every deck, then recall all of it on the next boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Sync.&lt;/strong&gt; Pick a master key. Connected decks follow it with the smallest possible pitch shift, and a minor track finds its relative minor. Keylock keeps tempo and pitch independent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A proper mixer.&lt;/strong&gt; Three-band EQ with full kill, a low- and high-pass filter per deck, a crossfader you assign per deck, and headphone cueing on a separate output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyboard scratching.&lt;/strong&gt; Eight tempo-synced scratch patterns under Shift, with half and double speed on hold.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controllers.&lt;/strong&gt; MIDI Learn for the controller you already own, and a ready-made preset for the Akai APC40 MK1 with pads, LEDs, knobs and faders.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full list of keys lives in &lt;a href=&quot;/support/#shortcuts&quot;&gt;Support&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;Grit has three steps, and only the last one happens on stage.&lt;/p&gt;
&lt;h3&gt;1. Import&lt;/h3&gt;
&lt;p&gt;Drop in files or whole folders. Grit reads WAV, AIFF, FLAC, MP3, Ogg Vorbis and M4A, and finds tempo, beat grid, key and phrase-aligned sections. Sections start on a phrase, downbeat or beat, so a pad always lands somewhere musical. If the analysis is unsure, the track is flagged for review instead of guessing quietly.&lt;/p&gt;
&lt;h3&gt;2. Separate&lt;/h3&gt;
&lt;p&gt;Every track is split into drums, bass, vocals and other parts. This happens on your Mac, with Apple&amp;#39;s MLX on Metal. Your music is not uploaded anywhere.&lt;/p&gt;
&lt;h3&gt;3. Perform&lt;/h3&gt;
&lt;p&gt;Load tracks into decks and play. Fire sections, switch stems, bring in a vocal on the next bar, kill the low end of one deck while another takes over. Everything is tied to one session clock, so launches stay in time no matter how many decks are running.&lt;/p&gt;
&lt;h2&gt;Why it exists&lt;/h2&gt;
&lt;p&gt;I wanted an instrument, not a playlist. Mashups and live edits usually mean hours of preparation in a DAW, and the result is fixed once you export it. Grit moves that work to the stage: the preparation is automatic, and the decisions happen while the music plays.&lt;/p&gt;
&lt;p&gt;That also means Grit is not trying to replace the DJ software you already know. Use it on its own for a stem set, or next to your usual setup when you want to take a few tracks apart.&lt;/p&gt;
&lt;h2&gt;Where Grit stands&lt;/h2&gt;
&lt;p&gt;Grit is in final testing and &lt;strong&gt;not on sale yet&lt;/strong&gt;. The app works end to end in development, and the remaining work is the kind that has to be done properly before anyone pays: signed and notarized builds, license activation in the app, testing on more Macs, and a round of listening checks.&lt;/p&gt;
&lt;p&gt;Before that comes a &lt;strong&gt;private beta&lt;/strong&gt;. &lt;a href=&quot;/#beta&quot;&gt;Join the waitlist&lt;/a&gt; and we&amp;#39;ll invite testers in small batches; downloads, feedback and bug reports run through our &lt;a href=&quot;https://discord.gg/uXaawQKxep&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The plan for the launch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two personal Macs per license.&lt;/li&gt;
&lt;li&gt;All Grit 1.x updates included.&lt;/li&gt;
&lt;li&gt;No subscription and no license key: you sign in with your purchase email. A future major version may be a paid upgrade; the version you buy stays yours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grit needs an Apple Silicon Mac with macOS 14 or later. The &lt;a href=&quot;/download/&quot;&gt;download page&lt;/a&gt; has the details.&lt;/p&gt;
&lt;h2&gt;Try it now&lt;/h2&gt;
&lt;p&gt;You do not have to wait for the Mac app to hear what Grit does. The &lt;a href=&quot;/#playground&quot;&gt;playground&lt;/a&gt; on the home page is a simplified browser sketch of the idea, with four Creative Commons house tracks. Launch sections, switch stems, move the crossfader, and the audio follows. It is not the app: it runs on Web Audio, not on Grit&amp;#39;s native engine. There is more about how it works in &lt;a href=&quot;/blog/inside-the-playground/&quot;&gt;Inside the playground&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Follow along&lt;/h2&gt;
&lt;p&gt;Development notes go into the &lt;a href=&quot;/changelog/&quot;&gt;changelog&lt;/a&gt;, and new posts appear here. Both have RSS feeds if you want to know when Grit is ready.&lt;/p&gt;
</description>
</item>
<item>
<title>Why Grit is native</title>
<link>https://mixwithgrit.com/blog/why-grit-is-native/</link>
<guid isPermaLink="true">https://mixwithgrit.com/blog/why-grit-is-native/</guid>
<pubDate>Tue, 29 Sep 2026 10:00:00 GMT</pubDate>
<description>&lt;p&gt;The first version of Grit was a web app in a desktop wrapper: Electron for the window, Svelte for the interface, Tone.js for the audio. It was a good way to find out what the instrument should be. Multi-deck playback, bar-quantized launches, stem switching, EQ, filters and a crossfader all worked, and a simplified version of that prototype now sketches the idea in the &lt;a href=&quot;/#playground&quot;&gt;playground&lt;/a&gt; on the home page.&lt;/p&gt;
&lt;p&gt;It was not a good way to play a set. So Grit was rewritten as a native application.&lt;/p&gt;
&lt;h2&gt;What a performance needs&lt;/h2&gt;
&lt;p&gt;A DJ tool has one job that outranks everything else: the audio must not stop. Not when you load a track, not when you scroll the library, not when a file turns out to be broken, not when the interface is busy drawing eight waveforms.&lt;/p&gt;
&lt;p&gt;In a browser engine, audio shares a process with layout, garbage collection, JavaScript and everything else the page is doing. You can work around that for a demo. You cannot rule it out.&lt;/p&gt;
&lt;h2&gt;How Grit is built now&lt;/h2&gt;
&lt;p&gt;Grit is written in Rust. The interface uses GPUI, a GPU-accelerated UI framework, and everything else sits behind a UI-independent application core.&lt;/p&gt;
&lt;h3&gt;A hard real-time audio callback&lt;/h3&gt;
&lt;p&gt;The audio callback is the code that fills your sound card&amp;#39;s buffer, many times per second. In Grit it has a strict contract. It pops audio that was prepared in advance, mixes it, advances the clock and applies fixed-cost DSP. It never:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;allocates memory,&lt;/li&gt;
&lt;li&gt;takes a lock or waits on another thread,&lt;/li&gt;
&lt;li&gt;decodes a file,&lt;/li&gt;
&lt;li&gt;touches the disk,&lt;/li&gt;
&lt;li&gt;or runs an unbounded loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Decoding, analysis and file work happen on other threads and hand finished audio to the callback through preallocated, lock-free queues. If something upstream is slow, the callback still meets its deadline.&lt;/p&gt;
&lt;h3&gt;Bounded by design&lt;/h3&gt;
&lt;p&gt;Memory and CPU use are bounded rather than best-effort. Tracks stream from disk instead of being held in memory, queues have fixed capacities, and background work is admitted in limited slots. A large library or a long session should not slowly change how the app behaves.&lt;/p&gt;
&lt;p&gt;This is measured, not assumed. A headless release gate in development runs eight keylocked, phase-bent streams plus a preview stream. On 12 September 2026, a 30-second run passed with zero decoder underruns or callback deadline misses, 6.40% p99 callback CPU load and 34.83 MiB peak resident memory. That is a headless development measurement, not a test on physical audio hardware. Qualification on real hardware is still open, and it is part of the work before launch.&lt;/p&gt;
&lt;h3&gt;Broken files stay contained&lt;/h3&gt;
&lt;p&gt;Audio files come from everywhere, and some of them are malformed. Grit never parses foreign media inside the app. Imported audio and cover images go through a separate import helper process, one file per run, with limits on time and memory. If a file crashes the helper, only that import fails. The app and anything playing keep running.&lt;/p&gt;
&lt;p&gt;Once imported, a track is stored as a managed FLAC file that Grit wrote itself, so playback only ever reads audio it knows.&lt;/p&gt;
&lt;h3&gt;Stems on your Mac&lt;/h3&gt;
&lt;p&gt;Stem separation and analysis run locally with Apple&amp;#39;s MLX on Metal. There is no bundled Python interpreter, no Node.js runtime and no browser engine in the app. Your music is not uploaded for processing, and preparing a track does not depend on a service being online.&lt;/p&gt;
&lt;h2&gt;No server on stage&lt;/h2&gt;
&lt;p&gt;Nothing in a performance depends on a network connection. There is no cloud library and no streaming step between your files and the decks.&lt;/p&gt;
&lt;p&gt;Licensing follows the same rule. It is designed around offline activation proofs: once a Mac is activated, the signed proof is stored locally and checked without contacting a server. An outage on our side should never interrupt your audio.&lt;/p&gt;
&lt;h2&gt;What you get from it&lt;/h2&gt;
&lt;p&gt;Most of this is invisible when it works, which is the point. What you should notice is what does not happen: loading a track does not interrupt the decks that are playing, a broken file fails its own import instead of the whole app, and a long set does not slowly change how Grit behaves.&lt;/p&gt;
&lt;p&gt;Grit needs an Apple Silicon Mac with macOS 14 or later. It is in final testing and not on sale yet. The &lt;a href=&quot;/changelog/&quot;&gt;changelog&lt;/a&gt; follows the remaining work, and the &lt;a href=&quot;/download/&quot;&gt;download page&lt;/a&gt; has the requirements.&lt;/p&gt;
</description>
</item>
<item>
<title>Inside the playground</title>
<link>https://mixwithgrit.com/blog/inside-the-playground/</link>
<guid isPermaLink="true">https://mixwithgrit.com/blog/inside-the-playground/</guid>
<pubDate>Tue, 29 Sep 2026 09:00:00 GMT</pubDate>
<description>&lt;p&gt;The first thing on the Grit home page is a &lt;a href=&quot;/#playground&quot;&gt;playground&lt;/a&gt;: a simplified sketch of the app window with four decks, section pads, stem switches, a mixer and a crossfader. Press play and it makes sound, and every control you touch changes what you hear.&lt;/p&gt;
&lt;p&gt;It is there to explain the idea, not to stand in for the app. This post explains what is running there, and what it leaves out.&lt;/p&gt;
&lt;h2&gt;A sketch, not the app&lt;/h2&gt;
&lt;p&gt;Grit itself is a native application written in Rust around a hard real-time audio engine. None of that runs in your browser.&lt;/p&gt;
&lt;p&gt;The playground is built from Grit&amp;#39;s first prototype, a web app made with Electron and Tone.js before the native rewrite. It plays through your browser&amp;#39;s Web Audio, which shares its time with everything else the page is doing. That is fine for showing how sections, stems and scenes fit together. It is not how Grit sounds or keeps time on stage, and most of the app is missing: preparing your own tracks, eight decks, Key Sync, scratching, MIDI and more.&lt;/p&gt;
&lt;h2&gt;Four real tracks&lt;/h2&gt;
&lt;p&gt;The playground plays four house tracks that their artists released under the Creative Commons Attribution licence:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Art Now&lt;/strong&gt;, AlexBeroza feat. Snowflake, electro house&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All I Need&lt;/strong&gt;, Malk &amp;amp; Starjam feat. DaKooka, house&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runnin&amp;#39;&lt;/strong&gt;, Square a Saw, dance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preoccupied in Thoughts (Craig Ferrier Remix)&lt;/strong&gt;, DJ DeadSheakerz feat. HunterSynth, house&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grit prepared them the way it prepares your tracks: it split each one into drums, bass, vocals and other stems and found its beat grid, key and sections. The demo plays four four-bar sections of each track, an intro, a groove, a break and a drop, cut on Grit&amp;#39;s downbeats. All four are stretched to 125 BPM and sit in C minor, so anything you combine will fit. The credits and licences are listed under the playground.&lt;/p&gt;
&lt;h2&gt;What you can do&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Launch sections.&lt;/strong&gt; Each deck&amp;#39;s pads fire its sections. Launches wait for the next boundary of the selected quantize setting, so they land in time. The default is one bar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch stems.&lt;/strong&gt; Full, a cappella and instrumental presets, or each of the four stems on its own. Stem changes fade in and out without clicks and survive section changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mix.&lt;/strong&gt; Each channel has volume, three-band EQ and a filter that sweeps from low-pass to high-pass. The crossfader splits the decks into two groups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change the tempo.&lt;/strong&gt; The session moves between 105 and 135 BPM. Pitch follows tempo, like a record played faster or slower. Tap tempo works too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Launch scenes.&lt;/strong&gt; Each of the four scenes launches the same section on every deck at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The meters show measured output on a −60 to 0 dB scale, and the waveforms are drawn from minimum, maximum and RMS data of the actual audio files, not from decoration.&lt;/p&gt;
&lt;h2&gt;Keyboard&lt;/h2&gt;
&lt;p&gt;The playground listens to the same kind of keys as the app:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Space&lt;/td&gt;
&lt;td&gt;Play / stop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1–4&lt;/td&gt;
&lt;td&gt;Focus a deck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q, W, E, R&lt;/td&gt;
&lt;td&gt;Launch a section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z, X, C&lt;/td&gt;
&lt;td&gt;Full / Acap / Inst&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⌥1–⌥4&lt;/td&gt;
&lt;td&gt;Launch a scene&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The Mac app has many more. They are listed in &lt;a href=&quot;/support/#shortcuts&quot;&gt;Support&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The stem field&lt;/h2&gt;
&lt;p&gt;Below the playground, the &amp;quot;One track in, four stems out&amp;quot; section draws a field of points with three.js. It is built from the same waveform data as the demo. Scrolled to the top, it shows one merged track in the app&amp;#39;s grey waveform ink. As you scroll, it separates into four layers in the stem colours.&lt;/p&gt;
&lt;p&gt;While the demo is playing, the field follows it: the session clock, each deck&amp;#39;s meter and a frequency analysis of the master output drive what you see. If your browser struggles to keep up, it lowers its own resolution.&lt;/p&gt;
&lt;h2&gt;What stays in your browser&lt;/h2&gt;
&lt;p&gt;The playground plays its own included audio. It does not ask for microphone access, and it does not upload anything. The audio code and the visualisation are only loaded when they are needed, and the audio starts after you press play. Leaving the page shuts it down.&lt;/p&gt;
&lt;p&gt;On a phone, the playground shows one deck at a time. The other three keep playing in the background, so the mix you hear does not change when you switch.&lt;/p&gt;
&lt;h2&gt;What the Mac app adds&lt;/h2&gt;
&lt;p&gt;The playground sketches the idea. The app is what you perform with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your own music.&lt;/strong&gt; Import tracks and folders. Grit detects tempo, beat grid, key and phrase-aligned sections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stem separation.&lt;/strong&gt; Every track is split into drums, bass, vocals and other parts on your Mac.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eight decks&lt;/strong&gt; instead of four, each with as many sections as the track has.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scenes you capture yourself&lt;/strong&gt;, with tempo, sections, stems and the full mix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Sync, loops, rolls and keyboard scratching.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MIDI Learn&lt;/strong&gt; and a preset for the Akai APC40 MK1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grit needs an Apple Silicon Mac with macOS 14 or later. It is not on sale yet; the &lt;a href=&quot;/download/&quot;&gt;download page&lt;/a&gt; and the &lt;a href=&quot;/changelog/&quot;&gt;changelog&lt;/a&gt; show where things stand.&lt;/p&gt;
</description>
</item>
</channel>
</rss>
