本文へ移動
cccskills
無料GitHub で公開

juce-review

Reviews JUCE audio plugin code for JUCE-specific correctness issues: thread safety, APVTS parameter patterns, MessageManager usage, ValueTree, and MIDI handling. Use when the user asks to review a JUCE plugin, check a processBlock, audit parameter handling, or asks "is this JUCE code safe?". Trigger on phrases like "review my JUCE plugin", "check my AudioProcessor", "is this APVTS usage correct?", or when you see AudioProcessor, AudioProcessorEditor, or AudioProcessorValueTreeState in the code.

インストール方法を見る

含まれるファイル(2)

  • SKILL.md4.8 KB
  • references/juce-violations.md11.4 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

JUCE Audio Plugin Review

JUCE abstractions hide thread boundaries — always trace which thread each piece of code runs on before declaring it safe.

Step 0 — Run universal checks first

Invoke audio-dsp-review and audio-numerics-review before this skill. This skill adds JUCE-specific checks on top; it does not replace realtime-safety or numerics reviews.

Step 1 — Identify plugin structure

Locate the three core classes and their thread ownership:

  • AudioProcessor — audio thread owns processBlock; message thread owns everything else
  • AudioProcessorEditor — message thread only; never call from audio thread
  • AudioProcessorValueTreeState — parameter tree lives on message thread; audio thread must use getRawParameterValue() raw pointers only

Step 2 — Scan for JUCE violations

ViolationWhere to lookRisk
juce::String construction/concatenationprocessBlock, DSP helpersMay allocate and may touch shared string/logging machinery; realtime unsafe
DBG() macroAny audio-thread codeLogger I/O in debug builds; blocks indefinitely
MessageManager::getInstance() from audio threadAudio callbacks, DSP helpersNot thread-safe; undefined behaviour
apvts.getParameter(...) or apvts.state from audio threadprocessBlock and DSP helpersAPVTS/ValueTree access is not an audio-thread data path; use raw pointer cache instead
ValueTree listener callbacks assumed on audio threadListener overridesDispatched via MessageManager; runs on message thread
AudioBuffer::setSize() inside processBlockBuffer management codeTriggers allocation; causes xrun
Modifying MIDI buffer while iterating itMIDI event loopsIterator invalidation; undefined behaviour
prepareToPlay not resetting all state (e.g. filters, envelopes, delay lines)prepareToPlay bodyDouble-call leaves stale state; causes audio artefacts
juce::CriticalSection::tryEnter() or enter() on audio threadprocessBlock, DSP helpersexit()/destructor does a syscall to wake waiting threads — not realtime-safe even with tryEnter()
juce::SpinLock::enter() on audio threadprocessBlock, DSP helpersBusy-waits on audio thread — use tryEnter() + fallback only; non-audio thread should use progressive back-off

Step 3 — Write the review

## JUCE Plugin Review: `[file / class]`

### Verdict
[Safe | Has critical violations | Warnings only] — [one sentence summary]

### Critical Violations
**[Category]: [description]**
`file:line` — `offending code`
Why: [one sentence on thread / correctness risk]
Fix: [concrete JUCE-idiomatic suggestion]

### Warnings
[same format]

### What's Done Well
[correct patterns observed]

### Recommended Fixes (priority order)
1. ...

Quick fix table

ViolationFix
juce::String in processBlockPre-format on message thread; pass IDs/scalars via AbstractFifo or atomics
DBG() in audio codeRemove entirely or gate behind a lock-free ring buffer drained on message thread
MessageManager from audio threadUse juce::MessageManager::callAsync from message thread only
apvts.getParameter(id) in audio threadCache getRawParameterValue(id) once after APVTS construction; read atomically in processBlock
ValueTree listener on audio threadHandle listener callbacks on message thread; pass state to audio thread via atomics
AudioBuffer::setSize() in processBlockCall only in prepareToPlay; never resize during playback
Mutating MIDI buffer mid-iterationCollect into a preallocated member buffer or bounded event array, then swap/write back after iteration
Missing state reset in prepareToPlayReset filters, envelopes, delay lines, and position counters unconditionally
CriticalSection::tryEnter() in audio threadReplace with std::atomic<T> or lock-free SPSC queue; tryEnter() + exit() is not safe because exit() does a syscall
SpinLock::enter() on audio threadUse tryEnter() + fallback only; non-audio thread should use progressive back-off (see references/juce-violations.md Section 4)

For full code examples (BAD/GOOD patterns, AbstractFifo usage, async dispatch) see references/juce-violations.md.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

au-review

無料

Reviews AudioUnit v2/v3 plugin implementations for spec compliance, thread safety, and correctness. Use when the user asks to review an AudioUnit plugin, check an AUv3 app extension, audit property or parameter handling, or asks "is my AUComponent thread-safe?" or "why does my AU crash in Logic?". Trigger on phrases like "review my AudioUnit", "check my AUv3", "is my render block safe?", or when you see AURenderCallback, internalRenderBlock, kAudioUnitProperty_*, or AUAudioUnit in the code.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

Systematic checklist for diagnosing audio artifacts. Use when the user describes a sound quality problem — clicks, pops, crackling, silence, DC offset, aliasing, phase issues, or latency problems. Trigger on phrases like "why do I hear clicks?", "my output has DC offset", "there's aliasing in my oscillator", "phase is wrong in mono", "dropout when CPU spikes". Pairs with audio-dsp-review (realtime safety) and audio-numerics-review (numeric correctness) — use those to fix once the cause is found.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

Reviews audio DSP and audio processing code for realtime safety violations. Use whenever the user asks to review, audit, or check audio processing code — including plugin process callbacks, audio engine render functions, DSP implementations, or any code that runs on the audio thread. Trigger on phrases like "review my processBlock", "check this DSP code", "is this safe for the audio thread?", "review my JUCE plugin", or when you see an audio callback and spot potential realtime violations. Flag issues proactively even when the user hasn't explicitly asked for a review.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

Explains DSP math concepts to developers who need the theory behind an algorithm. Use whenever the user asks how a signal-processing concept works, wants intuition behind a formula, or hits a math-shaped bug. Trigger on phrases like "how does a Fourier transform work", "explain z-transforms", "what is convolution", "why does my biquad ring", "what is windowing for", "what causes aliasing", or "how do I convert gain to dB". Also trigger when the user pastes DSP code and asks why it behaves a certain way.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

Reviews audio DSP code for numerical correctness. Use when the user asks to review, audit, or check DSP code for correctness issues — filters, feedback loops, fixed-point arithmetic, accumulation loops, or any numeric computation in audio code. Trigger on "check this filter for NaN", "why does my reverb blow up?", "is this numerically stable?", "why do I hear DC in my output?". Pairs with audio-dsp-review (realtime safety); this skill covers numeric correctness. Flag issues proactively.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

Profiling strategy for audio CPU issues — xruns, spikes, and buffer underruns. Use when the user reports CPU overload, audio glitches under load, or performance regressions. Trigger on phrases like "I'm getting xruns", "my plugin causes CPU spikes", "dropouts under high voice count", "audio thread is too slow", "how do I profile my DSP". References audio-numerics-review for denormal slowdown and audio-dsp-review for lock contention.

日本語の概要は準備中です。原文の説明を表示しています。

kunitoki/sonic-skills222026年5月21日 更新

kunitoki のスキルをすべて見る

このスキルの問題を報告する