Model manual auto musical parameters

This commit is contained in:
Codex
2026-09-13 13:33:30 +02:00
parent c3ebf95e53
commit 20c541421f
3 changed files with 61 additions and 1 deletions
@@ -154,6 +154,38 @@ public extension SongProject {
dialects.removeAll { $0.id == dialectID } 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] { var selectedInstrumentTracks: [InstrumentTrack] {
instruments.filter(\.selected) instruments.filter(\.selected)
} }
@@ -279,4 +279,32 @@ final class SongProjectModelTests: XCTestCase {
XCTAssertEqual(project.dialects(forLanguageID: arabic.id), []) XCTAssertEqual(project.dialects(forLanguageID: arabic.id), [])
XCTAssertEqual(project.languageIDs, ["english"]) 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))
}
} }
+1 -1
View File
@@ -26,7 +26,7 @@ requirement is missing and blocks implementation, record it in
- [x] Model instruments, variants, roles and placements. - [x] Model instruments, variants, roles and placements.
- [x] Model multiple vocalists and section assignments. - [x] Model multiple vocalists and section assignments.
- [x] Model language/dialect and Arabic pronunciation settings. - [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. - [ ] Model emotional arc and production directions.
- [ ] Add serialization tests. - [ ] Add serialization tests.