Skip to content

Windows support milestone#4

Open
oreginha wants to merge 74 commits intoglittercowboy:mainfrom
oreginha:feat/windows-support-milestone
Open

Windows support milestone#4
oreginha wants to merge 74 commits intoglittercowboy:mainfrom
oreginha:feat/windows-support-milestone

Conversation

@oreginha
Copy link
Copy Markdown

@oreginha oreginha commented Apr 4, 2026

Summary

This PR delivers the Windows-support milestone for Plugin Freedom System.

It brings the repo from a macOS-only workflow to a Windows-capable workflow with PowerShell automation, Windows-aware build/install validation, cross-platform workspace scaffolding, and milestone closure evidence.

What Changed

  • Added Windows-oriented automation helpers and PowerShell entrypoints for build/install flows.
  • Added and refined cross-platform CMake configuration and presets for Windows and macOS.
  • Added Windows validation coverage for GainKnob, including a real-host Ableton Live 12 checkpoint.
  • Fixed a host-discovered DSP regression in GainKnob where the default centered pan attenuated the signal instead of remaining unity-gain.
  • Extended the installer/bootstrap flow so generated plugin workspaces can be shared and used autonomously across agent tools.
  • Added planning, verification, and milestone audit artifacts covering phases 01, 02, 05, 06, 07, and 08.

Validation

  • Windows configure/build/install/pluginval workflow documented and captured in phase artifacts.
  • Real DAW validation captured for GainKnob on Windows in Ableton Live 12.
  • Installer/bootstrap flow validated through real-host evidence and final configure completion.

Known Limitation

  • macOS runtime non-regression was not executed on hardware and is explicitly recorded as a waiver, not as completed runtime proof.

Review Notes

  • The PR is large because local main was already ahead of origin/main with the milestone history.
  • The branch was cleaned of local-only config noise before opening the PR, but the upstream diff still includes previously accumulated history from local main, including HarmInt work that is not strictly part of the Windows milestone.
  • If you prefer, I can split the Windows milestone into a narrower follow-up PR with a rebased/cherry-picked history.

oreginha and others added 30 commits April 2, 2026 14:45
- add reusable PowerShell logging, native execution, tool discovery, and install helpers
- centralize VS/MSBuild and pluginval lookup for future Windows wrappers
- keep macOS shell flow untouched
- add PowerShell-native checksum, cache-hit, read/write, and cleanup helpers
- preserve the existing JSON cache contract for future wrappers
- document PowerShell entry points and call patterns
- compare cached expiry values with culture-invariant DateTimeOffset parsing
- keep cache hits stable after ConvertFrom-Json date materialization
- preserve the existing JSON cache contract while fixing hit checks
- add the phase 02-01 summary with task commits, decisions, and deviation notes
- update planning state and roadmap for the next Windows automation plan
- keep the summary machine-readable for later phase context assembly
…s phase

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…s in root CMakeLists.txt

- Detect OS and set JUCE_PATH default (C:/SDKs/JUCE on Windows, /Applications/JUCE on macOS)
- Define JUCE_VST3_DESTINATION and JUCE_AU_DESTINATION dynamically per platform
- Replace hardcoded add_subdirectory(/Applications/JUCE) with ${JUCE_PATH}
- Add FATAL_ERROR if JUCE_PATH does not exist, with override hint
- Check cmake, git, and JUCE folder presence with clear pass/fail output
- Accept -JucePath param (default C:\SDKs\JUCE) and -BuildDir param
- Generate Visual Studio 17 2022 CMake cache with -DJUCE_PATH override
- -SkipCmakeGen flag for tool-only checks (e.g. CI pre-flight)
- Non-zero exit on any failed check for pipeline integration
…d DriveVerb

