diff --git a/Sources/MusicAssistantCore/Domain/SongProject.swift b/Sources/MusicAssistantCore/Domain/SongProject.swift index 41de062..ae86459 100644 --- a/Sources/MusicAssistantCore/Domain/SongProject.swift +++ b/Sources/MusicAssistantCore/Domain/SongProject.swift @@ -154,6 +154,38 @@ public extension SongProject { dialects.removeAll { $0.id == dialectID } } + mutating func setBPMManually(_ value: Int) { + bpm = ManualAutoValue(mode: .manual, value: value) + } + + mutating func setBPMAutomatic() { + bpm = ManualAutoValue(mode: .auto) + } + + mutating func setKeyManually(_ value: String) { + key = ManualAutoValue(mode: .manual, value: value) + } + + mutating func setKeyAutomatic() { + key = ManualAutoValue(mode: .auto) + } + + mutating func setScaleManually(_ value: String) { + scale = ManualAutoValue(mode: .manual, value: value) + } + + mutating func setScaleAutomatic() { + scale = ManualAutoValue(mode: .auto) + } + + mutating func setMaqamManually(_ value: String) { + maqam = ManualAutoValue(mode: .manual, value: value) + } + + mutating func setMaqamAutomatic() { + maqam = ManualAutoValue(mode: .auto) + } + var selectedInstrumentTracks: [InstrumentTrack] { instruments.filter(\.selected) } diff --git a/Tests/MusicAssistantCoreTests/SongProjectModelTests.swift b/Tests/MusicAssistantCoreTests/SongProjectModelTests.swift index 787b920..e96570a 100644 --- a/Tests/MusicAssistantCoreTests/SongProjectModelTests.swift +++ b/Tests/MusicAssistantCoreTests/SongProjectModelTests.swift @@ -279,4 +279,32 @@ final class SongProjectModelTests: XCTestCase { XCTAssertEqual(project.dialects(forLanguageID: arabic.id), []) XCTAssertEqual(project.languageIDs, ["english"]) } + + func testMusicalParametersSupportManualAndAutoModes() { + var project = SongProject( + id: "project-8", + title: "Musical Parameters", + idea: "Control tempo and harmony" + ) + + project.setBPMManually(104) + project.setKeyManually("D") + project.setScaleAutomatic() + project.setMaqamManually("Bayati") + + XCTAssertEqual(project.bpm, ManualAutoValue(mode: .manual, value: 104)) + XCTAssertEqual(project.key, ManualAutoValue(mode: .manual, value: "D")) + XCTAssertEqual(project.scale, ManualAutoValue(mode: .auto)) + XCTAssertEqual(project.maqam, ManualAutoValue(mode: .manual, value: "Bayati")) + + project.setBPMAutomatic() + project.setKeyAutomatic() + project.setScaleManually("minor") + project.setMaqamAutomatic() + + XCTAssertEqual(project.bpm, ManualAutoValue(mode: .auto)) + XCTAssertEqual(project.key, ManualAutoValue(mode: .auto)) + XCTAssertEqual(project.scale, ManualAutoValue(mode: .manual, value: "minor")) + XCTAssertEqual(project.maqam, ManualAutoValue(mode: .auto)) + } } diff --git a/docs/TASKS.md b/docs/TASKS.md index 51d64f3..d47972c 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -26,7 +26,7 @@ requirement is missing and blocks implementation, record it in - [x] Model instruments, variants, roles and placements. - [x] Model multiple vocalists and section assignments. - [x] Model language/dialect and Arabic pronunciation settings. -- [ ] Model BPM, key, scale and maqam with Manual/Auto state. +- [x] Model BPM, key, scale and maqam with Manual/Auto state. - [ ] Model emotional arc and production directions. - [ ] Add serialization tests.