<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Deluge Community | Blog</title><description/><link>https://delugecommunity.com</link><language>en</language><fh:complete/><atom:link rel="self" href="https://delugecommunity.com/blog/rss.xml"/><item><title>Embedded Foundations</title><link>https://delugecommunity.com/blog/2026-11-08-embedded-foundations</link><guid isPermaLink="true">https://delugecommunity.com/blog/2026-11-08-embedded-foundations</guid><pubDate>Sun, 08 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hi everyone, I’m Katherine Whitlock, one of the core maintainers of the Deluge’s Community Firmware alongside Mark and Sean. For the last six to eight months I’ve been working on a branch internally called &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;, which is planned to be the second major release (i.e. 2.x). As we get closer to releasing it, currently planned for the end of January, I thought it might be worth doing a set of blog posts on &lt;em&gt;what&lt;/em&gt; the major changes are and why they’re being done. These include, but are not limited to, topics like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HALs and BSPs (this post)&lt;/li&gt;
&lt;li&gt;Testing and development strategies for the Deluge&lt;/li&gt;
&lt;li&gt;File reading, writing, and streaming (async vs synchronous I/O and cache coherence)&lt;/li&gt;
&lt;li&gt;Multi-tasking and scheduling for music devices&lt;/li&gt;
&lt;li&gt;Atomic model state and data flow&lt;/li&gt;
&lt;li&gt;Embedded UI architecture&lt;/li&gt;
&lt;li&gt;Soft real-time render loops&lt;/li&gt;
&lt;li&gt;Compile-time composable SIMD DSP components and other optimization strategies&lt;/li&gt;
&lt;li&gt;The Deluge’s synth architecture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And many other things!&lt;/p&gt;