- Move plugin formats into a conditional list (WIN32 guard removes AU)
- GainKnob: reference implementation with GAINKNOB_FORMATS variable
- DriveVerb: second plugin validates the pattern is replicable
- Both produce VST3 + Standalone on Windows, VST3 + AU + Standalone on macOS
- Add 01-01-SUMMARY.md: CMake cross-platform foundation summary
- Update STATE.md: plan 01-01 complete, accumulated context updated
- Update ROADMAP.md: phase 01 marked complete (1/1 plans)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Converts .claude/commands/*.md → .claude/skills/<name>/SKILL.md
- Idempotent: skips existing skill dirs unless -Force is passed
- Extracts name from YAML frontmatter; falls back to filename
- Exits 0 on success, 1 if any errors; prints created/skipped/errors summary
- Calls Convert-CommandsToSkills.ps1 first (Step 0)
- Step 1: creates NTFS junctions per-skill in ~/.codex/skills/ (no admin needed)
- Step 1b: copies .claude/agents/*.md to ~/.codex/agents/ (files, not junctions)
- Step 2: appends .claude/skills path to ~/.copilot/config.json skill_directories
- Step 3: probes Gemini CLI and creates .gemini/instructions.md placeholder
- Idempotent: all sections skip existing items; stale junctions auto-removed
- DryRun switch shows intended changes without modifying filesystem
…>/SKILL.md)

- 20 command .md files converted to skill directories by Convert-CommandsToSkills.ps1
- Each skill dir contains SKILL.md with verbatim command frontmatter content
- These are the canonical skill representations for non-Claude AI tools (Codex, Copilot)
- Add 03.1-01-SUMMARY.md documenting NTFS junction setup, Codex/Copilot/Gemini sharing
- Update STATE.md: plan 03.1-01 complete, advance to 03.1-02, add key decisions
- Update ROADMAP.md: mark 03.1-01-PLAN.md complete, phase status in progress
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
oreginha and others added 29 commits April 3, 2026 02:17
… enrich .gemini placeholder

- README.md: add Multi-Agent Skill Sharing section with setup command, 3-tool table (Codex/Copilot/Gemini), verify command, add-new-skills guide, and manual cleanup instructions per tool
- .gemini/instructions.md: replace minimal probe-output placeholder with full skill inventory (16 project skills + 20 command-derived), agent list, and UNVERIFIED format notice
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…tion authoring

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… default

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…macOS sections

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…omy manifest contract

- Remove PLUGINS.md from injection specs (no more hardlink)
- Add Get-WorkspacePluginsManifestContent: workspace-local manifest with sync contract
- Add Sync-WorkspaceManifest: explicit refresh path for rename/move scenarios
- Add Update-RootPluginsRegistry: idempotent root PLUGINS.md registry update
- Update Test-PluginScaffold: require PLUGINS.md + workspace-build/CMakeLists.txt
- Update New-PluginScaffold: call new autonomy functions
- PLUGINS.md: Windows-first paths + Workspace Manifest Model documentation

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CHECK 4: workspace PLUGINS.md + workspace-build/ artifacts per scaffolded plugin
- CHECK 5: root PLUGINS.md Plugin Registry + workspace manifest model documentation
- Pre-contract plugins get soft warnings, not failures

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- 07-02-SUMMARY.md: full execution record
- STATE.md: phase 07 complete (2/2 plans)
- ROADMAP.md: phase 07 status updated

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…space-autonomo

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- architecture.md: YIN pitch detection, custom STFT phase vocoder, scale engine
- plan.md: complexity 5.0, phased implementation (3 DSP + 2 GUI phases)
- parameter-spec-draft.md: 6 parameters (ROOT_NOTE, SCALE_TYPE, INTERVAL, MIX, HARMONY_LEVEL, MIDI_LEARN)
- PLUGINS.md: status updated to Stage 0

Key decisions:
- YIN algorithm for monophonic pitch detection (JUCE has no native detector)
- Custom STFT phase vocoder using juce::dsp::FFT (juce::dsp::PitchShifter does not exist)
- Latency: 1536 samples (~32ms) - quality-first per brief
- CMakeLists.txt requires NEEDS_MIDI_INPUT TRUE + juce_dsp (Stage 1 fix)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Incorporated findings from Meier et al. (2023) paper:
- YIN confidence threshold validated: 0.10 (VR=0.979)
- Hop size 512 @ 44100Hz confirmed as industry standard
- SWIPE-On-C documented as upgrade path (RPA 0.938 vs YIN 0.926)
- pYIN noted as v2 enhancement
- Wavelet transforms noted as transient-handling alternative

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Added MAE-AST / Audio-MAE context from Automatika paper
- Explains why deep learning not used for v1 pitch detection (37s batch latency, GPU required)
- Documents MAE-AST as future v3 auto-detect scale backend
- Added CREPE as v3 ML pitch estimation upgrade path
- Full research bibliography now in plan.md references

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- APVTS with 6 parameters (JUCE 8 ParameterID format)
  ROOT_NOTE, SCALE_TYPE, INTERVAL (Choice), MIX, HARMONY_LEVEL (Float), MIDI_LEARN (Bool)
- CMakeLists.txt fixes: NEEDS_MIDI_INPUT TRUE, juce_dsp + juce_gui_extra added
- acceptsMidi() now returns true
- MIDI root-note override (note % 12 when MIDI_LEARN on)
- DryWetMixer + Gain DSP scaffold (passthrough; Phase Vocoder slots in Stage 2)
- setLatencySamples(1536) declared in prepareToPlay
- State persistence via APVTS XML serialisation
- parameter-spec.md promoted from draft
- Compilation verified: VST3 + Standalone (Windows)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
YinPitchDetector (de Cheveigné & Kawahara 2002):
- 2048-sample window, 512-sample hop, threshold=0.10
- Validated by Meier et al. 2023 (RPA=0.926, VR=0.979, VFA=0.017)
- Circular ring buffer, CMNDF, parabolic interpolation
- Real-time safe: zero heap allocation in process()

ScaleIntervalEngine:
- 13 static scale tables (Major, modes, pentatonics, blues, chromatic)
- Diatonic interval math: 3rd(+2deg), 5th(+4deg), 6th(+5deg), Octave(+12st)
- computePitchShiftRatio() returns 2^(semitones/12)
- Verified: C4 Major 3rd -> ratio 1.2599, A4 Minor 5th -> ratio 1.4983

PluginProcessor integration:
- currentPitchRatio updated every 512-sample YIN hop
- harmonyBuffer pre-allocated for Phase 3.3 Phase Vocoder
- Compilation verified: VST3 + Standalone

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
PhaseVocoder (custom STFT implementation):
- juce::dsp::FFT order=11 (N=2048), hop=512 (75% overlap)
- Hann WOLA with correct normalisation: outputGain=2/3
  (JUCE performRealOnlyInverseTransform normalises by 1/N;
   75% overlap Hann OLA sum-of-squares=1.5, so 1/1.5=2/3)
- Instantaneous frequency estimation + phase accumulation per bin
- Real-time safe: zero heap alloc in process()/processHop()

Full signal chain now active:
  Guitar In -> YIN Pitch Detector -> Scale/Interval Engine
  -> PhaseVocoder -> HarmonyGain -> DryWetMixer -> Out

All 6 parameters connected:
  ROOT_NOTE, SCALE_TYPE, INTERVAL -> pitch ratio
  MIX -> DryWetMixer blend
  HARMONY_LEVEL -> Gain on wet path
  MIDI_LEARN -> root note MIDI override

Latency: 1536 samples (~32ms @ 48kHz) via setLatencySamples()
Compilation verified: VST3 + Standalone (Windows)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@oreginha
Copy link
Copy Markdown
Author

oreginha commented Apr 4, 2026

Hey — I just opened a PR adding Windows support.

Your video (“English is the New Programming Language”) really resonated with me. I also come from a music background, and I’m experiencing a similar shift with these tools.

It felt like you were putting words to something I’ve been going through.

Thanks for sharing that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant