Skip to content

Commit af04c32

Browse files
committed
Refactor the code
1 parent 5384570 commit af04c32

13 files changed

+77
-88
lines changed

Pitchy.xcodeproj/project.pbxproj

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10-
D512C1211C319917002DD504 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1201C319917002DD504 /* Config.swift */; };
11-
D512C1221C319917002DD504 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1201C319917002DD504 /* Config.swift */; };
10+
D512C1211C319917002DD504 /* FrequencyValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1201C319917002DD504 /* FrequencyValidator.swift */; };
11+
D512C1221C319917002DD504 /* FrequencyValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1201C319917002DD504 /* FrequencyValidator.swift */; };
1212
D512C1241C319A40002DD504 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1231C319A40002DD504 /* Error.swift */; };
1313
D512C1251C319A40002DD504 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1231C319A40002DD504 /* Error.swift */; };
1414
D512C12A1C319BC1002DD504 /* Pitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1271C319BC1002DD504 /* Pitch.swift */; };
@@ -23,6 +23,8 @@
2323
D512C1401C319E36002DD504 /* AcousticWaveSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1311C319C82002DD504 /* AcousticWaveSpec.swift */; };
2424
D512C1411C319E36002DD504 /* NoteSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1321C319C82002DD504 /* NoteSpec.swift */; };
2525
D512C1421C319E36002DD504 /* PitchSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D512C1331C319C82002DD504 /* PitchSpec.swift */; };
26+
D53425091F8C0FBA00BE4F4B /* FrequencyValidatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53425071F8C0F8A00BE4F4B /* FrequencyValidatorSpec.swift */; };
27+
D534250A1F8C0FBB00BE4F4B /* FrequencyValidatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53425071F8C0F8A00BE4F4B /* FrequencyValidatorSpec.swift */; };
2628
D5DF49E71C2EE85900343F13 /* NoteCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DF49B51C2EE67800343F13 /* NoteCalculator.swift */; };
2729
D5DF49E81C2EE85900343F13 /* PitchCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DF49B61C2EE67800343F13 /* PitchCalculator.swift */; };
2830
D5DF49E91C2EE85900343F13 /* WaveCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DF49B71C2EE67800343F13 /* WaveCalculator.swift */; };
@@ -61,7 +63,7 @@
6163
/* End PBXContainerItemProxy section */
6264

6365
/* Begin PBXFileReference section */
64-
D512C1201C319917002DD504 /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = "<group>"; };
66+
D512C1201C319917002DD504 /* FrequencyValidator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrequencyValidator.swift; sourceTree = "<group>"; };
6567
D512C1231C319A40002DD504 /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
6668
D512C1271C319BC1002DD504 /* Pitch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Pitch.swift; sourceTree = "<group>"; };
6769
D512C1281C319BC1002DD504 /* AcousticWave.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcousticWave.swift; sourceTree = "<group>"; };
@@ -70,6 +72,7 @@
7072
D512C1321C319C82002DD504 /* NoteSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoteSpec.swift; sourceTree = "<group>"; };
7173
D512C1331C319C82002DD504 /* PitchSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PitchSpec.swift; sourceTree = "<group>"; };
7274
D51575A01C330432006F8E75 /* PitchyPlayground-iOS.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = "PitchyPlayground-iOS.playground"; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
75+
D53425071F8C0F8A00BE4F4B /* FrequencyValidatorSpec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrequencyValidatorSpec.swift; sourceTree = "<group>"; };
7376
D5DF49B51C2EE67800343F13 /* NoteCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoteCalculator.swift; sourceTree = "<group>"; };
7477
D5DF49B61C2EE67800343F13 /* PitchCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PitchCalculator.swift; sourceTree = "<group>"; };
7578
D5DF49B71C2EE67800343F13 /* WaveCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WaveCalculator.swift; sourceTree = "<group>"; };
@@ -198,7 +201,7 @@
198201
children = (
199202
D512C1261C319B9D002DD504 /* Data */,
200203
D5DF49B41C2EE67800343F13 /* Calculators */,
201-
D512C1201C319917002DD504 /* Config.swift */,
204+
D512C1201C319917002DD504 /* FrequencyValidator.swift */,
202205
D512C1231C319A40002DD504 /* Error.swift */,
203206
);
204207
path = Source;
@@ -235,6 +238,7 @@
235238
children = (
236239
D512C1301C319C48002DD504 /* Data */,
237240
D5DF49FB1C2EE8AC00343F13 /* Calculators */,
241+
D53425071F8C0F8A00BE4F4B /* FrequencyValidatorSpec.swift */,
238242
);
239243
path = Specs;
240244
sourceTree = "<group>";
@@ -483,7 +487,7 @@
483487
D512C1241C319A40002DD504 /* Error.swift in Sources */,
484488
D512C12E1C319BC1002DD504 /* Note.swift in Sources */,
485489
D5DF49E81C2EE85900343F13 /* PitchCalculator.swift in Sources */,
486-
D512C1211C319917002DD504 /* Config.swift in Sources */,
490+
D512C1211C319917002DD504 /* FrequencyValidator.swift in Sources */,
487491
D5DF49E71C2EE85900343F13 /* NoteCalculator.swift in Sources */,
488492
D5DF49E91C2EE85900343F13 /* WaveCalculator.swift in Sources */,
489493
);
@@ -498,7 +502,7 @@
498502
D512C1251C319A40002DD504 /* Error.swift in Sources */,
499503
D512C12F1C319BC1002DD504 /* Note.swift in Sources */,
500504
D5DF49EE1C2EE85A00343F13 /* PitchCalculator.swift in Sources */,
501-
D512C1221C319917002DD504 /* Config.swift in Sources */,
505+
D512C1221C319917002DD504 /* FrequencyValidator.swift in Sources */,
502506
D5DF49ED1C2EE85A00343F13 /* NoteCalculator.swift in Sources */,
503507
D5DF49EF1C2EE85A00343F13 /* WaveCalculator.swift in Sources */,
504508
);
@@ -508,6 +512,7 @@
508512
isa = PBXSourcesBuildPhase;
509513
buildActionMask = 2147483647;
510514
files = (
515+
D53425091F8C0FBA00BE4F4B /* FrequencyValidatorSpec.swift in Sources */,
511516
D512C13E1C319E36002DD504 /* NoteSpec.swift in Sources */,
512517
D5DF4A351C2EEB5200343F13 /* WaveCalculatorSpec.swift in Sources */,
513518
D5DF4A331C2EEB5200343F13 /* NoteCalculatorSpec.swift in Sources */,
@@ -521,6 +526,7 @@
521526
isa = PBXSourcesBuildPhase;
522527
buildActionMask = 2147483647;
523528
files = (
529+
D534250A1F8C0FBB00BE4F4B /* FrequencyValidatorSpec.swift in Sources */,
524530
D512C1411C319E36002DD504 /* NoteSpec.swift in Sources */,
525531
D5DF4A3B1C2EEB5300343F13 /* WaveCalculatorSpec.swift in Sources */,
526532
D5DF4A391C2EEB5300343F13 /* NoteCalculatorSpec.swift in Sources */,

PitchyTests/Specs/Calculators/NoteCalculatorSpec.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class NoteCalculatorSpec: QuickSpec {
2626

2727
describe(".indexBounds") {
2828
it("has bounds based on min and max frequencies from the config") {
29-
let minimum = try! NoteCalculator.index(frequency: Config.minimumFrequency)
30-
let maximum = try! NoteCalculator.index(frequency: Config.maximumFrequency)
29+
let minimum = try! NoteCalculator.index(frequency: FrequencyValidator.minimumFrequency)
30+
let maximum = try! NoteCalculator.index(frequency: FrequencyValidator.maximumFrequency)
3131
let expected = (minimum: minimum, maximum: maximum)
3232
let result = NoteCalculator.indexBounds
3333

PitchyTests/Specs/Calculators/PitchCalculatorSpec.swift

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,6 @@ class PitchCalculatorSpec: QuickSpec {
2323
]
2424

2525
describe("PitchCalculator") {
26-
describe(".isValidFrequency") {
27-
it("is invalid if frequency is higher than maximum") {
28-
let frequency = 5000.0
29-
expect(PitchCalculator.isValidFrequency(frequency)).to(beFalse())
30-
}
31-
32-
it("is invalid if frequency is lower than minimum") {
33-
let frequency = 10.0
34-
expect(PitchCalculator.isValidFrequency(frequency)).to(beFalse())
35-
}
36-
37-
it("is invalid if frequency is zero") {
38-
let frequency = 0.0
39-
expect(PitchCalculator.isValidFrequency(frequency)).to(beFalse())
40-
}
41-
42-
it("is valid if frequency is within valid bounds") {
43-
let frequency = 440.0
44-
expect(PitchCalculator.isValidFrequency(frequency)).to(beTrue())
45-
}
46-
}
47-
4826
describe(".offsets") {
4927
it("returns a correct offsets for the specified frequency") {
5028
offsets.forEach {

PitchyTests/Specs/Calculators/WaveCalculatorSpec.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class WaveCalculatorSpec: QuickSpec {
1919
describe("WaveCalculator") {
2020
describe(".wavelengthBounds") {
2121
it("has bounds based on min and max frequencies from the config") {
22-
let minimum = try! WaveCalculator.wavelength(frequency: Config.maximumFrequency)
23-
let maximum = try! WaveCalculator.wavelength(frequency: Config.minimumFrequency)
22+
let minimum = try! WaveCalculator.wavelength(frequency: FrequencyValidator.maximumFrequency)
23+
let maximum = try! WaveCalculator.wavelength(frequency: FrequencyValidator.minimumFrequency)
2424
let expected = (minimum: minimum, maximum: maximum)
2525
let result = WaveCalculator.wavelengthBounds
2626

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
@testable import Pitchy
2+
import Quick
3+
import Nimble
4+
5+
class FrequencyValidatorSpec: QuickSpec {
6+
override func spec() {
7+
describe("FrequencyValidator") {
8+
describe(".isValid:frequency") {
9+
it("is invalid if frequency is higher than maximum") {
10+
let frequency = 5000.0
11+
expect(FrequencyValidator.isValid(frequency: frequency)).to(beFalse())
12+
}
13+
14+
it("is invalid if frequency is lower than minimum") {
15+
let frequency = 10.0
16+
expect(FrequencyValidator.isValid(frequency: frequency)).to(beFalse())
17+
}
18+
19+
it("is invalid if frequency is zero") {
20+
let frequency = 0.0
21+
expect(FrequencyValidator.isValid(frequency: frequency)).to(beFalse())
22+
}
23+
24+
it("is valid if frequency is within valid bounds") {
25+
let frequency = 440.0
26+
expect(FrequencyValidator.isValid(frequency: frequency)).to(beTrue())
27+
}
28+
}
29+
}
30+
}
31+
}
32+

Source/Calculators/NoteCalculator.swift

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import Foundation
22

33
public struct NoteCalculator {
4-
5-
// MARK: - Constants
6-
74
public struct Standard {
85
public static let frequency = 440.0
96
public static let octave = 4
@@ -17,8 +14,8 @@ public struct NoteCalculator {
1714
// MARK: - Bounds
1815

1916
public static var indexBounds: (minimum: Int, maximum: Int) {
20-
let minimum = try! index(frequency: Config.minimumFrequency)
21-
let maximum = try! index(frequency: Config.maximumFrequency)
17+
let minimum = try! index(frequency: FrequencyValidator.minimumFrequency)
18+
let maximum = try! index(frequency: FrequencyValidator.maximumFrequency)
2219

2320
return (minimum: minimum, maximum: maximum)
2421
}
@@ -99,12 +96,8 @@ public struct NoteCalculator {
9996
// MARK: - Pitch Index
10097

10198
public static func index(frequency: Double) throws -> Int {
102-
guard PitchCalculator.isValidFrequency(frequency) else {
103-
throw PitchError.invalidFrequency
104-
}
105-
99+
try FrequencyValidator.validate(frequency: frequency)
106100
let count = Double(letters.count)
107-
108101
return Int(round(count * log2(frequency / Standard.frequency)))
109102
}
110103

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,6 @@
11
import Foundation
22

33
public struct PitchCalculator {
4-
5-
// MARK: - Validators
6-
7-
public static func isValidFrequency(_ frequency: Double) -> Bool {
8-
return frequency > 0.0
9-
&& frequency >= Config.minimumFrequency
10-
&& frequency <= Config.maximumFrequency
11-
}
12-
13-
// MARK: - Offsets
14-
154
public static func offsets(_ frequency: Double) throws -> Pitch.Offsets {
165
let note = try Note(frequency: frequency)
176
let higherNote = try note.higher()
@@ -27,25 +16,23 @@ public struct PitchCalculator {
2716
frequency: frequency - note.frequency,
2817
percentage: (frequency - note.frequency) * 100
2918
/ abs(note.frequency - closestNote.frequency),
30-
cents: try cents(note.frequency, frequency2: frequency)
19+
cents: try cents(frequency1: note.frequency, frequency2: frequency)
3120
)
3221

3322
let secondOffset = Pitch.Offset(
3423
note: closestNote,
3524
frequency: frequency - closestNote.frequency,
3625
percentage: (frequency - closestNote.frequency) * 100
3726
/ abs(note.frequency - closestNote.frequency),
38-
cents: try cents(closestNote.frequency, frequency2: frequency)
27+
cents: try cents(frequency1: closestNote.frequency, frequency2: frequency)
3928
)
4029

4130
return Pitch.Offsets(firstOffset, secondOffset)
4231
}
4332

44-
public static func cents(_ frequency1: Double, frequency2: Double) throws -> Double {
45-
guard isValidFrequency(frequency1)
46-
&& isValidFrequency(frequency2)
47-
else { throw PitchError.invalidFrequency }
48-
33+
public static func cents(frequency1: Double, frequency2: Double) throws -> Double {
34+
try FrequencyValidator.validate(frequency: frequency1)
35+
try FrequencyValidator.validate(frequency: frequency2)
4936
return 1200.0 * log2(frequency2 / frequency1)
5037
}
5138
}

Source/Calculators/WaveCalculator.swift

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
public struct WaveCalculator {
2-
3-
// MARK: - Bounds
4-
52
public static var wavelengthBounds: (minimum: Double, maximum: Double) {
6-
let minimum = try! wavelength(frequency: Config.maximumFrequency)
7-
let maximum = try! wavelength(frequency: Config.minimumFrequency)
3+
let minimum = try! wavelength(frequency: FrequencyValidator.maximumFrequency)
4+
let maximum = try! wavelength(frequency: FrequencyValidator.minimumFrequency)
85

96
return (minimum: minimum, maximum: maximum)
107
}
@@ -46,10 +43,7 @@ public struct WaveCalculator {
4643
}
4744

4845
public static func wavelength(frequency: Double) throws -> Double {
49-
guard PitchCalculator.isValidFrequency(frequency) else {
50-
throw PitchError.invalidFrequency
51-
}
52-
46+
try FrequencyValidator.validate(frequency: frequency)
5347
return AcousticWave.speed / frequency
5448
}
5549

Source/Config.swift

Lines changed: 0 additions & 5 deletions
This file was deleted.

Source/Data/AcousticWave.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
public struct AcousticWave {
2-
32
public static let speed: Double = 343
43

54
public let frequency: Double
@@ -21,10 +20,7 @@ public struct AcousticWave {
2120
// MARK: - Initialization
2221

2322
public init(frequency: Double) throws {
24-
guard PitchCalculator.isValidFrequency(frequency) else {
25-
throw PitchError.invalidFrequency
26-
}
27-
23+
try FrequencyValidator.validate(frequency: frequency)
2824
self.frequency = frequency
2925
wavelength = try WaveCalculator.wavelength(frequency: frequency)
3026
period = try WaveCalculator.period(wavelength: wavelength)

0 commit comments

Comments
 (0)