agentsclimarketplace

Juce guide

Skill kunitoki/sonic-skills/skills/juce-guide

Modular Markdown-based audio skills for AI agents and developers, covering signal processing, synthesis, effects, analysis, and spatial audio.

Install
npx -y skills add kunitoki/sonic-skills --skill juce-guide

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 14 stars14 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Step-by-step guide for building a JUCE audio plugin from scratch. Use when the user asks "how do I create a JUCE plugin", "set up a JUCE project", "add parameters to my JUCE plugin", "package my VST3", or "how do I wire up APVTS". Trigger on phrases like "create a JUCE plugin", "JUCE CMake setup", "AudioProcessor skeleton", "add APVTS parameters", or "codesign my plugin on macOS".

SKILL.md

3.8 KB, as published. Nobody here has run it

JUCE Audio Plugin — Build Guide

Five steps from empty folder to distributable plugin. Do each step in order; skip none.

Step 1 — Project setup (CMake + JUCE)

  • Add JUCE as a git submodule or FetchContent target; call add_subdirectory(JUCE).
  • Use juce_add_plugin(MyPlugin FORMATS VST3 AU Standalone ...) to declare the plugin target.
  • Set PLUGIN_MANUFACTURER_CODE, PLUGIN_CODE, IS_SYNTH, NEEDS_MIDI_INPUT in the same call.
  • Link juce::juce_audio_processors juce::juce_audio_utils juce::juce_dsp to the target.

Step 2 — AudioProcessor skeleton

  • Subclass juce::AudioProcessor; override prepareToPlay, releaseResources, processBlock.
  • In prepareToPlay: store sampleRate and maximumBlockSize, allocate internal buffers, reset all state (filters, envelopes, delay lines — unconditionally).
  • In processBlock: read only pre-cached raw parameter pointers; never allocate, never call JUCE String ops or DBG().
  • Implement getStateInformation / setStateInformation using apvts.copyState() and apvts.replaceState() with a MemoryOutputStream / MemoryBlock.

Step 3 — Parameters via APVTS

  • Declare a static createParameterLayout() method that returns AudioProcessorValueTreeState::ParameterLayout.
  • Construct apvts(*this, nullptr, "Parameters", createParameterLayout()) as a member.
  • After constructing APVTS, cache raw pointers once: gainParam = apvts.getRawParameterValue("Gain").
  • In processBlock, dereference with gainParam->load() — no APVTS calls on the audio thread.
  • Use AudioProcessorValueTreeState::ParameterAttachment (or SliderAttachment) in the editor, never in the processor.

Step 4 — Editor and UI

  • Subclass juce::AudioProcessorEditor; call setSize(w, h) in the constructor.
  • Override paint for background / labels; override resized to lay out components with setBounds.
  • Declare juce::Slider members; attach each via juce::AudioProcessorValueTreeState::SliderAttachment.
  • Keep all UI state in the editor — the processor must function correctly with no editor open.
  • The editor holds a reference to the processor (passed in constructor); never store a raw editor pointer in the processor.

Step 5 — Build, test, package

  • Configure: cmake -B build -DCMAKE_BUILD_TYPE=Release
  • Build: cmake --build build --config Release
  • Locate artefacts under build/MyPlugin_artefacts/Release/.
  • macOS codesign: codesign --deep --force --sign "Developer ID Application: ..." MyPlugin.vst3 then spctl --assess --verbose MyPlugin.vst3.
  • Notarize for distribution: xcrun notarytool submit MyPlugin.pkg --apple-id ... --wait.
  • Validate in a DAW host or use the JUCE AudioPluginHost utility (extras/AudioPluginHost).

Common pitfalls

PitfallCorrect approach
Calling apvts.getParameter() in processBlockCache getRawParameterValue() once after APVTS construction
Allocating in processBlockAllocate in prepareToPlay only
Not resetting state on prepareToPlay re-entryAlways reset unconditionally
Storing editor pointer in processorUse createEditor() factory; processor owns no editor reference
Missing JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTORAdd to every AudioProcessor and AudioProcessorEditor subclass

Use the juce-review skill to audit finished processor code for thread-safety violations.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.