From 528e10b43a7fb9882aa947677fc8c1387b551fdb Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Thu, 5 Nov 2026 12:19:00 +0000 Subject: [PATCH] broken changes --- KJamsClone/KJMixProApp.swift | 21 ++++++++++++++++----- README.md | 4 ++++ docs/VERIFICATION.md | 3 ++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/KJamsClone/KJMixProApp.swift b/KJamsClone/KJMixProApp.swift index fa431e3..5448dc9 100644 --- a/KJamsClone/KJMixProApp.swift +++ b/KJamsClone/KJMixProApp.swift @@ -65,7 +65,9 @@ struct SongDragReference: Codable, Sendable { @Published var activeSection = "Library" @Published var studio = StudioSettings() { didSet { applyStudioSettings(save:true,previous:oldValue) } } let backgroundDeck = BackgroundDeck() + #if KJMIX_DJ_CONSOLE let dj = DJSystem() + #endif var backgroundAutomationReady = false var backgroundPlaybackObserver: AnyCancellable? var backgroundHandoff: Task? @@ -717,8 +719,7 @@ struct LibraryView: View { } private var selectedSong: Song? { model.songs.first { $0.id == selected } } - private var workspace: some View { - VSplitView { + private var libraryWorkspace: some View { HSplitView { sidebar.frame(minWidth:220,idealWidth:240,maxWidth:260) VStack(spacing:0) { @@ -754,9 +755,19 @@ struct LibraryView: View { footer.padding(.horizontal,18).padding(.vertical,8) }.frame(minWidth:780) } - .frame(minHeight:400) - DJConsole(model:model,system:model.dj).frame(minHeight:400,idealHeight:470) + } + @ViewBuilder private var workspaceLayout: some View { + #if KJMIX_DJ_CONSOLE + VSplitView { + libraryWorkspace.frame(minHeight:400) + DJConsole(model:model,system:model.dj).frame(minHeight:400,idealHeight:470) } + #else + libraryWorkspace + #endif + } + private var workspace: some View { + workspaceLayout .background(StudioTheme.frame) .tint(.accentColor) .focusedSceneValue(\.nameReinterpretation,NameReinterpretationCommands(perform:{beginReinterpretation()},enabled:["Library","Singer Songs"].contains(source) && (selectedSong != nil || !tableSelection.isEmpty))) @@ -1016,7 +1027,7 @@ struct LibraryView: View { }.width(65) TableColumn("Tempo") { song in Picker("Tempo",selection:Binding(get:{model.tuningForControls(song.id).tempo},set:{model.updateTuning(song.id,tempo:$0)})) { - ForEach(10..<31) { Text("\($0*5)%").tag(Double($0)/20) } + ForEach(50...150,id:\.self) { Text("\($0)%").tag(Double($0)/100) } }.labelsHidden().controlSize(.small) }.width(78) TableColumn("Rating",value:\Song.rating) { song in diff --git a/README.md b/README.md index 945b337..f9aa0ae 100644 --- a/README.md +++ b/README.md @@ -160,3 +160,7 @@ See [the Reinterpret Names guide](docs/REINTERPRETING.md) for folder templates, ## Live tuning and library pages Key and Tempo controls beside the main transport adjust the loaded performance immediately. Changes save to the performing singer and song, even while browsing another singer or track. With no assigned performer, live changes are temporary. The library shows 20 songs per page; search and sorting cover the entire library, and Next Song can cross page boundaries. + +### Optional DJ console development + +The pending `DJSystem` / `DJConsole` integration is retained behind `KJMIX_DJ_CONSOLE`. Default Debug and Release builds compile the working karaoke interface. Add the missing console implementation to the target before enabling that Active Compilation Condition. diff --git a/docs/VERIFICATION.md b/docs/VERIFICATION.md index fc66ea2..3c7b858 100644 --- a/docs/VERIFICATION.md +++ b/docs/VERIFICATION.md @@ -2,10 +2,11 @@ Verified on 5 November 2026. +- Debug build was also verified with `xcodebuild` in the normal `build` directory. Unfinished DJSystem/DJConsole references added during this work are retained behind the optional KJMIX_DJ_CONSOLE compilation condition, restoring the default build without deleting that pending integration. - Dedicated live Key and Tempo controls beside the main transport identify the performing singer. Both the existing detail controls and a loaded song’s inline tuning controls route live changes to the same performance. Audio effect parameters change without restarting playback. - Live changes save only to the performing singer/song pair, using playbackSinger rather than the singer being browsed. Other singers, other songs, global defaults and the singer’s saved rating are preserved. Without an assigned performer, adjustments are temporary. - Library results are paginated at 20 songs per page, with first/previous/next/last controls, page count and matching-song range. Search and sorting operate before pagination. Filtering/sorting resets the page; page navigation clears row selection; Next Song traverses all filtered results and follows the appropriate page. Generate All Library Waveforms continues to use the full library. -- 105 XCTest cases passed, zero failures (`/tmp/kjmix-live-pages-final-tests.log`). New cases exercise live playback while browsing another singer, persistence and rating isolation, inline/live routing, temporary unassigned tuning, invalid values and first/middle/last/empty/filtered page boundaries. Prior native UI, import, playback, rotation, metadata and storage tests passed. +- 105 XCTest cases passed, zero failures (`/tmp/kjmix-live-pages-buildfix-tests.log`). New cases exercise live playback while browsing another singer, persistence and rating isolation, inline/live routing, temporary unassigned tuning, invalid values and first/middle/last/empty/filtered page boundaries. Prior native UI, import, playback, rotation, metadata and storage tests passed. - The library was rendered at 1320 × 900 with 45 isolated demo entries. The performing singer’s +3 key/95% tempo remained visible while another singer was selected; pagination displayed songs 1–20 and Page 1 of 3. - Release signing, Apple notarization, stapling and Gatekeeper results are stored under `build-release/release-verification/KJMixPro-0.6.9-macOS/`. Only the current DMG is retained in `dist`.