diff --git a/docs/JUCE.md b/docs/JUCE.md index c9c1a8f..ca1dc55 100644 --- a/docs/JUCE.md +++ b/docs/JUCE.md @@ -20,6 +20,16 @@ Synthesis is the real xtc **Soft Keys** implementation, called through uses a separate PIC build of the C archive with JACK/FLTK disabled; the installed application and existing build directories are not modified. +## Screenshots + +![Actual JUCE Soft Keys editor](../screenshots/juce-soft-keys-editor.png) + +The native editor rendered at 2× scale, with effects enabled and -6 dB output; +no audio device is opened for this capture. Also see +[the JUCE VST3 in xtc's instrument chooser](../screenshots/juce-vst3-instrument.png) +and [capture commands and context](../screenshots/README.md#steinberg-and-juce-sdk-integration-phases-106107). +The editor image is separate from xtc's FLTK host, which does not embed it. + ## Licensing and dependency impact The inspected JUCE checkout is 9.0.4, revision diff --git a/docs/STEINBERG.md b/docs/STEINBERG.md index 3d8dbd7..46c68d3 100644 --- a/docs/STEINBERG.md +++ b/docs/STEINBERG.md @@ -28,6 +28,17 @@ check without adding a C++ runtime or network dependency to libxtc. See [the example instructions](../examples/steinberg/README.md) for SDK versions, build commands, validation and ASIO diagnostics. +## Screenshots + +![SDK Half Gain loaded in xtc's insert graph](../screenshots/steinberg-sdk-track-insert.png) + +The actual SDK-built effect in xtc's host. See its +[identity dialog](../screenshots/steinberg-sdk-identity.png), the +[SDK Sine instrument chooser](../screenshots/steinberg-sdk-instrument.png) and +[capture commands](../screenshots/README.md#steinberg-and-juce-sdk-integration-phases-106107). +These examples have no custom editor; the screenshots show xtc's host interface +with playback stopped. They do not demonstrate ASIO hardware operation. + ## ASIO and VST2 scope ASIO is native driver I/O, separate from VST plugin hosting. The optional Windows diff --git a/screenshots/README.md b/screenshots/README.md index 4a6f8e9..06ca8fc 100644 --- a/screenshots/README.md +++ b/screenshots/README.md @@ -6,7 +6,8 @@ VST3 insert chains. The gallery captures are actual rendered application windows and menus on a 1440 × 960 virtual X11 screen. The promotional `overview.png` is a designed composite of cropped, proportionally scaled captures with added headings; the -other captures have no mockups, compositing or image edits. +other captures have no mockups, compositing or image edits. The JUCE editor +image below uses its separately documented direct component-rendering path. ![xtc promotional overview: arrangement, piano roll, mixer and modular effects](overview.png) @@ -29,6 +30,52 @@ APIs and GUI history/preparation paths. Original projects, media and user configuration are not overwritten. Black margins are the virtual desktop; floating views show the actual detached windows together. +## Steinberg and JUCE SDK integration (Phases 106–107) + +Captured on 2026-11-06 from the built SDK examples, with no fabricated UI. + +![JUCE Soft Keys native editor](juce-soft-keys-editor.png) + +The 1560 × 980 image is rendered directly from the actual JUCE editor, with +filter/reverb enabled and output at -6 dB. It shows the parameter controls, +preset buttons and on-screen keyboard without opening an audio device. + +![Steinberg SDK Half Gain loaded in xtc's track insert graph](steinberg-sdk-track-insert.png) + +- [Steinberg SDK effect identity and current adapter limits](steinberg-sdk-identity.png) +- [Steinberg SDK Sine instrument discovered by xtc](steinberg-sdk-instrument.png) +- [JUCE VST3 instrument discovered by xtc](juce-vst3-instrument.png) + +The four 1440 × 960 FLTK captures load the actual SDK-built VST3 bundles. +The Steinberg examples have no custom editor; xtc displays its host graph and +metadata. The JUCE native editor above is rendered separately: xtc's C host +currently uses plugin defaults and does not embed native VST3 editors or expose +their controller parameters. Unsupported class counts in the choosers include +non-instrument/controller classes; they do not mean the selected synth failed. +The host is stopped and meters are idle. No ASIO interface is shown or implied. +See [Steinberg integration](../docs/STEINBERG.md) and +[JUCE integration](../docs/JUCE.md). + +After building both SDK examples, reproduce only these host captures with: + +```sh +make build/capture_screenshots +XTC_CAPTURE_STEINBERG_BUNDLE="$PWD/build/steinberg-sdk/VST3/Release/xtc-sdk-examples.vst3" \ +XTC_CAPTURE_JUCE_BUNDLE="$PWD/build/juce/XtcJuceSynth_artefacts/Release/VST3/xtc JUCE Synth.vst3" \ + xvfb-run -a -s '-screen 0 1440x960x24' \ + ./build/capture_screenshots "$PWD/screenshots" +``` + +This uses the existing capture prerequisites and temporary project isolation; +it preserves the other gallery images, including `overview.png`. +To reproduce the JUCE editor image, remove or move the existing destination +first (the command refuses overwrites): + +```sh +xvfb-run -a ./build/juce/xtc-juce-render_artefacts/Release/xtc-juce-render \ + --snapshot "$PWD/screenshots/juce-soft-keys-editor.png" +``` + ## MIDI devices, defaults and file exchange (Phases 100–105) - [Open MIDI input dropdown with real host devices](preferences-midi-input-devices.png) diff --git a/screenshots/juce-soft-keys-editor.png b/screenshots/juce-soft-keys-editor.png new file mode 100644 index 0000000..2730b68 Binary files /dev/null and b/screenshots/juce-soft-keys-editor.png differ diff --git a/screenshots/juce-vst3-instrument.png b/screenshots/juce-vst3-instrument.png new file mode 100644 index 0000000..56989cb Binary files /dev/null and b/screenshots/juce-vst3-instrument.png differ diff --git a/screenshots/steinberg-sdk-identity.png b/screenshots/steinberg-sdk-identity.png new file mode 100644 index 0000000..70ce892 Binary files /dev/null and b/screenshots/steinberg-sdk-identity.png differ diff --git a/screenshots/steinberg-sdk-instrument.png b/screenshots/steinberg-sdk-instrument.png new file mode 100644 index 0000000..65e111e Binary files /dev/null and b/screenshots/steinberg-sdk-instrument.png differ diff --git a/screenshots/steinberg-sdk-track-insert.png b/screenshots/steinberg-sdk-track-insert.png new file mode 100644 index 0000000..9afa3fd Binary files /dev/null and b/screenshots/steinberg-sdk-track-insert.png differ diff --git a/tools/capture_screenshots.cpp b/tools/capture_screenshots.cpp index e594a12..be4af59 100644 --- a/tools/capture_screenshots.cpp +++ b/tools/capture_screenshots.cpp @@ -105,6 +105,19 @@ int main(int argc,char **argv) { check(s->make_chord({4,7}));check(s->strum_chords(30,false));piano_view();capture("creative-strum-result"); window.do_callback();std::puts("Creative workflow captures completed.");return 0; } + if(const char *sdk=std::getenv("XTC_CAPTURE_STEINBERG_BUNDLE")) { + const char *juce=std::getenv("XTC_CAPTURE_JUCE_BUNDLE"); + if(!juce || !std::filesystem::exists(sdk) || !std::filesystem::exists(juce)) + throw std::runtime_error("Supply existing Steinberg and JUCE bundles for SDK captures"); + reset(); + check(window.add_track_effect(0,sdk,0)); + auto *inserts=window.track_inserts();inserts->select_track(0);tab("Track inserts"); + capture("steinberg-sdk-track-insert"); + dialog("steinberg-sdk-identity",[&]{check(inserts->inspect_slot());}); + dialog("steinberg-sdk-instrument",[&]{unsigned int index=0;xtc_choose_plugin(sdk,48000,index,true);}); + dialog("juce-vst3-instrument",[&]{unsigned int index=0;xtc_choose_plugin(juce,48000,index,true);}); + window.do_callback();std::puts("Real Steinberg/JUCE SDK host captures completed.");return 0; + } if(std::getenv("XTC_CAPTURE_HOST_VST3")) { reset();capture("compact-workspace"); auto *create=dynamic_cast(named(window,"Create"));if(!create)throw std::runtime_error("Missing Create dropdown");