&lt;p&gt;So without further ado, here’s the first entry in the series:&lt;/p&gt;
&lt;!-- Prompts like this one are HTML comments, so they never appear on the page. --&gt;
&lt;div&gt;&lt;h2 id=&quot;embedded-foundations&quot;&gt;Embedded Foundations&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Have you ever looked at a synthesizer or sampler or Eurorack module and wondered, “Wow, there’s a lot of stuff going on there. How does it know what I’m doing and how I’m interacting with it?” If so, then you’re in luck. If not, then maybe this will give some insight anyway, so that in the future you’ll know how this all works.&lt;/p&gt;
&lt;p&gt;In modern embedded devices, such as synthesizers, samplers, keyboards, controllers, Eurorack modules, etc., it’s very rare that whatever does all the audio processing is written so specifically for a processor that it’s manually poking all the memory addresses and registers to communicate with all the buttons, switches, knobs, and screens that may exist.&lt;/p&gt;
&lt;p&gt;Instead, this is often left to a dedicated platform layer, allowing some level of abstraction between whatever runtime or application code may exist and the hardware itself. This increases portability and ease of development, while also allowing for better separation of concerns.&lt;/p&gt;
&lt;p&gt;For example, many devices and products run on the Arduino framework. This framework is responsible for knowing details of both the CPU and (to some degree) the board, and then presenting an easy-to-use facade over top which allows fairly easy portability between various Arduino boards. It is a relatively simple endeavor to port a program written for an older Uno R3 to a Mega or even an Adafruit Metro.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;One line of Arduino code, digitalWrite(LED_BUILTIN, HIGH), runs unchanged on an Uno R3 and a Mega 2560, which use AVR chips, and on an Adafruit Metro M0 Express, which uses an ARM chip. The framework maps pin 13 to port pin PB5 on the Uno, PB7 on the Mega and PA17 on the Metro.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;350&quot; src=&quot;https://delugecommunity.com/_astro/arduino-boards.B0ydtmBL_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The same line of code can be used across multiple boards. The framework knows how pin names map to specific port/pin combos for a given CPU and board.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-things-work-today&quot;&gt;How things work today&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;On the Deluge, this layer originally started out as Renesas’ own vendor platform code and drivers (Renesas being the manufacturer of the Deluge’s CPU, the RZ/A1L), and became entangled with the application code as it was further developed. This is evident in the way that both the RZ/A1L platform code and the application call into each other, and the way that the application does things such as reading raw bytes from the PIC or interacting with the SD routine.&lt;/p&gt;
&lt;p&gt;Essentially, the Deluge is married to its hardware by virtue of this entanglement, and in order to get it running on anything else (such as x86 or ARM64), this had to be remedied.&lt;/p&gt;
&lt;p&gt;The solution to this was to start from scratch: an entirely new set of layers, written in Rust for safety, running on top of the Embassy runtime framework, and abstracting away all the platform details and drivers that an application shouldn’t need to know to run.&lt;/p&gt;
&lt;p&gt;Ultimately this required recreating most of Renesas’ drivers, and even writing new ones, that were up to spec and matched what we needed.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Before and after map. On main, the sequencer, sound engine, UI and project code share one program with the hardware drivers, task scheduler, FatFS filesystem, fault handler and heap cores. On next, the first four stay in the C++ app above libdeluge, and the other five moved below it into the Rust platform.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;560&quot; src=&quot;https://delugecommunity.com/_astro/what-moved.DDHoKsZ2_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How old drivers map to implementations and crates in the new stack, as well as the libdeluge boundary used to enforce this.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;hals-and-bsps&quot;&gt;HALs and BSPs&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A “HAL” or “Hardware Abstraction Layer” acts as the first real layer between an application and silicon. It’s typically intended for a single CPU model or a CPU family, and has details about which memory locations correspond to different peripherals. In the case of Rust, it also acts as a safety barrier, presenting a safe “owning” API that works in conjunction with Rust’s borrow checker to hide the messy unsafe details of poking raw registers and memory locations.&lt;/p&gt;
&lt;p&gt;A “BSP” or “Board Support Package” is exactly what it says on the tin: if the HAL abstracts details of a CPU, then the BSP does the same for an entire board. This includes things like drivers for whatever I2C, SPI, and UART devices may be connected to the CPU, and also simplifications for interacting with them. This is also where a lot of aliasing and binding happens, so that instead of saying “turn on the LED on pin 13 in inverted mode”, you can instead say “turn on the SYNC LED”.&lt;/p&gt;
&lt;p&gt;Together, these two layers act as a way to hide details inside them. Previously, if you pressed a button on the Deluge, the application would read raw bytes directly from the UART peripheral, queue up events and handle the appropriate response itself before sending out raw color bytes. Now that behavior has moved &lt;em&gt;below&lt;/em&gt; the platform boundary.&lt;/p&gt;
&lt;p&gt;So now, the HAL is responsible for receiving the UART data into a DMA ring, and the BSP is responsible for decoding it and simply presenting the application with a queue of events saying “hey, this is what’s happened since you last checked.” And the application can go “neat, I need these things to change” and the BSP will properly convert those outgoing commands to the hardware-specific operations that need to be performed.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A pad press on main arrives in the application as raw PIC bytes. On next it passes through the HAL and BSP and reaches the application as a pad event, and pad colors travel back the same way.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;512&quot; src=&quot;https://delugecommunity.com/_astro/pad-press.Bmi_g7py_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A single pad press and its LED response. On the current firmware, the app handles raw bytes. On &lt;code dir=&quot;auto&quot;&gt;next&lt;/code&gt;, it receives a pad event and sends pad colors, while the layer below is actually responsible for the hardware-specific translation and messaging.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;this-is-not-a-rust-rewrite&quot;&gt;This is not a Rust rewrite&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Some may see this as the beginning of a full-stack Rust rewrite. While that may occur in the long term, it’s orthogonal to the problem this is solving. Instead, it’s simply that Rust is the best solution to this particular problem, due to both its language architecture and the Embassy framework (which will be discussed in a subsequent blog post). Rust is very useful for the kind of safety-critical code that &lt;em&gt;should&lt;/em&gt; exist below this boundary, such as an allocator and platform-specific cache management.&lt;/p&gt;
&lt;p&gt;In addition to this, Embassy gives us a lot of extra stuff “for free” if we implement the HAL and BSP correctly. Things like USB support for both host and device, interrupt-based task scheduling, etc. This is all extremely valuable for a (soft) real-time instrument, and means that we don’t have to maintain as much code ourselves.&lt;/p&gt;
&lt;p&gt;The Deluge application itself is, and remains, C++ due to the advantages that gives us and our limited time.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;the-boundary-libdeluge&quot;&gt;The boundary: libdeluge&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Both Rust and C++ (as well as many other languages) interface very well with C. Because of this, we can use C as a way to “translate” between the two layers, creating a contract that both must follow in order to work properly. In programmer terms, this is called an “ABI boundary”.&lt;/p&gt;
&lt;p&gt;There are now a number of C headers that act as that contract, and, even better, by using Rust macros we can enforce the type safety of this boundary, so that mistakes can’t catch us out. (You can still make mistakes relating to execution context and threading, but those are much more subtle issues.)&lt;/p&gt;
&lt;!--
- 38 headers, about 4,900 lines, and the only way through.
- Only plain C crosses, the header is the source of truth, and the app calls down but never includes platform code.
- Each function&apos;s docs say where it may be called from: [audio], [task] or [isr].
- The build enforces it: a signature mismatch doesn&apos;t compile, and the boundary allowlist on next is empty.
--&gt;
&lt;p&gt;&lt;img alt=&quot;An example of the contract check: bindgen turns the C header into a Rust declaration, abi_pin compares it with the Rust export, and a wrong type stops the build.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;392&quot; src=&quot;https://delugecommunity.com/_astro/contract-check.B6sKLRJb_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How this contract catches a mistake: introducing a &lt;code dir=&quot;auto&quot;&gt;u32&lt;/code&gt; where a &lt;code dir=&quot;auto&quot;&gt;u16&lt;/code&gt; is expected causes the Rust binding system to emit a compile-time error rather than silently continue.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;in-place-replacement&quot;&gt;In-place replacement&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;img alt=&quot;Timeline from June to October 2026: new parts are added above the line and old parts are removed below it, ending with the legacy BSP retired on September 29.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;300&quot; src=&quot;https://delugecommunity.com/_astro/timeline.ajOySVGu_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The retirement timeline, over four months.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The first step to migrating all of this was to look at the existing boundary, and begin routing both the Renesas C platform code and the C++ application calls through new C headers.&lt;/p&gt;
&lt;p&gt;Following the convention that platform code is typically provided as a library, I decided to call this platform layer “libdeluge”.&lt;/p&gt;
&lt;p&gt;Rather than just flipping the switch over to Rust one day, this was a multi-week process of migrating the Renesas functions into a new C/C++ static library behind the libdeluge interface, so that there was a proper record and understanding of all the ABI functions we needed to fill.&lt;/p&gt;
&lt;p&gt;Once that was done, there were a few more weeks of untangling the ABI to have (mostly) unidirectional calling conventions, and mapping out how to best wire in both the Rust BSP and the other major benefit of doing all this: a new hosted (x86/A64) platform layer.&lt;/p&gt;
&lt;p&gt;For a long time, all three existed independently, until more and more pieces moved below the ABI boundary (such as the filesystem access and task scheduling), and the original Renesas code was no longer needed.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Three stages of the swap. First, the Renesas code moved behind libdeluge. Then three implementations of libdeluge ran side by side: the Renesas C code and the Rust BSP on the Deluge, and a C host on a computer. Finally only the Rust BSP remained, built for both the Deluge and a computer.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;372&quot; src=&quot;https://delugecommunity.com/_astro/three-stages.B4nbxesR_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How things changed beneath libdeluge over the migration.&lt;/em&gt;&lt;/p&gt;
&lt;!--
- No flag day: drivers moved behind the contract one at a time, and the firmware kept working throughout.
- New parts came in first, and the old ones were deleted only once nothing needed them.
- Mention the long stretch where both existed, if you have a good story from it.
--&gt;
&lt;div&gt;&lt;h2 id=&quot;the-end-goal&quot;&gt;The end goal&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;To be brief, doing all this allows us to run the Deluge’s application code almost anywhere, including on our own computers. Instead of having to rely on slow architectural emulators like QEMU or Unicorn, we had a hosted platform implementation very early on. This speeds up testing &lt;em&gt;considerably&lt;/em&gt;, as things like rendering songs and checking hashes can happen in seconds instead of minutes.&lt;/p&gt;
&lt;p&gt;Once the Rust/Embassy side was introduced and things were migrated onto it, Embassy &lt;em&gt;itself&lt;/em&gt; offers a hosted build and executor, meaning the C hosted libdeluge implementation was quickly retired and stopped being a maintenance burden whenever the ABI changed.&lt;/p&gt;
&lt;p&gt;Because of this, we now have &lt;code dir=&quot;auto&quot;&gt;./dbt sim&lt;/code&gt;, which is the Deluge running natively on your computer for simulation, and much more complex testing harnesses for integration testing.&lt;/p&gt;
&lt;!--
- The simulator: the same app and BSP run on a computer through dbt sim, which sets up post 2 on testing.
- Better crash information: faults are reported on all vectors.
- Memory: Clang with cross-language LTO shrank the image. Use a fresh measurement here.
--&gt;
&lt;p&gt;&lt;img alt=&quot;The same C++ application and the same Rust BSP run on the Deluge and in the simulator. Only the endpoints under the BSP change, from real parts to their desktop stand-ins.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;760&quot; height=&quot;424&quot; src=&quot;https://delugecommunity.com/_astro/two-worlds.DA7djoCd_2eTUYn.svg&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How the application is shared and reused between multiple platforms without modification other than new platform library linking.&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;whats-left&quot;&gt;What’s left?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This was just step one: the groundwork that made a rigorous and repeatable testing harness possible.&lt;/p&gt;
&lt;p&gt;Our next post will take a look at exactly that, detailing how work is being done while ensuring that the Deluge’s behavior doesn’t change unexpectedly.&lt;/p&gt;
&lt;p&gt;If you’d like to use the HAL and BSP for your own projects, they’re available as part of the &lt;a href=&quot;https://github.com/FirestormAudio/deluge-sdk&quot;&gt;Deluge SDK&lt;/a&gt;, which is currently in Developer Preview. The SDK will get a blog post/announcement when it’s fully released in its own right.&lt;/p&gt;
&lt;!--
- The boundary is enforced at build time, but it&apos;s not yet the hard wall the plan calls for.
- Some [audio] calls still allocate or lock. The tags record those hazards, and they aren&apos;t fixed yet.
- Supervisor and MMU isolation come last. Close by pointing to post 2: how do you change all this without changing the sound?
--&gt;</content:encoded></item><item><title>Built Together: Community and the Deluge Firmware</title><link>https://delugecommunity.com/blog/2026-10-26-first-post</link><guid isPermaLink="true">https://delugecommunity.com/blog/2026-10-26-first-post</guid><pubDate>Mon, 26 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Deluge is a strange and wonderful instrument. It’s a sequencer, a sampler, a synth, a groovebox, or a looper, or a drum machine, or a sequencer, or whatever you want it to be, and it fits in a bag.
The firmware that runs it exists because a lot of people care about it, and that was true long before any of us were using AI tools to write code.&lt;/p&gt;

