diff --git a/.gitignore b/.gitignore index 47042c2..fd01f05 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ +.build +.swiftpm .DS_Store xcuserdata diff --git a/MusicKit.xcodeproj/project.pbxproj b/MusicKit.xcodeproj/project.pbxproj index 7a24b08..23f2922 100644 --- a/MusicKit.xcodeproj/project.pbxproj +++ b/MusicKit.xcodeproj/project.pbxproj @@ -133,7 +133,7 @@ 965AF8C11AF7A1DA00D31E83 /* Protocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Protocols.swift; sourceTree = ""; }; 9662BFF01B058568008A053A /* IntervalQuality.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IntervalQuality.swift; sourceTree = ""; }; 96686DB41A573B7F00350A2D /* PitchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PitchTests.swift; sourceTree = ""; }; - 966E60FA1B0930E9005EE226 /* AlteredPentads.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = AlteredPentads.playground; path = ../Playgrounds/AlteredPentads.playground; sourceTree = ""; }; + 966E60FA1B0930E9005EE226 /* AlteredPentads.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = AlteredPentads.playground; path = ../Playgrounds/AlteredPentads.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 967070E81B0850AC00CB367E /* ChordExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChordExtensions.swift; sourceTree = ""; }; 967070EB1B08512A00CB367E /* ChordQualities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChordQualities.swift; sourceTree = ""; }; 967070EE1B08649200CB367E /* ChordQualityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChordQualityTests.swift; sourceTree = ""; }; @@ -536,6 +536,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 96F299181A5663E500D7B006; @@ -716,10 +717,6 @@ 9691BB2E1A57C75500421B56 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -730,24 +727,20 @@ PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; 9691BB2F1A57C75500421B56 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); INFOPLIST_FILE = MusicKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -765,7 +758,6 @@ "$(inherited)", ); INFOPLIST_FILE = MusicKit/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; @@ -773,7 +765,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -787,7 +779,6 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = MusicKit/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; @@ -795,7 +786,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -901,6 +892,7 @@ SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -921,6 +913,7 @@ PRODUCT_NAME = MusicKit; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -940,6 +933,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -955,6 +949,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "benzguo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/MusicKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MusicKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MusicKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MusicKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MusicKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MusicKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MusicKit/ChordQualities.swift b/MusicKit/ChordQualities.swift index 4eb1e5d..1741bdf 100644 --- a/MusicKit/ChordQualities.swift +++ b/MusicKit/ChordQualities.swift @@ -1,10 +1,10 @@ import Foundation public extension ChordQuality { -public static let Dyads = [ +static let Dyads = [ ChordQuality.PowerChord, ] -public static let Triads = [ +static let Triads = [ ChordQuality.Major, ChordQuality.Minor, ChordQuality.Augmented, @@ -12,7 +12,7 @@ ChordQuality.Diminished, ChordQuality.Sus2, ChordQuality.Sus4, ] -public static let UnalteredTetrads = [ +static let UnalteredTetrads = [ ChordQuality.DominantSeventh, ChordQuality.MajorSeventh, ChordQuality.MinorMajorSeventh, @@ -22,7 +22,7 @@ ChordQuality.AugmentedSeventh, ChordQuality.HalfDiminishedSeventh, ChordQuality.DiminishedSeventh, ] -public static let AlteredTetrads = [ +static let AlteredTetrads = [ ChordQuality.DominantSeventhFlatFive, ChordQuality.MajorSeventhFlatFive, ChordQuality.DominantSeventhSusFour, @@ -39,7 +39,7 @@ ChordQuality.AddSharpEleven, ChordQuality.MinorAddSharpEleven, ChordQuality.AugmentedAddSharpEleven, ] -public static let UnalteredPentads = [ +static let UnalteredPentads = [ ChordQuality.DominantNinth, ChordQuality.MajorNinth, ChordQuality.MinorMajorNinth, @@ -49,7 +49,7 @@ ChordQuality.AugmentedNinth, ChordQuality.HalfDiminishedNinth, ChordQuality.DiminishedNinth, ] -public static let AlteredPentads = [ +static let AlteredPentads = [ ChordQuality.DominantSeventhFlatNine, ChordQuality.MajorSeventhFlatNine, ChordQuality.MinorMajorSeventhFlatNine, @@ -73,7 +73,7 @@ ChordQuality.DiminishedSeventhFlatThirteen, ChordQuality.Dominant9Sus4, ChordQuality.SixNine, ] -public static let UnalteredHexads = [ +static let UnalteredHexads = [ ChordQuality.DominantEleventh, ChordQuality.MajorEleventh, ChordQuality.MinorMajorEleventh, @@ -83,7 +83,7 @@ ChordQuality.AugmentedEleventh, ChordQuality.HalfDiminishedEleventh, ChordQuality.DiminishedEleventh, ] -public static let AlteredHexads = [ +static let AlteredHexads = [ ChordQuality.DominantEleventhFlatNine, ChordQuality.MajorEleventhFlatNine, ChordQuality.MinorMajorEleventhFlatNine, @@ -121,7 +121,7 @@ ChordQuality.MajorSeventhSharpElevenFlatThirteen, ChordQuality.MinorMajorSeventhSharpElevenFlatThirteen, ChordQuality.MinorSeventhSharpElevenFlatThirteen, ] -public static let UnalteredHeptads = [ +static let UnalteredHeptads = [ ChordQuality.DominantThirteenth, ChordQuality.MajorThirteenth, ChordQuality.MinorMajorThirteenth, @@ -131,7 +131,7 @@ ChordQuality.AugmentedThirteenth, ChordQuality.HalfDiminishedThirteenth, ChordQuality.DiminishedThirteenth, ] -public static let AlteredHeptads = [ +static let AlteredHeptads = [ ChordQuality.DominantThirteenthFlatNine, ChordQuality.MajorThirteenthFlatNine, ChordQuality.MinorMajorThirteenthFlatNine, @@ -173,11 +173,11 @@ ChordQuality.MajorSeventhFlatNineSharpElevenFlatThirteen, ChordQuality.MinorMajorSeventhFlatNineSharpElevenFlatThirteen, ChordQuality.MinorSeventhFlatNineSharpElevenFlatThirteen, ] -public static let Tetrads = ChordQuality.UnalteredTetrads + ChordQuality.AlteredTetrads -public static let Pentads = ChordQuality.UnalteredPentads + ChordQuality.AlteredPentads -public static let Hexads = ChordQuality.UnalteredHexads + ChordQuality.AlteredHexads -public static let Heptads = ChordQuality.UnalteredHeptads + ChordQuality.AlteredHeptads -public static let All = [ +static let Tetrads = ChordQuality.UnalteredTetrads + ChordQuality.AlteredTetrads +static let Pentads = ChordQuality.UnalteredPentads + ChordQuality.AlteredPentads +static let Hexads = ChordQuality.UnalteredHexads + ChordQuality.AlteredHexads +static let Heptads = ChordQuality.UnalteredHeptads + ChordQuality.AlteredHeptads +static let All = [ ChordQuality.PowerChord, ChordQuality.Major, ChordQuality.Minor, @@ -331,7 +331,7 @@ ChordQuality.MajorSeventhFlatNineSharpElevenFlatThirteen, ChordQuality.MinorMajorSeventhFlatNineSharpElevenFlatThirteen, ChordQuality.MinorSeventhFlatNineSharpElevenFlatThirteen, ] -public var name: String { +var name: String { switch self { case .PowerChord: return "PowerChord" case .Major: return "Major" diff --git a/MusicKit/MIDI.swift b/MusicKit/MIDI.swift index bc62f82..70e0469 100644 --- a/MusicKit/MIDI.swift +++ b/MusicKit/MIDI.swift @@ -2,6 +2,10 @@ import Foundation import CoreMIDI +#if SWIFT_PACKAGE +import MKMIDIProc +#endif + open class MIDI { /// Messages sent to the virtual MIDI source will be delivered on this channel. @@ -63,11 +67,11 @@ open class MIDI { let s = MIDIReceived(_virtualSource, packetList) success = s == 0 - packet.deinitialize() + packet.deinitialize(count: MemoryLayout.size) // this dealloc is superfluous; not sure why. // packet.dealloc(sizeof(MIDIPacket)) - packetList.deinitialize() - packetList.deallocate(capacity: MemoryLayout.size) + packetList.deinitialize(count: MemoryLayout.size) + packetList.deallocate() return success } diff --git a/MusicKit/MIDIMessage.swift b/MusicKit/MIDIMessage.swift index b0a6a3f..2ad861c 100644 --- a/MusicKit/MIDIMessage.swift +++ b/MusicKit/MIDIMessage.swift @@ -1,6 +1,9 @@ // Copyright (c) 2015 Ben Guo. All rights reserved. import Foundation +#if SWIFT_PACKAGE +import MKMIDIProc +#endif public protocol MIDIMessage { /// The message's channel diff --git a/MusicKit/Pitch.swift b/MusicKit/Pitch.swift index 298eee6..3311b65 100644 --- a/MusicKit/Pitch.swift +++ b/MusicKit/Pitch.swift @@ -80,8 +80,8 @@ extension Pitch: CustomStringConvertible { // MARK: Hashable extension Pitch: Hashable { - public var hashValue: Int { - return midi.hashValue + public func hash(into hasher: inout Hasher) { + hasher.combine(midi) } } diff --git a/MusicKit/Temperament.swift b/MusicKit/Temperament.swift index fd06f8c..e21bbfb 100644 --- a/MusicKit/Temperament.swift +++ b/MusicKit/Temperament.swift @@ -6,6 +6,8 @@ // Copyright © 2017 benzguo. All rights reserved. // +import Darwin + public struct Temperament: Equatable, Hashable { public static let just = Temperament([1.0000, 1.0417, 1.1250, 1.2000, @@ -82,15 +84,13 @@ public struct Temperament: Equatable, Hashable { return lhs.ratios == rhs.ratios } - public var hashValue: Int { + public func hash(into hasher: inout Hasher) { if let ratio = ratios.first { - return ratios.dropFirst().reduce(ratio.hashValue, { - sum, value in - return sum ^ value.hashValue + hasher.combine(ratio) + ratios.dropFirst().forEach({ + value in + hasher.combine(value) }) } - else { - return 0 - } } } diff --git a/MusicKit/Translation.swift b/MusicKit/Translation.swift index ed2de88..02456ae 100644 --- a/MusicKit/Translation.swift +++ b/MusicKit/Translation.swift @@ -79,7 +79,9 @@ extension Translation:Equatable, Hashable { lhs.numerals == rhs.numerals && lhs.showNatural == rhs.showNatural } - public var hashValue: Int { - return self.language.hashValue ^ self.numerals.hashValue ^ self.showNatural.hashValue + public func hash(into hasher: inout Hasher) { + hasher.combine(self.language) + hasher.combine(self.numerals) + hasher.combine(self.showNatural) } } diff --git a/MusicKit/include/headers.h b/MusicKit/include/headers.h new file mode 100644 index 0000000..578f414 --- /dev/null +++ b/MusicKit/include/headers.h @@ -0,0 +1 @@ +#import "../MusicKit.h" diff --git a/MusicKitTests/ChordNameBasicTests.swift b/MusicKitTests/ChordNameBasicTests.swift index 2292468..54a3490 100644 --- a/MusicKitTests/ChordNameBasicTests.swift +++ b/MusicKitTests/ChordNameBasicTests.swift @@ -6,124 +6,124 @@ final class ChordNameBasicTests: XCTestCase { let sut: PitchSet = [Chroma.c*0, Chroma.g*0, Chroma.c*2] let name = Chord.name(sut) let expected = "C5" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testMajorMinor() { var sut: PitchSet = [Chroma.c*0, Chroma.e*2, Chroma.g*3, Chroma.c*4] var name = Chord.name(sut) var expected = "CM" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.e*2, Chroma.g*3, Chroma.c*4, Chroma.g*4] name = Chord.name(sut) expected = "CM/E" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*0, Chroma.ds*2, Chroma.g*3, Chroma.c*4, Chroma.g*4] name = Chord.name(sut) expected = "Cm/G" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testOtherTriads() { var sut: PitchSet = [Chroma.c*0, Chroma.e*2, Chroma.gs*3, Chroma.c*4] var name = Chord.name(sut) var expected = "C+" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.ds*2, Chroma.fs*3, Chroma.c*4, Chroma.fs*4] name = Chord.name(sut) expected = "C°/E♭" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*2, Chroma.d*3, Chroma.c*4, Chroma.g*4] name = Chord.name(sut) expected = "Gsus4" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.c*2, Chroma.f*3, Chroma.c*4, Chroma.g*4] name = Chord.name(sut) expected = "Csus4" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.c*2, Chroma.d*3, Chroma.c*4, Chroma.g*4] name = Chord.name(sut) expected = "Csus2" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testCommonTetrads() { var sut: PitchSet = [Chroma.c*0, Chroma.e*2, Chroma.g*3, Chroma.as*4, Chroma.g*3] var name = Chord.name(sut) var expected = "C7" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*0, Chroma.ds*2, Chroma.c*3, Chroma.as*4, Chroma.g*3] name = Chord.name(sut) expected = "Cm7/G" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.b*0, Chroma.g*2, Chroma.d*3, Chroma.fs*4, Chroma.g*3] name = Chord.name(sut) expected = "GΔ7/B" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.b*0, Chroma.d*2, Chroma.f*3, Chroma.gs*4, Chroma.d*3] name = Chord.name(sut) expected = "B°7" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testOtherTetrads() { var sut: PitchSet = [Chroma.c*0, Chroma.ds*2, Chroma.g*3, Chroma.b*4, Chroma.g*3] var name = Chord.name(sut) var expected = "CmΔ7" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.e*0, Chroma.c*2, Chroma.gs*3, Chroma.b*4, Chroma.gs*3] name = Chord.name(sut) expected = "C+Δ7/E" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.b*0, Chroma.g*2, Chroma.ds*3, Chroma.f*4, Chroma.g*3] name = Chord.name(sut) expected = "B+add♯11" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.b*0, Chroma.d*2, Chroma.f*3, Chroma.a*4, Chroma.d*3] name = Chord.name(sut) expected = "Bø7" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.b*0, Chroma.cs*2, Chroma.f*3, Chroma.g*4, Chroma.cs*3] name = Chord.name(sut) expected = "G7♭5/B" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.c*0, Chroma.e*2, Chroma.fs*3, Chroma.b*4, Chroma.c*3] name = Chord.name(sut) expected = "Esus2/C" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.c*0, Chroma.g*2, Chroma.f*3, Chroma.as*4, Chroma.c*3] name = Chord.name(sut) expected = "C7sus4" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*0, Chroma.g*2, Chroma.f*3, Chroma.b*4, Chroma.c*3] name = Chord.name(sut) expected = "CΔ7sus4/G" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*0, Chroma.d*2, Chroma.b*3, Chroma.e*4, Chroma.g*3] name = Chord.name(sut) expected = "G6" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.g*0, Chroma.d*2, Chroma.as*3, Chroma.e*4, Chroma.g*3] name = Chord.name(sut) expected = "Gm6" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } } diff --git a/MusicKitTests/ChordNameExtendedTests.swift b/MusicKitTests/ChordNameExtendedTests.swift index c4fe11b..55b8999 100644 --- a/MusicKitTests/ChordNameExtendedTests.swift +++ b/MusicKitTests/ChordNameExtendedTests.swift @@ -6,44 +6,48 @@ final class ChordNameExtendedTests: XCTestCase { var sut: PitchSet = [Chroma.cs*0, Chroma.e*2, Chroma.g*3, Chroma.c*4] var name = Chord.name(sut) var expected = "CM/C♯" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.fs*0, Chroma.ds*2, Chroma.g*3, Chroma.c*4] name = Chord.name(sut) expected = "Cm/F♯" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testPentads() { let sut: PitchSet = [Chroma.as*0, Chroma.cs*1, Chroma.e*1, Chroma.g*1, Chroma.c*2] let name = Chord.name(sut) let expected = "B♭°9" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testSlashPentads() { var sut: PitchSet = [Chroma.cs*0, Chroma.as*1, Chroma.e*2, Chroma.g*3, Chroma.c*4] var name = Chord.name(sut) var expected = "C7/C♯" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") sut = [Chroma.e*0, Chroma.as*1, Chroma.ds*2, Chroma.g*3, Chroma.c*4] name = Chord.name(sut) expected = "Cm7/E" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testHexads() { let sut: PitchSet = [Chroma.c*0, Chroma.e*0, Chroma.gs*0, Chroma.b*0, Chroma.d*1, Chroma.f*1] let name = Chord.name(sut) let expected = "C+Δ11" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } func testHeptads() { - let sut: PitchSet = [Chroma.c*0, Chroma.e*0, Chroma.g*0, Chroma.as*0, Chroma.d*1, Chroma.f*1, Chroma.gs*1] + let sut = PitchSet([ + Chroma.c*0, Chroma.e*0, Chroma.g*0, + Chroma.as*0, Chroma.d*1, Chroma.f*1, + Chroma.gs*1 + ]) let name = Chord.name(sut) let expected = "C11♭13" - XCTAssert(name == expected, "\(name) != \(expected)") + XCTAssert(name == expected, "\(name ?? "") != \(expected)") } } diff --git a/MusicKitTests/ScaleTests.swift b/MusicKitTests/ScaleTests.swift index 51ff3c5..f33ac25 100644 --- a/MusicKitTests/ScaleTests.swift +++ b/MusicKitTests/ScaleTests.swift @@ -4,7 +4,7 @@ import MusicKit final class ScaleTests: XCTestCase { func testMajor() { let sut = Scale.Major(Chroma.c*5) - let expected: PitchSet = [ + let expected = PitchSet([ Chroma.c*5, Chroma.d*5, Chroma.e*5, @@ -12,13 +12,13 @@ final class ScaleTests: XCTestCase { Chroma.g*5, Chroma.a*5, Chroma.b*5, - ] + ]) XCTAssertEqual(sut, expected) } func testPhrygian() { let sut = Scale.Phrygian(Chroma.e*5) - let expected: PitchSet = [ + let expected = PitchSet([ Chroma.e*5, Chroma.f*5, Chroma.g*5, @@ -26,15 +26,15 @@ final class ScaleTests: XCTestCase { Chroma.b*5, Chroma.c*6, Chroma.d*6, - ] + ]) XCTAssertEqual(sut, expected) } func testChromatic() { let sut = Scale.Chromatic(Chroma.c*5) - let chromatic: PitchSet = [Chroma.c*5, Chroma.cs*5, Chroma.d*5, + let chromatic = PitchSet([Chroma.c*5, Chroma.cs*5, Chroma.d*5, Chroma.ds*5, Chroma.e*5, Chroma.f*5, Chroma.fs*5, Chroma.g*5, - Chroma.gs*5, Chroma.a*5, Chroma.as*5, Chroma.b*5] + Chroma.gs*5, Chroma.a*5, Chroma.as*5, Chroma.b*5]) XCTAssertEqual(sut, chromatic) } } diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..8e6c50c --- /dev/null +++ b/Package.swift @@ -0,0 +1,41 @@ +// swift-tools-version:5.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MusicKit", + products: [ + .library( + name: "MusicKit", + targets: ["MusicKit"]), + ], + dependencies: [], + targets: [ + .target( + name: "MKMIDIProc", + path: "MusicKit", + sources: [ + "MKMIDIProc.h", + "MKMIDIProc.m" + ] + ), + .target( + name: "MusicKit", + dependencies: [ + .target(name: "MKMIDIProc") + ], + path: "MusicKit", + exclude: [ + "MKMIDIProc.h", + "MKMIDIProc.m" + ] + ), + .testTarget( + name: "MusicKitTests", + dependencies: ["MusicKit"], + path: "MusicKitTests" + ), + ] +) +