&lt;p&gt;I want to talk about a couple things: how we’ve been using AI while working on the firmware, and why it hasn’t changed the need for community&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;we-love-contributions&quot;&gt;We love contributions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;I’ve seen a handful of comments around that we’re letting our egos drive the deluge development and refusing to use AI
or accept AI PRs. I want to reassure everyone that couldn’t be further from the truth - we are all embracing AI as much as it can
help the firmware. My day job is &lt;em&gt;in&lt;/em&gt; AI research. We’re not luddites or trying to stick our head in the sand and pretend it’ll go away (as much as I wish it could).&lt;/p&gt;
&lt;p&gt;Nor are we refusing PRs on principle - 80+ people have directly contributed to the deluge code. Many of them have used LLMs and have
little to no development experience. Our guiding principle is that you should be able to articulate why a change is a good
idea in your own words and not use an LLM to communicate with us. This isn’t meant to be a judgement on anyone. We’re not expecting
people to have performance worked out from the get go, or a perfect UI. We are expecting the ability to talk about the change,
discuss whether it’s a good idea, weigh the pros and cons, and work with us to get it merged into the firmware.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;none-of-my-favourite-features-are-things-that-ive-coded&quot;&gt;None of my favourite features are things that I’ve coded&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;It’s a bit like asking me to pick my favourite student. Of course I have one but I’ll never admit it. That said some of
the ones I’d like to highlight as we get closer to the 1.3 release are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The new generative arpeggiator courtesy of Raúl Muñoz. I use this all the time, it’s the background music of my life&lt;/li&gt;
&lt;li&gt;The completely overhauled UI started by Nikodemus Siivola, continued by Leonid Burygin, featuring a new delugey small
font design from Casey Tucker with input from Reza Iman&lt;/li&gt;
&lt;li&gt;Tempo automation from Michael Mackus. I did the backend work on this forever ago but he finally did all the hard UI
work to make it usable :)&lt;/li&gt;
&lt;li&gt;The chord keyboard from Madeline Scyphers&lt;/li&gt;
&lt;li&gt;This website from mgabor (real name unknown but hopefully he’ll find this and I’ll update it)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’m excited to see what great ideas people have and hope that the lowered barrier to development will encourage
more people to help with development efforts. We expect people to communicate with us as humans but using an LLM
to write the code is fine, as long as you can accept that there’s going to be some back and forth before merging anything.
Which brings us to the second point of discussion&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;ai-is-a-really-really-good-software-development-tool&quot;&gt;AI is a really &lt;em&gt;really&lt;/em&gt; good software development tool&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;As with most of the software industry we’ve been adopting LLMs in our workflow. The latest generation is really freaking good.
It’s hit a point where getting an AI to generate code doesn’t feel like a compromise anymore. It needs guidance on architecture,
and it needs to be told what to do, but it can &lt;em&gt;write code&lt;/em&gt; as well as any of us can. And there’s things it does better than us!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building test infrastructure. We’ve adopted Graham Wheeler’s &lt;a href=&quot;https://github.com/SynthstromAudible/delugemu&quot;&gt;deluge emulator&lt;/a&gt; and are trying to get it as accurate as possible. None of us are experts on QEMU and this has been
something we wanted for a long time. Opus has made that possible without needing to find a real expert. Giving it my debug deluge and having it spend nights getting the emulator to match it as closely
as possible has been invaluable.&lt;/li&gt;
&lt;li&gt;Profiling and performance work. Much of the recent speed-up work would have been extremely tedious. Optimizing code for cache usage
is a painful process of trial and error and benchmarking. The LLM can do that for 12 hours straight until it hits something good,
I get bored way before that.&lt;/li&gt;
&lt;li&gt;Trying different implementations. Getting USB audio to work without a performance penalty was a journey. The LLM was
willing to rewrite it a dozen different ways with different tradeoffs until I got something worthwhile. If I was a
project manager getting a human engineer to do that I’d have been shot.&lt;/li&gt;
&lt;li&gt;Reviewing code.The Deluge is a huge and sprawling system of code, with lots of things that change because of weird edge cases,
and AI can help us catch that before we merge. It doesn’t get distracted or make assumptions in the same way we do and
that mechanical reading can be very helpful to find errors.&lt;/li&gt;
&lt;li&gt;Hairy refactoring. We can have the AI write out a pile of test cases for the current code, then write new code to match
those tests millions of times faster than we could do it by hand.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But ultimately AI is not human, and while it can write correct code, someone needs to figure out if it wrote the &lt;em&gt;right&lt;/em&gt;
code.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;ai-is-not-human&quot;&gt;AI is not human&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A language model has no stake in whether your set goes well. It doesn’t know the consequences of an update changing
your sounds right before a gig. It doesn’t know how bad it feels to have a 15 minute set and spend the first 5 troubleshooting.&lt;/p&gt;
&lt;p&gt;I gig the deluge at least once a month and go to jams with it almost every week. I am very invested in keeping it rock solid so I’m never worried about it crashing.
I’ve been gigging 1.3 for a year and I have never had it crash, but as we all know
tons of people &lt;em&gt;do&lt;/em&gt; have crashes on our nightly and beta firmware. How is that possible?&lt;/p&gt;
&lt;p&gt;I only have my own hardware and my own habits. You have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Songs that are far bigger and stranger than anything I’d make&lt;/li&gt;
&lt;li&gt;SD cards from every manufacturer in every state of health&lt;/li&gt;
&lt;li&gt;Controllers, USB devices, and modular rigs beyond my imagination&lt;/li&gt;
&lt;li&gt;Workflows I would never think to try (shout out to everyone turning the tempo up to FAST)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every time someone loads a community build and says “this sounds different” or “this crashed when I did that,” the firmware gets better in ways we could not have achieved alone.
Bug reports with steps to reproduce are one of the most valuable things anyone can contribute&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-we-work-together&quot;&gt;How we work together&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;We need feedback from real users to improve. We want to know how people are using it!&lt;/p&gt;
&lt;p&gt;First off test the builds when you can and let us know what you think. Nightly, beta, and release-candidate builds exist so that real use can find the problems before
people start gigging them.
Something not happening the way you’d expect can be a bug! We want things to be as intuitive as they can be.
Even if you can’t say why something feels wrong let us know, “The filter feels different” is a perfectly good bug report.
Suggestions and ideas are welcome - the best way to reach us is the dev channels on &lt;a href=&quot;https://discord.gg/s2MnkFqZgj&quot;&gt;discord&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We need more help than just code! Helping with documentation is wonderful, the web manual is an evolving work and
it’d be great to get videos and demos to go along with it.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;on-being-open-about-ai&quot;&gt;On being open about AI&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;We ask you to write the PR descriptions yourself because we want PRs from humans, we don’t want to be spammed by people’s AI agents.
It’s our filter to ensure that a real person (ideally a musician) has sat down and thought about whether this change makes the project better. It’s fine to have
AI write the code, but we need that human judgement to make sure it’s the right code.&lt;/p&gt;
&lt;p&gt;Everything that lands is reviewed by a person who understands it and is accountable for it. If you have a great idea but the code’s not quite there
then we can work on it - we’ll give feedback on where we think the problems are and leave it to you to fix them. If you use an AI that’s fine, we
just ask that you communicate with us by hand and respect the humans behind the work.&lt;/p&gt;
&lt;p&gt;That said everything that gets merged is human reviewed. We make sure changes make sense, follow the UI guidelines, and
feel right on the deluge. This is really a “we” - it’s the feedback from the army of beta testers and brave nightly build
users that let us get things right.&lt;/p&gt;
&lt;p&gt;If you have concerns or opinions about AI in this project please share those too. I miss the pre AI days as much as I’m
sure many of you do.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;the-best-firmware-is-a-shared-project&quot;&gt;The best firmware is a shared project&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The Deluge community has always been the heart of this instrument. It’s the reason it does so much more than it did when the hardware first shipped, and
it’s the reason it continues to grow more than 10 years from it’s announcement.&lt;/p&gt;
&lt;p&gt;The tools make us faster but the community makes us right.&lt;/p&gt;
&lt;p&gt;Mark Adams&lt;/p&gt;
&lt;p&gt;Co signed by Sean Ditny and Katherine Whitlock - your deluge community maintainers&lt;/p&gt;</content:encoded></item></channel></rss>