From 1a89cdd3d42b9a6ee77aa5dabff731f2b6ac1e76 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 21 Dec 2022 17:46:45 -0500 Subject: [PATCH 01/27] Refactor PitchTracker to make it easier to use directly (#58) This will be useful for upcoming pitch detection unit tests. * Add `PitchTracker.defaultBufferSize` * Discard `0` pitch values * Add `amplitudeThreshold` parameter to control what the threshold should be * Process `AVAudioPCMBuffer` from `PitchTracker` instead of raw `UnsafeMutablePointer` frames --- .../MicrophonePitchDetector/PitchTap.swift | 19 ++++--------------- .../PitchTracker.swift | 12 +++++++++--- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift index 5dede6a..b7842c1 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift @@ -6,7 +6,7 @@ import AVFoundation final class PitchTap { // MARK: - Properties - private var bufferSize: UInt32 { 4_096 } + private var bufferSize: UInt32 { PitchTracker.defaultBufferSize } private let input: Node private var tracker: PitchTracker? private let handler: (Float) -> Void @@ -41,24 +41,13 @@ final class PitchTap { private func analyzePitch(buffer: AVAudioPCMBuffer) { buffer.frameLength = bufferSize - guard let floatData = buffer.floatChannelData else { return } - didReceiveAudio() - let tracker: PitchTracker - if let existingTracker = self.tracker { - tracker = existingTracker - } else { - tracker = PitchTracker( - sampleRate: Int32(buffer.format.sampleRate), - hopSize: Int32(bufferSize), - peakCount: 20 - ) - self.tracker = tracker + if tracker == nil { + tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) } - let frames = (0..? private var ptrack: UnsafeMutablePointer? - init(sampleRate: Int32, hopSize: Int32, peakCount: Int32) { + static var defaultBufferSize: UInt32 { 4_096 } + + init(sampleRate: Int32, hopSize: Int32 = Int32(PitchTracker.defaultBufferSize), peakCount: Int32 = 20) { withUnsafeMutablePointer(to: &data, zt_create) data!.pointee.sr = sampleRate withUnsafeMutablePointer(to: &ptrack, zt_ptrack_create) @@ -16,15 +19,18 @@ final class PitchTracker { withUnsafeMutablePointer(to: &data, zt_destroy) } - func getPitch(frames: [UnsafeMutablePointer]) -> Float? { + func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Float = 0.1) -> Float? { + guard let floatData = buffer.floatChannelData else { return nil } + var pitch: Float = 0 var amplitude: Float = 0 + let frames = (0.. 0.1 { + if amplitude > amplitudeThreshold, pitch > 0 { return pitch } else { return nil From 0b318041d6bf1f069020afbddc244f2b937d0c78 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Thu, 22 Dec 2022 14:48:49 -0500 Subject: [PATCH 02/27] Add pitch detection tests (#59) Disable CI job Seems to be flaky on macOS 12, but consistent in my local runs on macOS 13.1. --- .github/workflows/ci.yml | 7 ++ .gitignore | 1 + .../MicrophonePitchDetector/Package.resolved | 16 +++ .../MicrophonePitchDetector/Package.swift | 19 +++- .../MicrophonePitchDetectorTests.swift | 61 ++++++++++ .../PitchRecording.swift | 50 ++++++++ .../Resources/piano/A0.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/A7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Ab7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B0.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/B7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb0.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Bb7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/C8.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/D7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Db8.mp3 | Bin 0 -> 12065 bytes .../Resources/piano/E1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/E7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Eb7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/F7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/G7.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb1.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb2.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb3.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb4.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb5.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb6.mp3 | Bin 0 -> 10089 bytes .../Resources/piano/Gb7.mp3 | Bin 0 -> 10089 bytes .../testPiano.A0.json | 106 +++++++++++++++++ .../testPiano.A1.json | 103 +++++++++++++++++ .../testPiano.A2.json | 94 +++++++++++++++ .../testPiano.A3.json | 94 +++++++++++++++ .../testPiano.A4.json | 92 +++++++++++++++ .../testPiano.A5.json | 85 ++++++++++++++ .../testPiano.A6.json | 85 ++++++++++++++ .../testPiano.A7.json | 82 ++++++++++++++ .../testPiano.Ab1.json | 104 +++++++++++++++++ .../testPiano.Ab2.json | 95 ++++++++++++++++ .../testPiano.Ab3.json | 94 +++++++++++++++ .../testPiano.Ab4.json | 93 +++++++++++++++ .../testPiano.Ab5.json | 85 ++++++++++++++ .../testPiano.Ab6.json | 85 ++++++++++++++ .../testPiano.Ab7.json | 83 ++++++++++++++ .../testPiano.B0.json | 106 +++++++++++++++++ .../testPiano.B1.json | 102 +++++++++++++++++ .../testPiano.B2.json | 100 ++++++++++++++++ .../testPiano.B3.json | 96 ++++++++++++++++ .../testPiano.B4.json | 88 ++++++++++++++ .../testPiano.B5.json | 85 ++++++++++++++ .../testPiano.B6.json | 84 ++++++++++++++ .../testPiano.B7.json | 82 ++++++++++++++ .../testPiano.Bb0.json | 106 +++++++++++++++++ .../testPiano.Bb1.json | 100 ++++++++++++++++ .../testPiano.Bb2.json | 94 +++++++++++++++ .../testPiano.Bb3.json | 94 +++++++++++++++ .../testPiano.Bb4.json | 91 +++++++++++++++ .../testPiano.Bb5.json | 85 ++++++++++++++ .../testPiano.Bb6.json | 84 ++++++++++++++ .../testPiano.Bb7.json | 82 ++++++++++++++ .../testPiano.C1.json | 107 ++++++++++++++++++ .../testPiano.C2.json | 100 ++++++++++++++++ .../testPiano.C3.json | 99 ++++++++++++++++ .../testPiano.C4.json | 95 ++++++++++++++++ .../testPiano.C5.json | 88 ++++++++++++++ .../testPiano.C6.json | 85 ++++++++++++++ .../testPiano.C7.json | 84 ++++++++++++++ .../testPiano.C8.json | 82 ++++++++++++++ .../testPiano.D1.json | 106 +++++++++++++++++ .../testPiano.D2.json | 98 ++++++++++++++++ .../testPiano.D3.json | 96 ++++++++++++++++ .../testPiano.D4.json | 95 ++++++++++++++++ .../testPiano.D5.json | 87 ++++++++++++++ .../testPiano.D6.json | 85 ++++++++++++++ .../testPiano.D7.json | 83 ++++++++++++++ .../testPiano.Db1.json | 107 ++++++++++++++++++ .../testPiano.Db2.json | 99 ++++++++++++++++ .../testPiano.Db3.json | 100 ++++++++++++++++ .../testPiano.Db4.json | 95 ++++++++++++++++ .../testPiano.Db5.json | 87 ++++++++++++++ .../testPiano.Db6.json | 85 ++++++++++++++ .../testPiano.Db7.json | 83 ++++++++++++++ .../testPiano.Db8.json | 100 ++++++++++++++++ .../testPiano.E1.json | 106 +++++++++++++++++ .../testPiano.E2.json | 107 ++++++++++++++++++ .../testPiano.E3.json | 104 +++++++++++++++++ .../testPiano.E4.json | 90 +++++++++++++++ .../testPiano.E5.json | 84 ++++++++++++++ .../testPiano.E6.json | 84 ++++++++++++++ .../testPiano.E7.json | 83 ++++++++++++++ .../testPiano.Eb1.json | 106 +++++++++++++++++ .../testPiano.Eb2.json | 107 ++++++++++++++++++ .../testPiano.Eb3.json | 103 +++++++++++++++++ .../testPiano.Eb4.json | 90 +++++++++++++++ .../testPiano.Eb5.json | 84 ++++++++++++++ .../testPiano.Eb6.json | 84 ++++++++++++++ .../testPiano.Eb7.json | 83 ++++++++++++++ .../testPiano.F1.json | 107 ++++++++++++++++++ .../testPiano.F2.json | 105 +++++++++++++++++ .../testPiano.F3.json | 99 ++++++++++++++++ .../testPiano.F4.json | 90 +++++++++++++++ .../testPiano.F5.json | 84 ++++++++++++++ .../testPiano.F6.json | 85 ++++++++++++++ .../testPiano.F7.json | 83 ++++++++++++++ .../testPiano.G1.json | 104 +++++++++++++++++ .../testPiano.G2.json | 96 ++++++++++++++++ .../testPiano.G3.json | 95 ++++++++++++++++ .../testPiano.G4.json | 94 +++++++++++++++ .../testPiano.G5.json | 86 ++++++++++++++ .../testPiano.G6.json | 84 ++++++++++++++ .../testPiano.G7.json | 83 ++++++++++++++ .../testPiano.Gb1.json | 107 ++++++++++++++++++ .../testPiano.Gb2.json | 106 +++++++++++++++++ .../testPiano.Gb3.json | 103 +++++++++++++++++ .../testPiano.Gb4.json | 88 ++++++++++++++ .../testPiano.Gb5.json | 84 ++++++++++++++ .../testPiano.Gb6.json | 84 ++++++++++++++ .../testPiano.Gb7.json | 83 ++++++++++++++ README.md | 5 + 185 files changed, 8428 insertions(+), 1 deletion(-) create mode 100644 Packages/MicrophonePitchDetector/Package.resolved create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A0.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B0.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb0.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C8.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db8.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb1.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb2.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb3.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb4.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb5.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb6.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb7.mp3 create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A0.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B0.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb0.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C8.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db8.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G7.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb1.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb2.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb3.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb4.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb5.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb6.json create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb7.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 44468d6..28d1252 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,13 @@ jobs: - uses: actions/checkout@v3 - name: Test run: xcodebuild test -scheme "ZenTuner_iOS" -destination platform="iOS Simulator,name=iPhone 14 Pro Max,OS=16.1" + # TODO: Try enabling this once GitHub Actions has macos-13 runners + # test_packages: + # runs-on: macos-13 + # steps: + # - uses: actions/checkout@v3 + # - name: Test + # run: swift test --package-path Packages/MicrophonePitchDetector macos: runs-on: macos-12 env: diff --git a/.gitignore b/.gitignore index 36248c2..1d887d0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ xcuserdata/ DerivedData/ .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +Packages/MicrophonePitchDetector/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata diff --git a/Packages/MicrophonePitchDetector/Package.resolved b/Packages/MicrophonePitchDetector/Package.resolved new file mode 100644 index 0000000..4b5117d --- /dev/null +++ b/Packages/MicrophonePitchDetector/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "swift-snapshot-testing", + "repositoryURL": "https://github.com/pointfreeco/swift-snapshot-testing", + "state": { + "branch": null, + "revision": "f29e2014f6230cf7d5138fc899da51c7f513d467", + "version": "1.10.0" + } + } + ] + }, + "version": 1 +} diff --git a/Packages/MicrophonePitchDetector/Package.swift b/Packages/MicrophonePitchDetector/Package.swift index 63cb8d5..a2be8ea 100644 --- a/Packages/MicrophonePitchDetector/Package.swift +++ b/Packages/MicrophonePitchDetector/Package.swift @@ -9,8 +9,25 @@ let package = Package( products: [ .library(name: "MicrophonePitchDetector", targets: ["MicrophonePitchDetector"]) ], + dependencies: [ + .package( + url: "https://github.com/pointfreeco/swift-snapshot-testing", + from: "1.10.0" + ) + ], targets: [ .target(name: "MicrophonePitchDetector", dependencies: ["CMicrophonePitchDetector"]), - .target(name: "CMicrophonePitchDetector") + .target(name: "CMicrophonePitchDetector"), + .testTarget( + name: "MicrophonePitchDetectorTests", + dependencies: [ + "MicrophonePitchDetector", + .product(name: "SnapshotTesting", package: "swift-snapshot-testing") + ], + exclude: [ + "Resources", + "__Snapshots__" + ] + ) ] ) diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift new file mode 100644 index 0000000..3f2d86f --- /dev/null +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift @@ -0,0 +1,61 @@ +import Foundation +import SnapshotTesting +import XCTest + +private let kPianoAudioFilesDirectory = URL(fileURLWithPath: #file) + .deletingLastPathComponent() + .appendingPathComponent("Resources/piano") + +final class MicrophonePitchDetectorTests: XCTestCase { + override class func setUp() { + super.setUp() + diffTool = "ksdiff" + // isRecording = true + } + + func testPiano() async throws { + let audioFiles = try FileManager.default.contentsOfDirectory( + at: kPianoAudioFilesDirectory, + includingPropertiesForKeys: nil + ).filter { $0.pathExtension == "mp3" } + + // Running in parallel is ~7x faster on an M1 Max + await audioFiles.concurrentForEach { audioFile in + // swiftlint:disable:next force_try - Can't throw in a `concurrentForEach` + let pitchRecording = try! PitchRecording.record(file: audioFile) + let name = String(audioFile.lastPathComponent.prefix(while: { $0 != "." })) + print("Comparing pitch recording snapshot for \(name)") + await assertAudioFileSnapshot(matching: pitchRecording, named: name) + } + } +} + +@MainActor +private func assertAudioFileSnapshot( + matching recording: PitchRecording, + named name: String, + file: StaticString = #file, + testName: String = #function, + line: UInt = #line) +{ + assertSnapshot( + matching: recording, + as: .json, + named: name, + file: file, + testName: testName, + line: line + ) +} + +private extension Sequence { + func concurrentForEach(_ operation: @escaping (Element) async -> Void) async { + await withTaskGroup(of: Void.self) { group in + for element in self { + group.addTask { + await operation(element) + } + } + } + } +} diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift new file mode 100644 index 0000000..76b9229 --- /dev/null +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift @@ -0,0 +1,50 @@ +import AVFoundation +@testable import MicrophonePitchDetector +import XCTest + +struct PitchRecording: Codable, Equatable { + private struct Entry: Codable, Equatable { + let iteration: Int + // Stored as a String to compare to some fixed precision + let pitch: String? + } + + private var entries: [Entry] = [] + + static func record(file fileURL: URL) throws -> PitchRecording { + let bufferSize = PitchTracker.defaultBufferSize + let file = try AVAudioFile(forReading: fileURL) + let buffer = try XCTUnwrap( + AVAudioPCMBuffer( + pcmFormat: file.processingFormat, + frameCapacity: bufferSize + ) + ) + + let tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) + + var iteration = 0 + var pitchRecording = PitchRecording() + while true { + do { + try file.read(into: buffer) + } catch { + break + } + + let pitch = tracker.getPitch(from: buffer, amplitudeThreshold: 0.05) + let pitchDescription = pitch?.descriptionForSnapshot() + let entry = PitchRecording.Entry(iteration: iteration, pitch: pitchDescription) + pitchRecording.entries.append(entry) + iteration += 1 + } + + return pitchRecording + } +} + +private extension FloatingPoint where Self: CVarArg { + func descriptionForSnapshot() -> String { + String(format: "%.3f", self) + } +} diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A0.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1370d9a33b005399c5564ccbd5b00c88a1344d16 GIT binary patch literal 10089 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 I{|nCl0+|d?BLDyZ literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5f1df4573f775a4a27f1d88e57a192d114251772 GIT binary patch literal 10089 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

9Ke^V>|KsBw5wjos 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..797832bc27993ac7cf10b1cecd3aaf60fae117ae GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b15144941de094543577e12970ec5cf697353c8f GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/A6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..427bdaddbeadc0d00cee6a9bad52b25ce733e5b5 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..455491a9a6c4213aef503f4b5cc5641283f767c8 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d73746cf200bf78864c5ad62a47b13475d657428 GIT binary patch literal 10089 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 BYsmlr literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..43a79c3a413e3d45ba2dbf7b4e41c43e6ad0ba6c GIT binary patch literal 10089 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 Hl(+u@t|T7# literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Ab7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1eb655417a92a0af29fd515da9fed8b1aebcb888 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B0.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6145207d6a999f83879a4a34c1f6ca1bdcc510bf GIT binary patch literal 10089 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 TA;%0;DY+8$zy4wWmv8(ZKuNge literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7f5df7698f27ecf15b12752dd3ac7466656d3841 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a290d7a9c484df3bb7ec23f108153b6a2ed27d54 GIT binary patch literal 10089 zcmds-X*kqv*#CbsjG@7deJ!MHDU^L3yJX)g*^;s^Nyl=W_i$TrXQo4f!2?eqR|938#L(PzHr^*zt?I?rq9+c`$i|MGLjH^>|O3Kslv zg&=8P2#I3FaNv0O1w{@>NJ>e`${$lwR@2bdGcYnWH@CF5b3Ehh>T%(skAF~5$d&Mj zsMz?Vl=Lj(&D`Alg2IQ7o|IKSt*L$W`gLOyxxJ&ar*~lRpV7~sC#Gh;&oBL0UEA2& zr303>g}$ZniDMcXq0Ghka$Z7@d5rE3Rxno@IU;Y{-JN<-~%#(%#y)h z2(l1Ff)L0oB`-l+0%Vb})Xpvr(Nlk4qaWLvqN6Eo=c#E?-gT>(-Ea}{=pRL~sySlc zi+m=BKZRL!wbMe{HPZ_ynM#HPf@HjZdHYRwGuQ%zm1Ya8o*$zoJJeY-nnWKUZhU^hE9GC*Pen9g~- z$-%k7!K81Ehxc4tOjLi-D6#3Jb7{aU$F)k7Ars4>Fw9}X(lXf3LLM>%u1Du^M-Pf4 zm6bf1nIAz~>3`uv(r80`<7~B)wbQp;XQw@+c9e2|5UVlGYW@C>M#M=RxhKK9;}y2~ z;NqOi+q}#OXSUW~m=&+@J^nvdDql1?mN2o4RIB~rL}Er^4(@y=BtI>M6j$(sNF+!v zJpj6$W=0&xMO_`dI;wTp%YaW@(p5#oMNIbT8OsU7G69U?)-=|{-u zLTLZ)l8cCBkQAg}3xIuy>$TZ!bfKJ2xonDst zrl671dA17|oMqWJmJt5#%Io}d!xBEE1593RMJ2UULL$)%Z`d}cD`SM4U7b@W*~h3M^_P8(s1|>v8JTGFHU}W zBND0e@Ae+m=}GYf{u(3>cb*CPZNX8^tEsrTbQt_fsAi=Ssw3Sb#<{dFIc8=3z<6k- zYMP%fI)K5!(y}?72uE=q;C!f}#_C9M4Hss@G-Sxe&@*-ETxPGT-t3{P+D-a+w&RG1 zt3!c`i9c?;qQfVu`d3(E3tye|Qqq00t=zc~;WQQZwy+4}$}-G8srS`C^pM}nb7i!Nt?iEB0UziJ$6n;fnS)FoklzuwqS5kmPmE^M}4y*u<7Ya+e zE%Xl|5GT%+Fh&(c9!F|>J41ir3A(670;&+AeRP^!S*Mq8ChhllEZA?{IyKhR68!ge z%b;g5=b_kt`-7V;v>aOo*64}*apy^$)~;j$4&9jti^3&8=>2Aq&IYG8Qejor}5iH6t%W#6p9hkJhJ+Cj?MFSi{&=xE=s z(u}>z{>`y3jfh<_B|to^XzT2*7W^2V~SE zW+cwn8G1{CfF3-F4dPt$k2U*F@X+DXsIevzlOn@+{2i8V&N;orJQLG*8F9;|@5b3u zh6GVV2~GNbzZH8Y8n0>@m&-_)X@2Nt@8;>8af3N5MA|K3M*@`(!c9ezVLdM1XIKb! zkOi9`Ss)E(+p@UhSNe|U=Ny$%V`=Bz-Z-l>T0KXJRk0XT9HRzI>|dzu@`uHeK%D2I$vKN|!q&$aN${a7wywN6 zy)U;YY)hKGHa)Uc!PO?CF;))Q-SZmPg$f|=4$dsy=p)26|8S$F^Ka*nS62V3=TBKb z8*Z{L7c9`n`s=G;?;kw`PDco<4(dS$SrOhN6#3%q^JK5wyoHI+WDrjyan>U0YuD{6Q5X<9fxOBPFL z1spHn>og37pnwy{A~I@ZK>nOL<$z8y!E2_-fx06@G}$~7^q z`RlfeABnbR&#a;x#o``RPR^+mJYIVH8E4I@m-hYYgmp6cg4FxzAFgj7qbvvk?37Ot>J> z*@&R;6D(CSbWhRFdAWAx%k`V2k*UKlS_Vm|1Dc{BFteT($ZLg z9*{rrktEm$hcrNv!u7h60Q|NxI3KEVay-=Qug7PMc}U(5E?)^QwSQ$7?&g*}s(Kw= ztr&v}>sa}cUzu5L6>y2zeqPIkC+1r4{RN${FX08BkELcHVGigE87!3ec+j_z&afWD zrjirPF+f)m_*rpY9opGX4j8(g*pSP#tYLBr3jM7t5-_6IQ=K>(>B0MyZ9ePk&kJ(l z6kCbF?z=ub-_i!H)Oud*#8|jIn8>JNN|?v^GxT6-F)S2>G%g1_?M%}59><;J4{tF^72jtHkjv<6Mj?CR=PA~%f$40>hdP{}O*#IXO zC&EgzUViS%?^^jt7}Gvr)QhU`OWw1*ToyhWp4i0J)_>(;p5UX|mG4|lq2X0I_wLFo z&;GdDMwc?(+VN>}8V^q{w}Ckbpa=MX$_=q2oyp2bPejdrM%Vd82AA z?ja_!)Ixt{k5PBfL|PuF1L&vXJPGC@s0AeQjHDf`$1>fwl`q%qpy_FSE(45NJ>tW* zY+SX{@}AAN(f46ohfYcwSbVM;diA8x+Et+9x7hHRIh0>7Dk3OxFMwDVOuE$I6_pnt z^b}ef`g1~id`0b!`4k{IiSQ4{ihD`8AY<>vdG_x4AZ}#mqtBT)(22|-lg!4tQ zZ?k&A6@k&jsB%##y#0o@sqg9Al)(IX%S`IpCM5chnXVeXy(7Fhuk+r%ZM{EMPxa6F zga8ikH8;`^=z)-CDpsh%M|hKTU$S5>?)ao-{rvF*-$Kc!)C6Kj-tSGyX?0zj`;1LH z#rm=>b?Dr&OWDg!4vUe4Qu?$t+prGR@oB78T>I5VDS2C*4^uN=#fd+htC%799>U`Z z#|>~~0p~H{6k7#ZlofYA)V*%!o{-HkDFd};oBDAf70u}4r91WWWAaERk3|>Rnh#;B z^#S%bts3rnNPHc8|8n;F`1khuVQNyS^P*xs+qI;IKXFTgIiMaq@*|*TnUTzrHfX{n zyfNT_dTfH5s z2DTNt+|pR@)n%@?){UKiu%Z`k{;3YjAOHJs&12QFfTpkw1wOgt>`%vLI`&@QkI^k| z8a*NxmPyd=hJ3UCU;oJ$wvWGvTjlzy8KQrX8!7G!@`nUjaL5us|G6=|Z=hvYC9Z?I zWSQ`jirl77Mvt7{jzRCX2o5P3(ZpPW5?_88+KpS>;(Xj0m2XVoZ^)li!kRWas860h(hqMo$A?cPnjCry38)M}saC2^Ikofcb zeLCsODCXFs=f(R~#E665W%G3R4h=^%2jAF<{*f)E5Z&45+67Ad?W#` z*JMc>6v$IuHa`f=B~Oq3{%Ep&(Um?Fd*UQ_)Wws_;{ltecTy^SYaiK2ygifPM~rl_ zrr&;^rK8CjMyVSVjiVo}OxN-|A{cpHZ;LpA0Xjv{=+ zn+^Lb_gb3p%zzzh;N82RHNgUmq+23j!@Oz`^f`J~}0 z{I~{j=k{h#T03wt583z)9;x~^qp(GEz1>qyA{{lWYZxx@AW7$q(QFiM^{Z2lUhHz}F-`h-)gtM#q2~Y2#~w;x%M7OrD2*J$dtL{obT) zdGEgG@1nKxZC7fi?vGT?1f0vmS0hac&gX+!0xvTS1=D}+1lb-m@EGA8%r6Pf__8Wo z^yY|Tc?_G$ty%^L+(SeFM1rNk`2+1610q*g5eW0hN5MLZ&Jc*k-=l+{*Ry~*pPqcUvW>_HKPPE3Qz_Huxj9S8Xfg3bOwYyMD86?f7);uIgmY^UuOYsCbpOqQ@`?^wT^JyZB^v zG7i6B1L^@{O$BgD@n)!bXfW5To+Rp3QWvG7{iKI5JI1%(%3j8svVN}eeqIPN)xTSBc<*7)tUFV0j7-eB$bs_EwbAhVx$E4~2fi;izm_0n z(hzfc^tC;`eN0q--F>xh>?m3;?vufkjjxq=xmpKdJ)rJHa||K?hdo{xjvHc0%>u4( z1}w4=IG5ZACbCeA;&Rh7gucjtto-s zw`Hp_;9e4TlcK2|#J`d{$-h6adwp2yNv8POC*nI#tKD*2A6r6VC*<6P zHd7j+>PBA46{;194B}=PbrhTrk;4woQyfALj{-h8q+*7GtiWz*E}pN@rkQa0*0YV> zpd*sXu_F7t{oEeExqtIZJ+Sq=eHdK9^y+F7O^LL(tJD2P5ko1I*}A5G&rS?y8}#Ms zNjaB(nL8nIbqv1|X}KJ>3FtFauBifXWn>6aUW36gNs)=?Ei{uBYTq?}M!7a@efgS^ zGOFnm_i~X#ocs+Hez^xRd@RUHnTpbq+A=&kQDoizvr`ATcZW&iz&or=@H?%Wll5;L zrlDy#_3 z2jq_lq)mm?LH_WILczj|nFWvgUzlr6?p`{nB&-9)29@wi=0*l}RkTM;ZF!zgw-e*) zF%S1IHNq(dh<9H+W%Kae&}8Wc3|^w9<9EB@wQ`t)BGQsLY!RtvsN50-IDKz!q=lLh zt7tpH0O)DYz58m5xFMIP!H%L79{G0wbAH>a$3EP&(fkQH^lV$qRl!^}YUZqhEC1y3 zM-F6k|KS_c0@-S9Gs~T^1z{#6lTV(U=Whaz7w}sQ_W**Vh2uWofP?+Uu4ceOu)v$A z%HV;ooyBMAvn>|A+US`lqQ4Y$_keG^GbYPGMm|X?XVtD4{meX5Ww9XSDb;v1HTEX8KDc?31;a&`1L}Y z&lN?*>FfKKnz;Q#y+jXWi~gG)bXom*zSWCGN^Y^DF;et{fxF=5!R=>*&je1O7v;6) zv_me%Z%w(L3sg~%G~>K|kZ~Ucd&@-30PF*B@5SjPb0b9oC)W_tV38pJzumK2lbl0~ zN>_ip-Ys){g8H-6$0oo>t#dn$wC(ka{{_BbK}0`}NfKZ=S3^ z=2vaptBtGSPyNL76$cjYd6|wKimapCz8aRsf7oZ*wp#qWbdVK$?q=Y2%+>1$j|wcN z!*K(85`Z2o(1Q>b7iGZ%UmKtb4e{FPoT;|Y)DR1s!tLAYzG_+<@=Ro?BI$^t1 z_^!FqQ-3N_M*ZVEVayee3l}1_SpB70D*X= zDfUg9CADbis#fKjW3&3a9MI<-D`%hZOR}Z2M(($?d_MS;x&F};`yU6}DlC2&&5M** zVw{gYTRD6_EOOx^XWyv|e0j9w!CuN1InAFd8DU!18JqP*T+@uCT9D#kO71xQrNlnx zv;AA#Ant9k&hZC(4g7nvavgStfAt^R?Ej-D8#90a^%`g3ERIM8brf(44Z*zagKy6@ z>*n0->0GF9l<*AkqG9{q%`S*lM+NUaX_3e}_U=Vn;AIUzF)CBV-mY-fhhvE>gb%O# zM+SYff2?&pJS_oo)#H32qc4DaNIIrJK3<)`1>y$hkCBoATn}JQ$UeNmNMBp8RYO#* z8b5-=2h)AIAVuXv+}e=$3rB0jr?c%5BgqS=zJ?B$INAvpRVEO2dD$mrPT+g*S-YYs z4%wCEG6H6>9?<84*=-5bBVd2+j061#(SO(o?sFP!J_NwIS?##cPu%d*8g`Q0NV2Zx z)m7a39=zUhIHTHVCCQSiYvHqVjeTz^HIiSNtH!ldDq1i4S!rTyfft(08*SD*6rKt1 zE#bP8BW#1f^CoaJnd9WA1(7yN;QS3C^Q<}0xAC$q?gPywtIN1VymU0a-?MfmZtZLA z*2?1hT+-0Nc$ex#Wijf7s9@uQiI1{|=5eX)W*y5j!meW=r4ZuZO^_BwO1)5L|er!9f^Jzlb~?7yETWND$Z z{3cZMb7__kgtf48c2IekOJ7Yn8*5%4uX(mT@*;x+>L@#?Zy-+%oFRl9gp@gqhv#5} zY#BIi7@L;&dJ8xIJ=uEHz-05rr_xJ7lZ(av!CmLLv6uk^i%oJjv0A9*(!B$-(^FV{ zpNnayOT_0b4mDo2O}nkDec?4JGkq<(qVj7Qy1r(C)jfut5CN#Skd+F@>S?`RNnqv zk;Srgu|W4Zl{zjNM*aZ5U5E9^K%CQOX)?$JB)f^J>%X>vF(;l}2`P{7C--Bq*d zBdZYJ-%U%~zRVRp+<8_Qf9n>LfAZ_BdDHrVi@!yVi6dVNEnHx_V43f}^;M|e?pB3_ zzcOMF6T{F$q{XrJBW4B3ID@k^Wx#Qe&}Qgi^CoxXnjKjELy!1O`KQ@yl?VS>Dj-xzo3?R0|KqoG);?z7%4kE(7tlP~0(fc)B6jgMS^Ubhrdi(?W^4d|OydJwmyQ4{(o`I*#&paCr4jnjV z{8a|+@A>43Kw#WrkE2P$2^|*M3@!!-OG{?$gX4y473v3j7sT9t;5QP4hdH@8|MY_7 zrwWo)&*LsA6S8U{^a+7Gq|)`+!*$E0KE)!+h|Sh+zsE!L*i#OljEY7NPuz7Qjr-Cq zO)18=0)@E3&!J_@1BWMGyz9)4 z%h3g3RPr$A68@$kHDz~+tb=V#>))fS{kx$M{b_mc%pQHQI< z-j`6v^mxFY$^~3VAsx|hZ<$W%jC-lT=Z_kJS z(UXknLqf7S+zDs<;d#MGMHAFf{3*Zzb8s70`dQsl;a3ZMRMBIev3B&3h-=)gae)2H zOYiT=osl2LHK8^)FD1rNOd2d$u3vR$rnkD_XkLT#%@bo~K6SXlqZpV2>L>y8-}xAv zrNVQtsDdsU%-cHY-tb;|ry??IIpg!>hS$@NHzjhqIlWtTRU6{K1L>I3?f%%oBh@9X zrO`*a;_Pdkq8>3F&N(#O>LYDUpVO_*NDezZf!swi_K6^W;^Fgw_t(G&ix84mO&9D# z@S5pm@LYdF3U{^fH|I=_1$8lupjPoIuXX$MX5wiHzY%|w{ogNfYdjCxDI!~MFuqwj z)+J?qB^T!DyDUqTUhYG;n(W((QU@9J8uXt8j=p%RY!1(KR}CCDMKw)U=o{XQO&Stn z#nown|AIXwt?smE-s{Z%;}!Wr+q?R)O6x8u$gb}P9&w6Qt0)+ZHMu1Ht|cAE8tv02~I2NRbQw#_YTyJF1d4n~ceFMAEBW5nh@ z`qzb66Vh?MJB;%IapSO#$Ai6?L^>6o7icOB4n7^^Pa$+rMl=3i&3%)&7xq1!eWIo$ z#O(2>&7;;sJH*K0V+n}ITiMKw=iM+bMkgG)xVe};*qTpod}-O@pNXQB3nHXs?$4fL z_zm7yS;OyUT+_gBU_T1-hq3o(D#Hu>1=)B<+pNWH>HSDJp@rBoBLp7_eO5Q>PQUY` zYoe56g(ff+Xd75VTfi=_YEHOa!udAn2OB;)J;<@^9kv)rxn*(t0Lvf0MRNeZf%is4 z1eLL`(qQC|F^C)R!KT~eNwzw@-QOCcvaL@Kq$=F2)ZO-Ik)EvUW)sH`T;f=1=3Ai; zR#)&z4!F70qyL_a{s?wk>s@YkY)&D=-TAp{(J%)E>JCRA{GNrKis(lkWJb!XX~T2y z$!uvnCCyA`U14u0_jib#wegYL`oFpocW%^InvbR6Rl_W{@<|iS%7R<-Ke}AcluLN( zSKVjc_RphlsZrL4{3^9*YqW=RZY7$GxWRLlHC#uz+E4Zyfqf!P1#nF8r#PfxJyYR% zachg00}9YDmK24rsneaVY;mkd7y5l?lE6RbV%8RpX1=bswsFk(%yctm@-}MH1?UM> ziCGiQfEU=rQYpsw0zm$x|Ht8;N++ZDf%_<|rxb6V4$dbHmlZ9uTD{>rG$Wxc*?Blb zu(LMX?QYAGYv?uE?s7$pObM$~LgUmFW&hldPHV2ah$~iCHluOluqtBLMA@+*-eAV} zLqOk-=S1+bm6$^!#*fyT}&^qdDymWH#xKJ)E33Mzc%exB!|f$YIi%x z?p@8n>)W%K3pHFTE#sATH$6g$_`hW3*iN@Q|)-t4fI?=BbII?5dtpIEMQ3B=3@Ee$aI2d_~m587!PD_D#TN9qM z43o+vi@rDF0a6UT5upV^=hq(-qoMyAR z#2#>Acl_#bA)lAvrfI&gZt5gvu6E~6edRZj;(^OQR$u%q?Ux{>mi$_*iZC)uyT%<^ zKqR(D#8`KoX)tC%T;z3t^?-RU3d9Y6ihu(gMt##zhvTM`#PGqOoSVZfwW5c+S57dQ z6fSNA#8}d*tAe`xL%Woie_u~^HSyWMQW5R_qwCr+A5st4CN^MgUtihq`DfPg=D&Kx zBzKwr-b=v#jnfMDHTHZ&KRlP3-E2{aNj@s9qgIXmA-e*6sdQySDiHhjMR;+uh^@ pjXm7__C=PqhiE-@6WY^P1$d7Z-o@@I$kOw6+Q6{`}z zU!St^r_Jfxw`c6wy?385d;fug-^7PYOOKy8RZ(@e_WZ@h%U7>myM9w~tF`Sx`=hR> zFJ8TR^S1x}(1%g=_=Mhw0<6HekYy1Iz5M-uAvR#Yq31COTI4zl4=;mo|6sp|YrSqQ z_JjYgKj>FFmLL~sDG7ooIEkaH1j6AP*QPqGK%hA4gri~OXo+*a{190E<1 z!%W0U=9bVyr>TgR5Z-~m4!RN!MTpZ8x(}3X$~8r4(U)WTws+GVZ;S|z>TW4#?fvNd zVgWTH=j;tu4=cpPzxOpOs=unvjz1te9Gvl2e|(2fY1*l-UO`FwEI&GlBUa_ppFt^` zA?uC*_PCS2!)e3T;jV-z!o}%ur!8WtMwhgIcxpI4a%>pNPco3S%}ScI(o})+x|i3O zM}BTlH%L&55ltHBsZPpw)T*ZRkp*i$XK_rq=TB+~vTBp{H=F|N)!7)I-V+K6;6n*Z zgt8@2SpHUp{V7D-jM|%wO>$Io_rk0*ZO0717~ZDc^X~YCQ&QNthIs|Or}RrwkM4Q) zLO;;u0sNB>qf95$TYK^;vAGw>x!bFC4T#~gpl{^F;#Z>FhGIodFWuI!n0@zpt# z_n_|`>Fq2L>U_BdFQWM=iAsR8i6~Z;x;(+bHV_?uqQrc_6(6{7HH7rQ;g(w=2PedO zoL`?MGUM!S%79(En&gV)-z@cl&BvEthUsry`SSa|tq%uL=`*#=xT+PJ`9)SnPPVZy zywmO(RiCd#0^RpK8^mx3VwKqC3DPsS#QN4&1Rn4MI4hxS7>+3(Qkc6(D=8*4QZH>i z^x?^W6?T=cS?jE|T(qH+hV~`#B!@qQ`;Y5=TUkf4II9iP-Pe%^9Cr240o309YgYIg zv}}IclT|7V2S-zhSgSA`t6P~8Jb5avlee0H)WE@(!!U(`1XorhR}0XFN2ZJ8&Rr?j zle)%c4zPx_8_{lQ%=KYn=*<+yAK97Wv%%@aVO?n|Qg0 za`w2zi178wX#7c?t?c-Hv0$PvJrg~)wfZUP?w<@3O}0w5NCYdl%Ob0Dru>TW!P8U+ znB7PUmrkoHL~v&TpM(`yorV-{X@;DU8}d69)qe*vy`?Y( zPo0Wq?^|vL;uc1on+-7(f@_9PVb|SW2UyNl-%08d6&(yt_~5ilP*`zoZA-2YXIj#e zs^xcm6{Od<<1H`QYpet*X}3*m!l$l;CM0A(ZP?v7iG%4aAshBDq34`PApyOu%vw%@ z-oZ<$b74?FvKhuWBg!w^eexY%^VL#RtW|Uz9mefUAM|()dDDF*wO_QkgHaO(X}2`w z5`^FN>YV6^p6qs9pX2rVNVmsLcwx$9+{CJ4mo6MU7qRRuOu+#h2aq2e3`bfHg#e4K zR6=q-g2E#7kRih&=|i>2eB44S?&Rp^I4#uOs-VkPYaao3n1AkH{&Vw-pep0v-Wv$6 z<|~JjYNqeN4Sk(CsRN+vVrBv~e=bDdFpWzBI&kO5VR4Hr+yc3sLV`3F+P?&A(9VUt zy?L$IX}@LSL=Oy+-J|s-yixqFG8svKKtM8xM#nAsx!bdu%8bB`-DbjtDtSM;X6EcR zw~1k_PB9-XWlubqi#73b7Z|-EFBT*BB&smo+sfejz1g zl1#Y>MuF47TlpX_J`2z~2Zh^bn&YwKUN+}mY`F{ z34_L2e`gPUXi&XxxhpU;$fYe!^SfgS%Oc5lRKS_Q;Z_khbQ;Wdn8LpJ=OYLaXqF35>0i4$;0$EHRl8y%g@Sv z(Ig@d^wZ4>(0>fa-M9*QSs;q zXgMOpRK@zJu6^b(Uj?K_;fM-N)fLJbcM+Eo`m$Fk)_&tt z%zOmuw8Un^35Y_)<5RZ5BuE8C6uQGH?v#Vw)5i_&B6xaA>?f-OUpp;~v4%KNh|LS- zQNM&vNZ7l?u)|xuZIG1o$TY{XQt^5$f6sT46}lCu^|HaaS*sEP_UB_bK-c@3JRHyg zZNmvV5#YG;!!aKXEZnSMJ5f%_@0n0%5nM5$3ponq>7YI9h{BcfmWJ-Vk5?X-q)p?z z?NGi=<~Aq?nO)((8QfVl=A1H7zIbrakcY48^cQC>=A)RdvzS~Q90>AL2vID7uD8Ji zs0R)K`C+?L@;?rez}$4dXn2ML<$IOP_i()7fO2}eFlyZ)9LIg(*qV=H>3TEe6S?=L zLvmtdCJDVWVDd06eW^S`S6Gfg9nGWPa0=}^5QQJz8q)ze1y4)}CW5{lRk#`EI#E8V z3U1U@t6%G_Z=8Hv^0<3(Zhu%ZVoII0_FsYknm_2C3#Vt_zIo`yxa?YA& zO7HF5({F3R{$5+^gyje8+XdEK2X=Ihk^=b5I6-#;x_0GqMpd)S1I!zeaaX<_9kZ z^XMZ8=*@aVAswq9B0n4lbP!s&8IriS+0-22 zHuk&poqXPWUHhIWVV))aU~~3=e@`%AI>6=~kRPA}YkYYp4B{4-5RCa7hw7&2bZYwn zb(B8T+v(*4rEeIgoZZG}YOe*yPuJs*>F-p+Zd&&4Yd(S>P*2nu4B16q`q?YqdJf869VMwuqxo8;1nZ3*XX;Sz{b9(tRDyZeAkt zn2eiPC1im5*-WQ3H_llEC~Xyy*H;LJ9me@77ItPq+N;->;j7<8r%6FDF9(?Zj{<=fvgN zwbm+Y;BS`asrWd40PZS`L{TPnfEO04d&gXC!kiD|U&Hj?(}2A8hVzM;`jQPVFu43@0OaZh8RWMn4om zbqk^Uw805uVDdk!k30U#zN5Rq`|5`ODBlwFCH=d`Z|QUDvl<4cn0O{@X`2wWk;h4& z+y0gk^+s~hXo{8Ajf$S}*5lGIealZVb2$?45B8FBl@C4#PfQ1VYJd*X6rC>ckcKLV zOYXfpo{ZXDe$tIQWNc@3UhsNFGR;Fno~oAlb+m9CP@3;Uv~PXowx_tt>$br+yylPO zbEcz}A-nMVKCS#0;9&k%#%M>t-Z*vUmd=RK09=1WFxX3=$ig((z7A=;Eb=q`+3-2} z>4zL6oo4xP^)o_o?|bcW4TNf@c_7ReQ_>GIADIHPI7hmFfJviG|1Bl@j_ok4*3;45 zdAueoXKYT~1bio#-Z9Cisz8DF0CRlUB%fev8bWc3{%CX!%bpYa40`i0H+Z%u% z030GO5Y#EygKMF6?nu9P8RtR8v8;Ga#ffof+xFp+J1uW^)8&=H?H?_IC9{Ly#|mK` z@RoN*oe%lbqI4s5@$W98dE->8OGaCGyW|JuMob65N5#|Hkp?jL&T#Au$NEA#;By%Y zp}N6r7z#7l7~;@r#uy>$QN3MpZA0cWk~yO4R9O4xuQ5{ zE-pwP6Ey6K1}JAVeAYkNnW>mx@l9`8jCh=cfzW4^E6m8Cet3b{Top=5!*K2w34=_l zXj<8aqcjSs_(g2yewK|?;;gfZcIfd-Y7>vWP}k^LYY*;@5p#VfKJA>iS83Zwr#2F3@hkqrpy{X#KJ`U=+LKQyynb&lEQLx*5)w(xluL{o+ zIdJYIA8>bJ#6wv9v^e(ofcd}y@CodPLi5uQ`%+}|THVG@J41CAXS&{sHG*IDVYM(9 z^+@V<5ycN#oDL1SbeFt^OVx!cjZ_m{R1&u9)n=4C(RxTrF-#aeHok_ZPR=1f*ZGY0 zY>6#26~qnOgNeKVGvo>sNT~()9m=bJiZ4lI(lQsrn&IMh=xbInZQNYAa%1m19skq4 znu-LSI39V9%Pc;3TSF&rLe?a z`3gx^$!~XjKH0}Ioh_T5L%Q)z2m65zTsPA#tLB2ZA$TZaQrE#i*K_KA|2?UG%4cwL zTg*Rc%5&?s4(?Y!OsrA$kNrhtm@U!KO*f)_PX&E;Ng5{#E9ZQfaptMSRmpHGLSrl( z6G_#(9V=FaU^v)b!dRXS0Urf*Y7Y8OTtWaYC>)BTq$=!A)uo!i*{wbdVn&n_lIp0DN$55y3d02skjm7VdO!yY^*<9UpcBx}7cTsC#H&98+&$W#&k& z;u&(jaeA_3sj=N|TjC>Cn7}tg+*1BLp`2@H;GSU*p%<-Br>xuOv@HP352({T>*dfx zke`MQB%QwO8IgfPr4yl5IEyM*VifdoF83yZz{#AFaxJowD!?rfR0)2AXbXV(aN!{zKLP=b8Cu>c=ntyIay!LZCNq9%PL#kYGA+jllSTJJKAa z(*@FZTltpqOMa=S5+^PT$~#PmIFws$=2pb&+$rgCxY(bdUqu=nSoV4MZBFHkHu6> z$$fnEScF&Ooe!zrn^%+nx^=XUshJuOeLK_j+6L?8<7DAXp_d-)2wW+Al-2g{ugjAL zDrT{|H+C%zmRMjoVD1$%mStmpjW3rFE%EqS35zkk`BL2=x;tgh==_&cN6W&DI8!M5 z+&+r>&;?e-)3xfSy4XMbn{sW|7g~*g6WiY=ejmSkF)8`r&8=i+xAac(xf!JBorK`8 zMMXmx4t5`9EQ3Zt+*-;d4q$Iwx$QfsIUI_nrebqd_GnR&p|*RAj_wB?Z$2#B1eyYONo$~6OW+huhWvPuJ@}*I#AT=EY8+YP7!@>mF)w}Zu z6MwGh%N>Z2`)f)$b9xCCuCy<8^Rq;@S6OJ~6#Tf^_UonFCi&1*M;UQgKLvhW;sE02 zneZI}u2e)(=V0|SXs<we+_5(f--CcpMOF-OkJv<*wZ$bH~NQQe` z?4C$1K_yWZ2+hI84adou^;A-MGuH4u|0pUv?O?X!i}dbs&~*07rjWr za6tVOF=DYf5#$H4JWIthcwSiFj>7oZBE7VH!n1qQ)+LwSz3UjtpIvz41S8o%=I8Dd zmP8KPikhUilfhS78wTUYPsLuaY538lDKCp`ur)?3;kbEtju2}m^CMOrWW<8FA+%n{ z5?j!>As!pM?*td7!eF1fuOut! zouNZ57A|`I8L8Yim8)cTlH$JQM?CETgy}7`9Pz>Cw{2d)uN4uL z8i?&f0oQ;a!NIq3)Z?;}P((kd@2R{|ZAcWYSROy_eh4`w-61at4xg`+RdNhWLW;lq zcPm-tLXjUj>m+@|xQZ8SQ~UWFpB!c!w2ZEz!7a zR;6ou0@(;>DvNuye2}Gua{wP`i78wpf4UCUxR}kWi(2$N@ZCx?8Bex& zSJW@l?)!3I@dJ{sZi+ACyc{H;gNv-WbkQ%MU5h?9wmTSq}4$d~A?MEMN~?$@)UJf6GrEBL?h^B{nn4GptBf zxIrGkQGM-T!@p>!=pQ7>=SbKg!_{K8?BV8%`F+#}l!xDnKwksst}H&=-P%j{@JB z%AXrwXCq(AVw2y0*!e|62Cpddbe?L@-_2jfA<=z~a@fZxJ6j{ehuqv&Pm9mr#X_s9!FvA;3%8-Lcf)G^T)2|>lbxi@R-~eNZ{QJ z=xrN4!>X#F1kBgCet$M@QMe+iaJItJ9SJdsZj1DmObL79RsBaUQ7>!dMFU${?70yQ3;n3K-(b|M7Ax?wVdFqxW@404Ri}&EvU42wHZM8#CLG`5@ zfzk`oz9*<#y(FL=ato{QtoZlOQr%tMTG{tc+McYHC;sp5LQ^5uaX1ODgq8#92k=ov zO!{>Y$PaigIn}(pl*p+RmHdJp4he!5J=^K6+NEw7B=0Dn6)Uh$oEKqh~3P6U1XH{hdS-m%)?h?tRFaliA};GGr@DxBTy z>ZGU`cTS!yIwU-557{JLOE8F9<;|=!ot=)weZK$MsxK1$r2D(;b@S>>3Ug#^iNW6Y z!B#^2AJEtFJin5zx+o63RXf?YDPndFBL?d9%V6|6=21PSZ`%U&* zioRoukxIM?PZbVXVR{37p%m!)fBQm;l^YT4KVGq4EjcNim=wP)KrQs41aS1BuX{9&Txk!n*#AHNL40r}ZM z{|D3$o!(La^5cOI=Xv13dvFAGw!*;&@gA%Hk`*2dE0db^W5K?8W(FlMzO6aM_mjf` zbc*Fbte#|(Idx)F;x&br5R}hMk;lx2c5tw=B}9{g7Z8njbO6I4(b&a|7(@ZyPd5~l zfV&v3Gr|kIk46;EVK_Klh}Gxq)(JlpT!K7Dns$Jji~EvsgM7%0O)zjRHH@s}zNq`c z6RS6Vu&+3`e%MBNyLn_(M|)hQ*yMY7%I*uPx)$YGEI($ss$2%}gUxiS-nkjrJPPJs z$(4TB==`(Ty;tLGWM?x>!FHqE)rJdy4ZOQ^PH*qJP436Y8YBw2X(KxC$GIBIhrj;1 ztelGz{NQ(HmS$ooqzU=?lA?LePjFK2+etqlgL??$0Td5(oii8X18_Xekd@HV{GSxA zK2U96{L{QP(dg~er^t*qD|hre`{)sK=_ii$m0@cAULL=bGe~@rlkxh%hKGsXoU&u{ zI{K4J#6i1uZKlk~4$;KCV9J`^D+8aLyuJ1xuus?%4 zLxg7+-dCNc*)fSj7OS!>|AFT7*w(#{85Y>zhxktVTPUa>iH~B{G)d)z+uW0w5t8!b#iE> zji`);@u3h@b&NRol+6?x@M{c*4*cLs1RMbRHrN-w3fI0q95QS^dadculLOD%j|ooe z)a#JV(qHCof093%!+K{(9zx7yF2_40_@w)X1Zle2M_r*Dmx|WIqSgLr(C0N6pG_1T z`w;yfch}7hHoXNY)7-3ZhKPmWPM#7&os&ZMu~1g#PT+_1hk{RsWX$h{G-J*;qvUZE z_DbX}`62Dg?Wm7q$4#ZsVHm#uW>x2{y@opJy9Tv*=x7RLi+^YkOkL8w2*WW0@0!-J zb&AanV6Mt=0Qu>U!2B%*>{$?a*EB9ui=z4!Wzocwy4Gj82_W+7!ZG1^3f;jMQ#?MTqjqWPZr1GmO}C5?($%ryMpv?*n|)t1>9u zHL`FM&^1L4{+s2MvT4+5&#k2OnH2K4oqj&iI~SK}JjJ^SiH4Vq9q&i0X8n0%0i}3l zj>)u378Rs!FfO_|Hzv^Dew25wAo?4hQ`T|WgVqY`-trXl*<745(dCm8yT zn}>{!nP^4AT>TWy46B3%#1__SEmahfY+R5UJUe^l+LnuPo1;@_Jh>O4N2(XHd7S1; P&j0tX*Sr?3!an~8tK{#h literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..658061065a2b4ee05824bbe75d06b7f3d0c71a9c GIT binary patch literal 10089 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 DkIff< literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/B7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..906a669a2655ee817ee1e34cdd2d28ac7d599e3b GIT binary patch literal 10089 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 Sd-Crte|lf&1?qj(=f42YP5oy8 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb0.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb0.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0577fcaaf729171115b1d60d6267e2264099fc42 GIT binary patch literal 10089 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 NAn3pS?f>%o{{#2&DdqqG literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a18cb3edc3af0f675d4cc5556125ae6073fbcc47 GIT binary patch literal 10089 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 Ca9mIQqjO$IJVDzCY*nInT@5Po53*fB7&X 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 a(;{ACO%W0h)dW?|3gq(s*N^-^efdB9;NuPe literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7e505d8ae96ecc588ea74e5e5bfeadb87e8be125 GIT binary patch literal 10089 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�~}Y*ZX^l&hexN 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Bb4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1d314beb5f7f2fdd8a67c74843ce8ca7c152f9d3 GIT binary patch literal 10089 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 aH?*^j9H^+RXw^D%P5==V1+7-J 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a096aaaaf4ee3d16b60cebdf6b8ba2d37e4e7ba0 GIT binary patch literal 10089 zcmds-XIRqj+y4RCf}o<}Mg&6~kt=5c?wLEYGBhoSlq_~$r$qT-A5yx!OQ93Ovwm%79LAFs&7lr`X2 zNZ@M)3^p$jhCpGJiDY$6s;+^Nv5ASPx#a?zg$~ZHe0MKj-+;v-;gL}*1gqi`)~2MS zZrrkU`!10UYh6SgfsDZ(inwCXSvxKnC`7=s{AlPpjtjh1kxAXXfe&(0p_X8^GUoUM_x^6Rl z)#+H2tMh38uc;#I@9UHX{9{fU5JYgqzqh&Xed4t?xcWMyVH2SxUEiG`4zfg1sv3!* za$&07Y{di?hHzgdKqK9Rp5kM|R@uOhc>Kzs#$Ch*k&$#c*819xl(}Tux0sC@Q-ij} zvsJ1k;>NOjM*dOr^5^E~YUR~`EYW{M-=US%)Xm>%k{F;IVz50C;vh;CV%12vh%6_G z*a}7u5U$+G*}W%@OR42| z+(=a%dlp%JNEVcKR37$j2X=cx>S@cfrOgyV z3*jL34;(QO0f-3a(7 zNr05mxP16A;huU}V;0)HZFR7BYVE)_%h@5lrZ;XeK}fob%GsAq7pFB2C&%~I`fzI) zgY*XE{i-=fCu6Ogwe8I2W76`Rq78WSEytD;AP$bC$W|SJ$Ec>N*6Iv!m?j7=Ga5~( z6D|UI6BG_;pS5psc%p$gppsozjKXJ>yx&u;X)en+Ju%lGl-#>Mlm7Ok4lKhgHm%t@I15{-P5{-s&@`aFI0 zvFeLgkMMhMe0vsY;JXpef;jjR#ZKIaNTf<5jYTOK#tZ}jCqQEbFfJ0}2(T9}25-;b z_;z<-Tm42Q>e#rVqpZZp$NkKD+6r`vBPH?mwKPnD!=TFNC8 za$Ev2@_Z%6s?!jMP@*WnKNN{fIjX#<0S?gh4`MVL%Y}KOj&bFMvb1o2Zg9@$=U%Dy zzEmW2UwuCFrvA{mj}EH5*fx{p28jo#M@Ckd9@?#zpo@ID*Z4Mrf4WaQacPz5y;9|p zpaWOMN&|m665JB_m?}rr2yj3=&dZ{aVh@-*;7BC{R^3M<$Y0jI_=L)W-6tC9+h6b{ zHeU+8v~qV=!o815=GKo{YG~G0clTSrOEK3Z3BNME<^Lodc{u(2H@fHj2Q#0}{)K-y zBt@1MI3HCmxi)Il+{6T-XAzB&)o>RfXN7=6e)@55+THk$wFa+PYSMtnCo6F;G@rYW zcW^Ly5oxPetU1FL;R?KVT}-0nu1Pt&>FOh^670)PkCb1(@o}zs!@dFY(jX3zq>ySp zglC!tslt;6I6!YUrhvm0dS*lCBYW>(s9#QOn}$GdxO>50->e{%jW+irQUB^}}@mnh1#mcS=it!f}| zkPeV$(P*T*a3K=pt?+`oml&&-m{_D?o|EFR~;6w9<3r)pPjJ&r!_;{=dl^B zfEOf+TAkl)q6DW0xSe-CSkwRVO1!>dS%A$D9(G9ZH*XUB5;#qbOc1e0sfYy#vhi|^ z*bT;m^j0Wy&m^k1XBIKhS+;g%89`Eu<=1t02I`C?-m=T{?ZxJbywqk>W@adZGlV=? zXSLtV2mF4i(TyaG`*C}Ty@r`vrse~Pqf(-f;D<$%WEx2X;-Q-$sHV%2GA`FmycQ;v zNVLxGYFDK?P&+dI{py~{;hAZid?7%O#0U8lu0=Z2aEjNqou9%vD2Xb0^Uc5q8Rq1` z5A{!5ewD#Ilyb6~Zr|Ci@PRlalA;_R0XUGZ76Lam#8xg(b2-o(*Bc2q5~+Do`~9s?-|fn@s#M7n-+gd0bA#A2 z=#+Y+5Awm+l1$+%LH3YCkJRSow`U<-nFF=!h-ZEmBXfTIdCK|Sqy2C@oVPo~A&?Yh zn#00wH5j>DrVPtX`55#kdU_Q96(Gn)vw>-)DWtvoVth4s|Om>@7iygr?F>(V}V)2QsnB{j}0W(>puK3WX&Hcf@8 zbhCjD=J9F9QIKDAvzz5}SQ|27@Bo{jp5SFsA5_>^kIVe7)7^LY$|z6c*O751QAIwe z^W4+w#p#}VLG4UY??U}3#_Czo&@NqrGuz7FJxpPjHKqTJCllxm_*0@cPY%CrZLD@%@p7q!`{*&`5|)M82WAvS+6y0fylIa(u-Sh3 zk-HCQtTxAn{niWXKlZBSHGH)BA!7@QuFAXra*A+JJY*1$oIy9{(^f<&Aw6JRz$qmR z%pxs=uiZ^Q!$oHA*F3CFoUEth&AfR6%nNQ{)pTL6ZtA##F-2+onWQcn@`Vk5%)4`7 zUQN~^f#G*?chwhyDk}WXJq0?*#}C7S-pEEea*i<_v3yx1riLrG2j>I)psoW!VZHkq zm$(JNFo=q>KBs65Q$Kxn+wReM^l>DmN=;F?CFk@Z4n5RaVFk9dmfec~EqiNWvK)=`SM zC3Dl6Ji+e!Q5mhiFBpHgcB%Me=EWzwL+~5Smu9q2=RbPrnPqmpKmX`Itvl?tm+LNg zr2~UFD$qTBAetuA$UL1^3lk+i$08Ew0P6}k(!#z*S<#wH>jkpfsU6KzZ~8b_-VSSA zzc~E5kBwCvfXzSJyL!ZW%+2c!0h@OWf1DeJ$sVv#_ddPuyNKUnrFn1nqnIDGzZ@uU zF{(A-e1NXu2$oqSq=QAMB%wl9(U60mrS#0{jRt*wo3-N91bH6IDgTbUY%%QA9oQ8AGIH6OzZ}tDU5gy09209k$21ZH^@)G( zDfa!zkw+#I1?}T!x6D@=IPx~%!H|fJUE8l#I2iQs=veUByx%8K9^<+%CdXHm`aMyE zJ-9r?k94JT$jgWIcN0_R_D5164w0Y9)$1d<5tZU}QME#@Wq?Z(|&R#>R4afU^qQ5Hu0>HdLgC zvY!w?+uc$ca>v2AG&e2nnV$$Xke)Dq%-&?(4|eH9@B4V(@y58|Rbj^^@BO0qp2iyX z{}LWzbvRZFD#r*P{yWx$mOcv2P}i%vDM`ZS#Wcvb)oB_Jq>c z6_i38jS|H+<#6B!RC2Aa(7A_*V3 z-pqU)SfQUI;JMv%GODm-2y>chNj}^vgS{X1b$`6*bZ>#VoOcaM_flrq>|9$ny945A zg8mwC#;Gt>xTDlrPC(Fr4j_NaW^)yV{dQPsNq}LZ&XUHrl8j&PBeyuF%8M8azlEbj z%iz3;w4f8Zu|=9^>#qMyWFFNC=lh(;-HA2iK0tp}MD2Q&Yn>cQYWf>b0qy}jhs;rd zCrPQRV&Jd;+|wrS>?D{%)_-+&PTH&M_wne{hM}hJL&Zl@2R{BDHeQPev0=B>j4&64 zWgNU-;rdN{Uwz3HB}V1`$iWDUCR2_xo8Y6dV#P|59Z4bLHw$|L*>swbS_x`KJ<3Y&pGr(Lqj1_p|)PnpJKW`)FnX zp-*kAzk1~k=Pyfd3Q&VMIwgusOt@%F8|WYj;vhK25kS{MS8+2}PDJ_PuY1g^T2r0^ zYsh=O&B^1Ir;xm(hqz(jao%yY-S?5XRhRUhUd%KQ4Uf);yZ-dx#^HTdOAyG+HOhqf zL(hj(HB2)gjxI@&3-Si~DzXT~(}P5iNs(wOm+Opd76MLlWVrG->K&w^#uxQWk@r`X zW7JH>1$3?I+jqm}M0I^GBWY`{-sIlQuU&(Dj~1Botnn1D6~+D# zN3TSYi+v!PpaQ>6sxj|X;?0>xU}Sdm(}egErkh9t#W zRJe$)jV1Atqzok<-<%nSX%%ptvXi)T63Pf0z3D}Yv3Nt8GCF;JO`^#GVcE`(%wv_$$v@q=?lIan8Cy3lOuL(zMt^3D=L_n07z~;xdm8<7 zIvYuu5knj{G;fE2cpSm~5jwN1`SyTQFA#z{2ksA2UU!n=dDrKDstQ{8JVtCm5AVHQ zv;XL$C8$ho54IWF%$P@I=h(mXug=`?z%Xv;;CxAH%ZyXb`k1oxnPIY0UUz*Q#4&^V zw=mHJN2U^^Bjqq{5d?_C9d!Wl$crdOaqBb$u^9%!^(1-V-SHiyOVp|xlZMN+^&Zu> zpGd6f#+@d+zDl?E2#z6y)68dw^<%gC4}Z01zX>q#W3I{T9@3bEI2OQna6|A3YCd^% zM#uzp?yDK(2cw`5fz3&5S!%5&>-;oZq=!Zh%BOAcWaPv({N<#Adpb##kh_zB4tStH2ty;A zgrI)|^Us4qyIuVE^}C!~!x0GaL`JMotk{Dbt$o7SWw55WJ6|C>9}%lhzmauEpg&58 zQNMfY+jEV29bGi8^lZU_a@cmb{i{EEY45d)yy3-pg!&Y{O#jLs1_lZ@>N_%D4xQK#zUHKo%tDI zrL}4y$-YGc73l#3;p*L=OV;73G48~02TnzTS-w(c)Xm~GF^NwnqqZe(Pvgjr81XUa zrEAn!W_?@FLmb-@#TKY8kR4TMGg1%_@2Ob`re011{U{9FpM-YXhs{kMAyyZvFFIRC z>Ne1PyV(o8RGNGjo?T}@_u2@B?m%ux!%WV#Jbo;4zP~g0O1-xjRhv!FjERt#9{cvZ zs2<`tfW8VB3g*);;MYPV*y>mK4R-9RW`%MLoPSmsa_Rhv{`Fo0ut_j zzW46x1&Vh(LVS#9>GuZ@E1%{_dPI43Ds0>un^TD* z1N2oBRIF-DQYxt1ydNZ>H!wGXcmT)H>dRPxin*dO0#RGZYO2^Drezj0*ZsIZE=1@r z(oRaMXg)+so=X1xN#%;Y3Z{mSx~NrIPIc1$)yCJ=S+di>q1+9M$AzRQ#1Db`W3OW5 zDC7XYCKyBgf!tM`1pAED-y?G6^=u}_lLyH+>2XST{LKn(M{O#ij+^j!;YL>$^OA&B z7^ekKr;cK!eVPxtF6k+jAzCdl^_JqUDZJGPS5ML(ucSd4qi^FDkcY>%Od3kACM?zuR7UUi-S} z=~mzMFHA^USfqmwhO5?}&KX@O$k!88c?P68i!RKABA z_7Weg``Ub(UtuH6T|DsEKY8PWy(RFSX|g?u7bSGb#2{D@M^1A>nabsrD6=%>s--#B z@0Z8cMg)ibPGGf`L~-mZZ(Q8kBcCh%mwY7At)hlpEZM0rV0NCA+1Mwk`I)~xSBHPZ zBdHWHt<_?4ETDMY!2E*`gO9PPB%>rL@B==~EC?g38(joA(jufLXUX7>@ZjKgLm%9( z#!3$wTp)fbDRKK@Ds!he zzF}GiaN;~jiXy<7rqW1bY$4M`13twJ!4&eFY@qWYB3H%cz_+Lgq7RgJlQRzRf9k2v zHrxn(uWfWexQ?%%bL4ir;n=6ZPeXYsN%>_lMY`9UKj2i(l?0J!t?o8o+kIcZL$^Zl zc#{+*_#wE+icEqhr83Yw1P#)Gd(9%?J985K6UD)FE;T}c!ed$nC7O3{z{WL^Z9(TN zTm`wtZ;QWQ%>H!gMi?_g)S|P1zJHm}kT58rWsivR(b3Q(xkH_AJ z&Ii)l0x$=Y!THGCn;<_>Xd{pOTbCEzNts+{lxX0mr@5=7uLS2FSC@t78Pxj`#X7gW zN4v|f=MKhXD_z)68qjKB<1z}5QZ-VHSF7YPUsz;TT*-&x@deK@K;FRp0sBz_Bi0!B z+aC_pU(Xd1&1>Xs{tfpgY)D1wa3h`S)ri7)ilR=v?RdR|3B>U$Q4}hNie7WDq}rrZuy=t^nFS%m-U8Qb zpo2=32QOl8dZPP~5uIya1|Kr!Qr2*?QO~VfH#P~)H3z|pHcLgsPIbvd@y*Tru?+5%3-GrNiQY!F zfU}>^WF;tU_ZfG~Y}J+Ls)#+X4?$0a9zW*aZr)WPUY8SN6+tf`|s7!lW8P{)NW{h1<+e4mH$c5hNvRX;p0 zKId(fE4eL16XFCzx(4x>vQ%njgkT@Sdtnxck;Kw?s6=_6jKF(&4bu}_k`tkQ-l8sc z*gQ{IX`MHQAAP*iLyJFWtv={z@M`_t!{-_M-C@!ky7YrRV*HTar(>y3xLVVofsaUWN5rR1jJ__>ID(5cDY6g9X-tHzXyTnrJI#yBOH#0>%=aUAqaJw?)M>9L$bRi?oa;~3F`JA4tQ>+ z191>~fKx9|fbNf6c5AbnBzMrdll^+JgWm(TgHp%TdPMz$2HX2Pv`<|7HH;VOraasCA%3` zE+ZKF?sz%th-4%ClmwpHZddntWTU>Hk8C-Ue7Ms2U#Hff&55h5Be8>Fi}>g!;-%`s zkPTYMs9l41XvIA!%X7c-+*$)6&Po#SgHX{Fxd!YLQ=L~c`3zH#H-X$9(G1&z)o3et z@BroB#t_S4FfOyz+4fBGCyB?ry{1OvL?3JPWc%`ZT1=eE(D+w$yozP%fzGV%f-{y| z)HhoOb{q>>vVqqQ+W>K500(s+KJ5)7f&LBX8qD<|9^j);U69@0QjbS0C9ZVW&TO^c zN+P~51daRarO9e;*Zb&okM=aKds|q`CDT}Q-29ijq7FSDEYrs+7=Fz+`ZFuExFsC-UFfG_0^&by-P+nCI0Y^$%vy3LaI z&f{U?Z1x}2zCdh3FSCZLr0p+XHa`j(YK(p|t5JG;f_dn~)^dx9@E2OmczogdOo$Ul zQizo9i*l$i;MW3%2@e5$2UE|l;fjw6KT-~w6@0+tkuTm%>pJFrb4;&S*>Fp7ijn-o z$P4$n4a3?J@5udkFA;~%;XG^-k;tnnSz`wjNiWqe;RM4vY;<8`bFltmh!YQ=)?rWlW%jxD6h_eRTi-G#XvIl*9 z&;mLU)H(k@{SNRQIi-)0Wr4=NieFm4?@Z%u!+Q1iEJG?>&9~2|BRNIYVteF`pmI?^ z>Rh@a>PzT_h{r}|2fSMsF6h{0On6pwx%TkM0aC$jh?4;J6o3QyC_G94_3?7EKqQ#! zfeygj*mtk&=9U!+-tR=qrV2;>{L>t30}KzF`NNah_k3k@<*ZO$hktYDl#-FXa3VJS zI1*EO!U2YpQR@2@v4;fbE(dkj@*vJS=y`A`=&S5Wq9g$)))YQ!><{__feY%WP+o}~ z3JT7MewNd#w%7c2kUoAgfyLZ&Uvv2aLsXw_Kh=|Hr)5lxvJ2>-r0VVD2jk=I=}jxm zDE@7>`pB=1pNc$hY8*6zIP0M~80eY`?rD<1#SD%>>H;0eX)fZU+>cb0iq)Y=<M zLl=Cz+`aKQ-4OY7Zp!nlCt8I*>L>18v24>TjG%Ix5A^82q=nVpwyj-rcVFSnVHdHF zjyBC;`=YU9FCk7Uv_}fb!f~LzvVa5n5RQgF=C}~%hDzirB)2sTiV9E;Csb?CJeoGv zpSN-B;xCQWj>i)VCvFi{1Cd}VeUhXVa)EeI?f$r{&2I@DGx@}4`*zBUQvMspu5Jw_gH+{l?p+v8Y%0Tg{&~Kzk)&7;d~}-3 zBJ-jIz<2)CpGq+QWG8~XeJL3ma*#0VvpcUmzwn=k>3uiPlNkG@oWKl!-9CoY|@wx7wq4_ zUK!{>z;#3>a!UzU)XJK4MDMS!`t$=m5c4b`KtK0Pm8$lcOul7(E|z{8gI4MrSAUJt zCQ`C$2YyIG0*^`2w)S?7$`y)}LpQFq@AX_&0dckhyMDMfe9x4w0?i7w1>{BY zag8s@o5^#i%(ZL17ZJ$B>+*tie{{VK_yOeCSbJhEh=&g9f;#9AKs?z;g<$_S{!5)G zzq0&OJ7o@L+}L!F-5J2~-C1TF7sah>h3gcRMcfMhN1lSyx0%}=Y@}!2LOZ=wB|G|k z(1OgG_`ZNG;qwVdD4v}p#TFFkN4;TWBS((2i5s6{=8KWV3haT8%5g{na`bR!^Z)%@ zm8EU-fANAiLXu)DsB@t21@(u!0PI8NK%JAt3PD}qzL(Vh7k~CY-U4y5K;D4wO#Ycm zI2==31liOd)5;z7&Q6faW##|zrvKs_e>f$IjgViHsTw>TnoAB6-fFQ3Qyxom7B_OG NgzW#~&;G|-{s&*~a7X|E literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..36e6b73df8326bf5285e0c261ebab2631578e271 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0f44d99e1906e7a14294e06c9d0e7f8891fc1f21 GIT binary patch literal 10089 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

4v_uiK8-g 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 F{SQjx7>57= literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..523eb1e51f44e94053a14cf128d41bc5645b0072 GIT binary patch literal 10089 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 AX#fBK literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C8.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/C8.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e10cc4e03fad5282731d618489e48dbfc3c4beaa GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..36a43d4d75acf93de5330d450775ef3bf33009ff GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7a2a25e646728c06005992dbb76f8211282bb4a3 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f197ea783b5ac5c7b465085e40e2545fec49d432 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a30c4a4b2956b02ef013fdd2d9da4fab3ce59dfa GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7fc7b524fbb10a9c5efa87ca9edfe4dc03132828 GIT binary patch literal 10089 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 I{jY!Z?^YWjjsO4v literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/D7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1834e684b36f711fa348d5d0ef4c0d415c053905 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..720b7fae8ee9da13e98bdac934a06f4b58db2c0b GIT binary patch literal 10089 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 O&JebJD9-;A&i?_%&UKgo literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c8eaad4f62e8fa588b0533040f410c1546653253 GIT binary patch literal 10089 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

+D{gA0>3xBo<5_*~!Ml-w2BbO=W!D3@}-4^)O$ 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..89ef23ad969d5df97b0e7044f189993731ddb0e8 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f138d0014d554d55221e109912b619615529edea GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9ac21739b00a2941209096aa2f57a35bd2656872 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db8.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Db8.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ecc363cd4fc3c24febeb16b88525bfed8606038a GIT binary patch literal 12065 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9842d5ef922c3c5ae6d569bbdd295a39fd6fbf5c GIT binary patch literal 10089 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�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≻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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..88b7ec80fb7561271c96fb7af76979e2fd82aadb GIT binary patch literal 10089 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 V|I%aW-Ql&*X8hl;u+5tLe*jm!e+2*l literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a3ad2139485fd1751e75be4f305e2a58f6e76550 GIT binary patch literal 10089 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 E0oquMwEzGB literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/E7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..df63ee8eaae668e4e422a02bf9291086b2d8c54d GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..456db4097246aa00a54c7a821a4d70176d75dce4 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0d71f4a06d8afc45eef4da2c97fa3c8341266e0b GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bbf633589daedee5e08486f191f631c182004e59 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9861c7fb0aae633503e4aeb207a8469fc2e52d01 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Eb7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..749eed616490b750c29f17f9bd316b79a4ea61a9 GIT binary patch literal 10089 zcmds6X;@R&*4`%sh!IGlpg2LmDWD?G;FN%1a4M+aY~wt(m^z`YkU&9ksG+U3TB{&~ zI8plI7vy>Q!ske-srRyK(b2-KRTteEHSaiOFf{hmU@H{A6Zk*7t@V zf6l&i_1g8{Z{5B7$Nl0*rH?D0Rn?lzfLO!F`%MTO;N|PPlAl5Eu+MZt21&c|6cY$@ zncm06U&k5f5C5+l)Qba?G&h zqoH;kr0V|KjRQ9%f6a#{CD|Hy_wu7PH|O6C3*MPEy1o~{lhakfhhy@CVfDe989f3N zUHm-PZvl!U&>441@@!irkv6Gga|;g=o8S z{Lw}?UtaOkd|tQocR$-`PNn z9KO!DPI8SHd<<>)p5C2#2IlS*Z0aXXM|N z-L0zcra$2oaik=Dceqxa+uh+BdtGVtVsuBLa{b3 zus1v?9KZR|kxzD=1-5h7Cz^X}1Kw-ZuKPraV;wDCFS)9f`g+^NARnO}PZl_W#9lNg z5+0@I3bTKX)Y$t~l$NaH`S;JkTi+2PJS<%)ufB2ZXz_(9AF04Y!Iw#VfQ9OaB%7Ry z7mK=HVprwK-Wk6%S+T6@h-uH}0*cd0B-TkLXx+xBB{3eQc0wUj95>jSoKg&lPfrpL zT%zTNh>712^V&z>+FEadnt7#A9hK#qvF|xq*LOP@XAnW`)QlQsvi&m=Jo_S67^)au z!RnSxyu0{2$KHwHc$2K5IKpV}&)sqqNlppkWRDWQy^y&PH_%3VN-;7a-BCPH9nbGL zBWpzD=dC=t6u_60RBT36`TM)a*&Z*~yzsKxJmsY6)Be1K?K%K>^t+;#SJ9UsfH2p4@0E`y#so!`S6{j z;7uO`%tZf2&OCABgOcUbHgvjEqXKxC0WjV+bjb3^&-#&chqeo+Lut1X_;X=LCaQZ# z-TU!}Dl5!mxVSOi36e`%x4CKw-y=<6-;rsE8z$B6R}2;$ND|Au4Q2ds_4mHd9bm=Z zRD(CY*T9p-Z!fq~8nXF3_SwFKX(dc7+ora$xe8|C{xW`4_Sq#{4|g^ARpeCyG&r3g zT--huf8}=hpu)pj!s~EGU@v2CCOQB|<4k7AfBls!x$Y5n$} zJGEkMv_l>=_^xQ7t*B*q<>WEOMvoIDq1n?5H-$$u1oP5oP&^6JQ^0 z{7`b)FlWge^z|I#IfeN~>B%soh+O@!SzAcRz0%kFB`qZYr|HxktF6lHx35O5zs_cm4 zfQnf^?aR2Cul}q6ip2wJj_2Rl5)?aYL7oP_QZPG4uRd9Crg3v(#9xUo2Pr0cJ6!OU zQhk0>_95E)RG$T6nQSh(qydLQrqD*bG(}V9kO&QF#H!&kaekI_Z|}i&-+^+D_?nF zFY#mbtdfxa{WZzapVvU$Sc=mnTD(OvHi(&-WFO-@$PViPQTCN;Q%GMyTCrHRZWCOc zZW!hA&gyPsf)d{?fXcdGw9EKQey+dDC~p0xVs|MErhc?rKgYH0%#WbXnOJ3KdqSv{ za)_pG=*I! z?Zn_3c&4_S$R?lChdOL4Rl#QM1@{7D?8hXSpOeMzzS^9=p$AYs7TjxyM4h`3~ z7S0wTpFV>pINDzLH4mP7dnmeQ+>#qY-&^)OfIZVM^vmiVU4oCmiw%TGRVAse!qJqE zceHVb+pj@VpAZLkpK8iyj?#sR_A`hCX$o=gv+qMy9wAC6kVBl$)JpUrWj4hA&oV;D8|b#XfHhlxc}wHgT`q zwZEG@IfIQSWL$BtWrX-|O554irU3Hgxy3YY{tWscJ4m`jElifZ;0s-tq)|P!(W4Au zt-6MyKDse*N zvC?fXX0*=&^BUs^opJX_;}#GXvPu#ZBn>h0iac&1uzyOZb#1~);fqu4vMu7^kD zygzq3+a1ypzFhk>9jc2{KG5H{o7Wf@{4%W!In&(x13@=zxwD2f8xFQQi<&Lw*3+

RtBi9!&GzXT#b6iqDsi;9n`Mhj(7f4 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 ZUh~0!Id1<~`n-Zuhz4uQpZ_AC{{d`PvupqW literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b5ceba65d6ebdb60f2c8c8d424eb7b61a7f2aea9 GIT binary patch literal 10089 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 T?>Zb8HDOjrYW~mvVO#Y-3PqIK literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fa3cc0d33168f82a55a19e54df22f19f2668ccee GIT binary patch literal 10089 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%0DHbmkwrPj?E~ir>;>x#&uM#C$SQ~Jk{YIg*j&R!D zTE~EIpWP2cMxT-EeL4OoTrQ8#0e8y`VM;OJ7*`Z4%-sa%)}g zy!3iBde%y^xqVf+*We1q-W1b1&bzguV|`lwNlW1v332&zPr7&dTuI_GC4Sj^W)^ukI9BPbh;n>? z{Dw1GW-C=ylba_L6(S1f0&#AClA8H*h#i;@E`a!a1ot;Y;d&lWKps@u!VcIIeEqSBrKChmEAQ-DD)p ze%;t6{WfIFrlRdB7W=OXY~pi3{S^J>jAaotKzx8bXh8>voC)$;iX4yc+gR6otwoL? zO#jznO(bD3h5O*YwCWgnEx|^@efl%o-V|axW3Y7S*&!7@Q|U)HtwrW3XPuW@V{?ZK z4g_s@MPI+igMOL~I4p3F2XzYc06Y)2L8UrCHrPq{p%giPYY{2$o#cvReX;z0bn94T zi&^JVyBKq1lWvQkk*!eU#Y)i-({SuB>(UvHr6$)U^lSKr8QG<}6{BCMS!8Tb;FV0i zJzx*MB*H~}0eVmjI3PZH)-W0Z_qWVSh$W4Q40RB5pJOy$-Ip=Y%;H@(xZD)RyE`Sj zsLvZMtW|{)kQ+1J&a()8k%1}k52RRZ1=7=&hPzD@8-G+UhD;ZH32HwFIQ+hS2Iwfb zABfSMAgM0YRtlI5xkWCm`i(JpP=wRs-fY3HMJ zXQHpNuNV8q;=?a_!CRV@i8?OQVQ#+P)YEQJnO$ySj+ZL?ys&%@h)=pSmj?QRM9Jw< zm2q>#g0&5wW1sq&?NLN-$M>Dx=!A?jf!)=ddR3k!_&UuB<(9{|3#>-{2mwdUTEP*a z>I=C7cCAMT&)2|{B+Ks}o?pws9G|goX^K=DH&DjsfW83o8t4ImFeb-Cf#=S8J3&8% zVHj}0+)EfN+jz;sg^-TAeWai)j`nD%t?Xh&hd(l3;`x)V$JulBKC11a&D(X8MNn~X zFDaAVpH!ddblS5tknd*1`Sqn1JK?*|0nh6t*EzUgVTiwH5lvu37Yy6b`5c0i=%DER z0IOa26M{NF@`O*nyi$}(Y^bu@wph&>lD~6cU#BNNkr3)*z*`xQNyA_IQ8$$9UK!bV z=8#-dCGS1D?L>Pmp9ALjH1Yr0qq>c!?qG`au(smQ2WEmt*pYHD$KR3ah%5^Jkv_U> z#@jqqf3}1pbRkG&%g6uXWtw!1;`{F!^$JsVrTpA`VUyr3p*D$2RX5)$F4@NJE=o%A zT2v@^7~^w5o#shU5M$y5aaFldK8Hwx`FoZl_A~W7{q=vL-_eaxHK*lu8Z-)KL#4`F z9tF#YYO_6wJxb`dpvTL(SDpQhG_eiG2eTqsuNPLf)(&qiSYNbl<&8!0+@soPJ_qbS z|KMNIrosCMB)L%~lnT<))d~f4XDhIWDhGqL3I0Lu7Ho(@e&~s}NwE`Ydu8KQYpjQp z-+0y6)QnVqO|<1eq|b1y$mkOJ*8)<^`>oAvd6rPo=d)$g+^@l|%8voZ4saOwS5#N< zd~WPC&+?HJ@}RXPs+9$kGe1-BN)eVRCq4VTRI-cC%2ar^q{rq)F-nSaZ=eo2?E2Js zH9(Z?UaYM!Lwb8%3&}&bT-RQn?KdgYuiyMG%yBA;vnNig;4c69DSv(|kZ?`bCbGn7 z+eX#FJW6r4LRrEvN$@i@UzYpLFs52$f%R>xejs^PeEwzaH=?z@)9|CR1CddpV}N} zT!ri$Qd~MMZ7<#)_Cbd=9gH?qR0+rZmX zE7(A6Wr>C$Qm^$o|qZ#t1GvU~5gTVYYg4j20}mMUsAOVyqj{}~9N2I!8B*g_u=n$iQ; M!oB#fu~k+5ACAIQ7XSbN literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..00101e15b43fe1a02c72d10b1656581e684f3a15 GIT binary patch literal 10089 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 vxa!c@B=O0PP5=A(wOxC1b94U(9XvTH literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b5b5803cbe627d5d5953bf1a8a14bd65e19078df GIT binary patch literal 10089 zcmdsdX;f3^+V)OJ2w^b606{?#Kp@~iL@cOa!XTi4fQmzH4LH={^fa{AmpZW%Kn6hr zPN20WVpZw{9nQg?w(bB9fCH$Yr^mKI#t>}@A<^u(v!CzTIlgOs|GxiU)^hQ~z?JL1 zulu@(9q_g$8To&_*6sLY8+;1~{`(L?!ge5Zri+^gm*?Z_7Z4a68X7)(?!4%jg>jO^ zX^o_$5i(z42GRqgTPb*Im$8!lYBe69Jrf84n7 z(=XcgJ015PK6>)>*WZ5oa~CfBjL}4W!r8YFWPxxd zU7Cr|?o*%RSHB-FQ~&Y*^$Wb^QVE)ibTZ)&mXy6!gV5+-6mIwRM39^*AGb4v2nYwj zy59#0$mxsaKHOjLHu?j$vuRwTd$N{QY~Bv8^jS(i`Nz(?)_?iE={ZJ(RtJ2jJNn~~ zhi0y zdeUvpBD#hy&0k4F^wMQVb}G2hTs%fcUIHC!^&F+#EChZNSR2j>)LR}cVb9ZE!gW_a z-$tnH8{u2ha(O>spK^GZZyH?O>jnbu+ z1_bgUQq4BWuzl%)X}+uc@YXxzti8HNL;LIOB6a=W1D9fF$l)w<3EKS@)r*Q)x6noL zIy{DW0dRrb?!9#J@CNHu{yRR^{!bMB@e0qx_iKr|I6dyGiDs3XL z7P59%uyCuqCqOnV8_pUtNx;Qz)_J?dZrF3;16{Ar&+22Zb1iP-Z^?p>S5crb3aI=1aeTmw($w&AQG{i_I(Kqqr)}aGxOYXTG?6luIoKpT1 zBrjX&8GKqn<%c0#?xcJVSpaoV;Hs5OVqGm3XO;XCS&``!Gg*4cCK%m7JR{LZ;Qg;` zF($Z0+a{*<=P#$~XK~e-f_X-}ZIxBk zu}?C*#MG>sR0>`LFFx?wcL1|AnGV}q1r`wQZLpw!nyVh5C;Y%yq!5(tuLFkjny?8C zI-wq!K~8%`;W(>|O8#RcPbBngvt?6!*2$9T3Rpi?V^YY+B(SX8#L`VNVsPxYIDg=W zM}lXmc1;bQ77~gB zWW3!!isy)%%6J&Yjh&-_{wAc2is@T+B~pCSs`QBSnF`6>n^{jl(vF=#GY>1nx+K;N zGU->45wtLJvg9za#vanH9+X=m$H2w!@>Zb&Z=iss2|k$i>NWc4n6Y_(qmH0(pug2X zJ}^H}Z-|K1OlM>!Q#ebi^a`#&ca=?Q?8Z4^L#UoSr+E98e#x%ffgLX;yAv2a09R&` z!D!z8x^4^BSS@uyMN`p&VDcKd@RezKS*VBZp?euAp>SaR)bM%~((S^jTNWCl>CN)SylMnx_28L5bTc&?GId2|Wu^-Gj2vUJ_k0%`!u&{p%?dv?8LG5cm z-bif~7}(ff4A6z)k!!Cjl8nC+w^qI5Q^)T?^0o_M+_(%DgLW%3kqP^P#LdA69n@L6 z-M|Q`1AW|5Fjy>qg{TcOq6PllM*-xE``KKyQgBryc=fV$g&)~pg|bjR7_vkAQ?fe& z{2YS%{?)L+`bze#%@%DAz%qE^1h4RYL+dw&Oir6@(^H)5T#F~h1rfEj<|7Po%SI8 z-ioQ4aHBi)HzYldrqn1>AP%gbwbtiv51mIl5|Wd$MiOeV?2R(K8=p^h<7rX!Sr(qM z7CS2WZSY4FrziG*OMK*oK0wCJ@(Gn)VCfTqN_yeM?00cH6xdCZdMi93j>AXOmmm;F zS{+9DTgX?$a=@37V50KIbKAdXtIef+dnTEVJ_k8bftOy!P3WOz&sZRAC9qv*G=h-Ta5RJoT09>;+&LeQmNahg7JfPoOoi%D9=hgX8KIm97d$k zlF$O4T(7;E`b2hX=7f;#L1x;Ln@5|TkBQ=Khue2!Ro%oOs)`JLRlRx@VGNWH{g;o* zsNnTbe7Kw0{Z!m$%N9{_lT?Rkp|1Zu>&PCtytX0mlBu~49c1Vp27urL_N47@@}cZp z%vAW=Lj;b;)in>~C0R9WRJwsYh}{8buCw^Y-)+^j9q0+iTm^mSB)^-&@l3@3Z=9s6 zQAI(x%eonUKttc9b)7cvhNZ2WttXwfy~|G-|Dgi*Q%)Py0jwXREROPn^vZ2iUqB;m_oslW zC29SQbwmLjYvW8TM(a#PPdr=S81e$qqvW^3RperQlptv_xxyudjDL=M6PJ#?22baQ z)u5-C!Dyrd2gVKJ2w{HO_BiCm7E6MNy z3|v;Su0RoQLj%eFHZ&0{Ts_{H7kDM_J9Mb!tq)L}HmYp~%_dr~RWpZ#I9nJTW0~&? zBoEG2iFgl{pIBKejiyn=u}3Lgr@k#NLvzM|y1XeaRyWB#0y=dgOVy)<3cPgYb|lA) zu}+d(Nr?}7{6K)T<1}|17Z=2sP}{bjFI}wNEH1bH%+yOTsuTtwsDwzB z>yto;xS0N_pp&)*8)A`}5;EIVaDTdPGAfIB^EwE#9MxGK+ZgL2%5R>}8);#G`Ib)> zORjH{5LJxll*<8S0?QHxp@EsNgxVweB8t znpGCnR^Q)IV2k zEOC! zcQ2jmGq)jYI>^r}F_RzpKgBoIJD$iIB_|Av$r!RfU)QrrFD9$n(}I9lfF8v9K%)VkOja}ck?ez`yu82RLXgpEU~>Q z=&RB;mhtlWs+i zNmh4!4i?KU8$=6&f%LBR5^)}_vNI&g6`~C$MGmGSYu6Q8Eksvofh&krS=U-yb-fGq z3Em9fwhMUupAJ4M;}PC{1;wY0(sdL)Ia5sWSqgo}-@gLPMXRDzC&0PL2Cm1^!pPf~ZZ z%Y=~)0zmY(U;AD*2DdYh#u)s752(Bc66OY774tmb&ArgyN_iO$KX8J&X2SZ(ih{aU zq`HSHX8UW=A>CxT{g;j3q0< zPhpy-$6ncw-N$W-lV~)UA5Y4M>`GjDK(zqNLHkjCjFo>uO!O+_z@gTC?{rYXOIJiL zRB(!+kFr+MXJ^i(>L;mcMC$L~0Yb$0X)(s%rsZ(*kcz)5TU^3Ibi>?bF`nlZB zkO@C+XYE1rVyqryke?lqg`yPlA)+^ z{KE)Pom5zb-gU%{V=U)Aph*|iOl`mm+~6MUo+YOG&l0EugqpxT%bl{CiYifOBsR z<)bdLxm4U@D?ds=ywkvJvUTbzAkmvI*{*-*`~y0O-NxFU6RUcnrWLD)mtqqwhSrJ= zV5WHvS)br;nhOJFl^wE0IQz#7fH)kxt$ymzfl6G&yGPCOoJ3raMqf$OW{GKzyVyvs z*gGShL13D3V=2vl`q#6F7;6mh)@K*jWZ7sbAOB+-g+~ zDAwt2Is6Uk8uC%V`I?i&R?wFQ(SD#_+yD7EvjV_opc5<6b`(L?dRWv{zmPm1@1g* zPMk~ar?GA$G-O7ad5_Bi+D6x!KJt{#R7ku;kIK;XGd)mm#WY<9sH{Sd?2UJYf4(_) z``?Jaleysbp-LewsJ!UBHV7RYf1I5&yx)_m6F?$t9PPTSib;Nm){i(ho z7bJ=kfW(qNa}~MJaL(dx%$7f0hD~NoR`B%-rJGhP!(BcB&n>3~4!uDgoa8@{QgNf> zyQS=J;hZ@89MpBX+i)*8+FeDczFVVkOMR+%$vjDDtHB&_rukVzP_aU1)v`Ru!k4bf z77KsRw8v5nBewd&+iJCGEnMsmUmuEqi8=vNnR6&U3@7nH{{2P@$BBKA;lZTU%fw7% z4H91+qJ?@Rn%;1nb%VN$IY_7=fp|W7eh#R^9>!QWl9f$*&{f<*u6kQuYZveTqoflE zJ;-2k9@bcXd7f9+fWn(x`&QX5aOlm+xC{CYyjyxEvGb_CQ7oIQfqa&_4I^+r9f}VX zRBL@M5dD2v71regZ=9S~;=)OD?Ix?}Ebz@=Vr4;JM|P;*Fh)vyBIk#tY<-&hiyYs%5iflum8 zz?O=2kZE^KODoq91qmc-4VXigqK0a1)ms`5%z-DqXmbQ@wV-pXXy7wl4;+Lf!xRon z#jW&RPR$2X+u6IlT$%L!vQSzv0{h$$ylQhXOY%{=OE3qkQYN7S^a`4w{=JWR$jj#e zHoN*ukY#E9WfoY^01f_8E`EBUc7fzzH@=2!nANc_LaJMgEK*NsDI5leThH%8vS8mn z&ps$(LLKCbkY7@eMKEsg{&s+r8`^4sJ`5a%ZgL85lTRjXBbSoRvejgicz5Ke^EG1p zsWhBycxK-YP6Rl_%m-Ix-#-duaDB_LuL8y$I4W_y?=s2{T$P=9)ICHmi=g&KY1MGA zSmZ_ACANp7M-KPByub%>PUzkEn-4EE86pv_PLqzF0YPHfcQadi{!Wy}phLg_hHj?* z2kTu>t{!oEgw?})#vX5Ph(r1H=lm|EW`+XBO$h4;>L8Md{8PBhJ!CakTOdR9Nlukm&gp90fN<&EBX%E1pu1gl2j@ z_|l9$0b!2(D7hNnj1J*;5!@GcGgwU6=fs+yFA60vZeo9K3oaNpRL-Q8u9-uw4uf4z zFSAXtZFA+}-#9%1Gf3G)6FiI8eC(<$BntRwCDz3U{JlFjW9vR=%f~!!MiN3tojR+; zD8GxQ@j|?U*;^SNPSD>%;ru3D>K=lKrQ9CYlSNW`M7y*t*mid>DB4< ze%0tQbW%2P4s>j+Suwx0K6R45nYcuL51y_B*PXq#Dcg%~kDJ~&o@+8y;!>yssY2+L z#Li`KouI#o5bX#eb)Tu_H);ikC0%DvJ%*1OrmTyXKM9fycbhpN`vtgquRpMV7)wx1 z@XZxYf}SFYV#Na<7U8PHC3q^}{2^=-zMT zeIB8H6M){+8RP~L=xciEtBL$sXW~#ej1pt1Z#qr0vc|K7EoMR;FfyYqDwpRisv4s1 zF0ZB?Mmy~rH6?>0)=F~q3~VCH)?#5}hU1szSL>&pl@Z{Td()XWmQ_SFy;aZ?pc|Hr z=KrxYEW<^5CDOu|bP29eIL;j7Dc|LA9;NO(LMgmc5V8m)J_SjthH*QtEg9nwKfSSJ zE>TW#PQ}tT#kheJs6GT2Y`^53&}8vJJFzuWldz#bj!6{bGbDEua$+HXPc;wNcYb*w zIW{6DTj#h_z?DeBzeh(FDd3$#=mLF*krjayBhp0n7Ht^J&(l~BIK}7FzK(e;*DS=k z&=D562a68Z_ZGK5ECg6cmbhLVpJnWFIBFI-hI3U3#j~)4;iHmv570}-jw1RUS^sUezyVYjhaK^vO*pEDf^-q|M;z0 zMFqz}BwD*_+fYo;=`5=?9=Kx@ZeZov?`24Ks||XRZX(OjnxlSufOkxVX!8R3FtBZ=-Iz5Fw`?4Et#4A`W5d%z{| zIwRo!tfp!y_j`kK( z^UfBAhq#!3U*x>7Vyd$93+8Ar?Q5A>ICDe@eTRm)YIPGdRKK=!Uv_B%5@IgPb6O8# zJ%KCw5WU)23fg7El3O~{#`OPOu#1cRDzJw&g`^Zbb2C`_lp4Cb6rMBhQo7#4bTS_C zO>fN07IDwBrD^ba79(H8L>i^hZo^8Ut5#sW(Spl=x?cX`JiU1*kba8RW?63U{bf6r ztquQPiQbYdE0NqL|N0lH{2*YCt-Op}3qIId+su?@lL4Qe113=FxFfM>#)DJuhif8y zVVz2u!%)}hp$POHI44r~c(OZle_p>&5Gj3Qm00V?jicv**>|Ut^=X~nosaJ${w5E9 zW$qCu3Z`SdDX<7mwBV|9&20>i$cOMDybAXMj_1xS4t$Q$1^qzik%$-2=|ONm6}ccr zBnjfcd)2RFjpfV~dltzgJ;3d~KDvzFaLHJ`^$Hx!hJQJmO4c-qBflMJdF2dTKm~PP zavfUdj5W%wI-^4V)0Mti+0K;STvR=BUOM6y&gH?rz#N`OFU|U|k5-42iltr>MMC!^ zwJFRZlvt0%;Bulw`hllCMKIL;SD?qwSnX@{o;H~668UA!Q+R*@!5px@?y_fv*zGWJ zp4?_Tvs$!=!hv&dJ+G7M+q?$+3wPKTL|GzQ+z65k`y9OUWd*+i$CdDVKE-2o^l!n4 zZs;za4<78VUi+vzuEl^_pO_0`x$ux7EHh7WSL}$?vq=GPl^b=z!MNuSA(A8D7=^=7 z6%<1p*cTv*q>u7 z1;d=)wkhx7Sy>H?l}UPcW88vIWrN_3#g^N!O!E}nliYLQaJYMU%N_Gu;+})dfq8J> zcIY4h_64|Sq0Q)m*KcjZvuHBILwmlTHZYo)U{{Zdgwb$dY+?iE8?n#`w;I8 zd0%lOsyDZ-LF&bdWACL-%1v?{!aea{&kQaq$n(Qz*+vh7Nm30Sh4XD&dp;@(C%wrg za?aTL@o$9RqJ@0N_d{TxYv6S%8&`2T37rMZ0cV3E013g<+*W-V=jXd(~=j~`w_02`^wSQ%a<>oldhvB&0{8HuYM!1{ogOI&0Ub| Gc>N#iYPJ&q literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..239b5c426e90629b6ea9229d6060a4bed1c26d0a GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F7.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/F7.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..47e7361b0058971b870295b76bbf7efa1fc65f45 GIT binary patch literal 10089 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 bTl5_AZ^x~B9L4__=f4%V{}$)JlAr$v4!35G literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0fb87b41e0cf1a17c4f2747b8a4b8ad9bab937c5 GIT binary patch literal 10089 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 I|NYhf2WAFO%>V!Z literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7ac3fe9d51b907de7afecf423577db71475bf48c GIT binary patch literal 10089 zcmds-X*ksV`}e;yW~{@EEn`U-%UG&GvP8aPHz8zSYOD!~v??`YFM}a8DmB(@71DJn zsj(DAE;~s@S~OHsQT^K7pRca}aX#D4e zi%&ds^wUVdTW*>e{zl~-M^yVBTvqqViIo!520w{Ku*Wc=~;^t0KQZ{99` z__Xx(`>z$ivUH)k+8b{$H{XxBhWv#Fr4VGIriq4KAyhx|cN}cB@kYM!|Ml0(4+4@P zdFWm`1c`zy2)GbRh+?~wxC4S>CG=Be+@W7^1`NRx&Dj!hel;C31qOfH5WT$zZt5Ds&v zRq_+HCpFHV^T6~iEnn)nf zpAZZ>(P*+sD28PVQPcH#>@4=>L0hp#am_vV+(olx+V@ss)+)J{x;%5e>o=sF+srjP zer+aWOSDpi!`Z=2Vq7@+mmm3qN9Zo@`m!+Zn?V+yQx3_w|8jE0{Z={D0D&b*34NSO z#}qn3_98JnUKV?oaER^h!HR?%<%%vXS;~A)0D112R^*Z~Ur`97qqKE+g4^dUr08k$ zggVS;7m^J(>K19yANCwlIrSqY@@1VnjzdH^XuN=dpJaweQ>2(%Ac~M08bb}mriC+X zurWLVi%pyVptixd+254A6wR=5nYx%>W4R~cNs#bBVe0c>DC6nBdI|}CD5fG?hB-B(8A?VQ01gLcSYcv#pIGjx z{omDN-|U}xd6oSQO%S^L^hhw~;Se@UC%H>{-j1lPJ+}E;{hbQ@HjQVgA8JiBh|h#P zFQPNFx*d<;@@ROWa%x5i;Dig|1?hmJCe0?OZ-X#%5E^4m7fB1}S!3#XA;bqyw%w|A zeb%P-VR`*1DHe@~K#{ped=$sd8Aq+Sj_`0R-*XYzf0T9uTV zfBD={giwVJs-{mp5e_C#kWcVssw=8Vqx1ws2O|(Sx=1AqZ%wP`B^1)Hg#9+$)tIG^^24pn{&P?&tVKn%lv-tTJ_J8!4Huna$e|=RMEgOQ(sG3EW!Ro_4~TL3fVWh zlSwZ${?&6D=$Tcd%c#?4)FL&}D%71w{g|gM@F<-A==i7&Nz}gdDme**+2WjP?e=)e zY@tv7hZkitXtGFC*M{)(#+ldK=f=_#SY#zjlZajS4dQox!<07R6Qf7U58ADj0~|Y` zCj&phoYkceI`}hI8fY}p7;vhy5It-bdy~JG>$k7f-TuE+o_!W-&7kzXZQYcd;8{-6 zr_5jW2??j0{MMNBDXE)3Q$@zs&>wd2GY+UPRd+KQ zx{Hejr=YluP>#s9u}v+!HYB)#3^W#Yr=n=apRdp_tQeFy0WsW=cf!$ty?He+c^ zKx^s*3F9hzK|f&dSe*3Ut^4lj8V3(PxGn?lD*TV=IgjeeidXb<_cDEa1%}-!uF9+u zw732JmQ119WLFvvQL+jm2u#Iq0a$%=7-u&nX=6fiz5*wHPF7!)PaJfCvYM zZPH`leB$8a=@VveC;A<4)xaM|?86@xy+NyzGaJLALUE16rn-agrOcJ~``EjZ-ZJ#e zM0BpXtZ|ebM>{Lq*2l1QnOf-N&~0_A9K4_aKh9(-su9X)gJRkc8mAj1!lA>Kn0lCA zf_*(xvGE}L@1Ep)VZBjWPShuhH+yHCwGRl&|T_yme1ZGop+3~G|VY%~rM=5TqAfCKtYqlZLr z<$vxozfilj=hsDyr~Y$Ldit_lCUM(<&tRwtn$ytKn|Y=>JAZp#j$8lOn7W^FAYo!e z@kg{GgdsVsyD^ov3DE=mc1qlbsiw%l&(c=orilk}Q-kf(^&u?|#97#oJdiBE#O2jH zy$&u?zKW?1jSA3ZY_yYAYMHD@FPclKH6OmbZ0A=qJHMvybM#I+cUWOPeCPBI+#%za z`W7oOO8>*b`JmzHK`jU3`IgVSbZpj*z3R3@QulmgI9c%pe;YIQRV8S zs8N`Q)74TkJsNZE%Wn13GpbF84VRXOX7$Z#KAkuV4kLfxBwtdB~PNw5c%$6dvH@o zSyqN+E_~wdtzgeC&-SI@g&f{bsWwwf8-yc~CpZH1ye1IvvlcweYcLli{Dd{tAQ>Tb`_W5(7mo%DiBLNVV>QFcsh_(COW)qKi%|R`zulnz{Y-SA?6O0hld!v_SV(jl z*FSn=*vdS=63u^T;^^jsst`dql7J)R!#qWR2q+p4^lLOl*AJ;v>vTPyJO|3(9_$>a z8n$SZ|2@@bZLG<@W4m0RmE*F-YTgwk-_R%GrT6jMO)P|)V=qP+dr57UTED?chpI{a z7CHDu^jjLnyKVX#;Mn2uf<)XnN?n>Gt*+Oo6$bQZ`GNVvpaPD7l_gW7rJd99Pkm5z zERmDoV7(ITl&u@EyOb|}rcq;E*yFs5X6jiF$xV8drou0LWS7?9yWtIAuG%=0)$@zn zZ(Vik^P56A(s)6FIKp8Qn6ySsk~ZiEej;fOt9r&*P;%@3u@tHxZi@_Ig`eQ8mUN-; zJML7JdQtniIT<}QFDvRmwqO5N+3 z`I%bTjO;0>G2xpnrdhpB{o3VsPj_Cl|Cq4PJ%ce~O)M|+h4fb64IZl;c@Q_iQI}>Q zdMLI8)S!+ZmP2R2>3WQAj;QwI2y%!Ix?a5qE>rYP^y zAG<>IVe-KB>~l#{sIoQg2P|ue3lFFWM=4KmOl%zCNTV#cRwM$dQO8dRM`#523G;34t~n^y#y;c9*|j;dOP>OReiG)N z1l6&swf@qTZA%J7XKY9%9zr;(_*G6Afr1aQ;F^R%s6|~L3?mA%N#irRS#bLGvivh* zH!3~1X3j8Ln(J<$=-Ho}k~W1$G=Eflix82T@26%S6qu8#?QT=$FNn> zjTaW!s>^A2--dA1@&x!SSG%D0kc9uGTZbS=cJa`FTj zxG~^sHG;Yxml7(6CL4PR|G;b?>RkEA!$AC*P;Mc$s*hJ1J^!QHVcN z@$9XeI_K|}7^ujO&%Z}Fx_N?Jz*zuuTit>Sbz#tER-PD!1GELhXUK{YL^StK*$*Db zt}uRcd7Yv^bN!3!VP9M~ly+2i(%Ldh_aGd-JV6@Z)Pnj^r*Tn0&r2&WY?>{+1^9rTHF=&{^K$5WNY?M>PIY)F zd;=QitXyK#+f*vJNFTh_68DIz9r2dFXNKl(Qs!mQz7&0YXN&}Vzo@#EeZ!#Dzxy?= zV-(5H`aA&(_+Ul}!lQuSG|W&xmA!;S>5ye+9q>U-DfR2~fB=OSACG}Oi=P%|$POKn z&y|A+X5nfL&DR^&x`@-NFZje?HcPpheg5d=$Glemuk&f&rLVXgNKz~|s(nju-iqki z2<8IN6Qal?F!i_?5H~q1Phre%P^WxYR+PA39k(H6xcTGlbz-*r3r)vYmOXW__3tn@ znIJj9T2spt_$>?0tb;p5Iqe_HUl#Ap<61;GTphYMud@B}%qOo!=V0a#ze1_kA?uyHf;5L6YboJx0N|1K}9s1(`q(@U>J25;r~6 zyb18zZpaM8jm>I&;;R>ySNkQ^cQb-Ti3JoJ>!hF3|S#+c+)~sIZa)v zU6RayX{<2*qW8Cmy;y9WwqN}N%bqPY2*)%}kSXrP;K@J)DxX2ARz)otg19+CHkox$ zW8q|F_3^b2CQyr~31J~xYL=Xb7hA*EYxxeB7E6AV}9oLQbAU3e7fZ$MAHrUn^Jwsyy)Me=M#>LAcZ^&Ikl zoUu1j%T-2~Cx#g&?-n9`+nV)yO~RKw!L4(tJ}UChQhyBHFOtu_M-N^ zyt%(cE(UHtcT`EMK}uQN`ifahN1`;(jTBX#cG5_4or`DwV3J$pKcz1_2Pp91_3s5; zlSCtgvn5Y(3O9;^K%I8*8A#l4)(8i-6{+QQ;5dsH9t`Z+cq{Wx)>KA|2QF~qjyt(# ztt_&o$M5snjX`}M&5mCjRC)U~K{(m)y|F<`)RC3QQ$g;Vl}W=Jt1l@1%~CM(K{%G6 zUrTx+aU+BPACL^tm_I(S0D93Zcm*Y#YE=?KJ*v}WDQ{}^CfF1@Av zrczu**!iJ{3dzQnCyVyJ^FGI@$WA4($-iIP#;dJ$KU_DRB{_g_wu1g9?ghOD^K=&I z3Ehkm7`qEWkuVkb4a}cQt+r8V{QZHb19>&OMD420oJp6Gql)FT$+FaV<=eu0PrkvD zUd@&Ds~u2Ch-Q#Fc-)TN&&yRh2+lTbI;72KtC*h{`c|mCbVgv?5nwghK^;2+j-QDYB)h{CGZfA-de;SwD}-W}3VrHLc)VzESD*X>8F8&36nn>RiPR z$gO+o_MgUJIl;Y!DqZ9oK0=7{C zN6*u`yS1~JxOyM82mMWa2Y7FT_X1L<+GtTjHw>d12KB?pFPy2ys$TIkmnL5SyQ<+) z!`gp-Dg+%zWuQYVf6CpLCXr)yd>D*hIDLJ*>d`^JExR5MJjX)bv(rH@E~)$5k2;Kf@twoJyIY)6b&U*FT#m*vKP~3erh$S#S? zKI=TvDa5{-UDtjGh!gO!2TA2rsl&gR2OaBXFM8T(nOP)Ph!%+HUtK>X(`AESk8qs9 zehu=|p$Owael$aoe(i>0#6ncS8OoZeH(pDX%8naQeI}KX7lLWtd3Whzuff{q>tB~A zNvj^OFG$4fDIKUY>W;w?-X!!fMm=c5E4ZIA+D*i>hx?9X(sd61LO3pXLCl~05JG8m zl~6mhfvyXNVJ;=HW?*N}5T;W^8LPyd40q}ptPHL$k_?$YqI*s}`{x(Ih z<_BMXQg5pWwFp0dcT~og>haa-FDcGBQS`&%H?;d6Z3xE=@%0Wyr=o^5n&u8}kElUo zH&8!LrWn9sW#O+bTiMK5kgMd9s`M*to3SFL5mlB)wAZXOU74-l@2wsiBk6d*OIn;f zLbJJ4?ng9WuDSk5B@MRS_WLhEi(pvYL=)k7;swX0M^F&(K{<^M?!CZoAZ`w@1&AA{ zQ-0WzvQ<{?it)#J5~J}w?|jI`q_>huMmzm9^8>eP-=<=gjqd0csGLi;{tpDgZ#kY9&gA^lb(FB zzpmMTNN}>gx>=ZcVq%+jqFR8IZ^Xum?8daT$xp%jR2BJkljdvsoH?6Lj~7|^I%u>; zTuG`p)TV9o{5P^!+4+J!5w`>4>9Pr-0q&NeDyWx^E=b?8OM450yX8>ZL$Nf}?f2FE zp%cU>M{%F1v2qFb9JucsQ*KvptV)<#Ol|zqCvt+sX|olrj~m@5@8L#B=#GptyU}=m z@{>}ZJbHD``GI#Mh?^SVP%YdMJ&pQEe&8)wUHBs>>XC7+J$Hbp^~~1l4B61&=S=Fl zgplf7yxI%=Q)a((cDN(M=*&{c^U=3{+QKqBFsUEA7s;<|y?)79-;6xFuZ=yNx_b8y z1n)WA$e+GLbJx@cadULT0FF7(6UI>^P1{TDDqnW=HK$Rodyhg6y8rngS+Ve9uR2$O*Um!+g#h61U(yL5lPU1Oq*t zG}tl%)Tyx>3IaY@<&f*!gHLn%s`CfzELAYvk`65Z^x|^TYV; z>oUo1xVah54TKW`;`S#$k|BET6rks)l?w`RV8m}(Y}>mjMpsjK((Z=)wpI{oaES_y zHzj+y;)MON%x7Fq(!Gr-l*{wn-KY?qv}Uw^eesR`m8Rt(RjAFR4t+W&t63){0^vmE z366q(zyn)K$RE5gCYF6cPW%R-F65k8jtt@)F~T$ zjsa7E-{!4dFu(_P>AFx$mMEv(WLk4hXuZahObKH>mFcWpmv`4Xd&j8V+w$MBP*)zy zWgTJYJeK8NKEGDsn}*_#6LoNd+)-}-cU%R`JzPIB*zs9d}WKb3q1MoS9nw1MCtsJrw*@O7aKvVW^ z(hJGm8=LqR>-lRurgHZ_^<^0+J9#8{=BwfIPtbC=K(#)uxkIf&oEfI-|)Q?RAR8Z^b3hRkg$h#QZ?cA#w!+Axo<7E4ta zd5N3coMdrpUNri7In@H2evyAG-GG+T_I+0Rua(-eUuGAXHn#I7=W_YC>0(J|G@6L- ztCAI+jw76S(033$WCpk&z?vEwsBhLTLM#}9Gxxx}EO*)SkD^bfqSd-&hBSodVrUvq z9gM5X?qQ=oSw^zcF#VT0pN?kP`W`YF&`e5gH#osy-G9rpx<`6{A;xb#@gwWQ*R%}? zXFs^};YUE77RZ!MQ7E0-hz~G~a>x+D+_-=i3xpY)J$*2IqF6bKL}rbCLg?(%%;n!t#bavt%Jaj zp5;?4BZz2GD=-%vU?-5Df-KG(BeO}#P|v(K%yJii`W6N>)1RO=7e30XZxo!AyX zaq3jt4%fm^Oxluz`Hel%4?|-W&yGlKi>Sgr?&VKY>_-nHoJ3GRz}ISIhSaPctVvP> zp99iRjB2MXnYD0Z7N_c;Rfue6x%cA_;Uw2h<{`N-6UiXNn&Q1I+$MhuJ@;*;h5U!p#bQ1Y1qC!P>+b7Dw zY3*|c$mgeaC-8!!AZ|$C>EOc@&<_M4ZlHdwMQTBvavr(ne-$Smm;KeyE2cNf(VnHg zn$Za#?r6UJ7%lVF-59H!@PnYL%sQDEFlTbV@i~@SJeo)MaoTe2ai)H&r{8w9uZakU zffpRcdop<7eoX}&aPNJI$~|KQFnqDw~TBU*Y-nDTV} zL1NKT!U@LF@zVY$mde+YMs+uC9b7Cr_GGYH8S~seAEk$I((wW&-V>RpQZxKN`_7-Z zfxQ>(RgLeI?qjoCX)j$<_MUC%puOKjq!AK^*%B#=ZF*DUFQdD5%B!B-6c=&f@wzLi zMNhpMb;4R1RcQ8!)b`%LS?x--Ye^~y=M)~?#XLd32KUh^*Z{msFjfvAKTb9vKV70u zC$7e!JzT5a3~k`Q?m%%uGzX3G+~-E~;#W((%Z@b-wLa1^e7`R+J$St7ecOh}u9_8L z-B){xu)Z$Ep~J}!Gb=9VW+R-_c|gzb>i(t<{HC=D)oSg8_zm$jkJY%4>FZ0ZIg|PE z(f9P6kN?bVSTrQGc(uuXSGf6nClq5M5cgp&un^M;?qGH?Us(?5(<^F zL*^f+pC6Vyh;VYidmHbu>bElBgH9Qs#|Z;fL)NQvVK8A{*(|=W?%Q1PoKb9GbIPN4 zu4K9FHKUhW-2JfJP8kFg zm|2Mzqzx@otDF%Dhs^9+QXoI_@lUxD>*=5#r7P~|L?RWfd ozK?J?5K2}4pA0KCXg&JDOiv|*zOc=JxSs*JW>s}b{lDS-ANs5Ewg3PC literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..674b55b530d8df06657f3340438cda893a6ff10d GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/G4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0e428b89b589d7b0db44ec3d6e68f6031768665f GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb1.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9aef039f02e8576a82c3b74af6bcd19e8965bd5e GIT binary patch literal 10089 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 v{-gil4KPQu>!Z;YV?y literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb2.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..25e189d10da9fd9146bc08c4cfb3c10a6867286e GIT binary patch literal 10089 zcmds-c{J4h+s9|dm>KKLAjUrSv81t&wHfOq#8{H(oK;icEhtN*5VF>!J$3hdzPg`te*Zn^{Qi9A9OpR4@S68^y+7A=eXg(HD+SK5|Kk-H z6}tnx1q;4HU@*NX7(x^yA%&BbCn&3FXzA+e8yTCJTUpz!cXW1hclX@H@DB_MVTNsw z+!-4imynop;1GwKd4!)|SX6Z4kOg5m3@#G4If$@_4T}vw0vEo$PJ(DtvwXG^Z}i)Rs(Rt(OBUb z*e=Uxzy#b7^6<1ltL!E(7OIV0I5xy)OcyV^gH!!CwX zr!+5U)=X?^cH6z5a(VY}mpnC@`|l|<*0nN`ilEM?&kom>_<0N*IZi(TagbQy5!qq* z1U?SOvV}=H5fEfqCJN~cbLK8UoRV*6HrdxsiVuWoZpqX;lolUa(`#Hj-Lb8L9G`N~ zu3$dmhl(qh${N zxe0KbU{vISz$6=|dtJoX`FHtbv4qs_ypWqn5~~2_FV)pkB^>a~LiK`t`?Wg8A=9s;uf_jfM6?uZ7kNJ#48LEwC**hAJlph4 zwMAaUKn78z6gB*mVX_sk#P8W;;hdxNWHoO2!gSdo4o5K#TVW$4IO)

2E`Gox5E! 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb3.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb3.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..93a7a232ee592514119bed55b84f3885337c9874 GIT binary patch literal 10089 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 R8b7V-zn`w{*0kUH{2$jCS~&m! literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb4.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb4.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..9c0485bc78da1ceff89144dc6d24c3c087683412 GIT binary patch literal 10089 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 literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb5.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb5.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3a446f94dc2cac7d09e0e44044ef8c312e8b7f88 GIT binary patch literal 10089 zcmdsdX;@R|*7nXsK)?iu0s<05gdmzIC@4xclOTg64Attfp(;+NZS3GtQQVtJP{2^d zq1KilGTIi~+82*iH&p9@wuS<7dOS4 zy4Std6Y#1!0r`LYtl9R#7WgXy_-{Re1aCvwJV$3&p~rMDpP2!HbLL3G<}ZkdT(V3a zmync_lAe*7vu5r3+>Lo#|Ng-TJ3ju$p1u1EOAZ{Y)O=b~bK=zL+A|GJtzV!2?uUyP zf4tIh?Z&M;zjpWB|NTGzdHCq@(~&>NCd@BM3P7x7X|d^v;q#X)`H0)be8R9>2(m~# zn~kO;th>zTkVTwhKG*->Kj4*+DUc6xn};BdeAH=?7GbgP?%C`WfFP>{VZ~fA0*pn7 z7MVEQ(sAJYzRHiNmj}u1`nau;&mR|c=FfKnf0@)b#cl6Q@qhHt4U7|tm^vAC>tfEC zJvIDDtJ=29+NrWKI1U<9<;>stA}!+1xg#E`LD<<JB)2^Hvm@#sk+dtVp=DqkTTM5#ToLNt zm0yn@VsN+`)1jI73(+vKF!0|4EdDHZ)ZR60+=#ApIfv`~k~x?Tn54JzFYZX*XnUW| zzV`~$xPq<%H&s2J*L;xH00GD%2FL2}bd$Y)S=VbVQ$agfaXEf;7q$Jf zG^P^o`-oN~7F_Ex`LeYvUB+7+h_k$M6z7yTTm0$BKOSFhqAwMsvv}YJrqlS?yyZjW z5Rt<<%GSRCbB${1>O0lG>uhh+ML?&v>X(d|b1rk{(Z1>zAT$D;u;)!+I_%wtaFjx~ z`p^zm!z^~WautsyLgZ7ncW9lGF|550v_56eCLRHc1Mt!tqWfRIqIRjz&!;~rchHlb zMn~(>u6$Z=>yt(hB9kE6;J54P|n~^exFl{!8B5nSF ze5_5ar;|XG5*#P@5p7_7PP8GAX5wLMOb5JsS?DxG$O*+m_?c`(lgUFaAaR22sBT*F zNjI$JWFRQwzuf&ni?IWhY+Xq!Y9}+n1ikhb>o|RJtA6+*c*zHCbc{apr?hQotqrsG zgSWt8GUs%*Ugrnu-qfcw@O3$kJ)-RbbrrKJhB-XVYJL?g? z7S|iWP~x%^CoBYg33I0VgxDR>W@`})5SDeu&gLdIVbmMvfjIp{Ek>o(jtZ?yfE`C* z+UuQ-qf4vZio141Kpy&bwmN^}cK#e17t8?4jg(InWT8KpT-#*ew_Dg%_PoLR9Q4k@2j(Ge@m)CN z8#^H{g@a!}k}F#}VBQwo#47pbd|>V|cCf=KE-?H@Z3W{q+o%-v_%`ec3!9ApL`rh< z_rpI7)+7WeB1vbU-D2%lOM&f*%GCZ$@uoieyfg6uSfAoh92pE{`{t!E@kCX&qMY)9 z^>nEjv(lQ?bgNk41*U^$V2HFX+@l7DqQK(-xlcEM5xRkjX~OzhQaXdmvUy<54>iD; zLvc@#ib!lYi^1UuOeej5V|d`cu`3tWhdsM0g@tSJ7?+lg9Zt#INNeQey&!P9%^X)4 zS|aZaw@I)8Vw@(ZPvXku7DV2=%X$OMZ~`jpg96`RuMSL?VGV$NBpJQfa@8yZb^Z(v z%v+^*CIWda916{4CC*|;Y)RlDW+cI-1?8Xam?#Ch@DZl!+NrfRABqQbk+yfK{REYT zp}1NzET4EwUim3n+Jyl|YLfe+5P(!@z)s^tAIpW7;dqWco)~yj0-} z<3aP1nY^uVX+gBpaZontFEwJ+YBDO~2M!ooNk^=sVy}+P+Rl$Ov&X1ZpeX}&*y?jY zs%}L_KyMxpZP!2AWG0D;t~wt~=|S1^26d+t#^baEcMlAe!Tw>{ly;oB$`(ZEE3~ch zryFc-=Rl%7g70+xgiYH{ue0fHp8E@Yb0!tUdQz!a`N}==j6Xn5?6}&bpNz#QLbqo6@Q8sHfhAx#W{eyoOLKZ> zV$DGSnDaDfyt-x*qt@=#yZveLGP3%p5Fp(1H zD?8kNIwWTFK&V{7Df|S9uWZJJA;Mp#?k?*Y1wGhVr-Pv$*eSm#GkWeOMePaK1j%x~(@E=D59Kb*>E zW5cR$wm2h*#vjmupY9Q4w9bs2_p-(b40FMRcx*B=BdzMnyPJp}&b_;d{D16`C!GU1 zMO@XB6x;*Y`xMT(-QEg@Z|)mI5iZ1$<;6KbJwPj)5wWkZ-)ap4UJXvSEzKe7AtY1Z zP4ph^0n|tO`wQGjqhOxR=(VPuoC5kqg+2ua1Pmgzln><~A6<)Om+Up3b$npgH`u2~ zyfX^5^PnC`OiUY4&$4^ zsq12H8EsJrNvljk#f7I;Q3k90~=4W9^Q4toPWR8==bc!7gJZi zIy4p6A9wCBwQs|mUuph-GmX|s0I z7r4`DssDCwTIQ+S06%We$N1^?=OyyzZt-CGNYgl1pXPx*4tTfOnHFKvwcs$H{ATJF zdprVDkqFjjJ>m}I;kq(Bi1}~cpdQfQoj?N(=KRX-9y_TS0a5BF?2qXW<w>f~l`psWoIc~+}#tguL&Cc?P1B0*;oG0@`6K%V}9`v3aM_{TDtzw~xh;XB10C_eG&bcTSGJq$+yg8g6 zpw=CC+9Q_&N>rRtuoU@LZ43lQ4}eK^v)Aqf{dU+M?bg#LCbO2SKyMu{!+2IgSc2#Q zy+t~Vfo~SBIU?^qW3La)oA)Y240*6oVuJm{x|p|&(d*@vO*qtpDF^89$|gmn^v)J! zpZ*HhpY#CQr{r`q2L9&uF>Dw$qyp*{H!vov8-2pY$(f zaCjQiPVZHPD4g5ZB)SO5gRs2C9F`VOgE*ee9YvUS(@o==psJWlB@M(^JyTTUWfO-3 zHXtW@ny1~TztcZ=+iPp??W7KPOM9jg<{%KFqWA?E=i5Pv5@I_AEup$bsgIOPx*cJtm6t7^{^8hHx|Lf!)DPO=u!i6 z_4nVVcNBxb2L`W_fTo9acfb+otky)<9W9uOTs%eB@a*-`K%bb-@Y*e2qGK6n!9HE= z0DW&_WfKDXM{R4Fqr|QU)>>@6Ne;h^g?NB2A6n5)x>C;3mgdDNJNdQa8aQ=t#tO)O z^7Is$f$l4tOC>C8qT+3rGX2*UU0~vYKJk$EDwcK{B7it3oC~uV921-iO(^v7`jKAW z`*eG!fUeK4Y5TSu_3e~Slwf_}dgswfeZuSm`kbGGjq%W*Uc1~%WTIbGwZWG2gq|)f zgKmu@lJ_sMFgP56sTkrgesoBpgT5Eeg(%jtCrGSIQ!L__+&n#U@&hnXLKY-oGudYs z>$P&A=qJIi4rIX9i+*QmGY=SummmZ?13yKO=kYV@i5B{6I(yLwzF8bSMYa967$%-N?!UDE`-8}fS?gKqN$ow0dff4M zd2*<4$0DMKT7mU$`K{67eVV2AGhn`|r%r!hj}-CU>8iDbaccDMcD;r;iyr+{#cC%=%+i5URrgM+FGn_PzF-2 zK==inUGyvY>ul$^mItVmu4{uI1?ot`)2~-~{I`F~yweLI4$RwmXTFT#n?qp=8Vl>= zdHPnkww7`N<%v)ugRlMKk`SB$EyA&I=ta=9LHYvzZ?%T#B_|U1u?F`^hB`L;{sa9Rj0ce_aj0+Sxvp$B7v_zXf+kfqcKG^sP-#HSCAxeJ!nbk< zIPbmujURD;_G`WAYu(T4&1M) z&AxS`vZZX(?%lg+AG)5n;orT8bY{Dt+G3Ch999xt?nho7b9_2=*tVX|k?S^69BR>- zG#p!G-%DWsKpZ=-Ik11A9{A=hMy{+t(aNS+u~YJQsWfKW5`vwMl+i)W3EXtsHoCsn zpf^SvXT7u2&*}aBg(>>pvGMYc>FCvWrxtq6^71F002d7WGAg!tJM8EgIbiP}fvG^0 zjx#*qNMPO;vK^I+8GU1PC;0TOF>0m!UyH^gXo+IIX}+pCo?-!59bHCRB`&$Wn%a1j z-fMfrzm4?;Yx9dP{Ln)=5XSj%_btnxR`*otpe(rZ+8+o^pNi7(+^s^P9Y@9v$y(@$ z8xhEB#PM`BuXgfh@TqHozs1KoXGJboHK2!Hz8>6Q|60J&mU(=343V0pv^W?}sDoP9 zp~N}1x4~4f8VW>%X4sLpDE-RrH}M>SIMQv^!azv}qocmc2;_$qNTQ3K*K67>4RrQ8 zIJw6KXjIAjHjGxBps-AuGQ3)5We2lPEMT^kUiEpE8h!I^`_Gb6;z%&`iDC6 z)RF}U`s{quzAg`w-vuX|N=#BY zVYfG0&mTRYdRVA3%i(fz2lO^sytOQ^Yg;3&zrmGtYjE9(M+P@t`ju9eJsypz3dWPM z1c!6`Jf9DBM;XB?)S@Xc9?zQU3_6_7v86*_(R*t+XbtcJim_MNDZi1zunp|a6a5u$ z(ci0|fBpChS8!K@C(V6NUjZto!C~H^3c;zcIosCL_?x^{i|*nX%4*01EuS|V?h6Z% z%TJIcuusJ^%ijULM{O zn?%O~MlGjox4i^;A3T^)4QJ7M;|%j$%WTn5eaH8p5*#ePoHX+4HhoU#80gtQuClm* z6~H;NvAsv(HOInzQ=c;LG)6}moMhOi%km-|@K!XrvJnmQt(Nzmu;LmUQQxPAO;4BH{Y)6t zBxm1=dO%K#nV!jwFQ}lysVo{iN-~FL?Qg_o?^nEur<%cm@x)7TW^P9)7cz4$wz82W zo0bf8wN`6n_lN};*HU@h4qf)lXu95i6omK>_ue~;TuV8OHQ%$AEP4zb-2GjDe&*}( zd!kZphEyPn^IPK;3+nCrDU9bIkZ;hxxxTwn>omBKjpW&J(8@+6%<)!28}zj|K3S$Y zqb|;ONSIDk4a$>_n$yTrj-0PuLGw*(i4dGHxAg|?Nb&grPWceoVvom>BRk@q z%IuAzddaZ_b{1QaC#ze&Lc9#(IF?tZ=I4bVXQ^S(+`sU43IV z`KTTXO{Zu2(Lh=U*=dL1`vnuE7^XU%?d@t5E}6Aw=#s}`j)`;W&)$*~At z9qga^%w8Yu(ikhAmaG7wfv@DF$F*#I@8U`<#5U2 zvZkp&$>7HwxOlONtiWz!&D+sTp0<5d&_(XF{I(bS1j3q!an^ZZ$6`M36+gGh+kUV!`1h1T&<5l;+9|V zpkj$0T6AIFcK0l>O8bZUsRszI08f2-Mr&Hm{kg$))*dfCye*pH>A6)F7VA!a;|;~! z_PRc%a#$b8YvDCXE;CQL46n@y%o_{p^`W?ln5;3u^VzxEO6Kd8Wi}<`-0q#&jp3_( zTnD;ogNIy4wDtZExdl11`Wi9h3^3ET>O@@Wh=jf8NIWdWECCFTL$OTjosM=yg+O1` zz#9&SzE{R6%tn?o_3=xlgSqlv;&_dgw{M{Q%sEvjq4S5$zTwMb;TE>wMKcS#v$;&( z^@U+A-Q@bHd&nOSQx#d3e+Dq}xBKCmC@mD%2^oXGjWJBn&mx_=(7mwN1^AWwiNI09g3pZ7B zBz27#c4lz+#lkZ0R3uj+7RF0*86V%92l<9-Q(PK)b<<10{f{kYe2PDgm)qS1bb~97 zZ1?aVEtT4cNo6$sj^fPU&C_`cBy>DjdY~TsbbC0b=!_%&xw-Hoxa5P(HEY@#97mQA z?sMqCJV%ds$;k*_7VBi5jM;-1yENeNy~L{fR{%GAihpM8|0tVTz>jXDBX%{;;Ht=C z4V>Q5*s+zwTS#(4wUlzEzXmS&2FH$4g>Up&tQ30i=BMQ0d_M+f3Qu^-JFNp%gt*5` z6b!F-b*oJRqDagKLhO!a(Ux{t3nT&l#hTlz|5C#RDI3f7=jiD0MD*I8Fs~k_|%O6;__W#>E?6J`pc)+DxZl z_x3Hnrgf=CrUsA7cH}tUQ=1uoy~&X!YxGXLtzCN3V@R@A3Xh?Njr=wXdhJyURjajwhp_C(6~G#>|*mZTfa=7Qei#z%UKOYTz4D zu+b9gE9T!79&q@a!QpZkJqQsj@q&J5w=ayx1q$?)1T+@%Ko}w-F+EhQRq@^IGeV@1 z5?kBvHZO%H@LHCwA-z`cRe@RXSpO#^|f9&{; zti<<6XC9OfrvU;UAOrS2#C?-;=z7&ez1p;oiHEN-HF>Xu`&>1QN5R}f@Vq&!kg0i50bIc24_L7)4d6RdwAGhoY zo3qsq8cTTg9|gJZRyOK#3%}Rpq-XxZhl}mS?IWH79MGX+aNZ$(RO*p zXVn>Bte(KA&HAAod&X6(zu9q*j6#Z^7Q=2L;o8z#@s#U(@csSu0?TZ;b=q+R!ZJ|` z+<)LZ6Vy>&7WCI)%sv-Y26+JWI;lTu4UhQGz?RKX!PaZw9Coc>N|GVW`3y&UklFN# zv5W>!vfH)upVj{08Z|ScM=4G~qCUKGw>Wx!Yor_=Rv8?};_5n4>QBh_lOBa5In2K8 zq6~F_cRqPpLk<6Q&8^kut`m4oXRc>i*}uQrGWpxf`rDHk>*Zeyr4CQ%g+4Yg*J&>{ z8WI!Wkl(1+E(f7r6EpRp=L}(v3)nExtANn%6CE_dLJ`c{(rQ7#2x`|+Wf)R~;Lwle z>ZYY#AuR21_?J{XW9x@GG4Z$aSANFH{_(|EW!Tq(iR>PDKChVeDoi}>0H!5KXsynO zZAL%jXugiK4szghbT`Ok;&Echs+hbj!3Fhpy=Lbs!=SH1lNi08mIhBlZB=dVpjS@$ zQ_lIrsZXqFC7*5Fe{v@{1DXpAX0l-}y;-}o>Q8O3wOeY&#;Zo~SqZodyz80Q{y99P zP1yZ`BO*H~x{FGeoP_FR7YP-cwRg8sCDh*U7#W{Lx2bUm3jcP@FvVKQ+b zhp1CeXhtTBIFI~PgDRVxQrTJ_9%|||q?E1u4KDySD!cB$`g|cuK{AxMYu(5W9`x6< zA>Ur_3%R=KmC_M2Sqs+5iv~qCdQHrp-CX!e*h?_=anR^?zvcntbty9!xLKhLP9)>6ozj4@<}4em z4G>TN#daJhlWwplbL96se)oGjwx9fr&L-%4iF8qCjCdowfsD~k1&i8sONHgR6<8&9 zP)}?A)}ZjV^FW~6DS~)$7ly&yzwEh+nB>;?GKvT%R>S0NS8reZBbKX9Eeo*OOtEU_Wofh zj)+q1`&_`t$q4AjQJSWzRflNALnDuY_V>qm4Dj2%yxABY^-uEUi64 z@`R^dJZ*ri*kAai5*H^5GmH*S%?u8=&~#Lk)(Pi=uydr8HyF-(tPErJIa%=>RJhDV z4P{UWmqseH1__*86L-%CbED5(i3zau70{z?LFiif z+M*3=IC+kni?3=J96m?5li|U7W;unJ!c@JHGCCIrz9I@oZu_?8NNJAMs z1|}ys9%*aTMjSC7rK2f-+Pg~3x=F>dFO!^FCLZ2F(_vAnM7y+Hz=8e%_Nhp@K88Hy9Et-X4a z)a(h5Sw-@OFQnXj^kn;e?HaxPdo>O$VWl871XT#(UeEYZw$~QOH~9S!7l?EE)|W{? z7sOl);KCWy6UBdivCW3TN#>VA#Zvy42abZ%i$>^T>fvYmT@B6-i&Q4?`bxgMO3HGL z?ZkeF-31?57(HMKPk5&`Gv7mrXY?S89i|L_2xl<@m<57(Xwgr7;=#MC$dOymfGu6Y}yC+x#qb-*J~0S)`yiV z3Da^DktM}JILFJ&s#rqf``_{#^-})~b>$iDl=NQ7G>Z%O@5eER#?6~_PPw93g>LQy RG4B4~FRjgA)cSw@{4c|$fcXFb literal 0 HcmV?d00001 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb6.mp3 b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Resources/piano/Gb6.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..68713c2855b77f7090a2eeaa16dd0bcdb5c28df7 GIT binary patch literal 10089 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 W2XOuQf5Q1s Date: Fri, 23 Dec 2022 13:35:13 -0500 Subject: [PATCH 03/27] Add `pitchbench` executable (#60) To benchmark pitch analysis for future refactoring. --- .../MicrophonePitchDetector/Package.swift | 6 +++-- .../PitchTracker.swift | 8 +++---- .../PitchRecording}/PitchRecording.swift | 23 +++++++++++-------- .../Sources/pitchbench/main.swift | 18 +++++++++++++++ .../MicrophonePitchDetectorTests.swift | 1 + 5 files changed, 40 insertions(+), 16 deletions(-) rename Packages/MicrophonePitchDetector/{Tests/MicrophonePitchDetectorTests => Sources/PitchRecording}/PitchRecording.swift (71%) create mode 100644 Packages/MicrophonePitchDetector/Sources/pitchbench/main.swift diff --git a/Packages/MicrophonePitchDetector/Package.swift b/Packages/MicrophonePitchDetector/Package.swift index a2be8ea..d9628c4 100644 --- a/Packages/MicrophonePitchDetector/Package.swift +++ b/Packages/MicrophonePitchDetector/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.7 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -16,12 +16,14 @@ let package = Package( ) ], targets: [ + .executableTarget(name: "pitchbench", dependencies: ["PitchRecording"]), + .target(name: "PitchRecording", dependencies: ["MicrophonePitchDetector"]), .target(name: "MicrophonePitchDetector", dependencies: ["CMicrophonePitchDetector"]), .target(name: "CMicrophonePitchDetector"), .testTarget( name: "MicrophonePitchDetectorTests", dependencies: [ - "MicrophonePitchDetector", + "PitchRecording", .product(name: "SnapshotTesting", package: "swift-snapshot-testing") ], exclude: [ diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift index a681ab8..23d3497 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift @@ -1,13 +1,13 @@ import AVFoundation import CMicrophonePitchDetector -final class PitchTracker { +public final class PitchTracker { private var data: UnsafeMutablePointer? private var ptrack: UnsafeMutablePointer? - static var defaultBufferSize: UInt32 { 4_096 } + public static var defaultBufferSize: UInt32 { 4_096 } - init(sampleRate: Int32, hopSize: Int32 = Int32(PitchTracker.defaultBufferSize), peakCount: Int32 = 20) { + public init(sampleRate: Int32, hopSize: Int32 = Int32(PitchTracker.defaultBufferSize), peakCount: Int32 = 20) { withUnsafeMutablePointer(to: &data, zt_create) data!.pointee.sr = sampleRate withUnsafeMutablePointer(to: &ptrack, zt_ptrack_create) @@ -19,7 +19,7 @@ final class PitchTracker { withUnsafeMutablePointer(to: &data, zt_destroy) } - func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Float = 0.1) -> Float? { + public func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Float = 0.1) -> Float? { guard let floatData = buffer.floatChannelData else { return nil } var pitch: Float = 0 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift similarity index 71% rename from Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift rename to Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift index 76b9229..c1628f7 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/PitchRecording.swift +++ b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift @@ -1,8 +1,11 @@ import AVFoundation -@testable import MicrophonePitchDetector -import XCTest +import MicrophonePitchDetector -struct PitchRecording: Codable, Equatable { +enum PitchRecordingError: Error { + case couldNotCreateAudioPCMBuffer +} + +public struct PitchRecording: Codable, Equatable { private struct Entry: Codable, Equatable { let iteration: Int // Stored as a String to compare to some fixed precision @@ -11,15 +14,15 @@ struct PitchRecording: Codable, Equatable { private var entries: [Entry] = [] - static func record(file fileURL: URL) throws -> PitchRecording { + public static func record(file fileURL: URL) throws -> PitchRecording { let bufferSize = PitchTracker.defaultBufferSize let file = try AVAudioFile(forReading: fileURL) - let buffer = try XCTUnwrap( - AVAudioPCMBuffer( - pcmFormat: file.processingFormat, - frameCapacity: bufferSize - ) - ) + guard let buffer = AVAudioPCMBuffer( + pcmFormat: file.processingFormat, + frameCapacity: bufferSize + ) else { + throw PitchRecordingError.couldNotCreateAudioPCMBuffer + } let tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) diff --git a/Packages/MicrophonePitchDetector/Sources/pitchbench/main.swift b/Packages/MicrophonePitchDetector/Sources/pitchbench/main.swift new file mode 100644 index 0000000..bf07ae1 --- /dev/null +++ b/Packages/MicrophonePitchDetector/Sources/pitchbench/main.swift @@ -0,0 +1,18 @@ +import Foundation +import MicrophonePitchDetector +import PitchRecording + +private let kPianoAudioFilesDirectory = URL(fileURLWithPath: #file) + .deletingLastPathComponent() + .deletingLastPathComponent() + .deletingLastPathComponent() + .appendingPathComponent("Tests/MicrophonePitchDetectorTests/Resources/piano") + +let audioFiles = try FileManager.default.contentsOfDirectory( + at: kPianoAudioFilesDirectory, + includingPropertiesForKeys: nil +).filter { $0.pathExtension == "mp3" } + +for audioFile in audioFiles { + _ = try PitchRecording.record(file: audioFile) +} diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift index 3f2d86f..06852c5 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift @@ -1,4 +1,5 @@ import Foundation +import PitchRecording import SnapshotTesting import XCTest From 6c9bdb6d8f5fa9f8ea6d47327fe0b1df54c3bdf3 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Fri, 23 Dec 2022 18:34:12 -0500 Subject: [PATCH 04/27] Use `Double` instead of `Float` for MicrophonePitchDetector APIs (#61) `pitchbench` performance isn't affected in my tests. --- .../MicrophonePitchDetector.swift | 2 +- .../Sources/MicrophonePitchDetector/PitchTap.swift | 4 ++-- .../MicrophonePitchDetector/PitchTracker.swift | 11 +++++++---- ZenTuner/Models/TunerData.swift | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index c487d38..2dfec72 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -9,7 +9,7 @@ public final class MicrophonePitchDetector: ObservableObject { private var hasMicrophoneAccess = false private var tracker: PitchTap! - @Published public var pitch: Float = 440 + @Published public var pitch: Double = 440 @Published public var didReceiveAudio = false @Published public var showMicrophoneAccessAlert = false diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift index b7842c1..bb3baa8 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift @@ -9,7 +9,7 @@ final class PitchTap { private var bufferSize: UInt32 { PitchTracker.defaultBufferSize } private let input: Node private var tracker: PitchTracker? - private let handler: (Float) -> Void + private let handler: (Double) -> Void private let didReceiveAudio: () -> Void // MARK: - Starting @@ -31,7 +31,7 @@ final class PitchTap { /// - input: Node to analyze /// - handler: Callback to call when a pitch is detected /// - didReceiveAudio: Callback to call when any audio is detected - init(_ input: Node, handler: @escaping (Float) -> Void, didReceiveAudio: @escaping () -> Void) { + init(_ input: Node, handler: @escaping (Double) -> Void, didReceiveAudio: @escaping () -> Void) { self.input = input self.handler = handler self.didReceiveAudio = didReceiveAudio diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift index 23d3497..a635fe6 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift @@ -19,17 +19,20 @@ public final class PitchTracker { withUnsafeMutablePointer(to: &data, zt_destroy) } - public func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Float = 0.1) -> Float? { + public func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Double = 0.1) -> Double? { guard let floatData = buffer.floatChannelData else { return nil } - var pitch: Float = 0 - var amplitude: Float = 0 + var fpitch: Float = 0 + var famplitude: Float = 0 let frames = (0.. amplitudeThreshold, pitch > 0 { return pitch } else { diff --git a/ZenTuner/Models/TunerData.swift b/ZenTuner/Models/TunerData.swift index c81918c..ff8a282 100644 --- a/ZenTuner/Models/TunerData.swift +++ b/ZenTuner/Models/TunerData.swift @@ -4,8 +4,8 @@ struct TunerData { } extension TunerData { - init(pitch: Float = 440) { - self.pitch = Frequency(floatLiteral: Double(pitch)) + init(pitch: Double = 440) { + self.pitch = Frequency(floatLiteral: pitch) self.closestNote = ScaleNote.closestNote(to: self.pitch) } } From 99fd6e63403d4aebd58f905647d31fad17a94f56 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Mon, 12 Jun 2023 10:57:40 -0700 Subject: [PATCH 05/27] Update swift-snapshot-testing from 1.10 to 1.11 (#66) --- ZenTuner.xcodeproj/project.pbxproj | 4 ++-- .../xcshareddata/swiftpm/Package.resolved | 24 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/ZenTuner.xcodeproj/project.pbxproj b/ZenTuner.xcodeproj/project.pbxproj index 878279d..adc346e 100644 --- a/ZenTuner.xcodeproj/project.pbxproj +++ b/ZenTuner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -1083,7 +1083,7 @@ repositoryURL = "https://github.com/pointfreeco/swift-snapshot-testing"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.10.0; + minimumVersion = 1.11.0; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4b5117d..f58d688 100644 --- a/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,16 +1,14 @@ { - "object": { - "pins": [ - { - "package": "swift-snapshot-testing", - "repositoryURL": "https://github.com/pointfreeco/swift-snapshot-testing", - "state": { - "branch": null, - "revision": "f29e2014f6230cf7d5138fc899da51c7f513d467", - "version": "1.10.0" - } + "pins" : [ + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "cef5b3f6f11781dd4591bdd1dd0a3d22bd609334", + "version" : "1.11.0" } - ] - }, - "version": 1 + } + ], + "version" : 2 } From bb5522072697f6d5b5fd4d69b10777c17af69ad6 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Mon, 26 Jun 2023 15:49:44 -0400 Subject: [PATCH 06/27] Clean up unused code from CMicrophonePitchDetector (#67) --- .../Sources/CMicrophonePitchDetector/base.c | 1 - .../Sources/CMicrophonePitchDetector/fft.c | 4 ---- .../Sources/CMicrophonePitchDetector/ptrack.c | 5 ----- 3 files changed, 10 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c index dd8259a..d41fda1 100644 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c +++ b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c @@ -1,7 +1,6 @@ // Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/ #include -#include #include #include "CMicrophonePitchDetector.h" diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c index 9146333..72236b9 100644 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c +++ b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c @@ -12,10 +12,6 @@ #include #include "CMicrophonePitchDetector.h" -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - #define POW2(m) ((uint32_t) 1 << (m)) /* integer power of 2 for m<32 */ /* fft's with M bigger than this bust primary cache */ diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c index fe20559..e4a9d7e 100644 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c +++ b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c @@ -40,10 +40,6 @@ #define NPARTIALONSET ((int)(sizeof(partialonset)/sizeof(ZTFLOAT))) -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - static const ZTFLOAT partialonset[] = { 0.0, @@ -70,7 +66,6 @@ typedef struct histopeak ZTFLOAT hvalue; ZTFLOAT hloud; int hindex; - int hused; } HISTOPEAK; typedef struct peak From 0e864f33a2424a357fbb76b7fee058150eddecb7 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Tue, 27 Jun 2023 20:26:04 -0400 Subject: [PATCH 07/27] Refactor `MicrophonePitchDetector.checkMicrophoneAuthorizationStatus()` (#68) To avoid `withUnsafeContinuation` --- .../MicrophonePitchDetector.swift | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index 2dfec72..8244633 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -53,38 +53,30 @@ public final class MicrophonePitchDetector: ObservableObject { private func checkMicrophoneAuthorizationStatus() async { guard !hasMicrophoneAccess else { return } - return await withUnsafeContinuation { continuation in #if os(watchOS) - AVAudioSession.sharedInstance().requestRecordPermission { granted in - if granted { - self.setUpPitchTracking() - } else { - self.showMicrophoneAccessAlert = true - } - continuation.resume() - } + if await AVAudioSession.sharedInstance().requestRecordPermission() { + self.setUpPitchTracking() + } else { + self.showMicrophoneAccessAlert = true + } #else - switch AVCaptureDevice.authorizationStatus(for: .audio) { - case .authorized: // The user has previously granted access to the microphone. + switch AVCaptureDevice.authorizationStatus(for: .audio) { + case .authorized: // The user has previously granted access to the microphone. + self.setUpPitchTracking() + case .notDetermined: // The user has not yet been asked for microphone access. + if await AVCaptureDevice.requestAccess(for: .audio) { self.setUpPitchTracking() - case .notDetermined: // The user has not yet been asked for microphone access. - AVCaptureDevice.requestAccess(for: .audio) { granted in - if granted { - self.setUpPitchTracking() - } else { - self.showMicrophoneAccessAlert = true - } - } - case .denied: // The user has previously denied access. - self.showMicrophoneAccessAlert = true - case .restricted: // The user can't grant access due to restrictions. - self.showMicrophoneAccessAlert = true - @unknown default: + } else { self.showMicrophoneAccessAlert = true } - continuation.resume() -#endif + case .denied: // The user has previously denied access. + self.showMicrophoneAccessAlert = true + case .restricted: // The user can't grant access due to restrictions. + self.showMicrophoneAccessAlert = true + @unknown default: + self.showMicrophoneAccessAlert = true } +#endif } private func setUpPitchTracking() { @@ -104,3 +96,15 @@ public final class MicrophonePitchDetector: ObservableObject { } } } + +#if os(watchOS) +private extension AVAudioSession { + func requestRecordPermission() async -> Bool { + await withCheckedContinuation { continuation in + AVAudioSession.sharedInstance().requestRecordPermission { granted in + continuation.resume(with: .success(granted)) + } + } + } +} +#endif From 1a595114dc879fa4626e2ac08653054093c78365 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 08:42:58 -0400 Subject: [PATCH 08/27] Create `MicrophoneAccess` helper (#69) To abstract getting the current microphone permission status or requesting permission to access the microphone across platforms. --- .../MicrophoneAccess.swift | 35 ++++++++++++++++ .../MicrophonePitchDetector.swift | 40 +++---------------- 2 files changed, 40 insertions(+), 35 deletions(-) create mode 100644 Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift new file mode 100644 index 0000000..d22ccce --- /dev/null +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift @@ -0,0 +1,35 @@ +import AVFoundation + +enum MicrophoneAccess { + enum Status { + case granted + case denied + } + + static func getOrRequestPermission() async -> Status { +#if os(watchOS) + return await withCheckedContinuation { continuation in + AVAudioSession.sharedInstance().requestRecordPermission { granted in + continuation.resume(with: .success(granted ? .granted : .denied)) + } + } +#else + switch AVCaptureDevice.authorizationStatus(for: .audio) { + case .authorized: // The user has previously granted access to the microphone. + return .granted + case .notDetermined: // The user has not yet been asked for microphone access. + if await AVCaptureDevice.requestAccess(for: .audio) { + return .granted + } else { + return .denied + } + case .denied: // The user has previously denied access. + return .denied + case .restricted: // The user can't grant access due to restrictions. + return .denied + @unknown default: + return .denied + } +#endif + } +} diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index 8244633..958e7de 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -53,30 +53,12 @@ public final class MicrophonePitchDetector: ObservableObject { private func checkMicrophoneAuthorizationStatus() async { guard !hasMicrophoneAccess else { return } -#if os(watchOS) - if await AVAudioSession.sharedInstance().requestRecordPermission() { - self.setUpPitchTracking() - } else { - self.showMicrophoneAccessAlert = true - } -#else - switch AVCaptureDevice.authorizationStatus(for: .audio) { - case .authorized: // The user has previously granted access to the microphone. - self.setUpPitchTracking() - case .notDetermined: // The user has not yet been asked for microphone access. - if await AVCaptureDevice.requestAccess(for: .audio) { - self.setUpPitchTracking() - } else { - self.showMicrophoneAccessAlert = true - } - case .denied: // The user has previously denied access. - self.showMicrophoneAccessAlert = true - case .restricted: // The user can't grant access due to restrictions. - self.showMicrophoneAccessAlert = true - @unknown default: - self.showMicrophoneAccessAlert = true + switch await MicrophoneAccess.getOrRequestPermission() { + case .granted: + setUpPitchTracking() + case .denied: + showMicrophoneAccessAlert = true } -#endif } private func setUpPitchTracking() { @@ -96,15 +78,3 @@ public final class MicrophonePitchDetector: ObservableObject { } } } - -#if os(watchOS) -private extension AVAudioSession { - func requestRecordPermission() async -> Bool { - await withCheckedContinuation { continuation in - AVAudioSession.sharedInstance().requestRecordPermission { granted in - continuation.resume(with: .success(granted)) - } - } - } -} -#endif From a2cd0c1899b6f397d9066ff3c15195d74e852cb4 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 09:55:31 -0400 Subject: [PATCH 09/27] Inherit async context in `setUpPitchTracking()` (#70) Instead of creating a new unstructured `Task`. --- .../MicrophonePitchDetector.swift | 46 ++++++++----------- ZenTuner/TunerScreen.swift | 7 ++- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index 958e7de..7336122 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -16,7 +16,7 @@ public final class MicrophonePitchDetector: ObservableObject { public init() {} @MainActor - public func activate(debug: Bool = false) async { + public func activate(debug: Bool = false) async throws { let startDate = Date() var intervalMS: UInt64 = 30 @@ -25,9 +25,9 @@ public final class MicrophonePitchDetector: ObservableObject { print("Waiting \(intervalMS * 2)ms") } try? await Task.sleep(nanoseconds: intervalMS * NSEC_PER_MSEC) - await checkMicrophoneAuthorizationStatus() + try await checkMicrophoneAuthorizationStatus() try? await Task.sleep(nanoseconds: intervalMS * NSEC_PER_MSEC) - start() + try start() intervalMS = min(intervalMS * 2, 180) } @@ -39,42 +39,36 @@ public final class MicrophonePitchDetector: ObservableObject { // MARK: - Private - private func start() { + private func start() throws { guard hasMicrophoneAccess else { return } - do { - try engine.start() - tracker.start() - } catch { - // TODO: Handle error - } + try engine.start() + tracker.start() } @MainActor - private func checkMicrophoneAuthorizationStatus() async { + private func checkMicrophoneAuthorizationStatus() async throws { guard !hasMicrophoneAccess else { return } switch await MicrophoneAccess.getOrRequestPermission() { case .granted: - setUpPitchTracking() + try await setUpPitchTracking() case .denied: showMicrophoneAccessAlert = true } } - private func setUpPitchTracking() { - Task { @MainActor in - tracker = PitchTap(engine.input, handler: { pitch in - Task { @MainActor in - self.pitch = pitch - } - }, didReceiveAudio: { - Task { @MainActor in - self.didReceiveAudio = true - } - }) + private func setUpPitchTracking() async throws { + tracker = PitchTap(engine.input, handler: { pitch in + Task { @MainActor in + self.pitch = pitch + } + }, didReceiveAudio: { + Task { @MainActor in + self.didReceiveAudio = true + } + }) - hasMicrophoneAccess = true - start() - } + hasMicrophoneAccess = true + try start() } } diff --git a/ZenTuner/TunerScreen.swift b/ZenTuner/TunerScreen.swift index 4b7c058..5d5510d 100644 --- a/ZenTuner/TunerScreen.swift +++ b/ZenTuner/TunerScreen.swift @@ -15,7 +15,12 @@ struct TunerScreen: View { .opacity(pitchDetector.didReceiveAudio ? 1 : 0.5) .animation(.easeInOut, value: pitchDetector.didReceiveAudio) .task { - await pitchDetector.activate() + do { + try await pitchDetector.activate() + } catch { + // TODO: Handle error + print(error) + } } .alert(isPresented: $pitchDetector.showMicrophoneAccessAlert) { MicrophoneAccessAlert() From 06bfdf31892d83b5381feec09ed767c85d508e34 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:14:49 -0400 Subject: [PATCH 10/27] Configure the audio session before starting the engine (#71) This appears to more reliably receive audio quickly in iOS 16 and fixes the ability to receive audio completely in iOS 17. Also more consistently configure the audio session across all platforms that support it. That's all platforms other than macOS, including visionOS. --- .../MicrophonePitchDetector/AudioEngine.swift | 16 +++++++++++----- .../MicrophonePitchDetector.swift | 14 +++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index 11f99a3..5b442be 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -36,9 +36,6 @@ extension AVAudioMixerNode { final class AudioEngine { /// Internal AVAudioEngine private let avEngine = AVAudioEngine() -#if os(iOS) - private let session = AVAudioSession.sharedInstance() -#endif /// Main mixer at the end of the signal chain private var mainMixerNode: Mixer? @@ -71,11 +68,20 @@ final class AudioEngine { /// Start the engine func start() throws { try avEngine.start() -#if os(iOS) + } + +#if !os(macOS) + /// Configures the audio session + func configureSession() throws { + let session = AVAudioSession.sharedInstance() + let bufferDuration = 7 / AVAudioFormat.stereo.sampleRate +#if !os(watchOS) + try session.setPreferredIOBufferDuration(bufferDuration) try session.setCategory(.playAndRecord, options: [.defaultToSpeaker, .mixWithOthers]) - try session.setActive(true) #endif + try session.setActive(true) } +#endif // MARK: - Private diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index 7336122..4535e6b 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -26,8 +26,6 @@ public final class MicrophonePitchDetector: ObservableObject { } try? await Task.sleep(nanoseconds: intervalMS * NSEC_PER_MSEC) try await checkMicrophoneAuthorizationStatus() - try? await Task.sleep(nanoseconds: intervalMS * NSEC_PER_MSEC) - try start() intervalMS = min(intervalMS * 2, 180) } @@ -39,12 +37,6 @@ public final class MicrophonePitchDetector: ObservableObject { // MARK: - Private - private func start() throws { - guard hasMicrophoneAccess else { return } - try engine.start() - tracker.start() - } - @MainActor private func checkMicrophoneAuthorizationStatus() async throws { guard !hasMicrophoneAccess else { return } @@ -58,6 +50,9 @@ public final class MicrophonePitchDetector: ObservableObject { } private func setUpPitchTracking() async throws { +#if !os(macOS) + try engine.configureSession() +#endif tracker = PitchTap(engine.input, handler: { pitch in Task { @MainActor in self.pitch = pitch @@ -69,6 +64,7 @@ public final class MicrophonePitchDetector: ObservableObject { }) hasMicrophoneAccess = true - try start() + try engine.start() + tracker.start() } } From ad61e98c9f53931312e417e84c13ea4a483935bc Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:21:09 -0400 Subject: [PATCH 11/27] Remove retry and debug logic when starting pitch detector (#72) I believe https://github.com/jpsim/ZenTuner/pull/71 fixed reliability issues when starting the audio session so that this is no longer needed. --- .../MicrophonePitchDetector.swift | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index 4535e6b..ab17feb 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -6,7 +6,7 @@ import WatchKit public final class MicrophonePitchDetector: ObservableObject { private let engine = AudioEngine() - private var hasMicrophoneAccess = false + private var isRunning = false private var tracker: PitchTap! @Published public var pitch: Double = 440 @@ -16,30 +16,8 @@ public final class MicrophonePitchDetector: ObservableObject { public init() {} @MainActor - public func activate(debug: Bool = false) async throws { - let startDate = Date() - var intervalMS: UInt64 = 30 - - while !didReceiveAudio { - if debug { - print("Waiting \(intervalMS * 2)ms") - } - try? await Task.sleep(nanoseconds: intervalMS * NSEC_PER_MSEC) - try await checkMicrophoneAuthorizationStatus() - intervalMS = min(intervalMS * 2, 180) - } - - if debug { - let duration = String(format: "%.2fs", -startDate.timeIntervalSinceNow) - print("Took \(duration) to start") - } - } - - // MARK: - Private - - @MainActor - private func checkMicrophoneAuthorizationStatus() async throws { - guard !hasMicrophoneAccess else { return } + public func activate() async throws { + guard !isRunning else { return } switch await MicrophoneAccess.getOrRequestPermission() { case .granted: @@ -63,7 +41,7 @@ public final class MicrophonePitchDetector: ObservableObject { } }) - hasMicrophoneAccess = true + isRunning = true try engine.start() tracker.start() } From 471ac9f9303c4971e3585c03ade30797039f4306 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:23:34 -0400 Subject: [PATCH 12/27] Remove unused `Node.detach()` function (#73) --- .../Sources/MicrophonePitchDetector/AudioEngine.swift | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index 5b442be..2393712 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -113,14 +113,3 @@ private extension AVAudioFormat { AVAudioFormat() } } - -private extension Node { - func detach() { - if let engine = avAudioNode.engine { - engine.detach(avAudioNode) - } - for connection in connections { - connection.detach() - } - } -} From 7628987982bc5e68f218430889cc99c0d0c6802c Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:33:24 -0400 Subject: [PATCH 13/27] Pass `AVAudioMixerNode` to `PitchTap` (#74) Removing a dependency on the `Node` protocol. --- .../MicrophonePitchDetector.swift | 2 +- .../Sources/MicrophonePitchDetector/Mixer.swift | 2 +- .../Sources/MicrophonePitchDetector/PitchTap.swift | 12 +++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index ab17feb..feb8800 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -31,7 +31,7 @@ public final class MicrophonePitchDetector: ObservableObject { #if !os(macOS) try engine.configureSession() #endif - tracker = PitchTap(engine.input, handler: { pitch in + tracker = PitchTap(engine.input.auMixer, handler: { pitch in Task { @MainActor in self.pitch = pitch } diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift index c02b785..cb7fcd5 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift @@ -9,7 +9,7 @@ class Mixer: Node { /// Connected nodes var connections: [Node] { inputs } - private let auMixer = AVAudioMixerNode() + let auMixer = AVAudioMixerNode() /// Underlying AVAudioNode var avAudioNode: AVAudioNode { auMixer } diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift index bb3baa8..6290ef5 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift @@ -7,7 +7,7 @@ final class PitchTap { // MARK: - Properties private var bufferSize: UInt32 { PitchTracker.defaultBufferSize } - private let input: Node + private let input: AVAudioMixerNode private var tracker: PitchTracker? private let handler: (Double) -> Void private let didReceiveAudio: () -> Void @@ -16,11 +16,9 @@ final class PitchTap { /// Enable the tap on input func start() { - input.avAudioNode.removeTap(onBus: 0) - input.avAudioNode - .installTap(onBus: 0, bufferSize: bufferSize, format: nil) { [weak self] buffer, _ in - self?.analyzePitch(buffer: buffer) - } + input.installTap(onBus: 0, bufferSize: bufferSize, format: nil) { [weak self] buffer, _ in + self?.analyzePitch(buffer: buffer) + } } // MARK: - Lifecycle @@ -31,7 +29,7 @@ final class PitchTap { /// - input: Node to analyze /// - handler: Callback to call when a pitch is detected /// - didReceiveAudio: Callback to call when any audio is detected - init(_ input: Node, handler: @escaping (Double) -> Void, didReceiveAudio: @escaping () -> Void) { + init(_ input: AVAudioMixerNode, handler: @escaping (Double) -> Void, didReceiveAudio: @escaping () -> Void) { self.input = input self.handler = handler self.didReceiveAudio = didReceiveAudio From 9f1bc9aba6bef3112eadcc955471ff0e53c8fb3d Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:40:28 -0400 Subject: [PATCH 14/27] Remove `Node` protocol (#75) Since the only conformers are the `Mixer` class and its subclasses. --- .../MicrophonePitchDetector/AudioEngine.swift | 10 +++--- .../MicrophonePitchDetector/Mixer.swift | 32 +++++++------------ .../MicrophonePitchDetector/Node.swift | 12 ------- 3 files changed, 16 insertions(+), 38 deletions(-) delete mode 100644 Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Node.swift diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index 2393712..bcd9f91 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -45,8 +45,8 @@ final class AudioEngine { var isNotConnected = true func connect(to engine: AudioEngine) { - engine.avEngine.attach(avAudioNode) - engine.avEngine.connect(engine.avEngine.inputNode, to: avAudioNode, format: nil) + engine.avEngine.attach(auMixer) + engine.avEngine.connect(engine.avEngine.inputNode, to: auMixer, format: nil) } } @@ -87,7 +87,7 @@ final class AudioEngine { private func createSilentOutput() { let output = _input - avEngine.attach(output.avAudioNode) + avEngine.attach(output.auMixer) // create the on demand mixer if needed createEngineMixer() @@ -100,8 +100,8 @@ final class AudioEngine { guard mainMixerNode == nil else { return } let mixer = Mixer() - avEngine.attach(mixer.avAudioNode) - avEngine.connect(mixer.avAudioNode, to: avEngine.outputNode, format: .stereo) + avEngine.attach(mixer.auMixer) + avEngine.connect(mixer.auMixer, to: avEngine.outputNode, format: .stereo) mainMixerNode = mixer mixer.silenceOutput() } diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift index cb7fcd5..d2858d6 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift @@ -3,23 +3,20 @@ import AVFoundation /// AudioKit version of Apple's Mixer Node. Mixes a variadic list of Nodes. -class Mixer: Node { - private var inputs: [Node] = [] +class Mixer { + private var inputs: [Mixer] = [] /// Connected nodes - var connections: [Node] { inputs } + var connections: [Mixer] { inputs } let auMixer = AVAudioMixerNode() - /// Underlying AVAudioNode - var avAudioNode: AVAudioNode { auMixer } - /// Initialize the mixer node with no inputs, to be connected later init() {} /// Add input to the mixer /// - Parameter node: Node to add - func addInput(_ node: Node) { + func addInput(_ node: Mixer) { assert(!hasInput(node), "Node is already connected to Mixer.") inputs.append(node) makeAVConnections() @@ -27,7 +24,7 @@ class Mixer: Node { /// Is this node already connected? /// - Parameter node: Node to check - private func hasInput(_ node: Node) -> Bool { + private func hasInput(_ node: Mixer) -> Bool { connections.contains(where: { $0 === node }) } @@ -36,28 +33,21 @@ class Mixer: Node { } } -private extension Node { +private extension Mixer { func makeAVConnections() { // Are we attached? - guard let engine = avAudioNode.engine else { + guard let engine = auMixer.engine else { return } - for (bus, connection) in connections.enumerated() { - if let sourceEngine = connection.avAudioNode.engine, sourceEngine != avAudioNode.engine { + for connection in connections { + if let sourceEngine = connection.auMixer.engine, sourceEngine != auMixer.engine { assertionFailure("Attempt to connect nodes from different engines.") return } - engine.attach(connection.avAudioNode) - - // Mixers will decide which input bus to use. - if let mixer = avAudioNode as? AVAudioMixerNode { - mixer.connectMixer(input: connection.avAudioNode) - } else { - avAudioNode.connect(input: connection.avAudioNode, bus: bus) - } - + engine.attach(connection.auMixer) + auMixer.connectMixer(input: connection.auMixer) connection.makeAVConnections() } } diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Node.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Node.swift deleted file mode 100644 index fe335f4..0000000 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Node.swift +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/ - -import AVFoundation - -/// Node in an audio graph. -protocol Node: AnyObject { - /// Nodes providing audio input to this node. - var connections: [Node] { get } - - /// Internal AVAudioEngine node. - var avAudioNode: AVAudioNode { get } -} From a08f97e7daf3d175574ea7202726477c753ea678 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:58:45 -0400 Subject: [PATCH 15/27] Make `AudioEngine.Input` private (#76) --- .../Sources/MicrophonePitchDetector/AudioEngine.swift | 8 ++++---- .../MicrophonePitchDetector/MicrophonePitchDetector.swift | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index bcd9f91..285dfa5 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -41,7 +41,7 @@ final class AudioEngine { private var mainMixerNode: Mixer? /// Input node mixer - class InputNode: Mixer { + private final class Input: Mixer { var isNotConnected = true func connect(to engine: AudioEngine) { @@ -50,16 +50,16 @@ final class AudioEngine { } } - private let _input = InputNode() + private let _input = Input() /// Input for microphone is created when this is accessed - var input: InputNode { + var inputMixer: AVAudioMixerNode { if _input.isNotConnected { _input.connect(to: self) _input.isNotConnected = false self.createSilentOutput() } - return _input + return _input.auMixer } /// Empty initializer diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift index feb8800..006a77a 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophonePitchDetector.swift @@ -31,7 +31,7 @@ public final class MicrophonePitchDetector: ObservableObject { #if !os(macOS) try engine.configureSession() #endif - tracker = PitchTap(engine.input.auMixer, handler: { pitch in + tracker = PitchTap(engine.inputMixer, handler: { pitch in Task { @MainActor in self.pitch = pitch } From dc8ada876946cfa56fd88998e6a01f9b4b3fe189 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 10:59:42 -0400 Subject: [PATCH 16/27] Simplify `Mixer` class (#77) --- .../MicrophonePitchDetector/AudioEngine.swift | 1 - .../MicrophonePitchDetector/Mixer.swift | 43 +++---------------- 2 files changed, 5 insertions(+), 39 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index 285dfa5..d7a4441 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -103,7 +103,6 @@ final class AudioEngine { avEngine.attach(mixer.auMixer) avEngine.connect(mixer.auMixer, to: avEngine.outputNode, format: .stereo) mainMixerNode = mixer - mixer.silenceOutput() } } diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift index d2858d6..596fda9 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/Mixer.swift @@ -4,51 +4,18 @@ import AVFoundation /// AudioKit version of Apple's Mixer Node. Mixes a variadic list of Nodes. class Mixer { - private var inputs: [Mixer] = [] - - /// Connected nodes - var connections: [Mixer] { inputs } - let auMixer = AVAudioMixerNode() /// Initialize the mixer node with no inputs, to be connected later init() {} /// Add input to the mixer - /// - Parameter node: Node to add + /// + /// - parameter node: Node to add func addInput(_ node: Mixer) { - assert(!hasInput(node), "Node is already connected to Mixer.") - inputs.append(node) - makeAVConnections() - } - - /// Is this node already connected? - /// - Parameter node: Node to check - private func hasInput(_ node: Mixer) -> Bool { - connections.contains(where: { $0 === node }) - } - - func silenceOutput() { + guard let engine = auMixer.engine else { return } + engine.attach(node.auMixer) + auMixer.connectMixer(input: node.auMixer) auMixer.outputVolume = 0 } } - -private extension Mixer { - func makeAVConnections() { - // Are we attached? - guard let engine = auMixer.engine else { - return - } - - for connection in connections { - if let sourceEngine = connection.auMixer.engine, sourceEngine != auMixer.engine { - assertionFailure("Attempt to connect nodes from different engines.") - return - } - - engine.attach(connection.auMixer) - auMixer.connectMixer(input: connection.auMixer) - connection.makeAVConnections() - } - } -} From e7bd6aaf5824a3f85b274345c054310488d61b59 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 11:08:48 -0400 Subject: [PATCH 17/27] Remove unused `AVAudioNode.connect(input:bus:)` function (#78) --- .../MicrophonePitchDetector/AudioEngine.swift | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index d7a4441..6fbd2e6 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -2,21 +2,6 @@ import AVFoundation -extension AVAudioNode { - /// Make a connection without breaking other connections. - func connect(input: AVAudioNode, bus: Int) { - guard let engine = engine else { return } - - var points = engine.outputConnectionPoints(for: input, outputBus: 0) - if points.contains(where: { $0.node === self && $0.bus == bus }) { - return - } - - points.append(AVAudioConnectionPoint(node: self, bus: bus)) - engine.connect(input, to: points, fromBus: 0, format: .stereo) - } -} - extension AVAudioMixerNode { /// Make a connection without breaking other connections. func connectMixer(input: AVAudioNode) { From 794bf3be18d2eff65ccc17e2bc28a729dde71261 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 28 Jun 2023 11:10:48 -0400 Subject: [PATCH 18/27] Remove unused `mainMixerNode` property (#79) The engine will strongly retain it --- .../MicrophonePitchDetector/AudioEngine.swift | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift index 6fbd2e6..2d2f7ec 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/AudioEngine.swift @@ -22,9 +22,6 @@ final class AudioEngine { /// Internal AVAudioEngine private let avEngine = AVAudioEngine() - /// Main mixer at the end of the signal chain - private var mainMixerNode: Mixer? - /// Input node mixer private final class Input: Mixer { var isNotConnected = true @@ -75,19 +72,16 @@ final class AudioEngine { avEngine.attach(output.auMixer) // create the on demand mixer if needed - createEngineMixer() - mainMixerNode?.addInput(output) + createEngineMixer(input: output) } // simulate the AVAudioEngine.mainMixerNode, but create it ourselves to ensure the // correct sample rate is used from .stereo - private func createEngineMixer() { - guard mainMixerNode == nil else { return } - + private func createEngineMixer(input: Mixer) { let mixer = Mixer() avEngine.attach(mixer.auMixer) avEngine.connect(mixer.auMixer, to: avEngine.outputNode, format: .stereo) - mainMixerNode = mixer + mixer.addInput(input) } } From 9197e4d9313f4e36b4ebb62fb10f923071d73342 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 18 Oct 2023 10:19:52 -0400 Subject: [PATCH 19/27] Update for Xcode 15 (#80) Add support for visionOS. Bump minimum OS versions: * iOS: 16.0 * watchOS: 9.0 * macOS: 13.0 * visionOS: 1.0 --- .github/workflows/ci.yml | 39 +-- .swiftlint.yml | 4 +- .../MicrophonePitchDetector/Package.resolved | 33 ++- .../MicrophonePitchDetector/Package.swift | 6 +- .../MicrophoneAccess.swift | 33 +-- .../PitchRecording/PitchRecording.swift | 28 ++- .../MicrophonePitchDetectorTests.swift | 15 +- .../Snapshotting+PitchRecording.swift | 57 +++++ .../testPiano.A0.json | 48 ++-- .../testPiano.A1.json | 42 ++-- .../testPiano.A2.json | 24 +- .../testPiano.A3.json | 24 +- .../testPiano.A4.json | 20 +- .../testPiano.A5.json | 6 +- .../testPiano.A6.json | 6 +- .../testPiano.Ab1.json | 44 ++-- .../testPiano.Ab2.json | 26 +- .../testPiano.Ab3.json | 24 +- .../testPiano.Ab4.json | 22 +- .../testPiano.Ab5.json | 6 +- .../testPiano.Ab6.json | 6 +- .../testPiano.Ab7.json | 2 +- .../testPiano.B0.json | 48 ++-- .../testPiano.B1.json | 40 ++-- .../testPiano.B2.json | 36 +-- .../testPiano.B3.json | 28 +-- .../testPiano.B4.json | 12 +- .../testPiano.B5.json | 6 +- .../testPiano.B6.json | 4 +- .../testPiano.Bb0.json | 48 ++-- .../testPiano.Bb1.json | 36 +-- .../testPiano.Bb2.json | 24 +- .../testPiano.Bb3.json | 24 +- .../testPiano.Bb4.json | 18 +- .../testPiano.Bb5.json | 6 +- .../testPiano.Bb6.json | 4 +- .../testPiano.C1.json | 50 ++-- .../testPiano.C2.json | 36 +-- .../testPiano.C3.json | 34 +-- .../testPiano.C4.json | 26 +- .../testPiano.C5.json | 12 +- .../testPiano.C6.json | 6 +- .../testPiano.C7.json | 4 +- .../testPiano.D1.json | 48 ++-- .../testPiano.D2.json | 32 +-- .../testPiano.D3.json | 28 +-- .../testPiano.D4.json | 26 +- .../testPiano.D5.json | 10 +- .../testPiano.D6.json | 6 +- .../testPiano.D7.json | 2 +- .../testPiano.Db1.json | 50 ++-- .../testPiano.Db2.json | 34 +-- .../testPiano.Db3.json | 36 +-- .../testPiano.Db4.json | 26 +- .../testPiano.Db5.json | 10 +- .../testPiano.Db6.json | 6 +- .../testPiano.Db7.json | 2 +- .../testPiano.E1.json | 48 ++-- .../testPiano.E2.json | 50 ++-- .../testPiano.E3.json | 44 ++-- .../testPiano.E4.json | 16 +- .../testPiano.E5.json | 4 +- .../testPiano.E6.json | 4 +- .../testPiano.E7.json | 2 +- .../testPiano.Eb1.json | 48 ++-- .../testPiano.Eb2.json | 50 ++-- .../testPiano.Eb3.json | 42 ++-- .../testPiano.Eb4.json | 16 +- .../testPiano.Eb5.json | 4 +- .../testPiano.Eb6.json | 4 +- .../testPiano.Eb7.json | 2 +- .../testPiano.F1.json | 50 ++-- .../testPiano.F2.json | 46 ++-- .../testPiano.F3.json | 34 +-- .../testPiano.F4.json | 16 +- .../testPiano.F5.json | 4 +- .../testPiano.F6.json | 6 +- .../testPiano.F7.json | 2 +- .../testPiano.G1.json | 44 ++-- .../testPiano.G2.json | 28 +-- .../testPiano.G3.json | 26 +- .../testPiano.G4.json | 24 +- .../testPiano.G5.json | 8 +- .../testPiano.G6.json | 4 +- .../testPiano.G7.json | 2 +- .../testPiano.Gb1.json | 50 ++-- .../testPiano.Gb2.json | 48 ++-- .../testPiano.Gb3.json | 42 ++-- .../testPiano.Gb4.json | 12 +- .../testPiano.Gb5.json | 4 +- .../testPiano.Gb6.json | 4 +- .../testPiano.Gb7.json | 2 +- README.md | 6 +- ZenTuner.xcodeproj/project.pbxproj | 225 ++++-------------- .../xcshareddata/swiftpm/Package.resolved | 13 +- .../xcschemes/ZenTuner_iOS.xcscheme | 88 ------- .../xcschemes/ZenTuner_macOS.xcscheme | 78 ------ .../xcschemes/ZenTuner_watchOS.xcscheme | 2 +- ZenTuner/Helpers/ColorAnimation.swift | 57 ----- ZenTuner/Models/Frequency.swift | 12 +- ZenTuner/Models/ScaleNote.swift | 72 ++---- ZenTuner/TunerScreen.swift | 6 +- ZenTuner/Views/MatchedNoteView.swift | 18 +- ZenTuner/Views/NoteDistanceMarkers.swift | 19 +- ZenTuner/Views/TranspositionMenu.swift | 6 +- .../testTunerView.ipad-dark.png | Bin 41498 -> 41570 bytes .../testTunerView.ipad-light.png | Bin 43147 -> 43169 bytes .../testTunerView.ipad105-dark.png | Bin 45365 -> 45398 bytes .../testTunerView.ipad105-light.png | Bin 47227 -> 47261 bytes .../testTunerView.ipadPro11-dark.png | Bin 47195 -> 47248 bytes .../testTunerView.ipadPro11-light.png | Bin 49101 -> 49150 bytes .../testTunerView.ipadPro129-dark.png | Bin 58826 -> 58535 bytes .../testTunerView.ipadPro129-light.png | Bin 61372 -> 61424 bytes .../testTunerView.iphone4-dark.png | Bin 23700 -> 23728 bytes .../testTunerView.iphone4-light.png | Bin 24499 -> 24540 bytes .../testTunerView.iphone58-dark.png | Bin 26986 -> 27010 bytes .../testTunerView.iphone58-light.png | Bin 28910 -> 28954 bytes .../testTunerView.iphone6-dark.png | Bin 25551 -> 25582 bytes .../testTunerView.iphone6-light.png | Bin 26860 -> 26895 bytes .../testTunerView.iphone65-dark.png | Bin 29331 -> 29376 bytes .../testTunerView.iphone65-light.png | Bin 31300 -> 31339 bytes .../testTunerView.iphone6Plus-dark.png | Bin 27527 -> 27562 bytes .../testTunerView.iphone6Plus-light.png | Bin 28838 -> 28879 bytes 123 files changed, 1208 insertions(+), 1517 deletions(-) create mode 100644 Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Snapshotting+PitchRecording.swift delete mode 100644 ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_iOS.xcscheme delete mode 100644 ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_macOS.xcscheme delete mode 100644 ZenTuner/Helpers/ColorAnimation.swift diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28d1252..408db61 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,32 +10,41 @@ on: jobs: test: - runs-on: macos-12 + runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_14.1.app + DEVELOPER_DIR: /Applications/Xcode_15.0.app steps: - uses: actions/checkout@v3 - name: Test - run: xcodebuild test -scheme "ZenTuner_iOS" -destination platform="iOS Simulator,name=iPhone 14 Pro Max,OS=16.1" - # TODO: Try enabling this once GitHub Actions has macos-13 runners - # test_packages: - # runs-on: macos-13 - # steps: - # - uses: actions/checkout@v3 - # - name: Test - # run: swift test --package-path Packages/MicrophonePitchDetector + run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.0" + test_packages: + runs-on: macos-13 + env: + DEVELOPER_DIR: /Applications/Xcode_15.0.app + steps: + - uses: actions/checkout@v3 + - name: Test + run: swift test --package-path Packages/MicrophonePitchDetector macos: - runs-on: macos-12 + runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_14.1.app + DEVELOPER_DIR: /Applications/Xcode_15.0.app steps: - uses: actions/checkout@v3 - name: Build macOS - run: xcodebuild build -scheme "ZenTuner_macOS" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO + run: xcodebuild build -scheme "Zen Tuner" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO + watchos: + runs-on: macos-13 + env: + DEVELOPER_DIR: /Applications/Xcode_15.0.app + steps: + - uses: actions/checkout@v3 + - name: Build watchOS + run: xcodebuild build -scheme "ZenTuner_watchOS" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO lint: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 container: - image: ghcr.io/realm/swiftlint:0.50.3 + image: ghcr.io/realm/swiftlint:0.53.0 steps: - uses: actions/checkout@v3 - name: Run SwiftLint diff --git a/.swiftlint.yml b/.swiftlint.yml index e85b1c4..a070180 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,6 +1,7 @@ disabled_rules: - multiple_closures_with_trailing_closure - opening_brace + - switch_case_alignment - todo - weak_delegate @@ -84,11 +85,12 @@ identifier_name: # Other - id - to - - MicrophoneAccessAlert() + - MicrophoneAccessAlert\(\) file_name: excluded: - Alignment.swift + - Snapshotting+PitchRecording.swift large_tuple: warning: 3 diff --git a/Packages/MicrophonePitchDetector/Package.resolved b/Packages/MicrophonePitchDetector/Package.resolved index 4b5117d..d2dfc75 100644 --- a/Packages/MicrophonePitchDetector/Package.resolved +++ b/Packages/MicrophonePitchDetector/Package.resolved @@ -1,16 +1,23 @@ { - "object": { - "pins": [ - { - "package": "swift-snapshot-testing", - "repositoryURL": "https://github.com/pointfreeco/swift-snapshot-testing", - "state": { - "branch": null, - "revision": "f29e2014f6230cf7d5138fc899da51c7f513d467", - "version": "1.10.0" - } + "pins" : [ + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "bb0ea08db8e73324fe6c3727f755ca41a23ff2f4", + "version" : "1.14.2" } - ] - }, - "version": 1 + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "74203046135342e4a4a627476dd6caf8b28fe11b", + "version" : "509.0.0" + } + } + ], + "version" : 2 } diff --git a/Packages/MicrophonePitchDetector/Package.swift b/Packages/MicrophonePitchDetector/Package.swift index d9628c4..ab0b6fc 100644 --- a/Packages/MicrophonePitchDetector/Package.swift +++ b/Packages/MicrophonePitchDetector/Package.swift @@ -1,18 +1,18 @@ -// swift-tools-version:5.7 +// swift-tools-version:5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "MicrophonePitchDetector", - platforms: [.macOS(.v11), .iOS(.v14), .watchOS(.v7)], + platforms: [.macOS(.v13), .iOS(.v16), .watchOS(.v9)], products: [ .library(name: "MicrophonePitchDetector", targets: ["MicrophonePitchDetector"]) ], dependencies: [ .package( url: "https://github.com/pointfreeco/swift-snapshot-testing", - from: "1.10.0" + from: "1.14.2" ) ], targets: [ diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift index d22ccce..bc2a2f3 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift @@ -7,28 +7,29 @@ enum MicrophoneAccess { } static func getOrRequestPermission() async -> Status { + if #available(iOS 17.0, macOS 14.0, watchOS 10.0, xrOS 1.0, *) { + let recordPermission = AVAudioApplication.shared.recordPermission + return switch recordPermission { + case .undetermined: await AVAudioApplication.requestRecordPermission() ? .granted : .denied + case .granted: .granted + case .denied: .denied + @unknown default: .denied + } + } + #if os(watchOS) return await withCheckedContinuation { continuation in AVAudioSession.sharedInstance().requestRecordPermission { granted in continuation.resume(with: .success(granted ? .granted : .denied)) } } -#else - switch AVCaptureDevice.authorizationStatus(for: .audio) { - case .authorized: // The user has previously granted access to the microphone. - return .granted - case .notDetermined: // The user has not yet been asked for microphone access. - if await AVCaptureDevice.requestAccess(for: .audio) { - return .granted - } else { - return .denied - } - case .denied: // The user has previously denied access. - return .denied - case .restricted: // The user can't grant access due to restrictions. - return .denied - @unknown default: - return .denied +#elseif !os(xrOS) + let authorizationStatus = AVCaptureDevice.authorizationStatus(for: .audio) + return switch authorizationStatus { + case .notDetermined: await AVCaptureDevice.requestAccess(for: .audio) ? .granted : .denied + case .authorized: .granted + case .denied, .restricted: .denied + @unknown default: .denied } #endif } diff --git a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift index c1628f7..af76471 100644 --- a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift +++ b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift @@ -6,13 +6,22 @@ enum PitchRecordingError: Error { } public struct PitchRecording: Codable, Equatable { - private struct Entry: Codable, Equatable { - let iteration: Int - // Stored as a String to compare to some fixed precision - let pitch: String? + public struct Entry: Codable, Equatable { + public let iteration: Int + public let pitch: Double? + + public func isApproximatelyEqual(to other: Self, pitchThreshold: Double) -> Bool { + guard iteration == other.iteration else { return false } + + guard let pitch = pitch, let otherPitch = other.pitch else { + return pitch == nil && other.pitch == nil + } + + return abs(pitch - otherPitch) < pitchThreshold + } } - private var entries: [Entry] = [] + public var entries: [Entry] = [] public static func record(file fileURL: URL) throws -> PitchRecording { let bufferSize = PitchTracker.defaultBufferSize @@ -36,8 +45,7 @@ public struct PitchRecording: Codable, Equatable { } let pitch = tracker.getPitch(from: buffer, amplitudeThreshold: 0.05) - let pitchDescription = pitch?.descriptionForSnapshot() - let entry = PitchRecording.Entry(iteration: iteration, pitch: pitchDescription) + let entry = PitchRecording.Entry(iteration: iteration, pitch: pitch) pitchRecording.entries.append(entry) iteration += 1 } @@ -45,9 +53,3 @@ public struct PitchRecording: Codable, Equatable { return pitchRecording } } - -private extension FloatingPoint where Self: CVarArg { - func descriptionForSnapshot() -> String { - String(format: "%.3f", self) - } -} diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift index 06852c5..2123cc7 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/MicrophonePitchDetectorTests.swift @@ -21,11 +21,9 @@ final class MicrophonePitchDetectorTests: XCTestCase { ).filter { $0.pathExtension == "mp3" } // Running in parallel is ~7x faster on an M1 Max - await audioFiles.concurrentForEach { audioFile in - // swiftlint:disable:next force_try - Can't throw in a `concurrentForEach` - let pitchRecording = try! PitchRecording.record(file: audioFile) + try await audioFiles.concurrentForEach { audioFile in + let pitchRecording = try PitchRecording.record(file: audioFile) let name = String(audioFile.lastPathComponent.prefix(while: { $0 != "." })) - print("Comparing pitch recording snapshot for \(name)") await assertAudioFileSnapshot(matching: pitchRecording, named: name) } } @@ -41,7 +39,7 @@ private func assertAudioFileSnapshot( { assertSnapshot( matching: recording, - as: .json, + as: .pitchRecording, named: name, file: file, testName: testName, @@ -50,13 +48,14 @@ private func assertAudioFileSnapshot( } private extension Sequence { - func concurrentForEach(_ operation: @escaping (Element) async -> Void) async { - await withTaskGroup(of: Void.self) { group in + func concurrentForEach(_ operation: @escaping (Element) async throws -> Void) async throws { + try await withThrowingTaskGroup(of: Void.self) { group in for element in self { group.addTask { - await operation(element) + try await operation(element) } } + for try await _ in group {} } } } diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Snapshotting+PitchRecording.swift b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Snapshotting+PitchRecording.swift new file mode 100644 index 0000000..4263ca6 --- /dev/null +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/Snapshotting+PitchRecording.swift @@ -0,0 +1,57 @@ +import Foundation +import PitchRecording +import SnapshotTesting +import XCTest + +extension SimplySnapshotting { + static let pitchRecording = Snapshotting( + pathExtension: "json", + diffing: .pitchRecording + ) +} + +private extension JSONEncoder { + static let prettyPrinted: JSONEncoder = { + let encoder = JSONEncoder() + encoder.outputFormatting = [.prettyPrinted, .sortedKeys] + return encoder + }() +} + +private extension Diffing where Value == PitchRecording { + static let pitchRecording = Diffing( + // swiftlint:disable:next force_try + toData: { try! JSONEncoder.prettyPrinted.encode($0) }, + // swiftlint:disable:next force_try + fromData: { try! JSONDecoder().decode(PitchRecording.self, from: $0) } + ) { old, new -> (String, [XCTAttachment])? in + guard old.entries.count == new.entries.count else { return nil } + + let mismatchedEntries = zip(old.entries, new.entries).filter { old, new in + !old.isApproximatelyEqual(to: new, pitchThreshold: 1) + } + + if mismatchedEntries.isEmpty { + return nil + } + + let numberOfMismatchesToPrint = 5 + let mismatchDescriptions = mismatchedEntries.prefix(numberOfMismatchesToPrint).compactMap { entry in + Snapshotting.lines.diffing.diff("\(entry.0)", "\(entry.1)")?.0 + } + + var messageSegments = [ + "Found \(mismatchedEntries.count) mismatched \(mismatchedEntries.count == 1 ? "entry" : "entries")." + ] + + if mismatchedEntries.count > numberOfMismatchesToPrint { + messageSegments.append("First \(numberOfMismatchesToPrint) mismatches are:") + } + + messageSegments.append(contentsOf: mismatchDescriptions) + + let message = messageSegments.joined(separator: "\n") + + return (message, []) + } +} diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A0.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A0.json index 3fc5441..4a7cfab 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A0.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A0.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "27.657" + "pitch" : 27.657310485839844 }, { "iteration" : 3, - "pitch" : "27.216" + "pitch" : 27.215675354003906 }, { "iteration" : 4, - "pitch" : "54.762" + "pitch" : 54.762222290039062 }, { "iteration" : 5, - "pitch" : "27.448" + "pitch" : 27.448247909545898 }, { "iteration" : 6, - "pitch" : "27.356" + "pitch" : 27.355859756469727 }, { "iteration" : 7, - "pitch" : "27.419" + "pitch" : 27.419174194335938 }, { "iteration" : 8, - "pitch" : "27.510" + "pitch" : 27.510112762451172 }, { "iteration" : 9, - "pitch" : "27.447" + "pitch" : 27.447050094604492 }, { "iteration" : 10, - "pitch" : "27.381" + "pitch" : 27.380687713623047 }, { "iteration" : 11, - "pitch" : "27.418" + "pitch" : 27.418197631835938 }, { "iteration" : 12, - "pitch" : "27.463" + "pitch" : 27.463048934936523 }, { "iteration" : 13, - "pitch" : "27.411" + "pitch" : 27.410831451416016 }, { "iteration" : 14, - "pitch" : "27.449" + "pitch" : 27.449378967285156 }, { "iteration" : 15, - "pitch" : "27.417" + "pitch" : 27.416511535644531 }, { "iteration" : 16, - "pitch" : "27.414" + "pitch" : 27.414312362670898 }, { "iteration" : 17, - "pitch" : "27.417" + "pitch" : 27.416664123535156 }, { "iteration" : 18, - "pitch" : "27.423" + "pitch" : 27.423486709594727 }, { "iteration" : 19, - "pitch" : "27.460" + "pitch" : 27.460294723510742 }, { "iteration" : 20, - "pitch" : "27.420" + "pitch" : 27.419824600219727 }, { "iteration" : 21, - "pitch" : "27.409" + "pitch" : 27.409172058105469 }, { "iteration" : 22, - "pitch" : "27.415" + "pitch" : 27.414670944213867 }, { "iteration" : 23, - "pitch" : "27.425" + "pitch" : 27.425365447998047 }, { "iteration" : 24, - "pitch" : "27.396" + "pitch" : 27.396129608154297 }, { "iteration" : 25, - "pitch" : "27.407" + "pitch" : 27.407375335693359 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A1.json index 0e6200e..ef34405 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A1.json @@ -8,87 +8,87 @@ }, { "iteration" : 2, - "pitch" : "54.984" + "pitch" : 54.984500885009766 }, { "iteration" : 3, - "pitch" : "54.586" + "pitch" : 54.585655212402344 }, { "iteration" : 4, - "pitch" : "54.863" + "pitch" : 54.863292694091797 }, { "iteration" : 5, - "pitch" : "54.804" + "pitch" : 54.803791046142578 }, { "iteration" : 6, - "pitch" : "54.848" + "pitch" : 54.8480224609375 }, { "iteration" : 7, - "pitch" : "54.415" + "pitch" : 54.414558410644531 }, { "iteration" : 8, - "pitch" : "54.669" + "pitch" : 54.668827056884766 }, { "iteration" : 9, - "pitch" : "54.789" + "pitch" : 54.789505004882812 }, { "iteration" : 10, - "pitch" : "54.720" + "pitch" : 54.719741821289062 }, { "iteration" : 11, - "pitch" : "54.713" + "pitch" : 54.713462829589844 }, { "iteration" : 12, - "pitch" : "54.865" + "pitch" : 54.865013122558594 }, { "iteration" : 13, - "pitch" : "54.787" + "pitch" : 54.787349700927734 }, { "iteration" : 14, - "pitch" : "54.760" + "pitch" : 54.760250091552734 }, { "iteration" : 15, - "pitch" : "54.523" + "pitch" : 54.523231506347656 }, { "iteration" : 16, - "pitch" : "54.716" + "pitch" : 54.716316223144531 }, { "iteration" : 17, - "pitch" : "54.780" + "pitch" : 54.779972076416016 }, { "iteration" : 18, - "pitch" : "54.643" + "pitch" : 54.643447875976562 }, { "iteration" : 19, - "pitch" : "54.853" + "pitch" : 54.853153228759766 }, { "iteration" : 20, - "pitch" : "54.593" + "pitch" : 54.592891693115234 }, { "iteration" : 21, - "pitch" : "54.497" + "pitch" : 54.496871948242188 }, { "iteration" : 22, - "pitch" : "54.622" + "pitch" : 54.622081756591797 }, { "iteration" : 23 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A2.json index 651c344..5e1af6d 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A2.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "109.531" + "pitch" : 109.53108215332031 }, { "iteration" : 2, - "pitch" : "110.095" + "pitch" : 110.09523773193359 }, { "iteration" : 3, - "pitch" : "109.916" + "pitch" : 109.91629028320312 }, { "iteration" : 4, - "pitch" : "109.738" + "pitch" : 109.73829650878906 }, { "iteration" : 5, - "pitch" : "109.879" + "pitch" : 109.87879180908203 }, { "iteration" : 6, - "pitch" : "109.830" + "pitch" : 109.83011627197266 }, { "iteration" : 7, - "pitch" : "109.802" + "pitch" : 109.80233001708984 }, { "iteration" : 8, - "pitch" : "109.799" + "pitch" : 109.79874420166016 }, { "iteration" : 9, - "pitch" : "109.918" + "pitch" : 109.91763305664062 }, { "iteration" : 10, - "pitch" : "109.805" + "pitch" : 109.80496215820312 }, { "iteration" : 11, - "pitch" : "109.820" + "pitch" : 109.82015228271484 }, { "iteration" : 12, - "pitch" : "109.567" + "pitch" : 109.56680297851562 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A3.json index c3d3b81..e1ccce7 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A3.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "220.336" + "pitch" : 220.33627319335938 }, { "iteration" : 2, - "pitch" : "220.452" + "pitch" : 220.45213317871094 }, { "iteration" : 3, - "pitch" : "220.618" + "pitch" : 220.61846923828125 }, { "iteration" : 4, - "pitch" : "220.111" + "pitch" : 220.11050415039062 }, { "iteration" : 5, - "pitch" : "220.064" + "pitch" : 220.06394958496094 }, { "iteration" : 6, - "pitch" : "220.696" + "pitch" : 220.69557189941406 }, { "iteration" : 7, - "pitch" : "220.241" + "pitch" : 220.24085998535156 }, { "iteration" : 8, - "pitch" : "219.977" + "pitch" : 219.97691345214844 }, { "iteration" : 9, - "pitch" : "220.006" + "pitch" : 220.00619506835938 }, { "iteration" : 10, - "pitch" : "220.133" + "pitch" : 220.13302612304688 }, { "iteration" : 11, - "pitch" : "220.037" + "pitch" : 220.03744506835938 }, { "iteration" : 12, - "pitch" : "219.973" + "pitch" : 219.97331237792969 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A4.json index 7731db1..8102399 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A4.json @@ -5,43 +5,43 @@ }, { "iteration" : 1, - "pitch" : "439.236" + "pitch" : 439.23587036132812 }, { "iteration" : 2, - "pitch" : "441.179" + "pitch" : 441.17868041992188 }, { "iteration" : 3, - "pitch" : "441.779" + "pitch" : 441.779052734375 }, { "iteration" : 4, - "pitch" : "440.388" + "pitch" : 440.38763427734375 }, { "iteration" : 5, - "pitch" : "440.255" + "pitch" : 440.25485229492188 }, { "iteration" : 6, - "pitch" : "440.164" + "pitch" : 440.16445922851562 }, { "iteration" : 7, - "pitch" : "440.219" + "pitch" : 440.21914672851562 }, { "iteration" : 8, - "pitch" : "440.131" + "pitch" : 440.13104248046875 }, { "iteration" : 9, - "pitch" : "440.121" + "pitch" : 440.12069702148438 }, { "iteration" : 10, - "pitch" : "440.138" + "pitch" : 440.1376953125 }, { "iteration" : 11 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A5.json index 94f6ee8..43478b3 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A5.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "884.852" + "pitch" : 884.85235595703125 }, { "iteration" : 2, - "pitch" : "882.138" + "pitch" : 882.13775634765625 }, { "iteration" : 3, - "pitch" : "881.577" + "pitch" : 881.57647705078125 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A6.json index cf37d5e..b9c0af8 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.A6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1763.575" + "pitch" : 1763.5743408203125 }, { "iteration" : 2, - "pitch" : "1768.263" + "pitch" : 1768.2626953125 }, { "iteration" : 3, - "pitch" : "1771.645" + "pitch" : 1771.6448974609375 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab1.json index 67c8737..161829a 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab1.json @@ -5,91 +5,91 @@ }, { "iteration" : 1, - "pitch" : "78.539" + "pitch" : 78.538810729980469 }, { "iteration" : 2, - "pitch" : "51.783" + "pitch" : 51.783233642578125 }, { "iteration" : 3, - "pitch" : "51.924" + "pitch" : 51.923862457275391 }, { "iteration" : 4, - "pitch" : "51.833" + "pitch" : 51.83251953125 }, { "iteration" : 5, - "pitch" : "51.979" + "pitch" : 51.97882080078125 }, { "iteration" : 6, - "pitch" : "51.938" + "pitch" : 51.938144683837891 }, { "iteration" : 7, - "pitch" : "51.815" + "pitch" : 51.814674377441406 }, { "iteration" : 8, - "pitch" : "51.607" + "pitch" : 51.607429504394531 }, { "iteration" : 9, - "pitch" : "51.847" + "pitch" : 51.846595764160156 }, { "iteration" : 10, - "pitch" : "51.699" + "pitch" : 51.698986053466797 }, { "iteration" : 11, - "pitch" : "51.879" + "pitch" : 51.879032135009766 }, { "iteration" : 12, - "pitch" : "52.026" + "pitch" : 52.026203155517578 }, { "iteration" : 13, - "pitch" : "51.585" + "pitch" : 51.584537506103516 }, { "iteration" : 14, - "pitch" : "51.694" + "pitch" : 51.6944580078125 }, { "iteration" : 15, - "pitch" : "51.659" + "pitch" : 51.659465789794922 }, { "iteration" : 16, - "pitch" : "51.918" + "pitch" : 51.918315887451172 }, { "iteration" : 17, - "pitch" : "51.659" + "pitch" : 51.659492492675781 }, { "iteration" : 18, - "pitch" : "51.807" + "pitch" : 51.807300567626953 }, { "iteration" : 19, - "pitch" : "51.866" + "pitch" : 51.865924835205078 }, { "iteration" : 20, - "pitch" : "51.582" + "pitch" : 51.582401275634766 }, { "iteration" : 21, - "pitch" : "51.730" + "pitch" : 51.729793548583984 }, { "iteration" : 22, - "pitch" : "51.599" + "pitch" : 51.599246978759766 }, { "iteration" : 23 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab2.json index e77414d..d6ad411 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab2.json @@ -5,55 +5,55 @@ }, { "iteration" : 1, - "pitch" : "102.793" + "pitch" : 102.79273986816406 }, { "iteration" : 2, - "pitch" : "103.410" + "pitch" : 103.41041564941406 }, { "iteration" : 3, - "pitch" : "103.906" + "pitch" : 103.90580749511719 }, { "iteration" : 4, - "pitch" : "103.813" + "pitch" : 103.81318664550781 }, { "iteration" : 5, - "pitch" : "103.690" + "pitch" : 103.69020080566406 }, { "iteration" : 6, - "pitch" : "103.596" + "pitch" : 103.59603118896484 }, { "iteration" : 7, - "pitch" : "103.887" + "pitch" : 103.88655090332031 }, { "iteration" : 8, - "pitch" : "103.790" + "pitch" : 103.78992462158203 }, { "iteration" : 9, - "pitch" : "103.492" + "pitch" : 103.49227905273438 }, { "iteration" : 10, - "pitch" : "103.607" + "pitch" : 103.60686492919922 }, { "iteration" : 11, - "pitch" : "103.753" + "pitch" : 103.75286865234375 }, { "iteration" : 12, - "pitch" : "103.815" + "pitch" : 103.81488800048828 }, { "iteration" : 13, - "pitch" : "103.596" + "pitch" : 103.59560394287109 }, { "iteration" : 14 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab3.json index aa13faa..7168e2f 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab3.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "103.475" + "pitch" : 103.47500610351562 }, { "iteration" : 2, - "pitch" : "207.700" + "pitch" : 207.70039367675781 }, { "iteration" : 3, - "pitch" : "208.091" + "pitch" : 208.0911865234375 }, { "iteration" : 4, - "pitch" : "207.798" + "pitch" : 207.79826354980469 }, { "iteration" : 5, - "pitch" : "207.830" + "pitch" : 207.82997131347656 }, { "iteration" : 6, - "pitch" : "207.700" + "pitch" : 207.7003173828125 }, { "iteration" : 7, - "pitch" : "207.654" + "pitch" : 207.65434265136719 }, { "iteration" : 8, - "pitch" : "207.585" + "pitch" : 207.58491516113281 }, { "iteration" : 9, - "pitch" : "207.721" + "pitch" : 207.72105407714844 }, { "iteration" : 10, - "pitch" : "207.869" + "pitch" : 207.86880493164062 }, { "iteration" : 11, - "pitch" : "207.485" + "pitch" : 207.48513793945312 }, { "iteration" : 12, - "pitch" : "207.905" + "pitch" : 207.90478515625 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab4.json index c42dc97..a19ad6b 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab4.json @@ -5,47 +5,47 @@ }, { "iteration" : 1, - "pitch" : "415.116" + "pitch" : 415.11602783203125 }, { "iteration" : 2, - "pitch" : "416.220" + "pitch" : 416.21969604492188 }, { "iteration" : 3, - "pitch" : "415.893" + "pitch" : 415.89291381835938 }, { "iteration" : 4, - "pitch" : "415.659" + "pitch" : 415.65859985351562 }, { "iteration" : 5, - "pitch" : "416.262" + "pitch" : 416.26171875 }, { "iteration" : 6, - "pitch" : "416.253" + "pitch" : 416.253173828125 }, { "iteration" : 7, - "pitch" : "415.521" + "pitch" : 415.52053833007812 }, { "iteration" : 8, - "pitch" : "416.349" + "pitch" : 416.34945678710938 }, { "iteration" : 9, - "pitch" : "416.603" + "pitch" : 416.60287475585938 }, { "iteration" : 10, - "pitch" : "416.166" + "pitch" : 416.16549682617188 }, { "iteration" : 11, - "pitch" : "416.747" + "pitch" : 416.7474365234375 }, { "iteration" : 12 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab5.json index ec1496e..11eb4fe 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab5.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "831.832" + "pitch" : 831.83221435546875 }, { "iteration" : 2, - "pitch" : "829.736" + "pitch" : 829.735595703125 }, { "iteration" : 3, - "pitch" : "832.421" + "pitch" : 832.42071533203125 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab6.json index dbb40f8..b87b5c0 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1665.137" + "pitch" : 1665.1370849609375 }, { "iteration" : 2, - "pitch" : "1671.927" + "pitch" : 1671.9267578125 }, { "iteration" : 3, - "pitch" : "1670.667" + "pitch" : 1670.66650390625 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab7.json index 72104eb..6cbaba9 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Ab7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "3356.414" + "pitch" : 3356.413818359375 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B0.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B0.json index 3ea732a..c9c20dd 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B0.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B0.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "30.672" + "pitch" : 30.67182731628418 }, { "iteration" : 3, - "pitch" : "30.749" + "pitch" : 30.748708724975586 }, { "iteration" : 4, - "pitch" : "30.893" + "pitch" : 30.892856597900391 }, { "iteration" : 5, - "pitch" : "30.837" + "pitch" : 30.836980819702148 }, { "iteration" : 6, - "pitch" : "30.776" + "pitch" : 30.776166915893555 }, { "iteration" : 7, - "pitch" : "30.894" + "pitch" : 30.893762588500977 }, { "iteration" : 8, - "pitch" : "30.839" + "pitch" : 30.839288711547852 }, { "iteration" : 9, - "pitch" : "30.880" + "pitch" : 30.879570007324219 }, { "iteration" : 10, - "pitch" : "30.727" + "pitch" : 30.727317810058594 }, { "iteration" : 11, - "pitch" : "30.908" + "pitch" : 30.907875061035156 }, { "iteration" : 12, - "pitch" : "30.739" + "pitch" : 30.739238739013672 }, { "iteration" : 13, - "pitch" : "30.847" + "pitch" : 30.846612930297852 }, { "iteration" : 14, - "pitch" : "30.878" + "pitch" : 30.877679824829102 }, { "iteration" : 15, - "pitch" : "30.801" + "pitch" : 30.801263809204102 }, { "iteration" : 16, - "pitch" : "30.861" + "pitch" : 30.860652923583984 }, { "iteration" : 17, - "pitch" : "30.785" + "pitch" : 30.784753799438477 }, { "iteration" : 18, - "pitch" : "30.868" + "pitch" : 30.868221282958984 }, { "iteration" : 19, - "pitch" : "30.686" + "pitch" : 30.685752868652344 }, { "iteration" : 20, - "pitch" : "30.861" + "pitch" : 30.860759735107422 }, { "iteration" : 21, - "pitch" : "30.844" + "pitch" : 30.844001770019531 }, { "iteration" : 22, - "pitch" : "30.969" + "pitch" : 30.96942138671875 }, { "iteration" : 23, - "pitch" : "30.874" + "pitch" : 30.873729705810547 }, { "iteration" : 24, - "pitch" : "30.781" + "pitch" : 30.781162261962891 }, { "iteration" : 25, - "pitch" : "30.890" + "pitch" : 30.88995361328125 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B1.json index c74db28..77ab3d4 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B1.json @@ -5,83 +5,83 @@ }, { "iteration" : 1, - "pitch" : "66.899" + "pitch" : 66.899375915527344 }, { "iteration" : 2, - "pitch" : "61.626" + "pitch" : 61.626258850097656 }, { "iteration" : 3, - "pitch" : "61.478" + "pitch" : 61.478363037109375 }, { "iteration" : 4, - "pitch" : "61.656" + "pitch" : 61.655719757080078 }, { "iteration" : 5, - "pitch" : "62.077" + "pitch" : 62.076560974121094 }, { "iteration" : 6, - "pitch" : "61.587" + "pitch" : 61.587276458740234 }, { "iteration" : 7, - "pitch" : "61.699" + "pitch" : 61.698551177978516 }, { "iteration" : 8, - "pitch" : "61.719" + "pitch" : 61.71917724609375 }, { "iteration" : 9, - "pitch" : "61.849" + "pitch" : 61.848987579345703 }, { "iteration" : 10, - "pitch" : "61.713" + "pitch" : 61.713405609130859 }, { "iteration" : 11, - "pitch" : "61.809" + "pitch" : 61.808937072753906 }, { "iteration" : 12, - "pitch" : "61.666" + "pitch" : 61.666164398193359 }, { "iteration" : 13, - "pitch" : "61.888" + "pitch" : 61.888465881347656 }, { "iteration" : 14, - "pitch" : "61.698" + "pitch" : 61.698329925537109 }, { "iteration" : 15, - "pitch" : "61.967" + "pitch" : 61.967155456542969 }, { "iteration" : 16, - "pitch" : "61.560" + "pitch" : 61.560085296630859 }, { "iteration" : 17, - "pitch" : "61.952" + "pitch" : 61.952312469482422 }, { "iteration" : 18, - "pitch" : "123.381" + "pitch" : 123.38135528564453 }, { "iteration" : 19, - "pitch" : "62.087" + "pitch" : 62.087100982666016 }, { "iteration" : 20, - "pitch" : "61.539" + "pitch" : 61.538749694824219 }, { "iteration" : 21 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B2.json index 3e082b8..4f2f198 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B2.json @@ -5,75 +5,75 @@ }, { "iteration" : 1, - "pitch" : "244.645" + "pitch" : 244.64482116699219 }, { "iteration" : 2, - "pitch" : "123.454" + "pitch" : 123.45449829101562 }, { "iteration" : 3, - "pitch" : "123.504" + "pitch" : 123.50363922119141 }, { "iteration" : 4, - "pitch" : "123.520" + "pitch" : 123.51988220214844 }, { "iteration" : 5, - "pitch" : "123.298" + "pitch" : 123.29839324951172 }, { "iteration" : 6, - "pitch" : "123.477" + "pitch" : 123.47700500488281 }, { "iteration" : 7, - "pitch" : "123.440" + "pitch" : 123.44000244140625 }, { "iteration" : 8, - "pitch" : "123.403" + "pitch" : 123.40290832519531 }, { "iteration" : 9, - "pitch" : "123.308" + "pitch" : 123.30830383300781 }, { "iteration" : 10, - "pitch" : "123.356" + "pitch" : 123.35552215576172 }, { "iteration" : 11, - "pitch" : "123.492" + "pitch" : 123.49246215820312 }, { "iteration" : 12, - "pitch" : "123.434" + "pitch" : 123.43356323242188 }, { "iteration" : 13, - "pitch" : "123.476" + "pitch" : 123.47595977783203 }, { "iteration" : 14, - "pitch" : "123.281" + "pitch" : 123.28092193603516 }, { "iteration" : 15, - "pitch" : "123.380" + "pitch" : 123.37975311279297 }, { "iteration" : 16, - "pitch" : "123.376" + "pitch" : 123.37647247314453 }, { "iteration" : 17, - "pitch" : "123.419" + "pitch" : 123.41946411132812 }, { "iteration" : 18, - "pitch" : "123.349" + "pitch" : 123.34915924072266 }, { "iteration" : 19 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B3.json index 87ef256..e680290 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B3.json @@ -5,59 +5,59 @@ }, { "iteration" : 1, - "pitch" : "244.469" + "pitch" : 244.46890258789062 }, { "iteration" : 2, - "pitch" : "247.221" + "pitch" : 247.22067260742188 }, { "iteration" : 3, - "pitch" : "247.203" + "pitch" : 247.20344543457031 }, { "iteration" : 4, - "pitch" : "247.112" + "pitch" : 247.11183166503906 }, { "iteration" : 5, - "pitch" : "246.969" + "pitch" : 246.96916198730469 }, { "iteration" : 6, - "pitch" : "247.032" + "pitch" : 247.032470703125 }, { "iteration" : 7, - "pitch" : "246.831" + "pitch" : 246.83120727539062 }, { "iteration" : 8, - "pitch" : "246.844" + "pitch" : 246.84365844726562 }, { "iteration" : 9, - "pitch" : "246.902" + "pitch" : 246.90176391601562 }, { "iteration" : 10, - "pitch" : "246.840" + "pitch" : 246.84024047851562 }, { "iteration" : 11, - "pitch" : "246.855" + "pitch" : 246.85466003417969 }, { "iteration" : 12, - "pitch" : "246.878" + "pitch" : 246.87771606445312 }, { "iteration" : 13, - "pitch" : "246.855" + "pitch" : 246.85452270507812 }, { "iteration" : 14, - "pitch" : "246.855" + "pitch" : 246.85531616210938 }, { "iteration" : 15 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B4.json index 8f30f6c..e008e80 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B4.json @@ -5,27 +5,27 @@ }, { "iteration" : 1, - "pitch" : "497.386" + "pitch" : 497.3858642578125 }, { "iteration" : 2, - "pitch" : "494.975" + "pitch" : 494.9754638671875 }, { "iteration" : 3, - "pitch" : "494.616" + "pitch" : 494.6158447265625 }, { "iteration" : 4, - "pitch" : "494.465" + "pitch" : 494.46533203125 }, { "iteration" : 5, - "pitch" : "494.545" + "pitch" : 494.5452880859375 }, { "iteration" : 6, - "pitch" : "494.589" + "pitch" : 494.58920288085938 }, { "iteration" : 7 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B5.json index 49e254f..aa7f533 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B5.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "990.342" + "pitch" : 990.34197998046875 }, { "iteration" : 2, - "pitch" : "989.855" + "pitch" : 989.8548583984375 }, { "iteration" : 3, - "pitch" : "994.689" + "pitch" : 994.688720703125 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B6.json index 15e16ee..00e5a85 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.B6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1989.691" + "pitch" : 1989.6905517578125 }, { "iteration" : 2, - "pitch" : "1986.102" + "pitch" : 1986.1025390625 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb0.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb0.json index 6bc3297..d602eaf 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb0.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb0.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "28.964" + "pitch" : 28.964164733886719 }, { "iteration" : 3, - "pitch" : "28.919" + "pitch" : 28.919218063354492 }, { "iteration" : 4, - "pitch" : "29.092" + "pitch" : 29.092226028442383 }, { "iteration" : 5, - "pitch" : "29.082" + "pitch" : 29.081649780273438 }, { "iteration" : 6, - "pitch" : "29.067" + "pitch" : 29.066610336303711 }, { "iteration" : 7, - "pitch" : "29.076" + "pitch" : 29.075582504272461 }, { "iteration" : 8, - "pitch" : "29.152" + "pitch" : 29.15165901184082 }, { "iteration" : 9, - "pitch" : "29.102" + "pitch" : 29.102319717407227 }, { "iteration" : 10, - "pitch" : "29.053" + "pitch" : 29.052852630615234 }, { "iteration" : 11, - "pitch" : "29.113" + "pitch" : 29.112916946411133 }, { "iteration" : 12, - "pitch" : "29.071" + "pitch" : 29.071426391601562 }, { "iteration" : 13, - "pitch" : "29.121" + "pitch" : 29.121356964111328 }, { "iteration" : 14, - "pitch" : "29.082" + "pitch" : 29.082248687744141 }, { "iteration" : 15, - "pitch" : "29.113" + "pitch" : 29.112703323364258 }, { "iteration" : 16, - "pitch" : "29.110" + "pitch" : 29.110336303710938 }, { "iteration" : 17, - "pitch" : "29.021" + "pitch" : 29.02086067199707 }, { "iteration" : 18, - "pitch" : "29.159" + "pitch" : 29.159257888793945 }, { "iteration" : 19, - "pitch" : "29.116" + "pitch" : 29.116100311279297 }, { "iteration" : 20, - "pitch" : "29.104" + "pitch" : 29.104244232177734 }, { "iteration" : 21, - "pitch" : "29.085" + "pitch" : 29.085048675537109 }, { "iteration" : 22, - "pitch" : "29.181" + "pitch" : 29.180965423583984 }, { "iteration" : 23, - "pitch" : "29.147" + "pitch" : 29.146659851074219 }, { "iteration" : 24, - "pitch" : "29.035" + "pitch" : 29.035295486450195 }, { "iteration" : 25, - "pitch" : "29.076" + "pitch" : 29.076459884643555 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb1.json index f89ffad..0001901 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb1.json @@ -8,75 +8,75 @@ }, { "iteration" : 2, - "pitch" : "58.425" + "pitch" : 58.425338745117188 }, { "iteration" : 3, - "pitch" : "58.174" + "pitch" : 58.174217224121094 }, { "iteration" : 4, - "pitch" : "58.211" + "pitch" : 58.211212158203125 }, { "iteration" : 5, - "pitch" : "58.003" + "pitch" : 58.003429412841797 }, { "iteration" : 6, - "pitch" : "58.272" + "pitch" : 58.271556854248047 }, { "iteration" : 7, - "pitch" : "58.033" + "pitch" : 58.032855987548828 }, { "iteration" : 8, - "pitch" : "58.165" + "pitch" : 58.165378570556641 }, { "iteration" : 9, - "pitch" : "57.994" + "pitch" : 57.994430541992188 }, { "iteration" : 10, - "pitch" : "58.225" + "pitch" : 58.225292205810547 }, { "iteration" : 11, - "pitch" : "58.100" + "pitch" : 58.099758148193359 }, { "iteration" : 12, - "pitch" : "58.163" + "pitch" : 58.163173675537109 }, { "iteration" : 13, - "pitch" : "57.946" + "pitch" : 57.945587158203125 }, { "iteration" : 14, - "pitch" : "58.336" + "pitch" : 58.336044311523438 }, { "iteration" : 15, - "pitch" : "58.155" + "pitch" : 58.155063629150391 }, { "iteration" : 16, - "pitch" : "57.991" + "pitch" : 57.991130828857422 }, { "iteration" : 17, - "pitch" : "58.036" + "pitch" : 58.035972595214844 }, { "iteration" : 18, - "pitch" : "58.248" + "pitch" : 58.247997283935547 }, { "iteration" : 19, - "pitch" : "58.220" + "pitch" : 58.220359802246094 }, { "iteration" : 20 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb2.json index b36975d..fdf1765 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb2.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "114.126" + "pitch" : 114.12626647949219 }, { "iteration" : 2, - "pitch" : "116.435" + "pitch" : 116.4351806640625 }, { "iteration" : 3, - "pitch" : "116.641" + "pitch" : 116.64106750488281 }, { "iteration" : 4, - "pitch" : "116.493" + "pitch" : 116.49298858642578 }, { "iteration" : 5, - "pitch" : "116.443" + "pitch" : 116.44287872314453 }, { "iteration" : 6, - "pitch" : "116.232" + "pitch" : 116.23166656494141 }, { "iteration" : 7, - "pitch" : "116.421" + "pitch" : 116.42131042480469 }, { "iteration" : 8, - "pitch" : "116.469" + "pitch" : 116.46925354003906 }, { "iteration" : 9, - "pitch" : "116.414" + "pitch" : 116.41445159912109 }, { "iteration" : 10, - "pitch" : "116.428" + "pitch" : 116.42844390869141 }, { "iteration" : 11, - "pitch" : "116.173" + "pitch" : 116.172607421875 }, { "iteration" : 12, - "pitch" : "116.186" + "pitch" : 116.18550872802734 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb3.json index 2e96643..5fe72f2 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb3.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "233.115" + "pitch" : 233.11518859863281 }, { "iteration" : 2, - "pitch" : "233.363" + "pitch" : 233.36262512207031 }, { "iteration" : 3, - "pitch" : "233.360" + "pitch" : 233.36044311523438 }, { "iteration" : 4, - "pitch" : "233.253" + "pitch" : 233.25286865234375 }, { "iteration" : 5, - "pitch" : "233.295" + "pitch" : 233.29458618164062 }, { "iteration" : 6, - "pitch" : "233.047" + "pitch" : 233.04714965820312 }, { "iteration" : 7, - "pitch" : "233.225" + "pitch" : 233.22514343261719 }, { "iteration" : 8, - "pitch" : "233.466" + "pitch" : 233.4661865234375 }, { "iteration" : 9, - "pitch" : "233.117" + "pitch" : 233.11666870117188 }, { "iteration" : 10, - "pitch" : "232.824" + "pitch" : 232.82431030273438 }, { "iteration" : 11, - "pitch" : "233.052" + "pitch" : 233.05152893066406 }, { "iteration" : 12, - "pitch" : "233.403" + "pitch" : 233.40327453613281 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb4.json index a9c33d7..299484b 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb4.json @@ -5,39 +5,39 @@ }, { "iteration" : 1, - "pitch" : "467.711" + "pitch" : 467.7109375 }, { "iteration" : 2, - "pitch" : "466.822" + "pitch" : 466.82174682617188 }, { "iteration" : 3, - "pitch" : "466.951" + "pitch" : 466.9505615234375 }, { "iteration" : 4, - "pitch" : "467.737" + "pitch" : 467.73703002929688 }, { "iteration" : 5, - "pitch" : "466.699" + "pitch" : 466.6993408203125 }, { "iteration" : 6, - "pitch" : "466.493" + "pitch" : 466.49270629882812 }, { "iteration" : 7, - "pitch" : "467.379" + "pitch" : 467.37896728515625 }, { "iteration" : 8, - "pitch" : "466.661" + "pitch" : 466.66049194335938 }, { "iteration" : 9, - "pitch" : "467.346" + "pitch" : 467.34634399414062 }, { "iteration" : 10 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb5.json index ad30d7d..2da2aed 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb5.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "933.812" + "pitch" : 933.81219482421875 }, { "iteration" : 2, - "pitch" : "945.081" + "pitch" : 945.08111572265625 }, { "iteration" : 3, - "pitch" : "929.207" + "pitch" : 929.2071533203125 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb6.json index 9e1bf5b..b214adb 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Bb6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1870.717" + "pitch" : 1870.7169189453125 }, { "iteration" : 2, - "pitch" : "1870.440" + "pitch" : 1870.439697265625 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C1.json index 820fffb..95d992f 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C1.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "136.308" + "pitch" : 136.30796813964844 }, { "iteration" : 2, - "pitch" : "32.324" + "pitch" : 32.323715209960938 }, { "iteration" : 3, - "pitch" : "32.521" + "pitch" : 32.520515441894531 }, { "iteration" : 4, - "pitch" : "32.628" + "pitch" : 32.628349304199219 }, { "iteration" : 5, - "pitch" : "32.594" + "pitch" : 32.593822479248047 }, { "iteration" : 6, - "pitch" : "32.620" + "pitch" : 32.620391845703125 }, { "iteration" : 7, - "pitch" : "32.644" + "pitch" : 32.6444091796875 }, { "iteration" : 8, - "pitch" : "32.597" + "pitch" : 32.597057342529297 }, { "iteration" : 9, - "pitch" : "32.620" + "pitch" : 32.620246887207031 }, { "iteration" : 10, - "pitch" : "32.657" + "pitch" : 32.657253265380859 }, { "iteration" : 11, - "pitch" : "32.568" + "pitch" : 32.568428039550781 }, { "iteration" : 12, - "pitch" : "32.643" + "pitch" : 32.643260955810547 }, { "iteration" : 13, - "pitch" : "32.627" + "pitch" : 32.626625061035156 }, { "iteration" : 14, - "pitch" : "32.652" + "pitch" : 32.652023315429688 }, { "iteration" : 15, - "pitch" : "32.607" + "pitch" : 32.606784820556641 }, { "iteration" : 16, - "pitch" : "32.628" + "pitch" : 32.628265380859375 }, { "iteration" : 17, - "pitch" : "32.600" + "pitch" : 32.600467681884766 }, { "iteration" : 18, - "pitch" : "32.591" + "pitch" : 32.591133117675781 }, { "iteration" : 19, - "pitch" : "32.569" + "pitch" : 32.568984985351562 }, { "iteration" : 20, - "pitch" : "32.574" + "pitch" : 32.573802947998047 }, { "iteration" : 21, - "pitch" : "32.603" + "pitch" : 32.603431701660156 }, { "iteration" : 22, - "pitch" : "32.596" + "pitch" : 32.596019744873047 }, { "iteration" : 23, - "pitch" : "32.581" + "pitch" : 32.581218719482422 }, { "iteration" : 24, - "pitch" : "32.593" + "pitch" : 32.592781066894531 }, { "iteration" : 25, - "pitch" : "32.628" + "pitch" : 32.628498077392578 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C2.json index 7d34777..7b53c8d 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C2.json @@ -8,75 +8,75 @@ }, { "iteration" : 2, - "pitch" : "65.130" + "pitch" : 65.129646301269531 }, { "iteration" : 3, - "pitch" : "65.037" + "pitch" : 65.0369873046875 }, { "iteration" : 4, - "pitch" : "65.496" + "pitch" : 65.496261596679688 }, { "iteration" : 5, - "pitch" : "65.468" + "pitch" : 65.467826843261719 }, { "iteration" : 6, - "pitch" : "65.485" + "pitch" : 65.485374450683594 }, { "iteration" : 7, - "pitch" : "65.589" + "pitch" : 65.588691711425781 }, { "iteration" : 8, - "pitch" : "65.566" + "pitch" : 65.566093444824219 }, { "iteration" : 9, - "pitch" : "65.391" + "pitch" : 65.390602111816406 }, { "iteration" : 10, - "pitch" : "65.503" + "pitch" : 65.502670288085938 }, { "iteration" : 11, - "pitch" : "65.542" + "pitch" : 65.542251586914062 }, { "iteration" : 12, - "pitch" : "65.398" + "pitch" : 65.398323059082031 }, { "iteration" : 13, - "pitch" : "65.605" + "pitch" : 65.604698181152344 }, { "iteration" : 14, - "pitch" : "65.256" + "pitch" : 65.256118774414062 }, { "iteration" : 15, - "pitch" : "65.626" + "pitch" : 65.626083374023438 }, { "iteration" : 16, - "pitch" : "65.322" + "pitch" : 65.321807861328125 }, { "iteration" : 17, - "pitch" : "65.570" + "pitch" : 65.570198059082031 }, { "iteration" : 18, - "pitch" : "65.342" + "pitch" : 65.342018127441406 }, { "iteration" : 19, - "pitch" : "65.329" + "pitch" : 65.329071044921875 }, { "iteration" : 20 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C3.json index c311531..2451575 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C3.json @@ -5,71 +5,71 @@ }, { "iteration" : 1, - "pitch" : "133.436" + "pitch" : 133.43624877929688 }, { "iteration" : 2, - "pitch" : "130.830" + "pitch" : 130.82987976074219 }, { "iteration" : 3, - "pitch" : "130.661" + "pitch" : 130.6605224609375 }, { "iteration" : 4, - "pitch" : "130.623" + "pitch" : 130.6234130859375 }, { "iteration" : 5, - "pitch" : "130.805" + "pitch" : 130.80484008789062 }, { "iteration" : 6, - "pitch" : "130.406" + "pitch" : 130.40632629394531 }, { "iteration" : 7, - "pitch" : "130.507" + "pitch" : 130.50730895996094 }, { "iteration" : 8, - "pitch" : "130.538" + "pitch" : 130.53788757324219 }, { "iteration" : 9, - "pitch" : "130.641" + "pitch" : 130.64076232910156 }, { "iteration" : 10, - "pitch" : "130.558" + "pitch" : 130.55804443359375 }, { "iteration" : 11, - "pitch" : "130.613" + "pitch" : 130.6126708984375 }, { "iteration" : 12, - "pitch" : "130.624" + "pitch" : 130.62423706054688 }, { "iteration" : 13, - "pitch" : "130.468" + "pitch" : 130.46830749511719 }, { "iteration" : 14, - "pitch" : "130.643" + "pitch" : 130.64266967773438 }, { "iteration" : 15, - "pitch" : "130.527" + "pitch" : 130.52651977539062 }, { "iteration" : 16, - "pitch" : "130.679" + "pitch" : 130.67892456054688 }, { "iteration" : 17, - "pitch" : "130.513" + "pitch" : 130.51296997070312 }, { "iteration" : 18 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C4.json index 99211f2..ada3843 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C4.json @@ -5,55 +5,55 @@ }, { "iteration" : 1, - "pitch" : "263.111" + "pitch" : 263.11077880859375 }, { "iteration" : 2, - "pitch" : "262.277" + "pitch" : 262.27731323242188 }, { "iteration" : 3, - "pitch" : "262.178" + "pitch" : 262.17825317382812 }, { "iteration" : 4, - "pitch" : "261.801" + "pitch" : 261.8013916015625 }, { "iteration" : 5, - "pitch" : "261.757" + "pitch" : 261.75735473632812 }, { "iteration" : 6, - "pitch" : "261.714" + "pitch" : 261.71417236328125 }, { "iteration" : 7, - "pitch" : "262.200" + "pitch" : 262.200439453125 }, { "iteration" : 8, - "pitch" : "261.760" + "pitch" : 261.76046752929688 }, { "iteration" : 9, - "pitch" : "261.685" + "pitch" : 261.68545532226562 }, { "iteration" : 10, - "pitch" : "261.889" + "pitch" : 261.88858032226562 }, { "iteration" : 11, - "pitch" : "261.609" + "pitch" : 261.6085205078125 }, { "iteration" : 12, - "pitch" : "261.634" + "pitch" : 261.634521484375 }, { "iteration" : 13, - "pitch" : "261.934" + "pitch" : 261.93365478515625 }, { "iteration" : 14 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C5.json index 5feaaa1..9ec79c8 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C5.json @@ -5,27 +5,27 @@ }, { "iteration" : 1, - "pitch" : "529.699" + "pitch" : 529.69854736328125 }, { "iteration" : 2, - "pitch" : "525.441" + "pitch" : 525.44140625 }, { "iteration" : 3, - "pitch" : "524.557" + "pitch" : 524.55712890625 }, { "iteration" : 4, - "pitch" : "523.669" + "pitch" : 523.66900634765625 }, { "iteration" : 5, - "pitch" : "524.848" + "pitch" : 524.84808349609375 }, { "iteration" : 6, - "pitch" : "524.940" + "pitch" : 524.9400634765625 }, { "iteration" : 7 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C6.json index 38fec5b..2def22a 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1049.232" + "pitch" : 1049.231689453125 }, { "iteration" : 2, - "pitch" : "1049.411" + "pitch" : 1049.41162109375 }, { "iteration" : 3, - "pitch" : "1048.566" + "pitch" : 1048.5655517578125 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C7.json index b5f5ba1..84480e1 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.C7.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "2109.447" + "pitch" : 2109.447265625 }, { "iteration" : 2, - "pitch" : "2107.144" + "pitch" : 2107.1435546875 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D1.json index fc14edf..352d81f 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D1.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "36.610" + "pitch" : 36.61004638671875 }, { "iteration" : 3, - "pitch" : "36.575" + "pitch" : 36.574916839599609 }, { "iteration" : 4, - "pitch" : "36.597" + "pitch" : 36.596961975097656 }, { "iteration" : 5, - "pitch" : "36.623" + "pitch" : 36.622577667236328 }, { "iteration" : 6, - "pitch" : "36.648" + "pitch" : 36.648181915283203 }, { "iteration" : 7, - "pitch" : "36.614" + "pitch" : 36.614006042480469 }, { "iteration" : 8, - "pitch" : "36.620" + "pitch" : 36.619827270507812 }, { "iteration" : 9, - "pitch" : "36.637" + "pitch" : 36.636951446533203 }, { "iteration" : 10, - "pitch" : "36.685" + "pitch" : 36.685260772705078 }, { "iteration" : 11, - "pitch" : "36.643" + "pitch" : 36.642593383789062 }, { "iteration" : 12, - "pitch" : "36.650" + "pitch" : 36.649539947509766 }, { "iteration" : 13, - "pitch" : "36.625" + "pitch" : 36.624961853027344 }, { "iteration" : 14, - "pitch" : "36.654" + "pitch" : 36.6539306640625 }, { "iteration" : 15, - "pitch" : "36.665" + "pitch" : 36.665485382080078 }, { "iteration" : 16, - "pitch" : "36.628" + "pitch" : 36.628082275390625 }, { "iteration" : 17, - "pitch" : "36.634" + "pitch" : 36.633914947509766 }, { "iteration" : 18, - "pitch" : "36.577" + "pitch" : 36.577049255371094 }, { "iteration" : 19, - "pitch" : "36.696" + "pitch" : 36.696083068847656 }, { "iteration" : 20, - "pitch" : "36.665" + "pitch" : 36.6646728515625 }, { "iteration" : 21, - "pitch" : "36.624" + "pitch" : 36.624027252197266 }, { "iteration" : 22, - "pitch" : "36.654" + "pitch" : 36.654399871826172 }, { "iteration" : 23, - "pitch" : "36.626" + "pitch" : 36.625690460205078 }, { "iteration" : 24, - "pitch" : "36.659" + "pitch" : 36.659103393554688 }, { "iteration" : 25, - "pitch" : "36.633" + "pitch" : 36.633289337158203 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D2.json index 1abd9c6..2cfcbf0 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D2.json @@ -8,67 +8,67 @@ }, { "iteration" : 2, - "pitch" : "73.196" + "pitch" : 73.196334838867188 }, { "iteration" : 3, - "pitch" : "73.082" + "pitch" : 73.082038879394531 }, { "iteration" : 4, - "pitch" : "73.816" + "pitch" : 73.816398620605469 }, { "iteration" : 5, - "pitch" : "73.387" + "pitch" : 73.38671875 }, { "iteration" : 6, - "pitch" : "73.652" + "pitch" : 73.651969909667969 }, { "iteration" : 7, - "pitch" : "73.734" + "pitch" : 73.733787536621094 }, { "iteration" : 8, - "pitch" : "73.473" + "pitch" : 73.472763061523438 }, { "iteration" : 9, - "pitch" : "73.653" + "pitch" : 73.653251647949219 }, { "iteration" : 10, - "pitch" : "73.428" + "pitch" : 73.428382873535156 }, { "iteration" : 11, - "pitch" : "73.583" + "pitch" : 73.583404541015625 }, { "iteration" : 12, - "pitch" : "73.334" + "pitch" : 73.334342956542969 }, { "iteration" : 13, - "pitch" : "73.815" + "pitch" : 73.815223693847656 }, { "iteration" : 14, - "pitch" : "73.286" + "pitch" : 73.28570556640625 }, { "iteration" : 15, - "pitch" : "73.593" + "pitch" : 73.59307861328125 }, { "iteration" : 16, - "pitch" : "73.627" + "pitch" : 73.626792907714844 }, { "iteration" : 17, - "pitch" : "73.371" + "pitch" : 73.371124267578125 }, { "iteration" : 18 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D3.json index 7bf77ad..890f733 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D3.json @@ -8,59 +8,59 @@ }, { "iteration" : 2, - "pitch" : "146.672" + "pitch" : 146.67153930664062 }, { "iteration" : 3, - "pitch" : "146.789" + "pitch" : 146.78868103027344 }, { "iteration" : 4, - "pitch" : "146.976" + "pitch" : 146.97611999511719 }, { "iteration" : 5, - "pitch" : "147.073" + "pitch" : 147.07347106933594 }, { "iteration" : 6, - "pitch" : "146.786" + "pitch" : 146.78623962402344 }, { "iteration" : 7, - "pitch" : "146.755" + "pitch" : 146.75508117675781 }, { "iteration" : 8, - "pitch" : "146.613" + "pitch" : 146.61257934570312 }, { "iteration" : 9, - "pitch" : "146.926" + "pitch" : 146.9263916015625 }, { "iteration" : 10, - "pitch" : "146.742" + "pitch" : 146.74174499511719 }, { "iteration" : 11, - "pitch" : "146.782" + "pitch" : 146.7816162109375 }, { "iteration" : 12, - "pitch" : "146.739" + "pitch" : 146.738525390625 }, { "iteration" : 13, - "pitch" : "147.103" + "pitch" : 147.10302734375 }, { "iteration" : 14, - "pitch" : "146.920" + "pitch" : 146.92013549804688 }, { "iteration" : 15, - "pitch" : "146.494" + "pitch" : 146.49449157714844 }, { "iteration" : 16 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D4.json index 952df7f..ffb4263 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D4.json @@ -5,55 +5,55 @@ }, { "iteration" : 1, - "pitch" : "2074.750" + "pitch" : 2074.750244140625 }, { "iteration" : 2, - "pitch" : "294.046" + "pitch" : 294.04571533203125 }, { "iteration" : 3, - "pitch" : "294.131" + "pitch" : 294.130859375 }, { "iteration" : 4, - "pitch" : "293.930" + "pitch" : 293.93008422851562 }, { "iteration" : 5, - "pitch" : "293.807" + "pitch" : 293.80679321289062 }, { "iteration" : 6, - "pitch" : "294.418" + "pitch" : 294.41775512695312 }, { "iteration" : 7, - "pitch" : "293.887" + "pitch" : 293.88681030273438 }, { "iteration" : 8, - "pitch" : "293.865" + "pitch" : 293.86447143554688 }, { "iteration" : 9, - "pitch" : "293.651" + "pitch" : 293.651123046875 }, { "iteration" : 10, - "pitch" : "293.545" + "pitch" : 293.54461669921875 }, { "iteration" : 11, - "pitch" : "293.760" + "pitch" : 293.75991821289062 }, { "iteration" : 12, - "pitch" : "293.526" + "pitch" : 293.5263671875 }, { "iteration" : 13, - "pitch" : "294.001" + "pitch" : 294.00128173828125 }, { "iteration" : 14 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D5.json index 1750a3a..7321530 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D5.json @@ -5,23 +5,23 @@ }, { "iteration" : 1, - "pitch" : "589.500" + "pitch" : 589.49969482421875 }, { "iteration" : 2, - "pitch" : "588.655" + "pitch" : 588.6553955078125 }, { "iteration" : 3, - "pitch" : "588.102" + "pitch" : 588.1015625 }, { "iteration" : 4, - "pitch" : "587.931" + "pitch" : 587.9307861328125 }, { "iteration" : 5, - "pitch" : "591.396" + "pitch" : 591.39617919921875 }, { "iteration" : 6 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D6.json index 6c23fdc..ebc6506 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1181.204" + "pitch" : 1181.2044677734375 }, { "iteration" : 2, - "pitch" : "1180.840" + "pitch" : 1180.8402099609375 }, { "iteration" : 3, - "pitch" : "1176.061" + "pitch" : 1176.061279296875 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D7.json index 44ac1ef..85aba6b 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.D7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2366.269" + "pitch" : 2366.26904296875 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db1.json index b5ceb39..4d8891d 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db1.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "94.630" + "pitch" : 94.629608154296875 }, { "iteration" : 2, - "pitch" : "34.416" + "pitch" : 34.415977478027344 }, { "iteration" : 3, - "pitch" : "34.582" + "pitch" : 34.582263946533203 }, { "iteration" : 4, - "pitch" : "34.634" + "pitch" : 34.63421630859375 }, { "iteration" : 5, - "pitch" : "34.636" + "pitch" : 34.636459350585938 }, { "iteration" : 6, - "pitch" : "34.591" + "pitch" : 34.591335296630859 }, { "iteration" : 7, - "pitch" : "34.592" + "pitch" : 34.591987609863281 }, { "iteration" : 8, - "pitch" : "34.518" + "pitch" : 34.518074035644531 }, { "iteration" : 9, - "pitch" : "34.643" + "pitch" : 34.642688751220703 }, { "iteration" : 10, - "pitch" : "34.665" + "pitch" : 34.665309906005859 }, { "iteration" : 11, - "pitch" : "34.583" + "pitch" : 34.582786560058594 }, { "iteration" : 12, - "pitch" : "34.625" + "pitch" : 34.624732971191406 }, { "iteration" : 13, - "pitch" : "34.626" + "pitch" : 34.626369476318359 }, { "iteration" : 14, - "pitch" : "34.574" + "pitch" : 34.573665618896484 }, { "iteration" : 15, - "pitch" : "34.589" + "pitch" : 34.588897705078125 }, { "iteration" : 16, - "pitch" : "34.676" + "pitch" : 34.675983428955078 }, { "iteration" : 17, - "pitch" : "34.676" + "pitch" : 34.676097869873047 }, { "iteration" : 18, - "pitch" : "34.580" + "pitch" : 34.579875946044922 }, { "iteration" : 19, - "pitch" : "34.775" + "pitch" : 34.775363922119141 }, { "iteration" : 20, - "pitch" : "34.538" + "pitch" : 34.538322448730469 }, { "iteration" : 21, - "pitch" : "34.603" + "pitch" : 34.603012084960938 }, { "iteration" : 22, - "pitch" : "34.604" + "pitch" : 34.603786468505859 }, { "iteration" : 23, - "pitch" : "34.536" + "pitch" : 34.535980224609375 }, { "iteration" : 24, - "pitch" : "34.634" + "pitch" : 34.6343994140625 }, { "iteration" : 25, - "pitch" : "34.582" + "pitch" : 34.582363128662109 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db2.json index d4fca42..f8713e4 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db2.json @@ -8,71 +8,71 @@ }, { "iteration" : 2, - "pitch" : "69.400" + "pitch" : 69.400238037109375 }, { "iteration" : 3, - "pitch" : "69.137" + "pitch" : 69.136810302734375 }, { "iteration" : 4, - "pitch" : "69.259" + "pitch" : 69.259040832519531 }, { "iteration" : 5, - "pitch" : "69.154" + "pitch" : 69.153518676757812 }, { "iteration" : 6, - "pitch" : "69.275" + "pitch" : 69.274955749511719 }, { "iteration" : 7, - "pitch" : "69.275" + "pitch" : 69.275001525878906 }, { "iteration" : 8, - "pitch" : "69.165" + "pitch" : 69.165351867675781 }, { "iteration" : 9, - "pitch" : "69.537" + "pitch" : 69.537178039550781 }, { "iteration" : 10, - "pitch" : "69.360" + "pitch" : 69.360420227050781 }, { "iteration" : 11, - "pitch" : "69.378" + "pitch" : 69.377754211425781 }, { "iteration" : 12, - "pitch" : "69.240" + "pitch" : 69.240379333496094 }, { "iteration" : 13, - "pitch" : "69.330" + "pitch" : 69.330474853515625 }, { "iteration" : 14, - "pitch" : "69.394" + "pitch" : 69.393539428710938 }, { "iteration" : 15, - "pitch" : "69.357" + "pitch" : 69.356620788574219 }, { "iteration" : 16, - "pitch" : "69.066" + "pitch" : 69.0655517578125 }, { "iteration" : 17, - "pitch" : "138.653" + "pitch" : 138.65303039550781 }, { "iteration" : 18, - "pitch" : "69.112" + "pitch" : 69.111503601074219 }, { "iteration" : 19 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db3.json index 17e21e6..e93b74e 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db3.json @@ -5,75 +5,75 @@ }, { "iteration" : 1, - "pitch" : "141.818" + "pitch" : 141.81771850585938 }, { "iteration" : 2, - "pitch" : "138.700" + "pitch" : 138.69998168945312 }, { "iteration" : 3, - "pitch" : "138.380" + "pitch" : 138.37956237792969 }, { "iteration" : 4, - "pitch" : "138.660" + "pitch" : 138.66007995605469 }, { "iteration" : 5, - "pitch" : "138.519" + "pitch" : 138.51910400390625 }, { "iteration" : 6, - "pitch" : "138.315" + "pitch" : 138.31475830078125 }, { "iteration" : 7, - "pitch" : "138.334" + "pitch" : 138.33441162109375 }, { "iteration" : 8, - "pitch" : "138.589" + "pitch" : 138.5887451171875 }, { "iteration" : 9, - "pitch" : "138.318" + "pitch" : 138.31819152832031 }, { "iteration" : 10, - "pitch" : "138.288" + "pitch" : 138.28781127929688 }, { "iteration" : 11, - "pitch" : "138.415" + "pitch" : 138.41522216796875 }, { "iteration" : 12, - "pitch" : "138.303" + "pitch" : 138.30307006835938 }, { "iteration" : 13, - "pitch" : "138.283" + "pitch" : 138.28262329101562 }, { "iteration" : 14, - "pitch" : "138.370" + "pitch" : 138.37046813964844 }, { "iteration" : 15, - "pitch" : "138.439" + "pitch" : 138.439208984375 }, { "iteration" : 16, - "pitch" : "138.415" + "pitch" : 138.41452026367188 }, { "iteration" : 17, - "pitch" : "138.422" + "pitch" : 138.422119140625 }, { "iteration" : 18, - "pitch" : "138.540" + "pitch" : 138.53974914550781 }, { "iteration" : 19 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db4.json index bda02c4..b6d4331 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db4.json @@ -8,55 +8,55 @@ }, { "iteration" : 2, - "pitch" : "277.948" + "pitch" : 277.94769287109375 }, { "iteration" : 3, - "pitch" : "277.367" + "pitch" : 277.36666870117188 }, { "iteration" : 4, - "pitch" : "277.756" + "pitch" : 277.75625610351562 }, { "iteration" : 5, - "pitch" : "278.623" + "pitch" : 278.62258911132812 }, { "iteration" : 6, - "pitch" : "278.706" + "pitch" : 278.7061767578125 }, { "iteration" : 7, - "pitch" : "277.678" + "pitch" : 277.67767333984375 }, { "iteration" : 8, - "pitch" : "277.901" + "pitch" : 277.90130615234375 }, { "iteration" : 9, - "pitch" : "277.105" + "pitch" : 277.1053466796875 }, { "iteration" : 10, - "pitch" : "277.370" + "pitch" : 277.36953735351562 }, { "iteration" : 11, - "pitch" : "277.392" + "pitch" : 277.39181518554688 }, { "iteration" : 12, - "pitch" : "277.503" + "pitch" : 277.5025634765625 }, { "iteration" : 13, - "pitch" : "277.404" + "pitch" : 277.4036865234375 }, { "iteration" : 14, - "pitch" : "277.226" + "pitch" : 277.22637939453125 }, { "iteration" : 15 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db5.json index 31f05b5..70367a3 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db5.json @@ -5,23 +5,23 @@ }, { "iteration" : 1, - "pitch" : "555.304" + "pitch" : 555.30352783203125 }, { "iteration" : 2, - "pitch" : "554.971" + "pitch" : 554.97119140625 }, { "iteration" : 3, - "pitch" : "555.373" + "pitch" : 555.3726806640625 }, { "iteration" : 4, - "pitch" : "555.896" + "pitch" : 555.89593505859375 }, { "iteration" : 5, - "pitch" : "558.116" + "pitch" : 558.1163330078125 }, { "iteration" : 6 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db6.json index 96f3270..467a2cc 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1113.551" + "pitch" : 1113.551513671875 }, { "iteration" : 2, - "pitch" : "1112.573" + "pitch" : 1112.573486328125 }, { "iteration" : 3, - "pitch" : "1110.584" + "pitch" : 1110.58447265625 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db7.json index 182571e..b5cf965 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Db7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2233.534" + "pitch" : 2233.533935546875 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E1.json index 74f7c01..631f53a 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E1.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "82.189" + "pitch" : 82.189048767089844 }, { "iteration" : 3, - "pitch" : "41.093" + "pitch" : 41.092628479003906 }, { "iteration" : 4, - "pitch" : "41.133" + "pitch" : 41.132869720458984 }, { "iteration" : 5, - "pitch" : "41.166" + "pitch" : 41.165508270263672 }, { "iteration" : 6, - "pitch" : "41.115" + "pitch" : 41.114650726318359 }, { "iteration" : 7, - "pitch" : "82.289" + "pitch" : 82.288688659667969 }, { "iteration" : 8, - "pitch" : "41.174" + "pitch" : 41.173728942871094 }, { "iteration" : 9, - "pitch" : "41.133" + "pitch" : 41.132789611816406 }, { "iteration" : 10, - "pitch" : "41.103" + "pitch" : 41.103336334228516 }, { "iteration" : 11, - "pitch" : "41.125" + "pitch" : 41.125217437744141 }, { "iteration" : 12, - "pitch" : "41.168" + "pitch" : 41.168239593505859 }, { "iteration" : 13, - "pitch" : "41.190" + "pitch" : 41.190109252929688 }, { "iteration" : 14, - "pitch" : "41.123" + "pitch" : 41.123428344726562 }, { "iteration" : 15, - "pitch" : "41.094" + "pitch" : 41.093513488769531 }, { "iteration" : 16, - "pitch" : "41.154" + "pitch" : 41.154151916503906 }, { "iteration" : 17, - "pitch" : "41.139" + "pitch" : 41.139110565185547 }, { "iteration" : 18, - "pitch" : "41.143" + "pitch" : 41.143070220947266 }, { "iteration" : 19, - "pitch" : "82.193" + "pitch" : 82.193428039550781 }, { "iteration" : 20, - "pitch" : "82.367" + "pitch" : 82.366928100585938 }, { "iteration" : 21, - "pitch" : "41.134" + "pitch" : 41.133861541748047 }, { "iteration" : 22, - "pitch" : "41.141" + "pitch" : 41.140869140625 }, { "iteration" : 23, - "pitch" : "41.069" + "pitch" : 41.069087982177734 }, { "iteration" : 24, - "pitch" : "41.180" + "pitch" : 41.179531097412109 }, { "iteration" : 25, - "pitch" : "41.130" + "pitch" : 41.130260467529297 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E2.json index 6bd7760..c885ac8 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E2.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "81.827" + "pitch" : 81.827346801757812 }, { "iteration" : 2, - "pitch" : "82.246" + "pitch" : 82.246353149414062 }, { "iteration" : 3, - "pitch" : "82.273" + "pitch" : 82.27264404296875 }, { "iteration" : 4, - "pitch" : "82.155" + "pitch" : 82.155220031738281 }, { "iteration" : 5, - "pitch" : "82.408" + "pitch" : 82.4083251953125 }, { "iteration" : 6, - "pitch" : "82.059" + "pitch" : 82.059371948242188 }, { "iteration" : 7, - "pitch" : "82.230" + "pitch" : 82.229591369628906 }, { "iteration" : 8, - "pitch" : "82.363" + "pitch" : 82.36297607421875 }, { "iteration" : 9, - "pitch" : "82.364" + "pitch" : 82.364151000976562 }, { "iteration" : 10, - "pitch" : "82.067" + "pitch" : 82.066780090332031 }, { "iteration" : 11, - "pitch" : "82.094" + "pitch" : 82.094161987304688 }, { "iteration" : 12, - "pitch" : "82.359" + "pitch" : 82.358924865722656 }, { "iteration" : 13, - "pitch" : "82.411" + "pitch" : 82.410621643066406 }, { "iteration" : 14, - "pitch" : "82.095" + "pitch" : 82.095054626464844 }, { "iteration" : 15, - "pitch" : "82.203" + "pitch" : 82.203376770019531 }, { "iteration" : 16, - "pitch" : "82.130" + "pitch" : 82.129508972167969 }, { "iteration" : 17, - "pitch" : "82.431" + "pitch" : 82.431488037109375 }, { "iteration" : 18, - "pitch" : "82.021" + "pitch" : 82.02069091796875 }, { "iteration" : 19, - "pitch" : "82.265" + "pitch" : 82.265388488769531 }, { "iteration" : 20, - "pitch" : "82.055" + "pitch" : 82.054885864257812 }, { "iteration" : 21, - "pitch" : "82.450" + "pitch" : 82.449691772460938 }, { "iteration" : 22, - "pitch" : "82.152" + "pitch" : 82.151947021484375 }, { "iteration" : 23, - "pitch" : "82.213" + "pitch" : 82.212783813476562 }, { "iteration" : 24, - "pitch" : "82.051" + "pitch" : 82.05126953125 }, { "iteration" : 25, - "pitch" : "82.464" + "pitch" : 82.464332580566406 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E3.json index d82848c..a2d51b3 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E3.json @@ -5,91 +5,91 @@ }, { "iteration" : 1, - "pitch" : "164.608" + "pitch" : 164.60751342773438 }, { "iteration" : 2, - "pitch" : "165.043" + "pitch" : 165.04350280761719 }, { "iteration" : 3, - "pitch" : "164.760" + "pitch" : 164.7598876953125 }, { "iteration" : 4, - "pitch" : "164.944" + "pitch" : 164.9444580078125 }, { "iteration" : 5, - "pitch" : "164.795" + "pitch" : 164.79512023925781 }, { "iteration" : 6, - "pitch" : "164.594" + "pitch" : 164.59432983398438 }, { "iteration" : 7, - "pitch" : "164.723" + "pitch" : 164.72314453125 }, { "iteration" : 8, - "pitch" : "164.701" + "pitch" : 164.70143127441406 }, { "iteration" : 9, - "pitch" : "164.985" + "pitch" : 164.98532104492188 }, { "iteration" : 10, - "pitch" : "164.785" + "pitch" : 164.78536987304688 }, { "iteration" : 11, - "pitch" : "164.855" + "pitch" : 164.85493469238281 }, { "iteration" : 12, - "pitch" : "164.782" + "pitch" : 164.78211975097656 }, { "iteration" : 13, - "pitch" : "164.556" + "pitch" : 164.55587768554688 }, { "iteration" : 14, - "pitch" : "164.685" + "pitch" : 164.68463134765625 }, { "iteration" : 15, - "pitch" : "164.655" + "pitch" : 164.65541076660156 }, { "iteration" : 16, - "pitch" : "164.885" + "pitch" : 164.88465881347656 }, { "iteration" : 17, - "pitch" : "164.724" + "pitch" : 164.72377014160156 }, { "iteration" : 18, - "pitch" : "164.725" + "pitch" : 164.72502136230469 }, { "iteration" : 19, - "pitch" : "164.686" + "pitch" : 164.68629455566406 }, { "iteration" : 20, - "pitch" : "164.526" + "pitch" : 164.52629089355469 }, { "iteration" : 21, - "pitch" : "164.747" + "pitch" : 164.74693298339844 }, { "iteration" : 22, - "pitch" : "164.708" + "pitch" : 164.70771789550781 }, { "iteration" : 23 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E4.json index af16170..c34259b 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E4.json @@ -5,35 +5,35 @@ }, { "iteration" : 1, - "pitch" : "328.821" + "pitch" : 328.82144165039062 }, { "iteration" : 2, - "pitch" : "330.618" + "pitch" : 330.61810302734375 }, { "iteration" : 3, - "pitch" : "330.067" + "pitch" : 330.06747436523438 }, { "iteration" : 4, - "pitch" : "330.144" + "pitch" : 330.14361572265625 }, { "iteration" : 5, - "pitch" : "330.074" + "pitch" : 330.07351684570312 }, { "iteration" : 6, - "pitch" : "329.852" + "pitch" : 329.85198974609375 }, { "iteration" : 7, - "pitch" : "329.716" + "pitch" : 329.71630859375 }, { "iteration" : 8, - "pitch" : "330.118" + "pitch" : 330.11782836914062 }, { "iteration" : 9 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E5.json index 0b00631..49a5e2d 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E5.json @@ -8,11 +8,11 @@ }, { "iteration" : 2, - "pitch" : "656.813" + "pitch" : 656.81341552734375 }, { "iteration" : 3, - "pitch" : "656.224" + "pitch" : 656.2244873046875 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E6.json index f0d4965..a410d73 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1325.597" + "pitch" : 1325.5966796875 }, { "iteration" : 2, - "pitch" : "1326.704" + "pitch" : 1326.704345703125 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E7.json index 113bc72..02918d8 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.E7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2664.608" + "pitch" : 2664.608154296875 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb1.json index a517072..acab9e6 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb1.json @@ -8,99 +8,99 @@ }, { "iteration" : 2, - "pitch" : "38.852" + "pitch" : 38.852222442626953 }, { "iteration" : 3, - "pitch" : "38.819" + "pitch" : 38.818855285644531 }, { "iteration" : 4, - "pitch" : "38.898" + "pitch" : 38.898239135742188 }, { "iteration" : 5, - "pitch" : "38.770" + "pitch" : 38.770416259765625 }, { "iteration" : 6, - "pitch" : "38.826" + "pitch" : 38.825832366943359 }, { "iteration" : 7, - "pitch" : "38.773" + "pitch" : 38.77276611328125 }, { "iteration" : 8, - "pitch" : "38.765" + "pitch" : 38.765380859375 }, { "iteration" : 9, - "pitch" : "38.787" + "pitch" : 38.787273406982422 }, { "iteration" : 10, - "pitch" : "38.760" + "pitch" : 38.760147094726562 }, { "iteration" : 11, - "pitch" : "38.832" + "pitch" : 38.832004547119141 }, { "iteration" : 12, - "pitch" : "38.744" + "pitch" : 38.743534088134766 }, { "iteration" : 13, - "pitch" : "38.794" + "pitch" : 38.794265747070312 }, { "iteration" : 14, - "pitch" : "38.748" + "pitch" : 38.748199462890625 }, { "iteration" : 15, - "pitch" : "38.770" + "pitch" : 38.769866943359375 }, { "iteration" : 16, - "pitch" : "38.811" + "pitch" : 38.810840606689453 }, { "iteration" : 17, - "pitch" : "77.529" + "pitch" : 77.529121398925781 }, { "iteration" : 18, - "pitch" : "38.779" + "pitch" : 38.77850341796875 }, { "iteration" : 19, - "pitch" : "38.725" + "pitch" : 38.72515869140625 }, { "iteration" : 20, - "pitch" : "38.800" + "pitch" : 38.8001708984375 }, { "iteration" : 21, - "pitch" : "38.826" + "pitch" : 38.826099395751953 }, { "iteration" : 22, - "pitch" : "38.727" + "pitch" : 38.72705078125 }, { "iteration" : 23, - "pitch" : "38.734" + "pitch" : 38.734394073486328 }, { "iteration" : 24, - "pitch" : "77.513" + "pitch" : 77.512664794921875 }, { "iteration" : 25, - "pitch" : "38.734" + "pitch" : 38.733676910400391 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb2.json index d5d905e..9c3c4b0 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb2.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "80.204" + "pitch" : 80.204185485839844 }, { "iteration" : 2, - "pitch" : "77.714" + "pitch" : 77.714340209960938 }, { "iteration" : 3, - "pitch" : "77.276" + "pitch" : 77.27557373046875 }, { "iteration" : 4, - "pitch" : "77.492" + "pitch" : 77.491668701171875 }, { "iteration" : 5, - "pitch" : "77.591" + "pitch" : 77.590599060058594 }, { "iteration" : 6, - "pitch" : "77.632" + "pitch" : 77.631568908691406 }, { "iteration" : 7, - "pitch" : "77.483" + "pitch" : 77.482673645019531 }, { "iteration" : 8, - "pitch" : "77.460" + "pitch" : 77.45989990234375 }, { "iteration" : 9, - "pitch" : "77.540" + "pitch" : 77.540451049804688 }, { "iteration" : 10, - "pitch" : "77.479" + "pitch" : 77.479469299316406 }, { "iteration" : 11, - "pitch" : "77.652" + "pitch" : 77.652259826660156 }, { "iteration" : 12, - "pitch" : "77.480" + "pitch" : 77.479644775390625 }, { "iteration" : 13, - "pitch" : "77.396" + "pitch" : 77.395927429199219 }, { "iteration" : 14, - "pitch" : "77.567" + "pitch" : 77.56707763671875 }, { "iteration" : 15, - "pitch" : "77.426" + "pitch" : 77.426185607910156 }, { "iteration" : 16, - "pitch" : "77.567" + "pitch" : 77.566764831542969 }, { "iteration" : 17, - "pitch" : "77.355" + "pitch" : 77.355155944824219 }, { "iteration" : 18, - "pitch" : "77.429" + "pitch" : 77.428703308105469 }, { "iteration" : 19, - "pitch" : "77.632" + "pitch" : 77.63232421875 }, { "iteration" : 20, - "pitch" : "77.480" + "pitch" : 77.480323791503906 }, { "iteration" : 21, - "pitch" : "77.474" + "pitch" : 77.474189758300781 }, { "iteration" : 22, - "pitch" : "77.410" + "pitch" : 77.409919738769531 }, { "iteration" : 23, - "pitch" : "77.499" + "pitch" : 77.49884033203125 }, { "iteration" : 24, - "pitch" : "77.624" + "pitch" : 77.623695373535156 }, { "iteration" : 25, - "pitch" : "77.472" + "pitch" : 77.472282409667969 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb3.json index d1bbaa6..8cb8c31 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb3.json @@ -5,87 +5,87 @@ }, { "iteration" : 1, - "pitch" : "155.652" + "pitch" : 155.6519775390625 }, { "iteration" : 2, - "pitch" : "155.358" + "pitch" : 155.35812377929688 }, { "iteration" : 3, - "pitch" : "155.469" + "pitch" : 155.46890258789062 }, { "iteration" : 4, - "pitch" : "155.611" + "pitch" : 155.61051940917969 }, { "iteration" : 5, - "pitch" : "155.673" + "pitch" : 155.67306518554688 }, { "iteration" : 6, - "pitch" : "155.501" + "pitch" : 155.50080871582031 }, { "iteration" : 7, - "pitch" : "155.564" + "pitch" : 155.56422424316406 }, { "iteration" : 8, - "pitch" : "155.505" + "pitch" : 155.50538635253906 }, { "iteration" : 9, - "pitch" : "155.526" + "pitch" : 155.52626037597656 }, { "iteration" : 10, - "pitch" : "155.503" + "pitch" : 155.50276184082031 }, { "iteration" : 11, - "pitch" : "155.647" + "pitch" : 155.6470947265625 }, { "iteration" : 12, - "pitch" : "155.531" + "pitch" : 155.53109741210938 }, { "iteration" : 13, - "pitch" : "155.384" + "pitch" : 155.38407897949219 }, { "iteration" : 14, - "pitch" : "155.528" + "pitch" : 155.5283203125 }, { "iteration" : 15, - "pitch" : "155.542" + "pitch" : 155.54217529296875 }, { "iteration" : 16, - "pitch" : "155.456" + "pitch" : 155.45625305175781 }, { "iteration" : 17, - "pitch" : "155.497" + "pitch" : 155.49749755859375 }, { "iteration" : 18, - "pitch" : "155.634" + "pitch" : 155.63397216796875 }, { "iteration" : 19, - "pitch" : "155.505" + "pitch" : 155.50466918945312 }, { "iteration" : 20, - "pitch" : "155.790" + "pitch" : 155.79048156738281 }, { "iteration" : 21, - "pitch" : "155.768" + "pitch" : 155.7681884765625 }, { "iteration" : 22 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb4.json index feee4e2..c4a3028 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb4.json @@ -8,35 +8,35 @@ }, { "iteration" : 2, - "pitch" : "311.589" + "pitch" : 311.5889892578125 }, { "iteration" : 3, - "pitch" : "311.196" + "pitch" : 311.19647216796875 }, { "iteration" : 4, - "pitch" : "311.212" + "pitch" : 311.21197509765625 }, { "iteration" : 5, - "pitch" : "311.153" + "pitch" : 311.15335083007812 }, { "iteration" : 6, - "pitch" : "311.152" + "pitch" : 311.15167236328125 }, { "iteration" : 7, - "pitch" : "311.233" + "pitch" : 311.2325439453125 }, { "iteration" : 8, - "pitch" : "311.204" + "pitch" : 311.20367431640625 }, { "iteration" : 9, - "pitch" : "311.065" + "pitch" : 311.06454467773438 }, { "iteration" : 10 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb5.json index f07482f..b592741 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb5.json @@ -8,11 +8,11 @@ }, { "iteration" : 2, - "pitch" : "626.176" + "pitch" : 626.17596435546875 }, { "iteration" : 3, - "pitch" : "625.274" + "pitch" : 625.2740478515625 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb6.json index 12efd9a..f7a2e50 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1251.175" + "pitch" : 1251.1746826171875 }, { "iteration" : 2, - "pitch" : "1249.237" + "pitch" : 1249.237548828125 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb7.json index f052130..fa1fbe9 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Eb7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2505.698" + "pitch" : 2505.69775390625 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F1.json index be09bf5..8920613 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F1.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "90.800" + "pitch" : 90.800094604492188 }, { "iteration" : 2, - "pitch" : "43.442" + "pitch" : 43.441799163818359 }, { "iteration" : 3, - "pitch" : "43.498" + "pitch" : 43.49835205078125 }, { "iteration" : 4, - "pitch" : "43.531" + "pitch" : 43.531185150146484 }, { "iteration" : 5, - "pitch" : "43.517" + "pitch" : 43.516654968261719 }, { "iteration" : 6, - "pitch" : "43.509" + "pitch" : 43.508892059326172 }, { "iteration" : 7, - "pitch" : "43.534" + "pitch" : 43.533832550048828 }, { "iteration" : 8, - "pitch" : "43.514" + "pitch" : 43.5142822265625 }, { "iteration" : 9, - "pitch" : "43.492" + "pitch" : 43.491916656494141 }, { "iteration" : 10, - "pitch" : "43.523" + "pitch" : 43.522834777832031 }, { "iteration" : 11, - "pitch" : "43.510" + "pitch" : 43.510257720947266 }, { "iteration" : 12, - "pitch" : "43.523" + "pitch" : 43.522518157958984 }, { "iteration" : 13, - "pitch" : "43.479" + "pitch" : 43.479103088378906 }, { "iteration" : 14, - "pitch" : "43.509" + "pitch" : 43.509490966796875 }, { "iteration" : 15, - "pitch" : "43.519" + "pitch" : 43.519065856933594 }, { "iteration" : 16, - "pitch" : "43.486" + "pitch" : 43.486358642578125 }, { "iteration" : 17, - "pitch" : "43.502" + "pitch" : 43.501613616943359 }, { "iteration" : 18, - "pitch" : "43.506" + "pitch" : 43.505615234375 }, { "iteration" : 19, - "pitch" : "43.487" + "pitch" : 43.487262725830078 }, { "iteration" : 20, - "pitch" : "43.524" + "pitch" : 43.523658752441406 }, { "iteration" : 21, - "pitch" : "43.503" + "pitch" : 43.502880096435547 }, { "iteration" : 22, - "pitch" : "43.482" + "pitch" : 43.481658935546875 }, { "iteration" : 23, - "pitch" : "43.437" + "pitch" : 43.436737060546875 }, { "iteration" : 24, - "pitch" : "43.418" + "pitch" : 43.41766357421875 }, { "iteration" : 25, - "pitch" : "43.417" + "pitch" : 43.416606903076172 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F2.json index 8fd9bec..1fc9243 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F2.json @@ -8,95 +8,95 @@ }, { "iteration" : 2, - "pitch" : "87.407" + "pitch" : 87.406608581542969 }, { "iteration" : 3, - "pitch" : "86.965" + "pitch" : 86.96466064453125 }, { "iteration" : 4, - "pitch" : "86.923" + "pitch" : 86.922950744628906 }, { "iteration" : 5, - "pitch" : "86.910" + "pitch" : 86.910140991210938 }, { "iteration" : 6, - "pitch" : "86.933" + "pitch" : 86.932754516601562 }, { "iteration" : 7, - "pitch" : "86.991" + "pitch" : 86.99102783203125 }, { "iteration" : 8, - "pitch" : "87.021" + "pitch" : 87.020698547363281 }, { "iteration" : 9, - "pitch" : "86.953" + "pitch" : 86.952781677246094 }, { "iteration" : 10, - "pitch" : "86.910" + "pitch" : 86.909660339355469 }, { "iteration" : 11, - "pitch" : "86.911" + "pitch" : 86.911407470703125 }, { "iteration" : 12, - "pitch" : "86.976" + "pitch" : 86.97601318359375 }, { "iteration" : 13, - "pitch" : "86.904" + "pitch" : 86.904289245605469 }, { "iteration" : 14, - "pitch" : "86.953" + "pitch" : 86.953285217285156 }, { "iteration" : 15, - "pitch" : "86.992" + "pitch" : 86.991500854492188 }, { "iteration" : 16, - "pitch" : "86.932" + "pitch" : 86.931900024414062 }, { "iteration" : 17, - "pitch" : "86.906" + "pitch" : 86.905838012695312 }, { "iteration" : 18, - "pitch" : "86.993" + "pitch" : 86.993064880371094 }, { "iteration" : 19, - "pitch" : "86.966" + "pitch" : 86.965591430664062 }, { "iteration" : 20, - "pitch" : "86.934" + "pitch" : 86.934379577636719 }, { "iteration" : 21, - "pitch" : "87.003" + "pitch" : 87.0030517578125 }, { "iteration" : 22, - "pitch" : "87.003" + "pitch" : 87.00347900390625 }, { "iteration" : 23, - "pitch" : "86.897" + "pitch" : 86.897102355957031 }, { "iteration" : 24, - "pitch" : "86.970" + "pitch" : 86.969902038574219 }, { "iteration" : 25 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F3.json index 540c0a6..7d0083a 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F3.json @@ -5,71 +5,71 @@ }, { "iteration" : 1, - "pitch" : "349.535" + "pitch" : 349.53521728515625 }, { "iteration" : 2, - "pitch" : "174.321" + "pitch" : 174.32148742675781 }, { "iteration" : 3, - "pitch" : "174.532" + "pitch" : 174.53187561035156 }, { "iteration" : 4, - "pitch" : "174.373" + "pitch" : 174.37287902832031 }, { "iteration" : 5, - "pitch" : "174.651" + "pitch" : 174.6507568359375 }, { "iteration" : 6, - "pitch" : "174.496" + "pitch" : 174.49647521972656 }, { "iteration" : 7, - "pitch" : "174.323" + "pitch" : 174.32321166992188 }, { "iteration" : 8, - "pitch" : "174.490" + "pitch" : 174.49043273925781 }, { "iteration" : 9, - "pitch" : "174.522" + "pitch" : 174.52206420898438 }, { "iteration" : 10, - "pitch" : "174.489" + "pitch" : 174.48921203613281 }, { "iteration" : 11, - "pitch" : "174.431" + "pitch" : 174.43148803710938 }, { "iteration" : 12, - "pitch" : "174.360" + "pitch" : 174.35948181152344 }, { "iteration" : 13, - "pitch" : "174.474" + "pitch" : 174.47355651855469 }, { "iteration" : 14, - "pitch" : "174.477" + "pitch" : 174.4774169921875 }, { "iteration" : 15, - "pitch" : "174.420" + "pitch" : 174.42005920410156 }, { "iteration" : 16, - "pitch" : "174.343" + "pitch" : 174.34292602539062 }, { "iteration" : 17, - "pitch" : "174.484" + "pitch" : 174.48384094238281 }, { "iteration" : 18 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F4.json index f03dff2..bba29df 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F4.json @@ -5,35 +5,35 @@ }, { "iteration" : 1, - "pitch" : "349.893" + "pitch" : 349.89309692382812 }, { "iteration" : 2, - "pitch" : "349.907" + "pitch" : 349.90704345703125 }, { "iteration" : 3, - "pitch" : "349.683" + "pitch" : 349.68344116210938 }, { "iteration" : 4, - "pitch" : "349.492" + "pitch" : 349.49240112304688 }, { "iteration" : 5, - "pitch" : "349.314" + "pitch" : 349.31423950195312 }, { "iteration" : 6, - "pitch" : "349.562" + "pitch" : 349.5621337890625 }, { "iteration" : 7, - "pitch" : "349.560" + "pitch" : 349.559814453125 }, { "iteration" : 8, - "pitch" : "349.911" + "pitch" : 349.91104125976562 }, { "iteration" : 9 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F5.json index c83c38f..cd19fe9 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F5.json @@ -8,11 +8,11 @@ }, { "iteration" : 2, - "pitch" : "702.687" + "pitch" : 702.68707275390625 }, { "iteration" : 3, - "pitch" : "701.769" + "pitch" : 701.76904296875 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F6.json index aba1718..80c8752 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F6.json @@ -5,15 +5,15 @@ }, { "iteration" : 1, - "pitch" : "1402.190" + "pitch" : 1402.1898193359375 }, { "iteration" : 2, - "pitch" : "1400.840" + "pitch" : 1400.84033203125 }, { "iteration" : 3, - "pitch" : "1401.853" + "pitch" : 1401.8529052734375 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F7.json index 6598e7d..c759531 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.F7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2828.758" + "pitch" : 2828.75830078125 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G1.json index b7fb883..53abdc4 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G1.json @@ -8,91 +8,91 @@ }, { "iteration" : 2, - "pitch" : "48.939" + "pitch" : 48.93902587890625 }, { "iteration" : 3, - "pitch" : "48.944" + "pitch" : 48.944480895996094 }, { "iteration" : 4, - "pitch" : "49.073" + "pitch" : 49.072689056396484 }, { "iteration" : 5, - "pitch" : "48.729" + "pitch" : 48.729007720947266 }, { "iteration" : 6, - "pitch" : "49.031" + "pitch" : 49.031162261962891 }, { "iteration" : 7, - "pitch" : "48.917" + "pitch" : 48.916542053222656 }, { "iteration" : 8, - "pitch" : "48.978" + "pitch" : 48.977828979492188 }, { "iteration" : 9, - "pitch" : "48.892" + "pitch" : 48.89227294921875 }, { "iteration" : 10, - "pitch" : "48.883" + "pitch" : 48.883445739746094 }, { "iteration" : 11, - "pitch" : "48.966" + "pitch" : 48.966209411621094 }, { "iteration" : 12, - "pitch" : "48.809" + "pitch" : 48.808902740478516 }, { "iteration" : 13, - "pitch" : "48.512" + "pitch" : 48.511745452880859 }, { "iteration" : 14, - "pitch" : "48.887" + "pitch" : 48.887142181396484 }, { "iteration" : 15, - "pitch" : "48.948" + "pitch" : 48.947601318359375 }, { "iteration" : 16, - "pitch" : "48.946" + "pitch" : 48.945941925048828 }, { "iteration" : 17, - "pitch" : "48.959" + "pitch" : 48.959053039550781 }, { "iteration" : 18, - "pitch" : "48.976" + "pitch" : 48.976020812988281 }, { "iteration" : 19, - "pitch" : "49.016" + "pitch" : 49.015693664550781 }, { "iteration" : 20, - "pitch" : "48.959" + "pitch" : 48.959438323974609 }, { "iteration" : 21, - "pitch" : "49.057" + "pitch" : 49.057094573974609 }, { "iteration" : 22, - "pitch" : "48.930" + "pitch" : 48.929805755615234 }, { "iteration" : 23, - "pitch" : "48.904" + "pitch" : 48.903553009033203 }, { "iteration" : 24 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G2.json index d1ac524..bec32a2 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G2.json @@ -5,59 +5,59 @@ }, { "iteration" : 1, - "pitch" : "93.052" + "pitch" : 93.051582336425781 }, { "iteration" : 2, - "pitch" : "97.791" + "pitch" : 97.790802001953125 }, { "iteration" : 3, - "pitch" : "97.967" + "pitch" : 97.967399597167969 }, { "iteration" : 4, - "pitch" : "97.745" + "pitch" : 97.745185852050781 }, { "iteration" : 5, - "pitch" : "97.819" + "pitch" : 97.819107055664062 }, { "iteration" : 6, - "pitch" : "97.734" + "pitch" : 97.734054565429688 }, { "iteration" : 7, - "pitch" : "97.735" + "pitch" : 97.735031127929688 }, { "iteration" : 8, - "pitch" : "97.824" + "pitch" : 97.823776245117188 }, { "iteration" : 9, - "pitch" : "97.733" + "pitch" : 97.733291625976562 }, { "iteration" : 10, - "pitch" : "97.911" + "pitch" : 97.911323547363281 }, { "iteration" : 11, - "pitch" : "97.870" + "pitch" : 97.86968994140625 }, { "iteration" : 12, - "pitch" : "97.861" + "pitch" : 97.86102294921875 }, { "iteration" : 13, - "pitch" : "97.505" + "pitch" : 97.504730224609375 }, { "iteration" : 14, - "pitch" : "97.657" + "pitch" : 97.6568603515625 }, { "iteration" : 15 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G3.json index d2b3cf4..8bd011f 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G3.json @@ -5,55 +5,55 @@ }, { "iteration" : 1, - "pitch" : "197.999" + "pitch" : 197.99871826171875 }, { "iteration" : 2, - "pitch" : "196.181" + "pitch" : 196.18072509765625 }, { "iteration" : 3, - "pitch" : "196.220" + "pitch" : 196.2196044921875 }, { "iteration" : 4, - "pitch" : "196.137" + "pitch" : 196.13655090332031 }, { "iteration" : 5, - "pitch" : "196.190" + "pitch" : 196.18962097167969 }, { "iteration" : 6, - "pitch" : "196.192" + "pitch" : 196.19218444824219 }, { "iteration" : 7, - "pitch" : "195.925" + "pitch" : 195.9248046875 }, { "iteration" : 8, - "pitch" : "195.877" + "pitch" : 195.8773193359375 }, { "iteration" : 9, - "pitch" : "196.069" + "pitch" : 196.06858825683594 }, { "iteration" : 10, - "pitch" : "196.144" + "pitch" : 196.14436340332031 }, { "iteration" : 11, - "pitch" : "196.156" + "pitch" : 196.15570068359375 }, { "iteration" : 12, - "pitch" : "196.355" + "pitch" : 196.35476684570312 }, { "iteration" : 13, - "pitch" : "195.958" + "pitch" : 195.95823669433594 }, { "iteration" : 14 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G4.json index 90e0721..0b77bf1 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G4.json @@ -5,51 +5,51 @@ }, { "iteration" : 1, - "pitch" : "390.640" + "pitch" : 390.64035034179688 }, { "iteration" : 2, - "pitch" : "392.973" + "pitch" : 392.97348022460938 }, { "iteration" : 3, - "pitch" : "392.746" + "pitch" : 392.74578857421875 }, { "iteration" : 4, - "pitch" : "392.425" + "pitch" : 392.42477416992188 }, { "iteration" : 5, - "pitch" : "391.906" + "pitch" : 391.90576171875 }, { "iteration" : 6, - "pitch" : "392.331" + "pitch" : 392.3314208984375 }, { "iteration" : 7, - "pitch" : "392.094" + "pitch" : 392.093505859375 }, { "iteration" : 8, - "pitch" : "393.167" + "pitch" : 393.1668701171875 }, { "iteration" : 9, - "pitch" : "392.704" + "pitch" : 392.70355224609375 }, { "iteration" : 10, - "pitch" : "391.937" + "pitch" : 391.93710327148438 }, { "iteration" : 11, - "pitch" : "391.851" + "pitch" : 391.85128784179688 }, { "iteration" : 12, - "pitch" : "391.933" + "pitch" : 391.9329833984375 }, { "iteration" : 13 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G5.json index 1628186..b9c6d3e 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G5.json @@ -5,19 +5,19 @@ }, { "iteration" : 1, - "pitch" : "785.743" + "pitch" : 785.74322509765625 }, { "iteration" : 2, - "pitch" : "785.834" + "pitch" : 785.833740234375 }, { "iteration" : 3, - "pitch" : "785.519" + "pitch" : 785.518798828125 }, { "iteration" : 4, - "pitch" : "788.928" + "pitch" : 788.927734375 }, { "iteration" : 5 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G6.json index 3f2e16e..f2e9b84 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1570.089" + "pitch" : 1570.0887451171875 }, { "iteration" : 2, - "pitch" : "1581.651" + "pitch" : 1581.6512451171875 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G7.json index 2bdd28c..b57ea21 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.G7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "3173.467" + "pitch" : 3173.466552734375 }, { "iteration" : 2 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb1.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb1.json index 6331ecc..6dd3386 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb1.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb1.json @@ -5,103 +5,103 @@ }, { "iteration" : 1, - "pitch" : "92.136" + "pitch" : 92.135581970214844 }, { "iteration" : 2, - "pitch" : "46.089" + "pitch" : 46.089149475097656 }, { "iteration" : 3, - "pitch" : "46.061" + "pitch" : 46.060619354248047 }, { "iteration" : 4, - "pitch" : "46.153" + "pitch" : 46.152751922607422 }, { "iteration" : 5, - "pitch" : "46.154" + "pitch" : 46.154079437255859 }, { "iteration" : 6, - "pitch" : "46.125" + "pitch" : 46.124897003173828 }, { "iteration" : 7, - "pitch" : "46.178" + "pitch" : 46.178298950195312 }, { "iteration" : 8, - "pitch" : "46.187" + "pitch" : 46.186538696289062 }, { "iteration" : 9, - "pitch" : "46.192" + "pitch" : 46.192337036132812 }, { "iteration" : 10, - "pitch" : "46.104" + "pitch" : 46.104423522949219 }, { "iteration" : 11, - "pitch" : "46.115" + "pitch" : 46.114753723144531 }, { "iteration" : 12, - "pitch" : "46.172" + "pitch" : 46.172187805175781 }, { "iteration" : 13, - "pitch" : "46.148" + "pitch" : 46.147743225097656 }, { "iteration" : 14, - "pitch" : "46.136" + "pitch" : 46.135906219482422 }, { "iteration" : 15, - "pitch" : "46.141" + "pitch" : 46.141151428222656 }, { "iteration" : 16, - "pitch" : "46.133" + "pitch" : 46.133182525634766 }, { "iteration" : 17, - "pitch" : "46.166" + "pitch" : 46.165966033935547 }, { "iteration" : 18, - "pitch" : "46.163" + "pitch" : 46.163105010986328 }, { "iteration" : 19, - "pitch" : "46.072" + "pitch" : 46.072101593017578 }, { "iteration" : 20, - "pitch" : "46.130" + "pitch" : 46.129829406738281 }, { "iteration" : 21, - "pitch" : "46.114" + "pitch" : 46.114151000976562 }, { "iteration" : 22, - "pitch" : "46.094" + "pitch" : 46.093936920166016 }, { "iteration" : 23, - "pitch" : "46.052" + "pitch" : 46.052211761474609 }, { "iteration" : 24, - "pitch" : "91.997" + "pitch" : 91.996803283691406 }, { "iteration" : 25, - "pitch" : "46.070" + "pitch" : 46.069969177246094 } ] } \ No newline at end of file diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb2.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb2.json index b36e2d3..9f6b153 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb2.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb2.json @@ -5,99 +5,99 @@ }, { "iteration" : 1, - "pitch" : "92.570" + "pitch" : 92.570411682128906 }, { "iteration" : 2, - "pitch" : "92.668" + "pitch" : 92.668106079101562 }, { "iteration" : 3, - "pitch" : "92.132" + "pitch" : 92.131637573242188 }, { "iteration" : 4, - "pitch" : "92.181" + "pitch" : 92.180778503417969 }, { "iteration" : 5, - "pitch" : "92.326" + "pitch" : 92.326469421386719 }, { "iteration" : 6, - "pitch" : "92.187" + "pitch" : 92.186866760253906 }, { "iteration" : 7, - "pitch" : "92.091" + "pitch" : 92.091323852539062 }, { "iteration" : 8, - "pitch" : "92.323" + "pitch" : 92.323394775390625 }, { "iteration" : 9, - "pitch" : "92.153" + "pitch" : 92.152618408203125 }, { "iteration" : 10, - "pitch" : "92.286" + "pitch" : 92.285942077636719 }, { "iteration" : 11, - "pitch" : "92.112" + "pitch" : 92.111953735351562 }, { "iteration" : 12, - "pitch" : "92.141" + "pitch" : 92.141410827636719 }, { "iteration" : 13, - "pitch" : "92.308" + "pitch" : 92.308494567871094 }, { "iteration" : 14, - "pitch" : "92.382" + "pitch" : 92.3817138671875 }, { "iteration" : 15, - "pitch" : "92.409" + "pitch" : 92.409446716308594 }, { "iteration" : 16, - "pitch" : "92.084" + "pitch" : 92.084175109863281 }, { "iteration" : 17, - "pitch" : "92.363" + "pitch" : 92.362869262695312 }, { "iteration" : 18, - "pitch" : "92.305" + "pitch" : 92.304832458496094 }, { "iteration" : 19, - "pitch" : "92.425" + "pitch" : 92.425422668457031 }, { "iteration" : 20, - "pitch" : "92.304" + "pitch" : 92.304466247558594 }, { "iteration" : 21, - "pitch" : "92.042" + "pitch" : 92.041877746582031 }, { "iteration" : 22, - "pitch" : "92.094" + "pitch" : 92.09375 }, { "iteration" : 23, - "pitch" : "92.029" + "pitch" : 92.028800964355469 }, { "iteration" : 24, - "pitch" : "92.292" + "pitch" : 92.292137145996094 }, { "iteration" : 25 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb3.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb3.json index de06cd8..1a8878c 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb3.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb3.json @@ -5,87 +5,87 @@ }, { "iteration" : 1, - "pitch" : "182.004" + "pitch" : 182.00416564941406 }, { "iteration" : 2, - "pitch" : "184.916" + "pitch" : 184.91563415527344 }, { "iteration" : 3, - "pitch" : "184.691" + "pitch" : 184.69129943847656 }, { "iteration" : 4, - "pitch" : "184.675" + "pitch" : 184.67477416992188 }, { "iteration" : 5, - "pitch" : "184.829" + "pitch" : 184.82913208007812 }, { "iteration" : 6, - "pitch" : "184.881" + "pitch" : 184.8812255859375 }, { "iteration" : 7, - "pitch" : "184.732" + "pitch" : 184.73214721679688 }, { "iteration" : 8, - "pitch" : "184.806" + "pitch" : 184.80563354492188 }, { "iteration" : 9, - "pitch" : "184.791" + "pitch" : 184.79139709472656 }, { "iteration" : 10, - "pitch" : "184.792" + "pitch" : 184.791748046875 }, { "iteration" : 11, - "pitch" : "184.777" + "pitch" : 184.77653503417969 }, { "iteration" : 12, - "pitch" : "184.716" + "pitch" : 184.71630859375 }, { "iteration" : 13, - "pitch" : "184.787" + "pitch" : 184.78689575195312 }, { "iteration" : 14, - "pitch" : "184.793" + "pitch" : 184.79313659667969 }, { "iteration" : 15, - "pitch" : "184.702" + "pitch" : 184.70184326171875 }, { "iteration" : 16, - "pitch" : "184.743" + "pitch" : 184.74296569824219 }, { "iteration" : 17, - "pitch" : "184.626" + "pitch" : 184.62588500976562 }, { "iteration" : 18, - "pitch" : "184.594" + "pitch" : 184.59422302246094 }, { "iteration" : 19, - "pitch" : "184.647" + "pitch" : 184.64683532714844 }, { "iteration" : 20, - "pitch" : "184.675" + "pitch" : 184.67544555664062 }, { "iteration" : 21, - "pitch" : "184.602" + "pitch" : 184.60203552246094 }, { "iteration" : 22 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb4.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb4.json index 6b40341..b4d1805 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb4.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb4.json @@ -8,27 +8,27 @@ }, { "iteration" : 2, - "pitch" : "370.648" + "pitch" : 370.64813232421875 }, { "iteration" : 3, - "pitch" : "370.227" + "pitch" : 370.22677612304688 }, { "iteration" : 4, - "pitch" : "369.982" + "pitch" : 369.98178100585938 }, { "iteration" : 5, - "pitch" : "371.585" + "pitch" : 371.58447265625 }, { "iteration" : 6, - "pitch" : "369.996" + "pitch" : 369.99655151367188 }, { "iteration" : 7, - "pitch" : "370.155" + "pitch" : 370.15530395507812 }, { "iteration" : 8 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb5.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb5.json index b05889e..3fcd941 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb5.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb5.json @@ -8,11 +8,11 @@ }, { "iteration" : 2, - "pitch" : "742.243" + "pitch" : 742.24261474609375 }, { "iteration" : 3, - "pitch" : "742.928" + "pitch" : 742.92822265625 }, { "iteration" : 4 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb6.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb6.json index 704148b..9eff08c 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb6.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb6.json @@ -5,11 +5,11 @@ }, { "iteration" : 1, - "pitch" : "1488.255" + "pitch" : 1488.2548828125 }, { "iteration" : 2, - "pitch" : "1484.237" + "pitch" : 1484.23681640625 }, { "iteration" : 3 diff --git a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb7.json b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb7.json index 4794a0d..a321b27 100644 --- a/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb7.json +++ b/Packages/MicrophonePitchDetector/Tests/MicrophonePitchDetectorTests/__Snapshots__/MicrophonePitchDetectorTests/testPiano.Gb7.json @@ -5,7 +5,7 @@ }, { "iteration" : 1, - "pitch" : "2992.737" + "pitch" : 2992.737060546875 }, { "iteration" : 2 diff --git a/README.md b/README.md index c207bb0..0bd778f 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ ![CI](https://github.com/jpsim/ZenTuner/workflows/CI/badge.svg) -A minimal chromatic tuner for iOS & macOS. Works well with any -instrument, whether it’s woodwinds, brass, strings or voice. +A minimal chromatic tuner for iOS, watchOS, macOS & visionOS. Works well with +any instrument, whether it’s woodwinds, brass, strings or voice. | | Dark | Light | | ----- | ----------------------------------- | ------------------------------------ | @@ -18,7 +18,7 @@ instrument, whether it’s woodwinds, brass, strings or voice. * One-touch menu to apply a transposition to easily tune all instruments * Tap the main note to adjust preference to prefer sharps or flats * Works well on all screen sizes and orientations, from the smallest - iPhone to the largest iPad or Mac + Apple Watch to the largest iPad or Mac ## Credits diff --git a/ZenTuner.xcodeproj/project.pbxproj b/ZenTuner.xcodeproj/project.pbxproj index adc346e..563b058 100644 --- a/ZenTuner.xcodeproj/project.pbxproj +++ b/ZenTuner.xcodeproj/project.pbxproj @@ -7,19 +7,14 @@ objects = { /* Begin PBXBuildFile section */ - 8F13E1B625ED345700C3F23D /* ColorAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F13E1B525ED345700C3F23D /* ColorAnimation.swift */; }; - 8F13E1B725ED345700C3F23D /* ColorAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F13E1B525ED345700C3F23D /* ColorAnimation.swift */; }; 8F13E1C225ED533800C3F23D /* ClosestNoteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F13E1C125ED533800C3F23D /* ClosestNoteTests.swift */; }; 8F2D975126938AF900B512D0 /* TunerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D975026938AF900B512D0 /* TunerScreen.swift */; }; - 8F2D975226938AF900B512D0 /* TunerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D975026938AF900B512D0 /* TunerScreen.swift */; }; 8F2D975326938B0500B512D0 /* TunerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D975026938AF900B512D0 /* TunerScreen.swift */; }; 8F2D9755269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D9754269390D800B512D0 /* MicrophoneAccessAlert.swift */; }; - 8F2D9756269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D9754269390D800B512D0 /* MicrophoneAccessAlert.swift */; }; 8F2D9757269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D9754269390D800B512D0 /* MicrophoneAccessAlert.swift */; }; 8F2D97592693930000B512D0 /* NoteTicks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D97582693930000B512D0 /* NoteTicks.swift */; }; - 8F2D975A2693930000B512D0 /* NoteTicks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D97582693930000B512D0 /* NoteTicks.swift */; }; 8F2D975B2693930000B512D0 /* NoteTicks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2D97582693930000B512D0 /* NoteTicks.swift */; }; - 8F3ECD042682821E00415B9F /* Zen Tuner WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 8F3ECD032682821E00415B9F /* Zen Tuner WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 8F3ECD042682821E00415B9F /* Zen Tuner WatchKit Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8F3ECD032682821E00415B9F /* Zen Tuner WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 8F3ECD1F2682834700415B9F /* ModifierPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D825B73E9A007C28BC /* ModifierPreference.swift */; }; 8F3ECD202682834700415B9F /* TunerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DB25B73E9A007C28BC /* TunerData.swift */; }; 8F3ECD212682834700415B9F /* Frequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D925B73E9A007C28BC /* Frequency.swift */; }; @@ -31,46 +26,29 @@ 8F3ECD282682838D00415B9F /* MainNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F025B73ECE007C28BC /* MainNoteView.swift */; }; 8F3ECD292682838D00415B9F /* MatchedNoteFrequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F225B73ECF007C28BC /* MatchedNoteFrequency.swift */; }; 8F3ECD2A2682838D00415B9F /* TunerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F425B73ECF007C28BC /* TunerView.swift */; }; - 8F3ECD2B2682843400415B9F /* ColorAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F13E1B525ED345700C3F23D /* ColorAnimation.swift */; }; 8F3ECD2C268284AC00415B9F /* ZenTunerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571AA25B72146007C28BC /* ZenTunerApp.swift */; }; 8F3ECD2E268287AA00415B9F /* MicrophonePitchDetector in Frameworks */ = {isa = PBXBuildFile; productRef = 8F3ECD2D268287AA00415B9F /* MicrophonePitchDetector */; }; 8F44F7FF26939F13007DBE1E /* Color+MusicalDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F44F7FE26939F13007DBE1E /* Color+MusicalDistance.swift */; }; - 8F44F80026939F13007DBE1E /* Color+MusicalDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F44F7FE26939F13007DBE1E /* Color+MusicalDistance.swift */; }; 8F44F80126939F13007DBE1E /* Color+MusicalDistance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F44F7FE26939F13007DBE1E /* Color+MusicalDistance.swift */; }; 8F693E3925B87DB20054DB16 /* TranspositionMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F693E3825B87DB20054DB16 /* TranspositionMenu.swift */; }; - 8F693E3A25B87DB20054DB16 /* TranspositionMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F693E3825B87DB20054DB16 /* TranspositionMenu.swift */; }; 8F848C87269365D30037EF97 /* MatchedNoteViewSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F848C86269365D30037EF97 /* MatchedNoteViewSnapshotTests.swift */; }; 8F8F67C525C093640024B4CB /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 8F8F67C425C093640024B4CB /* SnapshotTesting */; }; 8F8F67CD25C0938F0024B4CB /* TunerViewSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F8F67CC25C0938F0024B4CB /* TunerViewSnapshotTests.swift */; }; 8FABB9102683AAD000A7D824 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8FB571AC25B72147007C28BC /* Assets.xcassets */; }; 8FB571BD25B72147007C28BC /* ZenTunerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571AA25B72146007C28BC /* ZenTunerApp.swift */; }; - 8FB571BE25B72147007C28BC /* ZenTunerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571AA25B72146007C28BC /* ZenTunerApp.swift */; }; 8FB571C125B72147007C28BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8FB571AC25B72147007C28BC /* Assets.xcassets */; }; - 8FB571C225B72147007C28BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8FB571AC25B72147007C28BC /* Assets.xcassets */; }; 8FB571DF25B73E9A007C28BC /* ModifierPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D825B73E9A007C28BC /* ModifierPreference.swift */; }; - 8FB571E025B73E9A007C28BC /* ModifierPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D825B73E9A007C28BC /* ModifierPreference.swift */; }; 8FB571E125B73E9A007C28BC /* Frequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D925B73E9A007C28BC /* Frequency.swift */; }; - 8FB571E225B73E9A007C28BC /* Frequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571D925B73E9A007C28BC /* Frequency.swift */; }; 8FB571E325B73E9A007C28BC /* ScaleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DA25B73E9A007C28BC /* ScaleNote.swift */; }; - 8FB571E425B73E9A007C28BC /* ScaleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DA25B73E9A007C28BC /* ScaleNote.swift */; }; 8FB571E525B73E9A007C28BC /* TunerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DB25B73E9A007C28BC /* TunerData.swift */; }; - 8FB571E625B73E9A007C28BC /* TunerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DB25B73E9A007C28BC /* TunerData.swift */; }; 8FB571E925B73E9A007C28BC /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DE25B73E9A007C28BC /* Alignment.swift */; }; - 8FB571EA25B73E9A007C28BC /* Alignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571DE25B73E9A007C28BC /* Alignment.swift */; }; 8FB571F525B73ECF007C28BC /* CurrentNoteMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571EF25B73ECE007C28BC /* CurrentNoteMarker.swift */; }; - 8FB571F625B73ECF007C28BC /* CurrentNoteMarker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571EF25B73ECE007C28BC /* CurrentNoteMarker.swift */; }; 8FB571F725B73ECF007C28BC /* MainNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F025B73ECE007C28BC /* MainNoteView.swift */; }; - 8FB571F825B73ECF007C28BC /* MainNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F025B73ECE007C28BC /* MainNoteView.swift */; }; 8FB571F925B73ECF007C28BC /* MatchedNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F125B73ECE007C28BC /* MatchedNoteView.swift */; }; - 8FB571FA25B73ECF007C28BC /* MatchedNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F125B73ECE007C28BC /* MatchedNoteView.swift */; }; 8FB571FB25B73ECF007C28BC /* MatchedNoteFrequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F225B73ECF007C28BC /* MatchedNoteFrequency.swift */; }; - 8FB571FC25B73ECF007C28BC /* MatchedNoteFrequency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F225B73ECF007C28BC /* MatchedNoteFrequency.swift */; }; 8FB571FD25B73ECF007C28BC /* NoteDistanceMarkers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F325B73ECF007C28BC /* NoteDistanceMarkers.swift */; }; - 8FB571FE25B73ECF007C28BC /* NoteDistanceMarkers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F325B73ECF007C28BC /* NoteDistanceMarkers.swift */; }; 8FB571FF25B73ECF007C28BC /* TunerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F425B73ECF007C28BC /* TunerView.swift */; }; - 8FB5720025B73ECF007C28BC /* TunerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB571F425B73ECF007C28BC /* TunerView.swift */; }; 8FD5D594267849EF00E5577D /* MicrophonePitchDetector in Frameworks */ = {isa = PBXBuildFile; productRef = 8FD5D593267849EF00E5577D /* MicrophonePitchDetector */; }; - 8FD5D596267849F500E5577D /* MicrophonePitchDetector in Frameworks */ = {isa = PBXBuildFile; productRef = 8FD5D595267849F500E5577D /* MicrophonePitchDetector */; }; 8FE56CDD25BE05D20038664C /* TranspositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FE56CDC25BE05D20038664C /* TranspositionTests.swift */; }; /* End PBXBuildFile section */ @@ -92,21 +70,20 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 8F3ECD192682822100415B9F /* Embed App Extensions */ = { + 8F3ECD192682822100415B9F /* Embed Foundation Extensions */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 13; files = ( - 8F3ECD042682821E00415B9F /* Zen Tuner WatchKit Extension.appex in Embed App Extensions */, + 8F3ECD042682821E00415B9F /* Zen Tuner WatchKit Extension.appex in Embed Foundation Extensions */, ); - name = "Embed App Extensions"; + name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 8F13E1B525ED345700C3F23D /* ColorAnimation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorAnimation.swift; sourceTree = ""; }; 8F13E1C125ED533800C3F23D /* ClosestNoteTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClosestNoteTests.swift; sourceTree = ""; }; 8F2D975026938AF900B512D0 /* TunerScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunerScreen.swift; sourceTree = ""; }; 8F2D9754269390D800B512D0 /* MicrophoneAccessAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicrophoneAccessAlert.swift; sourceTree = ""; }; @@ -125,7 +102,6 @@ 8FB571AC25B72147007C28BC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 8FB571B125B72147007C28BC /* ZenTuner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZenTuner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8FB571B425B72147007C28BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 8FB571B925B72147007C28BC /* ZenTuner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZenTuner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8FB571D825B73E9A007C28BC /* ModifierPreference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModifierPreference.swift; sourceTree = ""; }; 8FB571D925B73E9A007C28BC /* Frequency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Frequency.swift; sourceTree = ""; }; 8FB571DA25B73E9A007C28BC /* ScaleNote.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScaleNote.swift; sourceTree = ""; }; @@ -160,14 +136,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8FB571B625B72147007C28BC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8FD5D596267849F500E5577D /* MicrophonePitchDetector in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 8FE56CD725BE05D20038664C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -252,7 +220,6 @@ isa = PBXGroup; children = ( 8FB571B125B72147007C28BC /* ZenTuner.app */, - 8FB571B925B72147007C28BC /* ZenTuner.app */, 8FE56CDA25BE05D20038664C /* ZenTunerTests.xctest */, 8F3ECCF82682821900415B9F /* Zen Tuner watchOS.app */, 8F3ECD032682821E00415B9F /* Zen Tuner WatchKit Extension.appex */, @@ -299,7 +266,6 @@ isa = PBXGroup; children = ( 8FB571DE25B73E9A007C28BC /* Alignment.swift */, - 8F13E1B525ED345700C3F23D /* ColorAnimation.swift */, 8F44F7FE26939F13007DBE1E /* Color+MusicalDistance.swift */, ); path = Helpers; @@ -332,7 +298,7 @@ buildConfigurationList = 8F3ECD1D2682822100415B9F /* Build configuration list for PBXNativeTarget "Zen Tuner watchOS" */; buildPhases = ( 8F3ECCF62682821900415B9F /* Resources */, - 8F3ECD192682822100415B9F /* Embed App Extensions */, + 8F3ECD192682822100415B9F /* Embed Foundation Extensions */, ); buildRules = ( ); @@ -364,9 +330,9 @@ productReference = 8F3ECD032682821E00415B9F /* Zen Tuner WatchKit Extension.appex */; productType = "com.apple.product-type.watchkit2-extension"; }; - 8FB571B025B72147007C28BC /* Zen Tuner iOS */ = { + 8FB571B025B72147007C28BC /* Zen Tuner */ = { isa = PBXNativeTarget; - buildConfigurationList = 8FB571C525B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner iOS" */; + buildConfigurationList = 8FB571C525B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner" */; buildPhases = ( 8FB571AD25B72147007C28BC /* Sources */, 8FB571AE25B72147007C28BC /* Frameworks */, @@ -376,7 +342,7 @@ ); dependencies = ( ); - name = "Zen Tuner iOS"; + name = "Zen Tuner"; packageProductDependencies = ( 8FD5D593267849EF00E5577D /* MicrophonePitchDetector */, ); @@ -384,26 +350,6 @@ productReference = 8FB571B125B72147007C28BC /* ZenTuner.app */; productType = "com.apple.product-type.application"; }; - 8FB571B825B72147007C28BC /* Zen Tuner macOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8FB571C825B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner macOS" */; - buildPhases = ( - 8FB571B525B72147007C28BC /* Sources */, - 8FB571B625B72147007C28BC /* Frameworks */, - 8FB571B725B72147007C28BC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Zen Tuner macOS"; - packageProductDependencies = ( - 8FD5D595267849F500E5577D /* MicrophonePitchDetector */, - ); - productName = "ZenTuner (macOS)"; - productReference = 8FB571B925B72147007C28BC /* ZenTuner.app */; - productType = "com.apple.product-type.application"; - }; 8FE56CD925BE05D20038664C /* ZenTunerTests */ = { isa = PBXNativeTarget; buildConfigurationList = 8FE56CE325BE05D20038664C /* Build configuration list for PBXNativeTarget "ZenTunerTests" */; @@ -431,8 +377,9 @@ 8FB571A525B72146007C28BC /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1300; - LastUpgradeCheck = 1220; + LastUpgradeCheck = 1500; TargetAttributes = { 8F3ECCF72682821900415B9F = { CreatedOnToolsVersion = 13.0; @@ -444,9 +391,6 @@ 8FB571B025B72147007C28BC = { CreatedOnToolsVersion = 12.2; }; - 8FB571B825B72147007C28BC = { - CreatedOnToolsVersion = 12.2; - }; 8FE56CD925BE05D20038664C = { CreatedOnToolsVersion = 12.2; TestTargetID = 8FB571B025B72147007C28BC; @@ -469,8 +413,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 8FB571B025B72147007C28BC /* Zen Tuner iOS */, - 8FB571B825B72147007C28BC /* Zen Tuner macOS */, + 8FB571B025B72147007C28BC /* Zen Tuner */, 8F3ECCF72682821900415B9F /* Zen Tuner watchOS */, 8F3ECD022682821E00415B9F /* Zen Tuner WatchKit Extension */, 8FE56CD925BE05D20038664C /* ZenTunerTests */, @@ -502,14 +445,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8FB571B725B72147007C28BC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8FB571C225B72147007C28BC /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 8FE56CD825BE05D20038664C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -536,7 +471,6 @@ 8F3ECD262682838D00415B9F /* MatchedNoteView.swift in Sources */, 8F3ECD282682838D00415B9F /* MainNoteView.swift in Sources */, 8F3ECD202682834700415B9F /* TunerData.swift in Sources */, - 8F3ECD2B2682843400415B9F /* ColorAnimation.swift in Sources */, 8F2D975326938B0500B512D0 /* TunerScreen.swift in Sources */, 8F2D9757269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */, 8F2D975B2693930000B512D0 /* NoteTicks.swift in Sources */, @@ -549,7 +483,6 @@ buildActionMask = 2147483647; files = ( 8FB571E525B73E9A007C28BC /* TunerData.swift in Sources */, - 8F13E1B625ED345700C3F23D /* ColorAnimation.swift in Sources */, 8FB571F525B73ECF007C28BC /* CurrentNoteMarker.swift in Sources */, 8FB571F925B73ECF007C28BC /* MatchedNoteView.swift in Sources */, 8F2D9755269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */, @@ -569,31 +502,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8FB571B525B72147007C28BC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8FB571E625B73E9A007C28BC /* TunerData.swift in Sources */, - 8F13E1B725ED345700C3F23D /* ColorAnimation.swift in Sources */, - 8FB571F625B73ECF007C28BC /* CurrentNoteMarker.swift in Sources */, - 8FB571FA25B73ECF007C28BC /* MatchedNoteView.swift in Sources */, - 8F2D9756269390D800B512D0 /* MicrophoneAccessAlert.swift in Sources */, - 8FB571EA25B73E9A007C28BC /* Alignment.swift in Sources */, - 8FB571E425B73E9A007C28BC /* ScaleNote.swift in Sources */, - 8FB571E225B73E9A007C28BC /* Frequency.swift in Sources */, - 8FB571FE25B73ECF007C28BC /* NoteDistanceMarkers.swift in Sources */, - 8FB5720025B73ECF007C28BC /* TunerView.swift in Sources */, - 8F2D975226938AF900B512D0 /* TunerScreen.swift in Sources */, - 8FB571BE25B72147007C28BC /* ZenTunerApp.swift in Sources */, - 8FB571E025B73E9A007C28BC /* ModifierPreference.swift in Sources */, - 8FB571F825B73ECF007C28BC /* MainNoteView.swift in Sources */, - 8F693E3A25B87DB20054DB16 /* TranspositionMenu.swift in Sources */, - 8FB571FC25B73ECF007C28BC /* MatchedNoteFrequency.swift in Sources */, - 8F2D975A2693930000B512D0 /* NoteTicks.swift in Sources */, - 8F44F80026939F13007DBE1E /* Color+MusicalDistance.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 8FE56CD625BE05D20038664C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -615,7 +523,7 @@ }; 8FE56CE025BE05D20038664C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 8FB571B025B72147007C28BC /* Zen Tuner iOS */; + target = 8FB571B025B72147007C28BC /* Zen Tuner */; targetProxy = 8FE56CDF25BE05D20038664C /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -646,7 +554,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 8.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -676,7 +584,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; VALIDATE_PRODUCT = YES; - WATCHOS_DEPLOYMENT_TARGET = 8.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -710,7 +618,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 8.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Debug; }; @@ -745,7 +653,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; VALIDATE_PRODUCT = YES; - WATCHOS_DEPLOYMENT_TARGET = 8.0; + WATCHOS_DEPLOYMENT_TARGET = 9.0; }; name = Release; }; @@ -753,6 +661,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -784,9 +693,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 15; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -814,6 +725,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -845,9 +757,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 15; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -874,15 +788,20 @@ DEVELOPMENT_TEAM = X4ST43AL9W; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = BuildSupport/iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 0.3.0; PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tuner; PRODUCT_NAME = ZenTuner; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -899,15 +818,20 @@ DEVELOPMENT_TEAM = X4ST43AL9W; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = BuildSupport/iOS/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 13.0; MARKETING_VERSION = 0.3.0; PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tuner; PRODUCT_NAME = ZenTuner; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -915,60 +839,6 @@ }; name = Release; }; - 8FB571C925B72147007C28BC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = BuildSupport/macOS/macOS.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 15; - DEVELOPMENT_TEAM = X4ST43AL9W; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = BuildSupport/macOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 0.3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tuner; - PRODUCT_NAME = ZenTuner; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 8FB571CA25B72147007C28BC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = BuildSupport/macOS/macOS.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 15; - DEVELOPMENT_TEAM = X4ST43AL9W; - ENABLE_HARDENED_RUNTIME = YES; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = BuildSupport/macOS/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 12.0; - MARKETING_VERSION = 0.3.0; - PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tuner; - PRODUCT_NAME = ZenTuner; - SDKROOT = macosx; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; 8FE56CE125BE05D20038664C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -977,15 +847,19 @@ CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = 865LEQR26C; INFOPLIST_FILE = ZenTunerTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 13.0; PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tunerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZenTuner.app/ZenTuner"; @@ -1001,15 +875,19 @@ CURRENT_PROJECT_VERSION = 15; DEVELOPMENT_TEAM = 865LEQR26C; INFOPLIST_FILE = ZenTunerTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); + MACOSX_DEPLOYMENT_TARGET = 13.0; PRODUCT_BUNDLE_IDENTIFIER = com.jpsim.zen.tunerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZenTuner.app/ZenTuner"; @@ -1048,7 +926,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8FB571C525B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner iOS" */ = { + 8FB571C525B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner" */ = { isa = XCConfigurationList; buildConfigurations = ( 8FB571C625B72147007C28BC /* Debug */, @@ -1057,15 +935,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8FB571C825B72147007C28BC /* Build configuration list for PBXNativeTarget "Zen Tuner macOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8FB571C925B72147007C28BC /* Debug */, - 8FB571CA25B72147007C28BC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 8FE56CE325BE05D20038664C /* Build configuration list for PBXNativeTarget "ZenTunerTests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1102,10 +971,6 @@ isa = XCSwiftPackageProductDependency; productName = MicrophonePitchDetector; }; - 8FD5D595267849F500E5577D /* MicrophonePitchDetector */ = { - isa = XCSwiftPackageProductDependency; - productName = MicrophonePitchDetector; - }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 8FB571A525B72146007C28BC /* Project object */; diff --git a/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index f58d688..d2dfc75 100644 --- a/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ZenTuner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-snapshot-testing", "state" : { - "revision" : "cef5b3f6f11781dd4591bdd1dd0a3d22bd609334", - "version" : "1.11.0" + "revision" : "bb0ea08db8e73324fe6c3727f755ca41a23ff2f4", + "version" : "1.14.2" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "74203046135342e4a4a627476dd6caf8b28fe11b", + "version" : "509.0.0" } } ], diff --git a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_iOS.xcscheme b/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_iOS.xcscheme deleted file mode 100644 index 05b93c7..0000000 --- a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_iOS.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_macOS.xcscheme b/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_macOS.xcscheme deleted file mode 100644 index 509db8b..0000000 --- a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_macOS.xcscheme +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_watchOS.xcscheme b/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_watchOS.xcscheme index 5a3196c..de0f20b 100644 --- a/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_watchOS.xcscheme +++ b/ZenTuner.xcodeproj/xcshareddata/xcschemes/ZenTuner_watchOS.xcscheme @@ -1,6 +1,6 @@ some View { - return self - .modifier(ColorAnimation(from: from, to: to, percentToColor: percentToColor)) - } -} - -// MARK: - Implementation - -// From https://gist.github.com/mattyoung/52947aff8524ed3c86d6ebd695dcfc86 -private struct ColorAnimation: AnimatableModifier { - var animatableData: Double - private let rgbaPair: [(Double, Double)] - - init(from: Color, to: Color, percentToColor: Double) { - animatableData = percentToColor - let fromComponents = PlatformColor(from).cgColor.components! - let toComponents = PlatformColor(to).cgColor.components! - rgbaPair = Array(zip(fromComponents.map(Double.init), toComponents.map(Double.init))) - } - - func body(content: Content) -> some View { - content - .foregroundColor(mixedColor) - } - - // This is a very basic implementation of a color interpolation between two values. - private var mixedColor: Color { - let rgba = rgbaPair.map { $0.0 + ($0.1 - $0.0) * animatableData } - return Color(red: rgba[0], green: rgba[1], blue: rgba[2], opacity: rgba[3]) - } -} diff --git a/ZenTuner/Models/Frequency.swift b/ZenTuner/Models/Frequency.swift index 735a247..ef86d50 100644 --- a/ZenTuner/Models/Frequency.swift +++ b/ZenTuner/Models/Frequency.swift @@ -43,7 +43,7 @@ struct Frequency: Equatable { /// /// - returns: The distance in cents. func distance(to frequency: Frequency) -> MusicalDistance { - return MusicalDistance( + MusicalDistance( cents: MusicalDistance.octave.cents * log2f(Float(frequency.measurement.value / measurement.value)) ) } @@ -74,7 +74,7 @@ private let kFrequencyFormatter: MeasurementFormatter = { extension Frequency { func localizedString() -> String { - return kFrequencyFormatter.string(from: measurement) + kFrequencyFormatter.string(from: measurement) } } @@ -82,7 +82,7 @@ extension Frequency { extension Frequency: Comparable { static func < (lhs: Frequency, rhs: Frequency) -> Bool { - return lhs.measurement < rhs.measurement + lhs.measurement < rhs.measurement } } @@ -104,9 +104,7 @@ extension Frequency { /// /// - parameter octaves: The number of octaves to transpose this frequency. Can be positive or negative. mutating func shift(byOctaves octaves: Int) { - if octaves == 0 { - return - } else { + if octaves != 0 { measurement.value *= pow(2.0, Double(octaves)) } } @@ -118,7 +116,7 @@ extension Frequency { /// /// - returns: Distance in octaves to specified frequency. func distanceInOctaves(to frequency: Frequency) -> Int { - return Int(distance(to: frequency).cents / MusicalDistance.octave.cents) + Int(distance(to: frequency).cents / MusicalDistance.octave.cents) } /// Creates a new frequency that's offset by the musical distance specified. diff --git a/ZenTuner/Models/ScaleNote.swift b/ZenTuner/Models/ScaleNote.swift index 5b46043..0eaf890 100644 --- a/ZenTuner/Models/ScaleNote.swift +++ b/ZenTuner/Models/ScaleNote.swift @@ -105,60 +105,36 @@ enum ScaleNote: Int, CaseIterable, Identifiable { /// The names for this note. var names: [String] { switch self { - case .C: - return ["C"] - case .CSharp_DFlat: - return ["C♯", "D♭"] - case .D: - return ["D"] - case .DSharp_EFlat: - return ["D♯", "E♭"] - case .E: - return ["E"] - case .F: - return ["F"] - case .FSharp_GFlat: - return ["F♯", "G♭"] - case .G: - return ["G"] - case .GSharp_AFlat: - return ["G♯", "A♭"] - case .A: - return ["A"] - case .ASharp_BFlat: - return ["A♯", "B♭"] - case .B: - return ["B"] + case .C: ["C"] + case .CSharp_DFlat: ["C♯", "D♭"] + case .D: ["D"] + case .DSharp_EFlat: ["D♯", "E♭"] + case .E: ["E"] + case .F: ["F"] + case .FSharp_GFlat: ["F♯", "G♭"] + case .G: ["G"] + case .GSharp_AFlat: ["G♯", "A♭"] + case .A: ["A"] + case .ASharp_BFlat: ["A♯", "B♭"] + case .B: ["B"] } } /// The frequency for this note at the 0th octave in standard pitch: https://en.wikipedia.org/wiki/Standard_pitch var frequency: Frequency { switch self { - case .C: - return 16.35160 - case .CSharp_DFlat: - return 17.32391 - case .D: - return 18.35405 - case .DSharp_EFlat: - return 19.44544 - case .E: - return 20.60172 - case .F: - return 21.82676 - case .FSharp_GFlat: - return 23.12465 - case .G: - return 24.49971 - case .GSharp_AFlat: - return 25.95654 - case .A: - return 27.5 - case .ASharp_BFlat: - return 29.13524 - case .B: - return 30.86771 + case .C: 16.35160 + case .CSharp_DFlat: 17.32391 + case .D: 18.35405 + case .DSharp_EFlat: 19.44544 + case .E: 20.60172 + case .F: 21.82676 + case .FSharp_GFlat: 23.12465 + case .G: 24.49971 + case .GSharp_AFlat: 25.95654 + case .A: 27.5 + case .ASharp_BFlat: 29.13524 + case .B: 30.86771 } } } diff --git a/ZenTuner/TunerScreen.swift b/ZenTuner/TunerScreen.swift index 5d5510d..f344726 100644 --- a/ZenTuner/TunerScreen.swift +++ b/ZenTuner/TunerScreen.swift @@ -3,8 +3,10 @@ import SwiftUI struct TunerScreen: View { @ObservedObject private var pitchDetector = MicrophonePitchDetector() - @AppStorage("modifierPreference") private var modifierPreference = ModifierPreference.preferSharps - @AppStorage("selectedTransposition") private var selectedTransposition = 0 + @AppStorage("modifierPreference") + private var modifierPreference = ModifierPreference.preferSharps + @AppStorage("selectedTransposition") + private var selectedTransposition = 0 var body: some View { TunerView( diff --git a/ZenTuner/Views/MatchedNoteView.swift b/ZenTuner/Views/MatchedNoteView.swift index 08c0678..49dc4c0 100644 --- a/ZenTuner/Views/MatchedNoteView.swift +++ b/ZenTuner/Views/MatchedNoteView.swift @@ -39,18 +39,18 @@ struct MatchedNoteView: View { private var preferredName: String { switch modifierPreference { case .preferSharps: - return match.note.names.first! + match.note.names.first! case .preferFlats: - return match.note.names.last! + match.note.names.last! } } private var note: String { - return String(preferredName.prefix(1)) + String(preferredName.prefix(1)) } private var modifier: String? { - return preferredName.count > 1 ? + preferredName.count > 1 ? String(preferredName.suffix(1)) : nil } @@ -59,14 +59,8 @@ struct MatchedNoteView: View { private extension View { @ViewBuilder func animatingPerceptibleForegroundColor(isPerceptible: Bool) -> some View { - if #available(iOS 16, macOS 13, watchOS 9, *) { - self - .foregroundColor(isPerceptible ? .perceptibleMusicalDistance : .imperceptibleMusicalDistance) - } else { - self - .animatingForegroundColor(from: .imperceptibleMusicalDistance, to: .perceptibleMusicalDistance, - percentToColor: isPerceptible ? 1 : 0) - } + self + .foregroundColor(isPerceptible ? .perceptibleMusicalDistance : .imperceptibleMusicalDistance) } } diff --git a/ZenTuner/Views/NoteDistanceMarkers.swift b/ZenTuner/Views/NoteDistanceMarkers.swift index aa96cea..4941ce3 100644 --- a/ZenTuner/Views/NoteDistanceMarkers.swift +++ b/ZenTuner/Views/NoteDistanceMarkers.swift @@ -18,12 +18,10 @@ struct NoteDistanceMarkers: View { } private func tickSize(forIndex index: Int) -> NoteTickSize { - if index == 12 { - return .large - } else if [2, 7, 17, 22].contains(index) { - return .medium - } else { - return .small + switch index { + case 12: .large + case 2, 7, 17, 22: .medium + default: .small } } } @@ -33,12 +31,9 @@ enum NoteTickSize { var height: CGFloat { switch self { - case .small: - return 60 - case .medium: - return 100 - case .large: - return 180 + case .small: 60 + case .medium: 100 + case .large: 180 } } } diff --git a/ZenTuner/Views/TranspositionMenu.swift b/ZenTuner/Views/TranspositionMenu.swift index fc92da9..6974fc4 100644 --- a/ZenTuner/Views/TranspositionMenu.swift +++ b/ZenTuner/Views/TranspositionMenu.swift @@ -36,10 +36,8 @@ struct TranspositionMenu: View { private extension ScaleNote { var transpositionName: String { switch self { - case .C: - return "Concert Pitch" - default: - return names.joined(separator: " / ") + case .C: "Concert Pitch" + default: names.joined(separator: " / ") } } } diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipad-dark.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipad-dark.png index 792aadf316fbfcf0b72cc94a2ef6a598fa786293..171b2c5aad24336168f0a8a87b4310fd59c81a5e 100644 GIT binary patch literal 41570 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 literal 41498 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

Gjcu!#_*o|~QEH~psw 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 B8!rF= delta 6194 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 W4ENR6?;J(LqBYcXt{13SJ^LSNlhi~2 delta 8507 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipad105-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipad105-light.png index cc0c120dc092ded6f0a478fbdabe8c15c17bb31d..3f994009999c3e0ee5cc30ee84c95635aab5af30 100644 GIT binary patch literal 47261 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�QhZIEdLAz^~GFS4`2cM4N9fwJ`J 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 literal 47227 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�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 l*q4%>kCB+gH!X9``+prMF#kzPVG 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 VHv?}27{=<`H+60lU4QiSzX0@mx!C{! delta 6445 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro11-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro11-light.png index 8af8b39a3b7975e38aa5367e4f435dbec0c53583..974bd439292969e10db968e4eb25efb2208e6bc5 100644 GIT binary patch delta 6564 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 ek=j&BdY_)wKMM5i?)?XI%j2K` diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro129-dark.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro129-dark.png index 0c455a3337c0064deac59735da5f5c73895c17d9..d78ce4b906ab81d604f2ca9b46f7466ef3305f8c 100644 GIT binary patch literal 58535 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro129-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.ipadPro129-light.png index d7fe7cabf391db51aa3c5561bfd8ccf9aeb59b31..6aec39e70fd0a53767c5712ce9c6691e3e99cb5f 100644 GIT binary patch delta 6869 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone4-dark.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone4-dark.png index 5213c3608089a5117d9f1a08db70b73700098554..11bed6854ebf32e82b87c9bd3108b35e7b275d08 100644 GIT binary patch delta 9667 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%0Ddr7680X!#!>6onVaO`?wtN(^D{Fu;qH#u zzIUYS1e(ulFYn(T;y4QC9>$VlYp@@x;-s%R)}X*WmgF1pHgLCKa8%J_{#9S1f4r5F z&+26_3%ylbpXBf02g}61C6gK4mFn9*2z79o8XA%cZW7hI`Z>V)Asuw*1;+`8gJIHZ sTjr#yKmY-uPr`G|=hLHIpKw_0`x%#IU&exErM|eKrlXpB#Uki`0lu5?oB#j- delta 9620 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone4-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone4-light.png index 0777f3112671089a75a45308ee3866924c3254be..74a3e4a05b0d022bd13633f598bf61163c87c432 100644 GIT binary patch delta 5743 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 O0Q7Z@;APhwqW=Rx>zq>n delta 5623 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 J%vZ4p{6DqfK5qa3 delta 6368 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 b5hO$|F@to+fJjM6 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 delta 5563 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 J`i*_trnzWA9mhbFSI;+F5EKYHc8jU?qwvVEf1g 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 V9CmAlJpsaVMR{ep-0Q~v{{;hzs-ge@ diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6-light.png index 98fa8caf485ed1d295db026229b08c47446c3e7f..b3b5fe2798fed89defa7bd3d3f6860162f52ef14 100644 GIT binary patch delta 9958 zcmZvC1yodR*Y*L42eD`n329*{rCU-2X@>4px|@R{EfPa_h=6p1q#_^<(%qfXFvNd` z=Y7}u*Y|yA&02G2%{}|x_ukjOcAVKBM2q-?7DU9>!^xd^?GuX>Mkx$ z$gGr;x~Rh>@wR(7O3Te{u5lN2`R+~rqn*p9x<~lUIpO{M`$xvSTYvaJ#icNwH|Si> z{XX;&79|rAcG23s1C+k9MFZmg#Egg0lXFm}C%x&-*NGmRFNzL813Yj5dqx3g*Nbm? z`8{=ua|VYXdG!6WnoLID(-YBruiOih0?|c|DNOdZU%!^u*VoU^&X$*Bx>pX)8{Yeg zKKe(q2#ywsfW!>&d#c5Z5Kl5|eTXw0+MBsvtNbGM@tSTLaWc! z)g4Ew+@Xo-hN|l7Nz>;zz(qVj9sgzMZBE!E>$g#_jqN)8lDtE3L3Fk}e)trUzPWGd0A4w}59-Q(nD+gW=D@iSiY#(%= znHk|4+nKod#o_!H(d57ZJ~03LY~qz8d|1su6R-Rn^V76D=7q(c{^#jOLg_Co`t)k; zW%aWL2RS?Mqa4uk1-rpf@bbQEFLT!gKB!8S);};%fjpszjAwfs-fql^hT4B5V66km z&=-=_ljNajUqK4!n#)u)>&J||aD_#^{#_#m{I{k;ca|hdwjYNI-xnG5wO}O@z`}DexDmmGz+=2;&fR%H|*% zE7oiFJ`Y`Ys-M};!E_X2M+1s`r@!-f$qk#16$;+DZ%kU6Y%O?oKdX?IV2xpM2t6t> zF|oLqQfpvKf6SIA8B^@R8a*H;Q>z#=vR&eqNMTH8sqXPwUnuo#)6mD+*;yuAd2no? z^zBL)5xQSPOe;Vgr658Eiip?T)0YaLeOJ;(+vWM`nFq~UzX2&}?b8eK%mLa6Ya(Dd zXBrF0Wn_=|)gko;(|nERMw*jUlj|@|ESqWTpeI~s&?~xwfq}ux>tV16qVs5StXd03 z3|XI;A_Z?|Dln;Jk5!P>7x1~*o}U*U)KDqETnOTo?YmumwUld|@1cz7UwnH64}1D@ zs4{MVSb0 zH$pbY06Z2QVj2B*?(@7&V&JHTzdj%Y@gh22#JZPfoSeYpyCHE`%RV*MCqemqRq)`8p)U^L@zXu9Z?7CEG=SDLlNqr^|@c z@{At9p?-$pRs+V*3PRk8!AhTkq?9%_RkV~Cx*i8V&`;TopB|ZMWXBH)Zt8hA`R5Nl zDpve1|I){X{q0I&8U6kmQ{LAA7O`S0J6mNnR-#+S48cgr>5%8&g`C9cLP8F4t-Qo< z~H}QNJ5F0KfRyCSExAr>E_BwKZp8ACfE9~p<)e;sM ziP;;vuMfl1qf&-OM##gZr3{=7M;8}qlrd4~;~*>P(t|HD5f3<4kJEc#)7R)WdhTrG zmV`A$N3SII(cfy(@JH0^^q>dmu!WV+fbStTf_q4Iorj#oEQdldwY%$+)&H(aa)VM-r2{>aG}(7Qeo!0tcnVYh1U(Kf;Gr15wu7Rl=tLw zWAvM}{-q+WG_zL30&O$_n?cj$oGA4LyhOjs!K4U)h)Ar7U(jU*tUKon{ToRHMK}*c zNZ&~}nmGlTLc=6!AjZh*H?OFwsrd(pgg7*lJ^TrwSt9r0u3!IHIQA$^nlRZDZ3CsNsgJ@%a`wOk4E`8G(07x;mbjzWMlXCqvK5V zznK)+?TWp0*;z@~*YD*y)7Ga-jeI=LK`b=LbAFe@+@3Jjw-@@6F3CRcPBW!c%hCpy zvSKu0qa!0M7byyBvyJtbC6900`|wWwY~lP|5OVocT0oFVT7Mth6R!bE<7L>Zp)ubnA3Hr-mVc3-}stIP3L zi-r--Nk(QXv*-G@`7E%9T0U8Ym0zf+_+iYi=qfhL2ANBLjofT(O>@5M|A+J!SFBWD%3nkLU3cMptX4M`J02!whLs*2uaGM! z=%tb$vtFuQR8-{kuQ?h>_gc>0D#OcImDZk-ETPHPx@~_X)iiH!ZS?97ZdzSs6-n2) zHAXr`dcz~xzR>a$tYoe?1WRZpLc48XU`gLJp+r(*;zaXJCRQbJ7N?kM2 z64{dmx0NpSK@EduhmAk<=qRT2u%#B@OH05vtHMbB)glHlM50a<_^XgqmN|BFV}kKw z+SU!l6sSl}Nox4D;vbbcT=u2hu!xC;exqVYqwQ5+dNUu2e@}L2%xb1EPD;= zWi3{DS!|_x8M<*aY{vP?lFReVK7E~qMW^2PO5j%Fm!XXpsv447MY?P&)TwyESs~?p z3VK9fE1%=CCf8#k3iApN2szPcC{^7Vcn&fcLn>0R3&+3XHA0qe1AZ>-PgJZ)&aL)7 ztgy#HRT51OpU4T#{!<5C4m_Tu=}MAoOG|wihW12YnDOE+E-pDa`K^}w>b&OIiAMna zHV#)(+m{2Uoix)asO-1`ukK{ojTP^}3)E2t1q`?!HL|?>BWV)tuK!mHm%MQ#s}Pl7 zZE_XUiF^v+Mc(U~#|QUO5b?7xHd0pgF_QYdO2R>}h}Zh}Z(&56*Tu$Gmc&q{u$LUr&E!P_LNDWC5gDniU;n%vxH=J;DK=#{B7q1(bw%v-{4Tdwhx;&$!*-a1G9TkZkE zM#d1q#AJFb3twp=h7MASqP-U5yPCLC+=A%$*(xN&WYbj8;U%W(%F3?@*X;SA%!>mM zBMg2t98D@!P)FFDjCitAD!<{F0#D_vMhkJU{IklD;W4dDXYmn6sv)CZX3{S@q@1m#RbNDAk~1nt0&xwDDlihs#mQNrrDYlMT@}-SO*Sw+je}2$OJUo4!c-m1r)(CRV4I zLfs_?A&5fpF}_+tK-6F{kzJ_wv*tpxQ-?60RwghHGGXBmoNKJq z^RrW4(wfuMWDPuJ*nEWsB{MO-q^~~ZM?1#W;GXv6YIQBfnJX2GPZ;TxqnGmPAPWlK zfJRFWD>&8bJ`7SwDflPCJYa0_(qmAU1JNUuqWsZaL1)7wSou`Y9mi!6WrdLFe!#5HJ@7j@~yd8{XK zBj%@AFP(W3i=6YGitr{T_;NVy^Oy--eVaBr z$Xe)2t%ve-U=S#SA0o*?TKJ85t};K(iyy_ob=1)by^>!+Do;l`5w;Snh`RaSw))w+ zN|$_Lx)y)V^ia2OO61@L?p-~-rUK{Bja9-et{#9_RuU0PK0#7WF00@uN#JREa+3gu7cc!ryz=u&CC%9U zdaHxc=zTPlGVHLV6hW%GG#mxDED1!&Z{F+v9ODBb*WS%CLU-2Po;7?g2XiI&qP5Jb zzUb|^Ilqpbl|=G*nmdU%w1-PWorxQgt2f&a>l-X^P58hg=2Q~Sw<`$aND6(&b@Wzw zU@H!|KtKC^!2OwV=Xu$AXPqgm=z$>{S+|g_N$0uqED}7~iU9xs3tj1^oiW}pJ%|`+ zK!9Y#2t$%4gaMf)Vwcng`wSld{Mhd!jP7tC_RY*e>SrgrA6P!qhq-SYZWxsteJtjb{Yl#JL2w8h0ZQ9oJ6g3G6m)Z0i)>DIy z&%JX&#TqI>S7TFCNuk~iXWQ|}I0S-%oSfErfak4=$>H%9Z}0JU7pp%*ydj;)%fpg; zOCfb^&z_}-f@uKI5cCrh5PK0G-s`qIO{93}*|;aP9m_IyvR48gtw*^>m6erM^SHUW z+4=hJwuf&?i3u?J?9Uq+7^K&oxC_xR`S^fWfkqhDvRJ@+|1$s(sIy;Kgo+2Qdo2Aw z)z#D*3vHE6aq}`W^D8Rkm@XJG0Y6V1;K+hhT2C)K&FK4KFGl)@{*2NyGD5kx>$?=3T@*PHVPb6j>*MC8@cV}q8`1xf)Uwj8 z;px?%w3U~a$Ex$%G%7=4{BVu^H#}mJn0VE0vhv4*eQ<7P9iHg5L!D=R|C*q~Vod2D z4(ON{V{!mc;`Ynav>2?dr4|v<4=Qzx*^Hv?SP`$v<*}P((l_3n=BM(G%&vA^uGu`X zO#1JpKm3D6)cgZ*NecDqr4gkEAsN@#zE!>5NHL6TNnWo6&8&2^r3z~!PZtYb=S?|w@zLgf6P2$6#TzT zMpexCC%@QrtTXRTdiE6^$bf?M?8?`pIdXD!ZHU{mAByGF7CRPSTg$AV@cEIn@9eA|(nM(8-HhG?Y=yzxJpwa`_+`zz{ zZoWN!@F&*9RcT*gy~EO1Y1w1!+s*P6ewUdr4*%Y^nd*A-AV|ch#GpBUG%6};C|8l> zgpTp1Mf>|Yf(zqgKtM=70PsOsIXO6uJ7g+@y@>|g`bv%MYX0B>NAwB zkUnV^BI6usme7wOET1SaiikL`2iL{rEbYz+>J_`Aq4f0|FejCk>wZ}UArK}cBwtfH z`i+*ES!MjIh~|jsB*XolC9)>BJ$-wPSB-I*6zb~SfkyJWlgYf`wGjBPgvhZ;&sSHX z?vR9oKkD~ewXyYOq!qq7hm^;$2{7I-%+1yC_04^8w41O+#1faAYe%e#25{`50k!t| z1qC|7Q7TH21s3BOI>Ms@9jC&*h)oaOp`G1?glk^82Rn}dV3Qt5xJ$w|GQ$1MMp?P3 z(B|l#poqxVQSd>K>iDX&0QwUJ$alNDGsu#QkrLcIB20>WhMu3J!eC-Pw9XBd;)_nf_Ice+Y=*^}%op7tPl$MV0%Xl{B z3%ZdxD2j$zRd7kze)sm`K~_?N8nopb|Nc}#yW*v#B`3%7%Dd#XBiRC!JV?D!5FWuG zd+hdiaV1+OBH1dwyUJY>~zDY4VN)BNL1 z37JBwX0Ow}j~_qslE8bz!O{m$-65{*Ucu+l+;gw;z#bNS^^L$Ir93N3TDU}ATRSBs z1qJ}aa=@dX=$~rfr;(FfTt{NQ)zz`Hx|&j-&BDUM4&8;A&q9gV$k!IXbi5OUU}e+_ zNkLp8$%oxrD=S^zzO{mg`VfjlK$Dys8kqdV+6t=EE#4RcbKgd)S(UfBt@da+rA9~V zs;JO?CA^J7z9$c^TD9}>Y~J~t9}rFaI&WSo6%?#5VjrW~l})mgTLopkh@B!mkwfq}+m3_#4?-5m}OocumR z5znUQd;YN|GceHHYJ!$Z8lT;9cRHY7^ky?VLL_#n;>!0%=he5T&2t7?T7nSM+a4Y| zk-!qzXQ63CBNXZ>!qnItc{{U>E>KhDxd5&QcXhqvUU<{h*XOAvnD_0QbeaT$pk>8R zM17}W_REEptq64odD7NOcYHoR9?$}vu?0D7JXvP4#XF~#(9wRc^=!L>eQ1ccNWYPp z6PnpAL`ro-s~=JbFb5fj;XshCFz+Q~cRVmnE?wW=W`^}dgob*D%N~yn4NZZwyYQ*u z;TUK@?RBb3Z^?P}5EU(e5&>bg-P|`@Rc?0A==9XN!*lP&w;LPDcZ4LDk3HLlO#NSt z$d%CNUr$a>|IDg7&M38L3pImKlF1oz;Q>@KFJ>OG|q=`SnSSC}u(~WS8l=n`>S(Gy3-4HI$Uh?VUEK zegOcCm!IxHMG>%#%6ZTQg%xz6QVIZEclb(DSV|HHpgj?-FNL-I{D3*y)M`v+ss$7C zOOW|TQn$wh1N~$4RErJp^eKK|3{#GiqLbi{o?rG+4v9$Q!hrL>gGjt6!aIhmX5PuF%Swkx8C5%&S-%^{r^Xku;* z{k+K*Q)?0N3ytXp;P&NX@0$ZwXAD3jXcrI@ej{h{tXp&yT){;Hj_?8DN;jWct~m3~ z7_^~64gg}bAZ5vYm@2#HCoa0kr)DlAANXc5IJK!w^AjXb1Ao0dh#2F2d zsm*}Mc>DsvL5_)-)uBR&sS+YM)GYqT8D1a;v|k`vR4v)FU@}siJrM_@+r6<$%YZO%lOOGy^eV3_2&`c(o(JJ=?O6yk)#nH?CCpoyEh<)U6|K*q#tHoc zRp)f>6o|sKF-{!)4mzGu=(SaOs-hll^6C7ZUb5ncG0x6S4+_M*i@dSP8)K731uyoT z7;_7^IMi1m;oKqN#{vvLwh~N78u}U#KU7Em50%NJJ--cpT+FM*-SLi3v-o8c#8NK0IA zld>}32y6tJj?I6a!AXYTtuSrUH^0=TQNE54>=I_NVF(U~y;w#R)zz ztuV#Tn^Y@++CV{{|v}zg=&u8k;5R~y$*vIjpPE0e}4xf z*_g?$a~`BJ$!}oBMhCPzfq}`>bWss+WbKuZ==ssXM!ZHza}z5V2bu$xuh|g?YLcLC zvp%|SnH!0`1EUUMOEO1oy~H$87RF z#;dIS%~d+wGl-An!Y=i8EO@Bv5dZe=f4%2p;NjUw9v&Xvx#M3RI4}_TCYh&b>m(;< zB`^?dfB*h{RFtxyprD=IUT|<}kxor;71`s*wzjrp6ci)xEQExFyuBM9J{e!z-iFzB zkB^@X4-?+?j(`#$hjjMfe18B93^v@}E*)HiuMl1kN6+puU|)(l=SaNiBt(Z%dM_fV49ekq7r`Ww5?glVE~6KynV|b zTEC|-RbyAevC1fV-nP6<7mC=2rl32T)?P9)Yt7fO&sy;(m71EGC@FXI7TUvSn=e=P z4rnVf3jFsjVK9DveoPFE44VK?BcrFhyrP1F8VLcx!NDFO!NKO{=IjPd3@-xf>ye&z z9UJwZK2;o4{`}#OJ?nGY8?W!Vdpu^~aXb<~pnGwKYXQ+R$i~WwnT}TobrBE6&1LuDx$^LSteiH8kRnXVcOR zm?|FqRMFNh_xHc^ZvWuGd%H~L^6E-CA|gUVW9%;C{=dzjF|Zw>?oI zw_fJ9XA47wz3G(m@ww{m?q;gCo`5Ny76sm0-P{xq7M__C^-Bl}@%UMO7dMPMNyJFr z+Pd->1#C`s2;3m02s2B87#=01>;Akiu64&hf{A1U|NL~47LVvhmrzuU&?19z3@H6+ z$+fW=VqsxvZ1i~^sD*$1yJkCA7D8+~E5U#KGa4`swWjKX)z#Jc`JHhS#Ul#Ycyx-X zWbVDh5$p@9m-y~1@Pzq_g(Wn!YjIH!Y_6_$1^MO0|B+kEVN7#ZTYq0XRsvpm_4Mo? z9ew)znee}YpLkzniL0jX4AP3tx`Ywo=L@S z^}gWb42etPkj4@pGV+mb=f5->)biZ_fn4?wr=dZ4o2DQ!DXHDmhF|w70|VG)JY`|A zX1XwM$bK){1BdnN`8g(xhm(C`N|5xrPjRe&ZdQ-|vhhLdv=i6k`=Liigq1T;^gE>S z;o)h;Yp2q)_k8)vkeO&wwv*nAT~nn_*0^)H5hrDouy_zrv`{^gyG8QrCg|d#y{n6v zP+3{#WP5@YikmCQr3Fj=pqyj*$@@D<3GolCb$SXp2>;&!FVk5$7QB;mY28>Ke^PI6 z9`f@+o?u~O-ZdHUc=5LZD$oa@R$cjHVBoK|RO0^{Dd0i>NWnWosE=@P$b~h`bau)T zOS3a{Vt$LjG1*V%T(NSfR4kj7$HOxUmj9U$9sOMO0DlxTHNC_ZRqQc>!p_TdFDy9N zoiZXgxDe-tH)6w{sV{{;;K=yLPH4t+;UexQ){)-Jo)t~RBn9{M>ys|Hs*M`CH=Msa zt+5#wQndpj`z?*Z@*jeO#|)?~EBm3BIy%bptEj2T zSIC*gHm62|HmtN%36f2Q)l25iO!D^iESMSH&!r{j<%NBKAKK{UCL>LWvgn~ZL^!-= z$rl$`nb;!FS=bkRbUgSs_lxN8!uD{JJkiVy%eW-;*%@T@GvPa`S~a0Oi$k z=4ph-LV!iUON)N}79)PbexbvUug!vf&dk{COwmuMb@ukk1bxfTUs>*40-^sHiRTv; zLI2aZCnYB4_v~=pbZT?{$DOt|`aC(gZdDch0Q^}8X4axesMo>{h@DpqCwo|%6oBUQ zP{=-A=yUDhBfKcvC5Xi4u1_8sTy66H<)w7d%iWonsB`Sy18>$KNi!t!3JSh^UZT%Sr{OmIQEV)bU@w9ECe=Ih2j`FAeW(>fX&B`C-huW?NXT1VC4Q39>XJQowHxvGuf+%dJ5g-kzkjbNcjUZ}ZdGkF z_1y;v&s0-Y4GL%K>Siee5Ohj%eSHehVccUV<9KXqZqGJ)fdiA`6$Q1mY9gco zi4bmae!gaA{`UBBk`e|s_QLbnOV*;*jg6-z8W3OgFX7=0rv3wsVSSDkL@yWmgQZ(r zTfrNoXn=~n{l3rXjLkgWRPwuL%$xr(1TG1sDde)iVC{3_ICF2?jGSFu?w1c(UOa!% ze^>Ycl?Yuw0Yrr0n(!mML5i;K?!)u7^maXl%r7eW3MqUi<0cP_nx<$gJ~j+i`XG6Z z;(swiv9;GEIMdr}qYmJDUTiSBZjZA;;p`4V-fx0&OlIci^NTh=VqaKnR0IV?6p$8>Zdh_9q&t?9mXvN5B_xz^MM7Fqx-EMmoQy<&nfgpN*DV2FMW9&w^%D-q(P?1A{fBJe%g`tIAOzD zb(8(15q6IGeGp(QS*{R>1$_DQc|wVak~=OjSp``D`!u#t92bfO_z(hbSOon&Prv6E zwAIgHO!wf_pNNlZXS)KA4kZix@=h%ZCFi(NcwBOfydr{vf;>DtA|i{f_5KphbTcHl z*t&%}z=D+tHsBufgxty_q~>LG#`E!AzuGGi1}cp~Wwuetz};%5;&+tR?)?78+pRM* zvEos~{~R3AhNhsblYXob%3TX{0!-NJ}e0 zZmG*kT7i-5>H>4+b$O2GBf-G%Eg;~GG5z{?t>4&8IXxCm%c9Xgtt+i51ag=vx94fQ z;g+jz>1T7PVqS}(^??E0XQsP2QlNi*Im;uCCV!yz#5Dx2J@ziO-fK_;V+$PYfTpH^ zS|{`u%K5(qe4l86T{2+icgKXSo$lYi`bOjxCwL#Gys2*4Y?(w)-xE*Zvl%e1d!uNQ zU0&|eO>#{@Yc_tPzu38oXFprdDH&XgHm!Gid-&||Nh~E7MO5d!3)c1dBcaPIx9FFl zD%SmtEOiFA0nW;ABN*16RcgsE$}Ed8I-2yWKM6D{dBeM(KE$XIT-%Xf;&lI9L1Zlql%9#xp(CUdTOPdo#BkUC$4g<-FjGbTv&jW!iVx-f>*!b^p$*)L|QHz zlLx&CrQs5_sD2YeI^-Vc)ns3>ePt~aH1r4GAY&L-LwC(EhOtMKOoUQVnHXwqZSCuO zYAIdnXPh_TKmquqBmjW%ES83DVat$}XLwwO@!~U|2<6?v;De!&5$dQ;sHxU)Zaljl zXsjj;PLL(@f%h?-0L|--C*Wt_L=nTfMw+`2ks=9yWxEo#LL4eX0;$pgViR_$ft0jH z@#MsN0^~`lsB`L0Gqa&SKkWXjqFz2Br_N0!tSBh+*%?W=1fqL?a?Deog8~Gx#~IjG zIL??v1u6?-McF5vZucnW4aY!6tGA6BMn{X4zI=We2)|}K$kw$6e$M#bwQ=r|cs!GC z3u~dh16``3lC)^R>3Wmj(F;?9iCui!DMp_g3J=v%BJ-ACs7OTRO~Ba0a8-sUWnfT) z_MPp5f?iGUw%P4WS$Sysh+V*jz1T+y*~izs>o-)14LS_Kb3p9QB-}=fpJMdcx zP^Y8O@xdOSHjB!Ajcs9{$EZdMkATv{B3Ou5*B!j-jj)3nae>eoP514?Defj7ZylYw z9`+P=sDVvxiTD#*1a=wxDpP@x{&aQKZmbw~v#FVXQNpuYt^&_ea`jI~Y)VQ?L)%Zg zy@Z^nCA>BXhn5d0wkE4(K^lP!sgB{jsNu#A(#K%tXH{%&2Q9#>>+9>gXt%!LS>cDH zHUw{c!gk@`?Xcv1$wNaSU2mc2p%Kbz&+54~x1X_4Iz1gQWUIYzr8oQ~A%XBZ>>osP z6&QWcn>8vQ)!{VTJu~-Vge&cq7&ini_UH^z5``MVYX7%zr(#&QI$4X zn87D6FHe#pDxw*TqnsS3ETU_TG2=D)*pSty!IrV;P_DFl_hn$c@4+NO&4e<*%Br_A zRp|y^JgYZ{n~O;9tM@Xvd39iJDXl9G}@|FV#F)e`4#-gjG)=>XTs z+8!q`H2Lm%7Ts}CTK}}DhAur~{gD{kNmfIH^X$vURI%E#3kfWBb&%rNp6qy&=86B5 zh(B$yZGM*F6D6l1P5&+qI-dcXDBy2Jfz8(5`GA3<1qc>JR9;~+Cq^yWat8mhHH zs>XCN0AN6>+gfXuU+&z`D*8`_)ITMNp)KTxld4$Pdg2RZWrd)oFFGeDCm&&f5C_4r z-ObM3IiA?4Ja^3>!OZZAKn;+6F{z1-`RksO`lgt`q2)KiqN0b9uGb+HgvSfYQ9Fh) zG8k=%qOvs)Fi_n;+A{TKHi4lwv$E)KHpS+DObZe5QC#$kkV}|&x+>c+Co6VWIVD-K z6DklKEIVN?K2-av{j{g&4jlWMxzGZeb$vPB{U*9)!Lz@cvQatn0Tx{^p6z%y=H;30 zi=+-T`FRmv8}Oh=UXFwfqUZP({%rwIpMNi{)w)v&MiQZUxFPoNqudM3CR)sx6O=*_ z;#WVo11{v&n_2DiTDqMo2tT|ucN9VzY6 z0n5hoKk7zQ6{k=Gs%~*nUw!RZW#)zkKgwxU)M$-7048aM8PlKclIOq!GYQYN zeqrDj{5&}~Vkd})=4hS)u4m&E`Lw^UZyf_y*pL761#CJ90M=BHYV*eE8C~f#!)3$r zQ3E-}>B6cv&uC(znxmtem=TIMj>TH>CVh)zff}$sRw_i>cjimc3`}DpccvP=uE1c+ zDlK=J|C6JHdo6xMQ|jx}P}i5AM<^Ufad4P?#;l!QAmEkejQ`w!lsc!cxHX`Qi%~ag z-`MSvC6LI4xpsY8&8p5Ss>dfnU!3{++*qYVb-xJKf|(Yj=T?oltFE58g?M z><)YGuvS7Rw|V*aY&%X?X_ooM>A~8~jCgW+=kEp zjzd23yn zs2x~>PB5aT3G{sff1|L!FxD|Ptuh%GtAxEvWv%XK4|Y#e*Ny#u zm08Xs-{VQd%S@WFZqC;h=diQmC?T3S$Ie}NX3oeHw^#11CgEf3Zkt?VgXF{tO6Z^m zV)L@PsUmkWBA;9`f3;3UGD4+AObx_DAF1YOW^KX2?(1D+GFe2(ir@YaXWMm7!a(S;ILz3W3zib!EtSx)YTvC$zT{qvVr=zs4NO9ApKR()$wH4iuQ6F zU$=;ra^!PDLepNVvs--%c2Gby=!>pcLX@TnY&SMzW~5<^3tss?Z2px-h+~7)g>(p8R5`QiC0s=Vh=fXkgqtv zZTL}LXXudzyn|ZFi)fpiB%vx&wC0Q&@7k@5EM3#!{ETs<{X-^4Z2!(jHWPvvIgJk4 z$R(y5C+R=`4jO|90aCtZp<(UBhE&lBp)>AuMj`riq9A_-P)TV-}-(~bR#-a(;QVN8~A~PSxKGT;NfRq z#9rd+$97ttgnFd&{FOZ_&heAbJY>ExZ~?*W+>g}pH~jEQZ|3KErj`j{mTGTRgH-wO zs-XqGBR}R3y%tm8B#*DEpI~{QfBJ{1!4ZV3k&NW`U5#_wiLXp!c2ndN?@J8$2%FJu zYBq>&#v7VKNI2oLPRP{K9f#k#w+vM%e0YM8Mc&K!Uz$u@^EzQy`0P55Um^S!Ir2WkOX>%|oPjRY+40Ss!JL9+bNVv1vS zv3GO*wDuGOma?8g=R)WCmcJL1!PAd^zLUuuJlrVW7;n-Iflsn$0Ukzz)i9OcnoeLYM6s;t@~>b5OtC3XQqx%+N* zAhiJpr%O%_E{Ev0p>%KW2CGqbP*iu!OXO+dTcTvbjurPC_B{jQR zulB?zeJxO4W$MTVGvUeQudy(itkb(uORIhGVy+MCl0pF zVwPE)YsAt_IRv~Ud?C~+n;l^+h#}|mbfvCE_Vwfui)XurQxiz5!$0d8+rCH~`&6s? z=Pg(1XdY5`hew}olg8Zkb_~Mf2+dV?8k%+{ z%Ygfl{q`d-j9J{PSgMMEX~=&4Q_rWmZ?CvU?2W$*EXmu6tMsT4FGuM>+6pR(BtQx(GxT>>?@qfScGGykShQ7$gOr9LVm zU>l1_qYVJQf4AG5sxM3%9UD8EZa1lSb;LAZ#Lz%Ak$l3!`leg2U%y6Gy>4F}VUNe* zMM!vWmo+t^4gH!-1lZsk8&4$Co%dTj0f6e=13>B%F(qdj#81^sKY*enKfmMebFM6y zRDAr1ib{V^Z2AKLSY-lYk;{8J+S-J-QA0x~8?`S2TTJgH@mQRGd42*v9p1V;9h2M~ zFL(U+r?bZz)7%q9$@NS&P!j+`#*_d6@+%`RugehmRY>UBGq{F~e!x<3UESZuY{W!F zJ-xjr2c_`1lt%iePoHvfs*XMX;d^p|gp*NG6@-2MvPlz|sN#RU)2I><1Wq5Ss#B{+ zXJ==>3N8PmmzEjdTjpBPjhV2vaW<^9j_+O6R2z0<2;4=;?0L3e;By_%tXL$T0RY(= z6Ch=3+HwK^ZRF&ntE~JXq|Ep8Y8*q?L0eVcXo+#LiP`D?>$NePa6R1J6E}W+TpLl!$u0R99$q&3R%&LUd$=by6-3Km zuLBFPCNh!@?lOEI7PcC9%e8Hig;hCKR6s&PwF$1Rpb%ctqnaw}=*VUKqbTMNp#ocU z+J?jrk$Ir_q zE%@smEc8VgvZ%pjKKDEu00_Q=*CDz0UDwA6`FQ=-MzIrmnON2j)`a>+IXE2VIwE?K zLPBUKlqj(jyP{`i%miovV0i}s$jRg1O0^o=SZ4oYj>s=dO-((t>+l(hPfUDsuqxoT zQ52LtcfOw&x-_=3$Z7ne0uGO_9)(oF_xH8&fQNerWI#qv&PbIsvs&8cv^3`D4$jV{ z24Y)#x6jPdOZB8QU9z&WQc_j@{Z|G_?TeMVj2k@b&^#bGH6WEi$mPOfh;0q5=0QjZ zt`f0*sc2h!`)7-#V3i97o&p>bXCye0k@E`uOHDPYp{cpFcM`_AffjaKg5UnX(@QpE zPvF~;yJwP)Z#^FdITY=>!g;H>NISOg{pfw}mCBH;*k5k|_^Sl8hANSh>sWt9 zR4R@M^0rI(@Y=#hIrU;)Iaq%SoWDt4&;B#ja3pzA_ctb-1sDnA| z>`eQ^$o90tN~tppjIxKG$^)6r&4FjOnUp_)hOBnx*K7Cr1m8H42 zyMd}*sefX38|OM}gQ&bbkGD14_%x-Z(-z9&;z+I0a12KBhfS>V1p`Zgo7+;~K+j~p z+-6&7)RJ@sDb?f09PFsQ?O9p-!Y*n~eQwi__&}?VI3T5>f^KaMs#aAruyB(5L?tLb zHN8sZ@sEsCvf#0N^kcqSh5j^%eS4Vlb$Ec>N?l1FPu1^@iZU}Z^YIzK8J{ht8Qys_ zz6GzS^<7{gpPTFKm5-sR9R*{)E86h~EdQ4{kO8LK@x|Nk-yc=>_xJOvZG*%rCvyLk zcq=91d9(>R6R6llyaao99h2rRarnV-I)&Ve7vI5P^bQ1v)@O$s0|T6u5RdPd`~Pko zXdZ3Vemww(Z0ocw_G8iGP@&BGFvjs`08fa@< zr;YU>ktzxb>hm~&Iyh7bi>VbniWU8fzL0{~)W%Pn=*z}fMMXy+`Zh5iXT5O3U!JS# zvKDh&y1m#6?$X*E5O3Z1%5^t#VPTQz2DzX&hjJ=PN?%=DFJFPa&cQnfvk*iXFn^nY zlC zu$a7^KRLZzY1^a51_l;fe*5hTt3F^`vJDm{`1y{FufHeVJ#Qh!970^|&dx;$1TyM5 zoO`Fzx?lUIZnWYDZP#2eir0rZQ%j}l?C)%2txya0agfqTU z=>?wC{+bhZc6V2H!bW{(+wgLsxL`JH$zlUli8aocU9j+smh+?|k4~0N!TMOn$pPSls)1TI=pcWshRUD=8XLDeK)0|>GkanO@nP#_}ar{(QE{#A`l-`*Yu2X)y2 z@rev9-Kl6ba(44m+8d_Lm{}cAHJwwrcE~GTLUhoU zl?X>Tkm#ut0UaGg#`gn|Ws-SskUGR@{RuYK1KdptBOGZNXa{5K9|JFscaA(1eD51D zBnhLPT}Soj(uh~;V6&wmjF3{tMWpC4;RIP9BFrAq!-MomI8B`o#kv|cf}0xJznxX? z+nnxD0~LlRj?BRCJW7lj%>eBga<+8ipg1aZxWD>iEFn-7<`0;0pC><3Qat6kU~jqy zNO576g_QW#e$!7*R{j?X0KSAlOzsz>X?u9Upc248taW8IKzY4vP?@$JDPjr$O}GGn zkcT}*NN7L6zMw_C)n)`u5<^Vr*dx?6@hUS6Z((uuRA@aY-oK4#?ZiI*^)6~eNn1zg zS7O>LvO0YLqyMJdH{wT$Jkq+Y6MKd_D(c0JpWM`U5gCv8K!4M9aw^szykLjOI?XGV zJwb4!Z6xBNcp{<%BBH8OCz`Z%&<`zq!=`>A%*2=t#8EtiH5O!)_TWpb(yyRoZHTXQ zhjBbwk)qpE`Q1ihM`v`REUQhV$;8k9faM!Low?v1a;N8`{lL^kVBKHHv2c2?Y2{nP zU@XKv9V$eIA-hS{2FQMs_Jhvdq%k|Psc6MfBxroC1sSzH8TFdys$aqPQ!9g9o8KAM z*Z*}W0$-p5PF;*^OP-=Uzgk;Vn1{D5#G6UXEHcaOB#1mHf(<~-%F2DNXh{%nVLXU? zhJ*-T7~lUPetj$#RO3M}%ea0J`SnWQi0`WjR!M1C4jfXblV9c*|2iJx0G68l@|gqX z+{D1l79#TzErLta9)#c?_M|xCgWfy>ENCF7v=(RRrd#-v#MeZ#G=2NOw|e-LckWhE zf&l`Ay-&z%n%{oE&-R1>MsU5Z0iF79LfB)dwEVM44h|OJ8Ue(jy2h60&xW@bowof0 zE`8n34r2qATRs4>BTEN}Of6c_d{&0$iBg>FB*K-#y1-0DOPLY?L0}F8$KaPYZ?-Su z${FApSZ3?!P%R@Rid);vw>LNMd3DbHT&!YrY?@mW}xg2?_>BH1R=jZ3Gt#sJW`1vh|b5+)U1iXG-pPA`mW@ct-`FCJo z0L*lHdWW^q=jM)KVPT+-$;r!CPg0SPkicnaw{Y+eMa0CSP`rYI5&{CDz?O@P3+XRg z{zvCV1Z{0Hjt&kTPr|~(9b)+i>FFom@bV#__Dj(K+?gKGc+`7R{@vQDvP#p=cqG+}8DrxJ`9+RbRgrdDpO|imG)kW^(TotgO-kxWMtzr*w7RN_9#uYm7#%$TzhKv5R$`SsIX(6Du44$J7V^E? zO=#(rx0cqy-#X_oaCLPhA|Q~OAldKS}Q6nL?w- z{KQl-R+cI8dE|F##J4vaoSXOmz}-q)E_(_~n?vUQbaADepfH#9RaK0AE{i=QX=&61 zQ&UE?0sF5S4^NiU1FtS>!7^Z(nwOnjl$)!X7#$uSenLh{S}-zESy@S-sYzyRY&`1c z7Z~`|^=T3ZcmqdFSeWh>7ZB1E(d#Gx0#x(t9<)UPnFShZP-q!h_I4G#~qv%d&?S}cP@j-Arb&MNN04z_Ae zPEIcd$Hzk=5oN+v4znql+`o`WN=Lo6)&Bu7Yn$?TiGmh>3y+rAA>p}P891fQ?3!+B zC|BkbWHMb{TQfB=kt+iyr#?TN1s2RoN=m?^E-r8s;CtLWYWljbUX{xYvwVp7_|dxA zGT=Yg2`Fjf<8|l=NJzxI-?ZS>ScIhZQK=KOdC1AcAj!hg(r7AO%UY#mlWwKeRI8L0 z7407$cJudr+GfC1fENdxoPjmU`jn)kJf@0-N>V;9vsP6ydO+?q4P(goIddY;0^YX4$~{uj z<%s*FaUKOD1{JTE1q28?A4fS}IY`tM7x&oKBJ*Grp`U&((ZbrT3e~_lZTJ<*!NErm zXo9S)==F(87`VZj5)^8AK%B5(xdCd!`w(21YeULQ7W_EkULaqArzp zo(tGP-ytG;@GE22dd{ci=g&;A52Yu#b0;E7?D_wq!+?@aT(9&yDR{f>S7&O)wkHb< z3)MqME_Y#Euo;#)H2=8~3AOSyv==UyUSb&gdSJ+}OXbjze9G_G?rZ<& zpZoHFafiO-2Q2@Yw|;TFU>cYQM1Xq`3w+GVBEzjCfGgw;>*$R|>VS_OSgONd>Dxd_8*P4KWNaL3^(wag_iuva=zX+2BgUFkFrNi;VQ*@BL=_SmO4R*;udmlvoH(om>) zj64+TuH~dR8J(Pr^jEv97pu2ui03rZsVMGaQM#K3 zroexW69w>cHEtJiudGiH3v;}mfhXCdsTZu@t7~W|4rpMEVymw|$yXN;s7?|00X5T@ zwYs`GCOY~l0RaKG6-_D!?1{K{MqM4Q%j?%ZFJES#il+*dNn$j<*J?gWi; z++OjUd3(0t0tH3K)*TA1a=AFHg&(i#wM1a*{(7X=*w`%h2!M@jIwd7M!QGTwMC7Dt z>q0@o(a~}2S*8dZ!#oFtQA6(Nv)9#pnA6dt1vyKj!e;X{|NS-7D-#>$YEjr`abe+D z(oC1+WxY|%x~j0f_K5egUU=TIV0i_h@~GnDJeQ)c?XR9LHqrc zZzNZ{yo<&Vjbd;k zoEWMKI1~Jv(81>7lDE|?hVJio)WN3M-yc>3ONTLtNI4t~$z~4j$xQI_MzZCe&}>$r zeBsFR)ek=f)J22eRFyWIwFqB@{Uocd_Q+q}cFVo0Hl+o7er_P>yjZ^6lmhGX4&p7A z&HpzU9gG{qMbKdL{%>Haf-Mn!wfZ_{PXo-y3 GyZ;9!?+|4G diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone65-dark.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone65-dark.png index 20d6b27720c0978091f373fd691bd790e710479b..79606a1481c4e88232e5f24309f71234d4672d8e 100644 GIT binary patch delta 5748 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 H?SuaUfCI#b delta 5799 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 DJQ~-2 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6Plus-dark.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6Plus-dark.png index 6ac072186979bbd46ce2106378bd9701b4e6f1f5..266b6ef411d7210f17db2142a9ab2f1518f81e7b 100644 GIT binary patch delta 6852 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 diff --git a/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6Plus-light.png b/ZenTunerTests/__Snapshots__/TunerViewSnapshotTests/testTunerView.iphone6Plus-light.png index 7dda742d050f73504945fba1e8ba914e090c173d..8f04b4cd7d340128caa111a523c08501cc2b2240 100644 GIT binary patch delta 5682 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 delta 5553 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 From 6139daa2b73748042799a21f84d2fe5f03a0400f Mon Sep 17 00:00:00 2001 From: JP Simard Date: Wed, 18 Oct 2023 19:50:56 -0400 Subject: [PATCH 20/27] Use for-in instead of while true --- .../Sources/PitchRecording/PitchRecording.swift | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift index af76471..dd2653b 100644 --- a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift +++ b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift @@ -35,21 +35,17 @@ public struct PitchRecording: Codable, Equatable { let tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) - var iteration = 0 var pitchRecording = PitchRecording() - while true { + for iteration in 0... { do { try file.read(into: buffer) + let pitch = tracker.getPitch(from: buffer, amplitudeThreshold: 0.05) + let entry = PitchRecording.Entry(iteration: iteration, pitch: pitch) + pitchRecording.entries.append(entry) } catch { break } - - let pitch = tracker.getPitch(from: buffer, amplitudeThreshold: 0.05) - let entry = PitchRecording.Entry(iteration: iteration, pitch: pitch) - pitchRecording.entries.append(entry) - iteration += 1 } - return pitchRecording } } From 671e568d4f84288ed7bdb0366ed0b78642977ef3 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Sat, 4 Nov 2023 14:53:52 -0400 Subject: [PATCH 21/27] Translate C to Swift (#62) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrate the `CMicrophonePitchTracker` C module to a new `ZenPTrack` Swift module. When compiling the new module with `-Ounchecked` performance is within 0%-2% of the C version. Without `-Ounchecked` it has a 20%-25% overhead. ```console $ hyperfine --warmup 30 --runs 50 \ pitchbench-c \ pitchbench-swift-checked \ pitchbench-swift-unchecked Benchmark 1: ./pitchbench-c Time (mean ± σ): 391.7 ms ± 0.7 ms [User: 379.3 ms, System: 8.6 ms] Range (min … max): 390.7 ms … 394.1 ms 50 runs Benchmark 2: ./pitchbench-swift-checked Time (mean ± σ): 472.1 ms ± 0.8 ms [User: 459.5 ms, System: 8.9 ms] Range (min … max): 471.0 ms … 475.8 ms 50 runs Benchmark 3: ./pitchbench-swift-unchecked Time (mean ± σ): 391.7 ms ± 0.5 ms [User: 379.5 ms, System: 8.6 ms] Range (min … max): 390.9 ms … 392.9 ms 50 runs Summary './pitchbench-c' ran 1.00 ± 0.00 times faster than './pitchbench-swift-unchecked' 1.21 ± 0.00 times faster than './pitchbench-swift-checked' ``` `-Ounchecked` breaks Swift's memory safety, but the fact that it's only enabled in release mode, combined with Swift's additional safety over C even with that flag, means we're in a safer position than the C code we're replacing. --- .../MicrophonePitchDetector/Package.swift | 21 +- .../Sources/CMicrophonePitchDetector/base.c | 36 - .../Sources/CMicrophonePitchDetector/fft.c | 1146 ----------------- .../include/CMicrophonePitchDetector.h | 64 - .../Sources/CMicrophonePitchDetector/ptrack.c | 417 ------ .../MicrophonePitchDetector/PitchTap.swift | 2 +- .../PitchTracker.swift | 38 +- .../PitchRecording/PitchRecording.swift | 2 +- .../Sources/ZenPTrack/ZenFFT.swift | 832 ++++++++++++ .../Sources/ZenPTrack/ZenPTrack.swift | 459 +++++++ 10 files changed, 1326 insertions(+), 1691 deletions(-) delete mode 100644 Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c delete mode 100644 Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c delete mode 100644 Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/include/CMicrophonePitchDetector.h delete mode 100644 Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c create mode 100644 Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenFFT.swift create mode 100644 Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenPTrack.swift diff --git a/Packages/MicrophonePitchDetector/Package.swift b/Packages/MicrophonePitchDetector/Package.swift index ab0b6fc..77f81b1 100644 --- a/Packages/MicrophonePitchDetector/Package.swift +++ b/Packages/MicrophonePitchDetector/Package.swift @@ -1,5 +1,4 @@ // swift-tools-version:5.9 -// The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -16,10 +15,22 @@ let package = Package( ) ], targets: [ - .executableTarget(name: "pitchbench", dependencies: ["PitchRecording"]), - .target(name: "PitchRecording", dependencies: ["MicrophonePitchDetector"]), - .target(name: "MicrophonePitchDetector", dependencies: ["CMicrophonePitchDetector"]), - .target(name: "CMicrophonePitchDetector"), + .executableTarget( + name: "pitchbench", + dependencies: ["PitchRecording"] + ), + .target( + name: "PitchRecording", + dependencies: ["MicrophonePitchDetector"] + ), + .target( + name: "MicrophonePitchDetector", + dependencies: ["ZenPTrack"] + ), + .target( + name: "ZenPTrack", + swiftSettings: [.unsafeFlags(["-Ounchecked"], .when(configuration: .release))] + ), .testTarget( name: "MicrophonePitchDetectorTests", dependencies: [ diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c deleted file mode 100644 index d41fda1..0000000 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/base.c +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/ - -#include -#include -#include "CMicrophonePitchDetector.h" - -void zt_create(zt_data **spp) -{ - *spp = (zt_data *) malloc(sizeof(zt_data)); - zt_data *sp = *spp; - ZTFLOAT *out = malloc(sizeof(ZTFLOAT)); - *out = 0; - sp->out = out; - sp->sr = 44100; - sp->len = 5 * sp->sr; - sp->pos = 0; -} - -void zt_destroy(zt_data **spp) -{ - zt_data *sp = *spp; - free(sp->out); - free(*spp); -} - -void zt_auxdata_alloc(zt_auxdata *aux, size_t size) -{ - aux->ptr = malloc(size); - aux->size = size; - memset(aux->ptr, 0, size); -} - -void zt_auxdata_free(zt_auxdata *aux) -{ - free(aux->ptr); -} diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c deleted file mode 100644 index 72236b9..0000000 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/fft.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* - FFT library - based on public domain code by John Green - original version is available at - http://hyperarchive.lcs.mit.edu/ - /HyperArchive/Archive/dev/src/ffts-for-risc-2-c.hqx - ported to Csound by Istvan Varga, 2005 -*/ - -#include -#include -#include -#include "CMicrophonePitchDetector.h" - -#define POW2(m) ((uint32_t) 1 << (m)) /* integer power of 2 for m<32 */ - -/* fft's with M bigger than this bust primary cache */ -#define MCACHE (11 - (sizeof(ZTFLOAT) / 8)) - -/* some math constants to 40 decimal places */ -#define MYROOT2 1.414213562373095048801688724209698078569 /* sqrt(2) */ - -/***************************************************** -* routines to initialize tables used by fft routines * -*****************************************************/ - -static void fftCosInit(int M, ZTFLOAT *Utbl) -{ - /* Compute Utbl, the cosine table for ffts */ - /* of size (pow(2,M)/4 +1) */ - /* INPUTS */ - /* M = log2 of fft size */ - /* OUTPUTS */ - /* *Utbl = cosine table */ - unsigned int fftN = POW2(M); - unsigned int i1; - - Utbl[0] = 1.0; - for (i1 = 1; i1 < fftN/4; i1++) - Utbl[i1] = cos((2.0 * M_PI * (ZTFLOAT)i1) / (ZTFLOAT)fftN); - Utbl[fftN/4] = 0.0; -} - -void fftBRInit(int M, int16_t *BRLow) -{ - /* Compute BRLow, the bit reversed table for ffts */ - /* of size pow(2,M/2 -1) */ - /* INPUTS */ - /* M = log2 of fft size */ - /* OUTPUTS */ - /* *BRLow = bit reversed counter table */ - int Mroot_1 = M / 2 - 1; - int Nroot_1 = POW2(Mroot_1); - int i1; - int bitsum; - int bitmask; - int bit; - - for (i1 = 0; i1 < Nroot_1; i1++) { - bitsum = 0; - bitmask = 1; - for (bit = 1; bit <= Mroot_1; bitmask <<= 1, bit++) - if (i1 & bitmask) - bitsum = bitsum + (Nroot_1 >> bit); - BRLow[i1] = bitsum; - } -} - -/***************** -* parts of ffts1 * -*****************/ - -static void bitrevR2(ZTFLOAT *ioptr, int M, int16_t *BRLow) -{ - /*** bit reverse and first radix 2 stage of forward or inverse fft ***/ - ZTFLOAT f0r; - ZTFLOAT f0i; - ZTFLOAT f1r; - ZTFLOAT f1i; - ZTFLOAT f2r; - ZTFLOAT f2i; - ZTFLOAT f3r; - ZTFLOAT f3i; - ZTFLOAT f4r; - ZTFLOAT f4i; - ZTFLOAT f5r; - ZTFLOAT f5i; - ZTFLOAT f6r; - ZTFLOAT f6i; - ZTFLOAT f7r; - ZTFLOAT f7i; - ZTFLOAT t0r; - ZTFLOAT t0i; - ZTFLOAT t1r; - ZTFLOAT t1i; - ZTFLOAT *p0r; - ZTFLOAT *p1r; - ZTFLOAT *IOP; - ZTFLOAT *iolimit; - int Colstart; - int iCol; - unsigned int posA; - unsigned int posAi; - unsigned int posB; - unsigned int posBi; - - const unsigned int Nrems2 = POW2((M + 3) / 2); - const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; - const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; - const unsigned int ColstartShift = (M + 1) / 2 + 1; - - posA = POW2(M); /* 1/2 of POW2(M) complexes */ - posAi = posA + 1; - posB = posA + 2; - posBi = posB + 1; - - iolimit = ioptr + Nrems2; - for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { - for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { - iCol = Nroot_1; - p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; - IOP = ioptr + (Colstart << ColstartShift); - p1r = IOP + BRLow[iCol] * 4; - f0r = *(p0r); - f0i = *(p0r + 1); - f1r = *(p0r + posA); - f1i = *(p0r + posAi); - for (; iCol > Colstart;) { - f2r = *(p0r + 2); - f2i = *(p0r + (2 + 1)); - f3r = *(p0r + posB); - f3i = *(p0r + posBi); - f4r = *(p1r); - f4i = *(p1r + 1); - f5r = *(p1r + posA); - f5i = *(p1r + posAi); - f6r = *(p1r + 2); - f6i = *(p1r + (2 + 1)); - f7r = *(p1r + posB); - f7i = *(p1r + posBi); - - t0r = f0r + f1r; - t0i = f0i + f1i; - f1r = f0r - f1r; - f1i = f0i - f1i; - t1r = f2r + f3r; - t1i = f2i + f3i; - f3r = f2r - f3r; - f3i = f2i - f3i; - f0r = f4r + f5r; - f0i = f4i + f5i; - f5r = f4r - f5r; - f5i = f4i - f5i; - f2r = f6r + f7r; - f2i = f6i + f7i; - f7r = f6r - f7r; - f7i = f6i - f7i; - - *(p1r) = t0r; - *(p1r + 1) = t0i; - *(p1r + 2) = f1r; - *(p1r + (2 + 1)) = f1i; - *(p1r + posA) = t1r; - *(p1r + posAi) = t1i; - *(p1r + posB) = f3r; - *(p1r + posBi) = f3i; - *(p0r) = f0r; - *(p0r + 1) = f0i; - *(p0r + 2) = f5r; - *(p0r + (2 + 1)) = f5i; - *(p0r + posA) = f2r; - *(p0r + posAi) = f2i; - *(p0r + posB) = f7r; - *(p0r + posBi) = f7i; - - p0r -= Nrems2; - f0r = *(p0r); - f0i = *(p0r + 1); - f1r = *(p0r + posA); - f1i = *(p0r + posAi); - iCol -= 1; - p1r = IOP + BRLow[iCol] * 4; - } - f2r = *(p0r + 2); - f2i = *(p0r + (2 + 1)); - f3r = *(p0r + posB); - f3i = *(p0r + posBi); - - t0r = f0r + f1r; - t0i = f0i + f1i; - f1r = f0r - f1r; - f1i = f0i - f1i; - t1r = f2r + f3r; - t1i = f2i + f3i; - f3r = f2r - f3r; - f3i = f2i - f3i; - - *(p0r) = t0r; - *(p0r + 1) = t0i; - *(p0r + 2) = f1r; - *(p0r + (2 + 1)) = f1i; - *(p0r + posA) = t1r; - *(p0r + posAi) = t1i; - *(p0r + posB) = f3r; - *(p0r + posBi) = f3i; - } - } -} - -static void fft2pt(ZTFLOAT *ioptr) -{ - /*** RADIX 2 fft ***/ - ZTFLOAT f0r, f0i, f1r, f1i; - ZTFLOAT t0r, t0i; - - /* bit reversed load */ - f0r = ioptr[0]; - f0i = ioptr[1]; - f1r = ioptr[2]; - f1i = ioptr[3]; - - /* Butterflys */ - /* - f0 - - t0 - f1 - 1 - f1 - */ - - t0r = f0r + f1r; - t0i = f0i + f1i; - f1r = f0r - f1r; - f1i = f0i - f1i; - - /* store result */ - ioptr[0] = t0r; - ioptr[1] = t0i; - ioptr[2] = f1r; - ioptr[3] = f1i; -} - -static void fft4pt(ZTFLOAT *ioptr) -{ - /*** RADIX 4 fft ***/ - ZTFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; - ZTFLOAT t0r, t0i, t1r, t1i; - - /* bit reversed load */ - f0r = ioptr[0]; - f0i = ioptr[1]; - f1r = ioptr[4]; - f1i = ioptr[5]; - f2r = ioptr[2]; - f2i = ioptr[3]; - f3r = ioptr[6]; - f3i = ioptr[7]; - - /* Butterflys */ - /* - f0 - - t0 - - f0 - f1 - 1 - f1 - - f1 - f2 - - f2 - 1 - f2 - f3 - 1 - t1 - -i - f3 - */ - - t0r = f0r + f1r; - t0i = f0i + f1i; - f1r = f0r - f1r; - f1i = f0i - f1i; - - t1r = f2r - f3r; - t1i = f2i - f3i; - f2r = f2r + f3r; - f2i = f2i + f3i; - - f0r = t0r + f2r; - f0i = t0i + f2i; - f2r = t0r - f2r; - f2i = t0i - f2i; - - f3r = f1r - t1i; - f3i = f1i + t1r; - f1r = f1r + t1i; - f1i = f1i - t1r; - - /* store result */ - ioptr[0] = f0r; - ioptr[1] = f0i; - ioptr[2] = f1r; - ioptr[3] = f1i; - ioptr[4] = f2r; - ioptr[5] = f2i; - ioptr[6] = f3r; - ioptr[7] = f3i; -} - -static void fft8pt(ZTFLOAT *ioptr) -{ - /*** RADIX 8 fft ***/ - ZTFLOAT w0r = (ZTFLOAT)(1.0 / MYROOT2); /* cos(pi/4) */ - ZTFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; - ZTFLOAT f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; - ZTFLOAT t0r, t0i, t1r, t1i; - const ZTFLOAT Two = 2.0; - - /* bit reversed load */ - f0r = ioptr[0]; - f0i = ioptr[1]; - f1r = ioptr[8]; - f1i = ioptr[9]; - f2r = ioptr[4]; - f2i = ioptr[5]; - f3r = ioptr[12]; - f3i = ioptr[13]; - f4r = ioptr[2]; - f4i = ioptr[3]; - f5r = ioptr[10]; - f5i = ioptr[11]; - f6r = ioptr[6]; - f6i = ioptr[7]; - f7r = ioptr[14]; - f7i = ioptr[15]; - /* Butterflys */ - /* - f0 - - t0 - - f0 - - f0 - f1 - 1 - f1 - - f1 - - f1 - f2 - - f2 - 1 - f2 - - f2 - f3 - 1 - t1 - -i - f3 - - f3 - f4 - - t0 - - f4 - 1 - t0 - f5 - 1 - f5 - - f5 - w3 - f4 - f6 - - f6 - 1 - f6 - -i - t1 - f7 - 1 - t1 - -i - f7 - iw3- f6 - */ - - t0r = f0r + f1r; - t0i = f0i + f1i; - f1r = f0r - f1r; - f1i = f0i - f1i; - - t1r = f2r - f3r; - t1i = f2i - f3i; - f2r = f2r + f3r; - f2i = f2i + f3i; - - f0r = t0r + f2r; - f0i = t0i + f2i; - f2r = t0r - f2r; - f2i = t0i - f2i; - - f3r = f1r - t1i; - f3i = f1i + t1r; - f1r = f1r + t1i; - f1i = f1i - t1r; - - t0r = f4r + f5r; - t0i = f4i + f5i; - f5r = f4r - f5r; - f5i = f4i - f5i; - - t1r = f6r - f7r; - t1i = f6i - f7i; - f6r = f6r + f7r; - f6i = f6i + f7i; - - f4r = t0r + f6r; - f4i = t0i + f6i; - f6r = t0r - f6r; - f6i = t0i - f6i; - - f7r = f5r - t1i; - f7i = f5i + t1r; - f5r = f5r + t1i; - f5i = f5i - t1r; - - t0r = f0r - f4r; - t0i = f0i - f4i; - f0r = f0r + f4r; - f0i = f0i + f4i; - - t1r = f2r - f6i; - t1i = f2i + f6r; - f2r = f2r + f6i; - f2i = f2i - f6r; - - f4r = f1r - f5r * w0r - f5i * w0r; - f4i = f1i + f5r * w0r - f5i * w0r; - f1r = f1r * Two - f4r; - f1i = f1i * Two - f4i; - - f6r = f3r + f7r * w0r - f7i * w0r; - f6i = f3i + f7r * w0r + f7i * w0r; - f3r = f3r * Two - f6r; - f3i = f3i * Two - f6i; - - /* store result */ - ioptr[0] = f0r; - ioptr[1] = f0i; - ioptr[2] = f1r; - ioptr[3] = f1i; - ioptr[4] = f2r; - ioptr[5] = f2i; - ioptr[6] = f3r; - ioptr[7] = f3i; - ioptr[8] = t0r; - ioptr[9] = t0i; - ioptr[10] = f4r; - ioptr[11] = f4i; - ioptr[12] = t1r; - ioptr[13] = t1i; - ioptr[14] = f6r; - ioptr[15] = f6i; -} - -static void bfR2(ZTFLOAT *ioptr, int M, int NDiffU) -{ - /*** 2nd radix 2 stage ***/ - unsigned int pos; - unsigned int posi; - unsigned int pinc; - unsigned int pnext; - unsigned int NSameU; - unsigned int SameUCnt; - - ZTFLOAT *pstrt; - ZTFLOAT *p0r, *p1r, *p2r, *p3r; - - ZTFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; - ZTFLOAT f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; - - pinc = NDiffU * 2; /* 2 floats per complex */ - pnext = pinc * 4; - pos = 2; - posi = pos + 1; - NSameU = POW2(M) / 4 / NDiffU; /* 4 Us at a time */ - pstrt = ioptr; - p0r = pstrt; - p1r = pstrt + pinc; - p2r = p1r + pinc; - p3r = p2r + pinc; - - /* Butterflys */ - /* - f0 - - f4 - f1 - 1 - f5 - f2 - - f6 - f3 - 1 - f7 - */ - /* Butterflys */ - /* - f0 - - f4 - f1 - 1 - f5 - f2 - - f6 - f3 - 1 - f7 - */ - - for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { - - f0r = *p0r; - f1r = *p1r; - f0i = *(p0r + 1); - f1i = *(p1r + 1); - f2r = *p2r; - f3r = *p3r; - f2i = *(p2r + 1); - f3i = *(p3r + 1); - - f4r = f0r + f1r; - f4i = f0i + f1i; - f5r = f0r - f1r; - f5i = f0i - f1i; - - f6r = f2r + f3r; - f6i = f2i + f3i; - f7r = f2r - f3r; - f7i = f2i - f3i; - - *p0r = f4r; - *(p0r + 1) = f4i; - *p1r = f5r; - *(p1r + 1) = f5i; - *p2r = f6r; - *(p2r + 1) = f6i; - *p3r = f7r; - *(p3r + 1) = f7i; - - f0r = *(p0r + pos); - f1i = *(p1r + posi); - f0i = *(p0r + posi); - f1r = *(p1r + pos); - f2r = *(p2r + pos); - f3i = *(p3r + posi); - f2i = *(p2r + posi); - f3r = *(p3r + pos); - - f4r = f0r + f1i; - f4i = f0i - f1r; - f5r = f0r - f1i; - f5i = f0i + f1r; - - f6r = f2r + f3i; - f6i = f2i - f3r; - f7r = f2r - f3i; - f7i = f2i + f3r; - - *(p0r + pos) = f4r; - *(p0r + posi) = f4i; - *(p1r + pos) = f5r; - *(p1r + posi) = f5i; - *(p2r + pos) = f6r; - *(p2r + posi) = f6i; - *(p3r + pos) = f7r; - *(p3r + posi) = f7i; - - p0r += pnext; - p1r += pnext; - p2r += pnext; - p3r += pnext; - } -} - -static void bfR4(ZTFLOAT *ioptr, int M, int NDiffU) -{ - /*** 1 radix 4 stage ***/ - unsigned int pos; - unsigned int posi; - unsigned int pinc; - unsigned int pnext; - unsigned int pnexti; - unsigned int NSameU; - unsigned int SameUCnt; - - ZTFLOAT *pstrt; - ZTFLOAT *p0r, *p1r, *p2r, *p3r; - - ZTFLOAT w1r = 1.0 / MYROOT2; /* cos(pi/4) */ - ZTFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; - ZTFLOAT f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; - ZTFLOAT t1r, t1i; - const ZTFLOAT Two = 2.0; - - pinc = NDiffU * 2; /* 2 floats per complex */ - pnext = pinc * 4; - pnexti = pnext + 1; - pos = 2; - posi = pos + 1; - NSameU = POW2(M) / 4 / NDiffU; /* 4 pts per butterfly */ - pstrt = ioptr; - p0r = pstrt; - p1r = pstrt + pinc; - p2r = p1r + pinc; - p3r = p2r + pinc; - - /* Butterflys */ - /* - f0 - - f0 - - f4 - f1 - 1 - f5 - - f5 - f2 - - f6 - 1 - f6 - f3 - 1 - f3 - -i - f7 - */ - /* Butterflys */ - /* - f0 - - f4 - - f4 - f1 - -i - t1 - - f5 - f2 - - f2 - w1 - f6 - f3 - -i - f7 - iw1- f7 - */ - - f0r = *p0r; - f1r = *p1r; - f2r = *p2r; - f3r = *p3r; - f0i = *(p0r + 1); - f1i = *(p1r + 1); - f2i = *(p2r + 1); - f3i = *(p3r + 1); - - f5r = f0r - f1r; - f5i = f0i - f1i; - f0r = f0r + f1r; - f0i = f0i + f1i; - - f6r = f2r + f3r; - f6i = f2i + f3i; - f3r = f2r - f3r; - f3i = f2i - f3i; - - for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { - - f7r = f5r - f3i; - f7i = f5i + f3r; - f5r = f5r + f3i; - f5i = f5i - f3r; - - f4r = f0r + f6r; - f4i = f0i + f6i; - f6r = f0r - f6r; - f6i = f0i - f6i; - - f2r = *(p2r + pos); - f2i = *(p2r + posi); - f1r = *(p1r + pos); - f1i = *(p1r + posi); - f3i = *(p3r + posi); - f0r = *(p0r + pos); - f3r = *(p3r + pos); - f0i = *(p0r + posi); - - *p3r = f7r; - *p0r = f4r; - *(p3r + 1) = f7i; - *(p0r + 1) = f4i; - *p1r = f5r; - *p2r = f6r; - *(p1r + 1) = f5i; - *(p2r + 1) = f6i; - - f7r = f2r - f3i; - f7i = f2i + f3r; - f2r = f2r + f3i; - f2i = f2i - f3r; - - f4r = f0r + f1i; - f4i = f0i - f1r; - t1r = f0r - f1i; - t1i = f0i + f1r; - - f5r = t1r - f7r * w1r + f7i * w1r; - f5i = t1i - f7r * w1r - f7i * w1r; - f7r = t1r * Two - f5r; - f7i = t1i * Two - f5i; - - f6r = f4r - f2r * w1r - f2i * w1r; - f6i = f4i + f2r * w1r - f2i * w1r; - f4r = f4r * Two - f6r; - f4i = f4i * Two - f6i; - - f3r = *(p3r + pnext); - f0r = *(p0r + pnext); - f3i = *(p3r + pnexti); - f0i = *(p0r + pnexti); - f2r = *(p2r + pnext); - f2i = *(p2r + pnexti); - f1r = *(p1r + pnext); - f1i = *(p1r + pnexti); - - *(p2r + pos) = f6r; - *(p1r + pos) = f5r; - *(p2r + posi) = f6i; - *(p1r + posi) = f5i; - *(p3r + pos) = f7r; - *(p0r + pos) = f4r; - *(p3r + posi) = f7i; - *(p0r + posi) = f4i; - - f6r = f2r + f3r; - f6i = f2i + f3i; - f3r = f2r - f3r; - f3i = f2i - f3i; - - f5r = f0r - f1r; - f5i = f0i - f1i; - f0r = f0r + f1r; - f0i = f0i + f1i; - - p3r += pnext; - p0r += pnext; - p1r += pnext; - p2r += pnext; - } - f7r = f5r - f3i; - f7i = f5i + f3r; - f5r = f5r + f3i; - f5i = f5i - f3r; - - f4r = f0r + f6r; - f4i = f0i + f6i; - f6r = f0r - f6r; - f6i = f0i - f6i; - - f2r = *(p2r + pos); - f2i = *(p2r + posi); - f1r = *(p1r + pos); - f1i = *(p1r + posi); - f3i = *(p3r + posi); - f0r = *(p0r + pos); - f3r = *(p3r + pos); - f0i = *(p0r + posi); - - *p3r = f7r; - *p0r = f4r; - *(p3r + 1) = f7i; - *(p0r + 1) = f4i; - *p1r = f5r; - *p2r = f6r; - *(p1r + 1) = f5i; - *(p2r + 1) = f6i; - - f7r = f2r - f3i; - f7i = f2i + f3r; - f2r = f2r + f3i; - f2i = f2i - f3r; - - f4r = f0r + f1i; - f4i = f0i - f1r; - t1r = f0r - f1i; - t1i = f0i + f1r; - - f5r = t1r - f7r * w1r + f7i * w1r; - f5i = t1i - f7r * w1r - f7i * w1r; - f7r = t1r * Two - f5r; - f7i = t1i * Two - f5i; - - f6r = f4r - f2r * w1r - f2i * w1r; - f6i = f4i + f2r * w1r - f2i * w1r; - f4r = f4r * Two - f6r; - f4i = f4i * Two - f6i; - - *(p2r + pos) = f6r; - *(p1r + pos) = f5r; - *(p2r + posi) = f6i; - *(p1r + posi) = f5i; - *(p3r + pos) = f7r; - *(p0r + pos) = f4r; - *(p3r + posi) = f7i; - *(p0r + posi) = f4i; -} - -static void bfstages(ZTFLOAT *ioptr, int M, ZTFLOAT *Utbl, int Ustride, - int NDiffU, int StageCnt) -{ - /*** RADIX 8 Stages ***/ - unsigned int pos; - unsigned int posi; - unsigned int pinc; - unsigned int pnext; - unsigned int NSameU; - int Uinc; - int Uinc2; - int Uinc4; - unsigned int DiffUCnt; - unsigned int SameUCnt; - unsigned int U2toU3; - - ZTFLOAT *pstrt; - ZTFLOAT *p0r, *p1r, *p2r, *p3r; - ZTFLOAT *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; - - ZTFLOAT w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; - ZTFLOAT f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; - ZTFLOAT f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; - ZTFLOAT t0r, t0i, t1r, t1i; - const ZTFLOAT Two = 2.0; - - pinc = NDiffU * 2; /* 2 floats per complex */ - pnext = pinc * 8; - pos = pinc * 4; - posi = pos + 1; - NSameU = POW2(M) / 8 / NDiffU; /* 8 pts per butterfly */ - Uinc = (int) NSameU * Ustride; - Uinc2 = Uinc * 2; - Uinc4 = Uinc * 4; - U2toU3 = (POW2(M) / 8) * Ustride; - for (; StageCnt > 0; StageCnt--) { - - u0r = &Utbl[0]; - u0i = &Utbl[POW2(M - 2) * Ustride]; - u1r = u0r; - u1i = u0i; - u2r = u0r; - u2i = u0i; - - w0r = *u0r; - w0i = *u0i; - w1r = *u1r; - w1i = *u1i; - w2r = *u2r; - w2i = *u2i; - w3r = *(u2r + U2toU3); - w3i = *(u2i - U2toU3); - - pstrt = ioptr; - - p0r = pstrt; - p1r = pstrt + pinc; - p2r = p1r + pinc; - p3r = p2r + pinc; - - /* Butterflys */ - /* - f0 - - t0 - - f0 - - f0 - f1 - w0- f1 - - f1 - - f1 - f2 - - f2 - w1- f2 - - f4 - f3 - w0- t1 - iw1- f3 - - f5 - - f4 - - t0 - - f4 - w2- t0 - f5 - w0- f5 - - f5 - w3- t1 - f6 - - f6 - w1- f6 - iw2- f6 - f7 - w0- t1 - iw1- f7 - iw3- f7 - */ - - for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { - f0r = *p0r; - f0i = *(p0r + 1); - f1r = *p1r; - f1i = *(p1r + 1); - for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { - f2r = *p2r; - f2i = *(p2r + 1); - f3r = *p3r; - f3i = *(p3r + 1); - - t0r = f0r + f1r * w0r + f1i * w0i; - t0i = f0i - f1r * w0i + f1i * w0r; - f1r = f0r * Two - t0r; - f1i = f0i * Two - t0i; - - f4r = *(p0r + pos); - f4i = *(p0r + posi); - f5r = *(p1r + pos); - f5i = *(p1r + posi); - - f6r = *(p2r + pos); - f6i = *(p2r + posi); - f7r = *(p3r + pos); - f7i = *(p3r + posi); - - t1r = f2r - f3r * w0r - f3i * w0i; - t1i = f2i + f3r * w0i - f3i * w0r; - f2r = f2r * Two - t1r; - f2i = f2i * Two - t1i; - - f0r = t0r + f2r * w1r + f2i * w1i; - f0i = t0i - f2r * w1i + f2i * w1r; - f2r = t0r * Two - f0r; - f2i = t0i * Two - f0i; - - f3r = f1r + t1r * w1i - t1i * w1r; - f3i = f1i + t1r * w1r + t1i * w1i; - f1r = f1r * Two - f3r; - f1i = f1i * Two - f3i; - - t0r = f4r + f5r * w0r + f5i * w0i; - t0i = f4i - f5r * w0i + f5i * w0r; - f5r = f4r * Two - t0r; - f5i = f4i * Two - t0i; - - t1r = f6r - f7r * w0r - f7i * w0i; - t1i = f6i + f7r * w0i - f7i * w0r; - f6r = f6r * Two - t1r; - f6i = f6i * Two - t1i; - - f4r = t0r + f6r * w1r + f6i * w1i; - f4i = t0i - f6r * w1i + f6i * w1r; - f6r = t0r * Two - f4r; - f6i = t0i * Two - f4i; - - f7r = f5r + t1r * w1i - t1i * w1r; - f7i = f5i + t1r * w1r + t1i * w1i; - f5r = f5r * Two - f7r; - f5i = f5i * Two - f7i; - - t0r = f0r - f4r * w2r - f4i * w2i; - t0i = f0i + f4r * w2i - f4i * w2r; - f0r = f0r * Two - t0r; - f0i = f0i * Two - t0i; - - t1r = f1r - f5r * w3r - f5i * w3i; - t1i = f1i + f5r * w3i - f5i * w3r; - f1r = f1r * Two - t1r; - f1i = f1i * Two - t1i; - - *(p0r + pos) = t0r; - *(p1r + pos) = t1r; - *(p0r + posi) = t0i; - *(p1r + posi) = t1i; - *p0r = f0r; - *p1r = f1r; - *(p0r + 1) = f0i; - *(p1r + 1) = f1i; - - p0r += pnext; - f0r = *p0r; - f0i = *(p0r + 1); - - p1r += pnext; - - f1r = *p1r; - f1i = *(p1r + 1); - - f4r = f2r - f6r * w2i + f6i * w2r; - f4i = f2i - f6r * w2r - f6i * w2i; - f6r = f2r * Two - f4r; - f6i = f2i * Two - f4i; - - f5r = f3r - f7r * w3i + f7i * w3r; - f5i = f3i - f7r * w3r - f7i * w3i; - f7r = f3r * Two - f5r; - f7i = f3i * Two - f5i; - - *p2r = f4r; - *p3r = f5r; - *(p2r + 1) = f4i; - *(p3r + 1) = f5i; - *(p2r + pos) = f6r; - *(p3r + pos) = f7r; - *(p2r + posi) = f6i; - *(p3r + posi) = f7i; - - p2r += pnext; - p3r += pnext; - } - - f2r = *p2r; - f2i = *(p2r + 1); - f3r = *p3r; - f3i = *(p3r + 1); - - t0r = f0r + f1r * w0r + f1i * w0i; - t0i = f0i - f1r * w0i + f1i * w0r; - f1r = f0r * Two - t0r; - f1i = f0i * Two - t0i; - - f4r = *(p0r + pos); - f4i = *(p0r + posi); - f5r = *(p1r + pos); - f5i = *(p1r + posi); - - f6r = *(p2r + pos); - f6i = *(p2r + posi); - f7r = *(p3r + pos); - f7i = *(p3r + posi); - - t1r = f2r - f3r * w0r - f3i * w0i; - t1i = f2i + f3r * w0i - f3i * w0r; - f2r = f2r * Two - t1r; - f2i = f2i * Two - t1i; - - f0r = t0r + f2r * w1r + f2i * w1i; - f0i = t0i - f2r * w1i + f2i * w1r; - f2r = t0r * Two - f0r; - f2i = t0i * Two - f0i; - - f3r = f1r + t1r * w1i - t1i * w1r; - f3i = f1i + t1r * w1r + t1i * w1i; - f1r = f1r * Two - f3r; - f1i = f1i * Two - f3i; - - if ((int) DiffUCnt == NDiffU / 2) - Uinc4 = -Uinc4; - - u0r += Uinc4; - u0i -= Uinc4; - u1r += Uinc2; - u1i -= Uinc2; - u2r += Uinc; - u2i -= Uinc; - - pstrt += 2; - - t0r = f4r + f5r * w0r + f5i * w0i; - t0i = f4i - f5r * w0i + f5i * w0r; - f5r = f4r * Two - t0r; - f5i = f4i * Two - t0i; - - t1r = f6r - f7r * w0r - f7i * w0i; - t1i = f6i + f7r * w0i - f7i * w0r; - f6r = f6r * Two - t1r; - f6i = f6i * Two - t1i; - - f4r = t0r + f6r * w1r + f6i * w1i; - f4i = t0i - f6r * w1i + f6i * w1r; - f6r = t0r * Two - f4r; - f6i = t0i * Two - f4i; - - f7r = f5r + t1r * w1i - t1i * w1r; - f7i = f5i + t1r * w1r + t1i * w1i; - f5r = f5r * Two - f7r; - f5i = f5i * Two - f7i; - - w0r = *u0r; - w0i = *u0i; - w1r = *u1r; - w1i = *u1i; - - if ((int) DiffUCnt <= NDiffU / 2) - w0r = -w0r; - - t0r = f0r - f4r * w2r - f4i * w2i; - t0i = f0i + f4r * w2i - f4i * w2r; - f0r = f0r * Two - t0r; - f0i = f0i * Two - t0i; - - f4r = f2r - f6r * w2i + f6i * w2r; - f4i = f2i - f6r * w2r - f6i * w2i; - f6r = f2r * Two - f4r; - f6i = f2i * Two - f4i; - - *(p0r + pos) = t0r; - *p2r = f4r; - *(p0r + posi) = t0i; - *(p2r + 1) = f4i; - w2r = *u2r; - w2i = *u2i; - *p0r = f0r; - *(p2r + pos) = f6r; - *(p0r + 1) = f0i; - *(p2r + posi) = f6i; - - p0r = pstrt; - p2r = pstrt + pinc + pinc; - - t1r = f1r - f5r * w3r - f5i * w3i; - t1i = f1i + f5r * w3i - f5i * w3r; - f1r = f1r * Two - t1r; - f1i = f1i * Two - t1i; - - f5r = f3r - f7r * w3i + f7i * w3r; - f5i = f3i - f7r * w3r - f7i * w3i; - f7r = f3r * Two - f5r; - f7i = f3i * Two - f5i; - - *(p1r + pos) = t1r; - *p3r = f5r; - *(p1r + posi) = t1i; - *(p3r + 1) = f5i; - w3r = *(u2r + U2toU3); - w3i = *(u2i - U2toU3); - *p1r = f1r; - *(p3r + pos) = f7r; - *(p1r + 1) = f1i; - *(p3r + posi) = f7i; - - p1r = pstrt + pinc; - p3r = p2r + pinc; - } - NSameU /= 8; - Uinc /= 8; - Uinc2 /= 8; - Uinc4 = Uinc * 4; - NDiffU *= 8; - pinc *= 8; - pnext *= 8; - pos *= 8; - posi = pos + 1; - } -} - -static void fftrecurs(ZTFLOAT *ioptr, int M, ZTFLOAT *Utbl, int Ustride, int NDiffU, - int StageCnt) -{ - /* recursive bfstages calls to maximize on chip cache efficiency */ - int i1; - - if (M <= (int) MCACHE) /* fits on chip ? */ - bfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); /* RADIX 8 Stages */ - else { - for (i1 = 0; i1 < 8; i1++) { - fftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, - NDiffU, StageCnt - 1); /* RADIX 8 Stages */ - } - bfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); /* RADIX 8 Stage */ - } -} - -static void ffts1(ZTFLOAT *ioptr, int M, ZTFLOAT *Utbl, int16_t *BRLow) -{ - /* Compute in-place complex fft on the rows of the input array */ - /* INPUTS */ - /* *ioptr = input data array */ - /* M = log2 of fft size (ex M=10 for 1024 point fft) */ - /* *Utbl = cosine table */ - /* *BRLow = bit reversed counter table */ - /* OUTPUTS */ - /* *ioptr = output data array */ - - int StageCnt; - int NDiffU; - - switch (M) { - case 0: - break; - case 1: - fft2pt(ioptr); /* a 2 pt fft */ - break; - case 2: - fft4pt(ioptr); /* a 4 pt fft */ - break; - case 3: - fft8pt(ioptr); /* an 8 pt fft */ - break; - default: - bitrevR2(ioptr, M, BRLow); /* bit reverse and first radix 2 stage */ - StageCnt = (M - 1) / 3; /* number of radix 8 stages */ - NDiffU = 2; /* one radix 2 stage already complete */ - if ((M - 1 - (StageCnt * 3)) == 1) { - bfR2(ioptr, M, NDiffU); /* 1 radix 2 stage */ - NDiffU *= 2; - } - if ((M - 1 - (StageCnt * 3)) == 2) { - bfR4(ioptr, M, NDiffU); /* 1 radix 4 stage */ - NDiffU *= 4; - } - if (M <= (int) MCACHE) - bfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); /* RADIX 8 Stages */ - else - fftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); /* RADIX 8 Stages */ - } -} - -void zt_fft_init(zt_fft *fft, int M) -{ - ZTFLOAT *utbl; - int16_t *BRLow; - int16_t *BRLowCpx; -// int i; - - /* init cos table */ - utbl = (ZTFLOAT*) malloc((POW2(M) / 4 + 1) * sizeof(ZTFLOAT)); - fftCosInit(M, utbl); - - BRLowCpx = - (int16_t*) malloc(POW2(M / 2 - 1) * sizeof(int16_t)); - fftBRInit(M, BRLowCpx); - - /* init bit reversed table for real FFT */ - BRLow = - (int16_t*) malloc(POW2((M - 1) / 2 - 1) * sizeof(int16_t)); - fftBRInit(M - 1, BRLow); - - fft->BRLow = BRLow; - fft->BRLowCpx = BRLowCpx; - fft->utbl = utbl; -} - -void zt_fft_cpx(zt_fft *fft, ZTFLOAT *buf, int FFTsize) -{ -// ZTFLOAT *Utbl; -// int16_t *BRLow; - int M = log2(FFTsize); - ffts1(buf, M, fft->utbl, fft->BRLowCpx); -} - -void zt_fft_destroy(zt_fft *fft) -{ - free(fft->utbl); - free(fft->BRLow); - free(fft->BRLowCpx); -} diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/include/CMicrophonePitchDetector.h b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/include/CMicrophonePitchDetector.h deleted file mode 100644 index e42242b..0000000 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/include/CMicrophonePitchDetector.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright AudioKit. All Rights Reserved. Revision History at http://github.com/AudioKit/AudioKit/ - -#ifndef ZENTUNER_H -#define ZENTUNER_H - -#include -#include - -#ifndef ZTFLOAT -#define ZTFLOAT float -#endif - -typedef struct { - size_t size; - void *ptr; -} zt_auxdata; - -typedef struct { - ZTFLOAT *out; - int sr; - unsigned long len; - unsigned long pos; -} zt_data; - -void zt_auxdata_alloc(zt_auxdata *aux, size_t size); -void zt_auxdata_free(zt_auxdata *aux); - -void zt_create(zt_data **spp); -void zt_destroy(zt_data **spp); - -typedef struct { - ZTFLOAT *utbl; - int16_t *BRLow; - int16_t *BRLowCpx; -} zt_fft; - -void zt_fft_create(zt_fft **fft); -void zt_fft_init(zt_fft *fft, int M); -void zt_fft_cpx(zt_fft *fft, ZTFLOAT *buf, int FFTsize); -void zt_fft_destroy(zt_fft *fft); - -typedef struct { - ZTFLOAT freq, amp; - ZTFLOAT size; - zt_auxdata signal, prev, sin, spec1, spec2, peakarray; - int numpks; - int cnt; - int histcnt; - int hopsize; - ZTFLOAT sr; - ZTFLOAT cps; - ZTFLOAT dbs[20]; - ZTFLOAT amplo; - ZTFLOAT npartial; - ZTFLOAT dbfs; - zt_fft fft; -} zt_ptrack; - -void zt_ptrack_create(zt_ptrack **p); -void zt_ptrack_destroy(zt_ptrack **p); -void zt_ptrack_init(zt_data *sp, zt_ptrack *p, int ihopsize, int ipeaks); -void zt_ptrack_compute(zt_data *sp, zt_ptrack *p, ZTFLOAT *in, ZTFLOAT *freq, ZTFLOAT *amp); - -#endif diff --git a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c b/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c deleted file mode 100644 index e4a9d7e..0000000 --- a/Packages/MicrophonePitchDetector/Sources/CMicrophonePitchDetector/ptrack.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * PTrack - * - * This code has been extracted from the Csound opcode "ptrack". - * It has been modified to work as a Soundpipe module and modified again for use in ZenTuner. - * - * Original Author(s): Victor Lazzarini, Miller Puckette (Original Algorithm), Aurelius Prochazka - * Year: 2007 - * Location: Opcodes/pitchtrack.c - * - */ - -#include -#include -#include "CMicrophonePitchDetector.h" - -#define MINFREQINBINS 5 -#define MAXWINSIZ 8192 -#define MINWINSIZ 128 -#define NPREV 20 -#define MINBW 0.03 -#define BINPEROCT 48 -#define BPEROOVERLOG2 69.24936196 -#define FACTORTOBINS 4/0.0145453 -#define BINGUARD 10 -#define PARTIALDEVIANCE 0.023 -#define DBSCAL 3.333 -#define DBOFFSET -92.3 -#define MINBIN 3 -#define MINAMPS 40 - -#define THRSH 10. - -#define COEF1 ((ZTFLOAT)(.5 * 1.227054)) -#define COEF2 ((ZTFLOAT)(.5 * -0.302385)) -#define COEF3 ((ZTFLOAT)(.5 * 0.095326)) -#define COEF4 ((ZTFLOAT)(.5 * -0.022748)) -#define COEF5 ((ZTFLOAT)(.5 * 0.002533)) -#define FLTLEN 5 - -#define NPARTIALONSET ((int)(sizeof(partialonset)/sizeof(ZTFLOAT))) - -static const ZTFLOAT partialonset[] = -{ - 0.0, - 48.0, - 76.0782000346154967102, - 96.0, - 111.45254855459339269887, - 124.07820003461549671089, - 134.75303625876499715823, - 144.0, - 152.15640006923099342109, - 159.45254855459339269887, - 166.05271769459026829915, - 172.07820003461549671088, - 177.62110647077242370064, - 182.75303625876499715892, - 187.53074858920888940907, - 192.0, -}; - -typedef struct histopeak -{ - ZTFLOAT hpitch; - ZTFLOAT hvalue; - ZTFLOAT hloud; - int hindex; -} HISTOPEAK; - -typedef struct peak -{ - ZTFLOAT pfreq; - ZTFLOAT pwidth; - ZTFLOAT ppow; - ZTFLOAT ploudness; -} PEAK; - -void zt_ptrack_create(zt_ptrack **p) -{ - *p = malloc(sizeof(zt_ptrack)); -} - -void zt_ptrack_destroy(zt_ptrack **p) -{ - zt_ptrack *pp = *p; - zt_auxdata_free(&pp->signal); - zt_auxdata_free(&pp->prev); - zt_auxdata_free(&pp->sin); - zt_auxdata_free(&pp->spec2); - zt_auxdata_free(&pp->spec1); - zt_auxdata_free(&pp->peakarray); - zt_fft_destroy(&pp->fft); - free(*p); -} - -void zt_ptrack_init(zt_data *sp, zt_ptrack *p, int ihopsize, int ipeaks) -{ - p->size = ihopsize; - - int i, winsize = p->size*2, powtwo, tmp; - ZTFLOAT *tmpb; - - if (winsize < MINWINSIZ || winsize > MAXWINSIZ) { - fprintf(stderr, "Woops\n"); - return; - } - - tmp = winsize; - - powtwo = -1; - - while (tmp) { - tmp >>= 1; - powtwo++; - } - - /* 3 days of debugging later... I found this off by one error */ - /* powtwo needs to be powtwo - 1 for fft_init */ - zt_fft_init(&p->fft, powtwo - 1); - - if (winsize != (1 << powtwo)) { - fprintf(stderr, "Woops\n"); - return; - } - - p->hopsize = p->size; - - zt_auxdata_alloc(&p->signal, p->hopsize * sizeof(ZTFLOAT)); - zt_auxdata_alloc(&p->prev, (p->hopsize*2 + 4*FLTLEN)*sizeof(ZTFLOAT)); - zt_auxdata_alloc(&p->sin, (p->hopsize*2)*sizeof(ZTFLOAT)); - zt_auxdata_alloc(&p->spec2, (winsize*4 + 4*FLTLEN)*sizeof(ZTFLOAT)); - zt_auxdata_alloc(&p->spec1, (winsize*4)*sizeof(ZTFLOAT)); - - for (i = 0, tmpb = (ZTFLOAT *)p->signal.ptr; i < p->hopsize; i++) - tmpb[i] = 0.0; - for (i = 0, tmpb = (ZTFLOAT *)p->prev.ptr; i < winsize + 4 * FLTLEN; i++) - tmpb[i] = 0.0; - for (i = 0, tmpb = (ZTFLOAT *)p->sin.ptr; i < p->hopsize; i++) { - tmpb[2*i] = (ZTFLOAT) cos((M_PI*i)/(winsize)); - tmpb[2*i+1] = -(ZTFLOAT)sin((M_PI*i)/(winsize)); - } - - p->cnt = 0; - p->numpks = ipeaks; - - zt_auxdata_alloc(&p->peakarray, (p->numpks+1)*sizeof(PEAK)); - - p->cnt = 0; - p->histcnt = 0; - p->sr = sp->sr; - for (i = 0; i < NPREV; i++) p->dbs[i] = -144.0; - p->amplo = MINAMPS; - p->npartial = 7; - p->dbfs = 32768.0; -} - -static void ptrack(zt_data *sp, zt_ptrack *p) -{ - ZTFLOAT *spec = (ZTFLOAT *)p->spec1.ptr; - ZTFLOAT *spectmp = (ZTFLOAT *)p->spec2.ptr; - ZTFLOAT *sig = (ZTFLOAT *)p->signal.ptr; - ZTFLOAT *sinus = (ZTFLOAT *)p->sin.ptr; - ZTFLOAT *prev = (ZTFLOAT *)p->prev.ptr; - PEAK *peaklist = (PEAK *)p->peakarray.ptr; - HISTOPEAK histpeak; - int i, j, k, hop = p->hopsize, n = 2*hop, npeak = 0, logn = -1, count, tmp; - ZTFLOAT totalpower = 0, totalloudness = 0, totaldb = 0; - ZTFLOAT maxbin, *histogram = spectmp + BINGUARD; - ZTFLOAT hzperbin = (ZTFLOAT) p->sr / (n + n); - int numpks = p->numpks; - int indx, halfhop = hop>>1; - ZTFLOAT best; - ZTFLOAT cumpow = 0, cumstrength = 0, freqnum = 0, freqden = 0; - int npartials = 0, nbelow8 = 0; - ZTFLOAT putfreq; - - count = p->histcnt + 1; - if (count == NPREV) count = 0; - p->histcnt = count; - - tmp = n; - while (tmp) { - tmp >>= 1; - logn++; - } - maxbin = BINPEROCT * (logn-2); - for (i = 0, k = 0; i < hop; i++, k += 2) { - spec[k] = sig[i] * sinus[k]; - spec[k+1] = sig[i] * sinus[k+1]; - } - - zt_fft_cpx(&p->fft, spec, hop); - - for (i = 0, k = 2*FLTLEN; i < hop; i+=2, k += 4) { - spectmp[k] = spec[i]; - spectmp[k+1] = spec[i+1]; - } - - for (i = n - 2, k = 2*FLTLEN+2; i >= 0; i-=2, k += 4) { - spectmp[k] = spec[i]; - spectmp[k+1] = -spec[i+1]; - } - - for (i = (2*FLTLEN), k = (2*FLTLEN-2);i=0; i-=2, k+=2) { - spectmp[k] = spectmp[i]; - spectmp[k+1] = -spectmp[k+1]; - } - - for (i = j = 0, k = 2*FLTLEN; i < halfhop; i++, j+=8, k+=2) { - ZTFLOAT re, im; - - re= COEF1 * ( prev[k-2] - prev[k+1] + spectmp[k-2] - prev[k+1]) + - COEF2 * ( prev[k-3] - prev[k+2] + spectmp[k-3] - spectmp[ 2]) + - COEF3 * (-prev[k-6] +prev[k+5] -spectmp[k-6] +spectmp[k+5]) + - COEF4 * (-prev[k-7] +prev[k+6] -spectmp[k-7] +spectmp[k+6]) + - COEF5 * ( prev[k-10] -prev[k+9] +spectmp[k-10] -spectmp[k+9]); - - im= COEF1 * ( prev[k-1] +prev[k] +spectmp[k-1] +spectmp[k]) + - COEF2 * (-prev[k-4] -prev[k+3] -spectmp[k-4] -spectmp[k+3]) + - COEF3 * (-prev[k-5] -prev[k+4] -spectmp[k-5] -spectmp[k+4]) + - COEF4 * ( prev[k-8] +prev[k+7] +spectmp[k-8] +spectmp[k+7]) + - COEF5 * ( prev[k-9] +prev[k+8] +spectmp[k-9] +spectmp[k+8]); - - spec[j] = 0.707106781186547524400844362104849 * (re + im); - spec[j+1] = 0.707106781186547524400844362104849 * (im - re); - spec[j+4] = prev[k] + spectmp[k+1]; - spec[j+5] = prev[k+1] - spectmp[k]; - - j += 8; - k += 2; - - re= COEF1 * ( prev[k-2] -prev[k+1] -spectmp[k-2] +spectmp[k+1]) + - COEF2 * ( prev[k-3] -prev[k+2] -spectmp[k-3] +spectmp[k+2]) + - COEF3 * (-prev[k-6] +prev[k+5] +spectmp[k-6] -spectmp[k+5]) + - COEF4 * (-prev[k-7] +prev[k+6] +spectmp[k-7] -spectmp[k+6]) + - COEF5 * ( prev[k-10] -prev[k+9] -spectmp[k-10] +spectmp[k+9]); - - im= COEF1 * ( prev[k-1] +prev[k] -spectmp[k-1] -spectmp[k]) + - COEF2 * (-prev[k-4] -prev[k+3] +spectmp[k-4] +spectmp[k+3]) + - COEF3 * (-prev[k-5] -prev[k+4] +spectmp[k-5] +spectmp[k+4]) + - COEF4 * ( prev[k-8] +prev[k+7] -spectmp[k-8] -spectmp[k+7]) + - COEF5 * ( prev[k-9] +prev[k+8] -spectmp[k-9] -spectmp[k+8]); - - spec[j] = 0.707106781186547524400844362104849 * (re + im); - spec[j+1] = 0.707106781186547524400844362104849 * (im - re); - spec[j+4] = prev[k] - spectmp[k+1]; - spec[j+5] = prev[k+1] + spectmp[k]; - - } - - - for (i = 0; i < n + 4*FLTLEN; i++) prev[i] = spectmp[i]; - - for (i = 0; i < MINBIN; i++) spec[4*i + 2] = spec[4*i + 3] =0.0; - - for (i = 4*MINBIN, totalpower = 0; i < (n-2)*4; i += 4) { - ZTFLOAT re = spec[i] - 0.5 * (spec[i-8] + spec[i+8]); - ZTFLOAT im = spec[i+1] - 0.5 * (spec[i-7] + spec[i+9]); - spec[i+3] = (totalpower += (spec[i+2] = re * re + im * im)); - } - - if (totalpower > 1.0e-9) { - totaldb = (ZTFLOAT)DBSCAL * logf(totalpower/n); - totalloudness = (ZTFLOAT)sqrtf((ZTFLOAT)sqrtf(totalpower)); - if (totaldb < 0) totaldb = 0; - } - else totaldb = totalloudness = 0.0; - - p->dbs[count] = totaldb + DBOFFSET; - - if (totaldb >= p->amplo) { - npeak = 0; - - for (i = 4*MINBIN;i < (4*(n-2)) && npeak < numpks; i+=4) { - ZTFLOAT height = spec[i+2], h1 = spec[i-2], h2 = spec[i+6]; - ZTFLOAT totalfreq, peakfr, tmpfr1, tmpfr2, m, var, stdev; - - if (height < h1 || height < h2 || - h1 < 0.00001*totalpower || - h2 < 0.00001*totalpower) continue; - - peakfr= ((spec[i-8] - spec[i+8]) * (2.0 * spec[i] - - spec[i+8] - spec[i-8]) + - (spec[i-7] - spec[i+9]) * (2.0 * spec[i+1] - - spec[i+9] - spec[i-7])) / - (height + height); - tmpfr1= ((spec[i-12] - spec[i+4]) * - (2.0 * spec[i-4] - spec[i+4] - spec[i-12]) + - (spec[i-11] - spec[i+5]) * (2.0 * spec[i-3] - - spec[i+5] - spec[i-11])) / - (2.0 * h1) - 1; - tmpfr2= ((spec[i-4] - spec[i+12]) * (2.0 * spec[i+4] - - spec[i+12] - spec[i-4]) + - (spec[i-3] - spec[i+13]) * (2.0 * spec[i+5] - - spec[i+13] - spec[i-3])) / - (2.0 * h2) + 1; - - - m = 0.333333333333 * (peakfr + tmpfr1 + tmpfr2); - var = 0.5 * ((peakfr-m)*(peakfr-m) + - (tmpfr1-m)*(tmpfr1-m) + (tmpfr2-m)*(tmpfr2-m)); - - totalfreq = (i>>2) + m; - if (var * totalpower > THRSH * height - || var < 1.0e-30) continue; - - stdev = (ZTFLOAT)sqrt((ZTFLOAT)var); - if (totalfreq < 4) totalfreq = 4; - - - peaklist[npeak].pwidth = stdev; - peaklist[npeak].ppow = height; - peaklist[npeak].ploudness = sqrt(sqrt(height)); - peaklist[npeak].pfreq = totalfreq; - npeak++; - } - - if (npeak > numpks) npeak = numpks; - for (i = 0; i < maxbin; i++) histogram[i] = 0; - for (i = 0; i < npeak; i++) { - ZTFLOAT pit = (ZTFLOAT)(BPEROOVERLOG2 * logf(peaklist[i].pfreq) - 96.0); - ZTFLOAT binbandwidth = FACTORTOBINS * peaklist[i].pwidth/peaklist[i].pfreq; - ZTFLOAT putbandwidth = (binbandwidth < 2.0 ? 2.0 : binbandwidth); - ZTFLOAT weightbandwidth = (binbandwidth < 1.0 ? 1.0 : binbandwidth); - ZTFLOAT weightamp = 4.0 * peaklist[i].ploudness / totalloudness; - for (j = 0; j < NPARTIALONSET; j++) { - ZTFLOAT bin = pit - partialonset[j]; - if (bin < maxbin) { - ZTFLOAT para, pphase, score = 30.0 * weightamp / - ((j+p->npartial) * weightbandwidth); - int firstbin = bin + 0.5 - 0.5 * putbandwidth; - int lastbin = bin + 0.5 + 0.5 * putbandwidth; - int ibw = lastbin - firstbin; - if (firstbin < -BINGUARD) break; - para = 1.0 / (putbandwidth * putbandwidth); - for (k = 0, pphase = firstbin-bin; k <= ibw; - k++,pphase += 1.0) - histogram[k+firstbin] += score * (1.0 - para * pphase * pphase); - - } - } - } - - - for (best = 0, indx = -1, j=0; j < maxbin; j++) { - if (histogram[j] > best) { - indx = j; - best = histogram[j]; - } - } - - histpeak.hvalue = best; - histpeak.hindex = indx; - - putfreq = expf((1.0 / BPEROOVERLOG2) * (histpeak.hindex + 96.0)); - - for (j = 0; j < npeak; j++) { - ZTFLOAT fpnum = peaklist[j].pfreq/putfreq; - int pnum = (int)(fpnum + 0.5); - ZTFLOAT fipnum = pnum; - ZTFLOAT deviation; - if (pnum > 16 || pnum < 1) continue; - deviation = 1.0 - fpnum/fipnum; - if (deviation > -PARTIALDEVIANCE && deviation < PARTIALDEVIANCE) { - ZTFLOAT stdev, weight; - npartials++; - if (pnum < 8) nbelow8++; - cumpow += peaklist[j].ppow; - cumstrength += sqrt(sqrt(peaklist[j].ppow)); - stdev = (peaklist[j].pwidth > MINBW ? - peaklist[j].pwidth : MINBW); - weight = 1.0 / ((stdev*fipnum) * (stdev*fipnum)); - freqden += weight; - freqnum += weight * peaklist[j].pfreq/fipnum; - } - } - if ((nbelow8 < 4 || npartials < 7) && cumpow < 0.01 * totalpower) { - histpeak.hvalue = 0; - } else { - ZTFLOAT pitchpow = (cumstrength * cumstrength); - ZTFLOAT freqinbins = freqnum/freqden; - pitchpow = pitchpow * pitchpow; - - if (freqinbins < MINFREQINBINS) { - histpeak.hvalue = 0; - } else { - p->cps = histpeak.hpitch = hzperbin * freqnum/freqden; - histpeak.hloud = DBSCAL * logf(pitchpow/n); - } - } - } -} - -void zt_ptrack_compute(zt_data *sp, zt_ptrack *p, ZTFLOAT *in, ZTFLOAT *freq, ZTFLOAT *amp) -{ - ZTFLOAT *buf = (ZTFLOAT *)p->signal.ptr; - int pos = p->cnt, h = p->hopsize; - ZTFLOAT scale = p->dbfs; - - if (pos == h) { - ptrack(sp,p); - pos = 0; - } - buf[pos] = *in * scale; - pos++; - - *freq = p->cps; - *amp = exp(p->dbs[p->histcnt] / 20.0 * log(10.0)); - - p->cnt = pos; -} diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift index 6290ef5..d1b5922 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTap.swift @@ -42,7 +42,7 @@ final class PitchTap { didReceiveAudio() if tracker == nil { - tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) + tracker = PitchTracker(sampleRate: buffer.format.sampleRate) } if let pitch = tracker?.getPitch(from: buffer) { diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift index a635fe6..962810f 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/PitchTracker.swift @@ -1,38 +1,34 @@ import AVFoundation -import CMicrophonePitchDetector +import ZenPTrack public final class PitchTracker { - private var data: UnsafeMutablePointer? - private var ptrack: UnsafeMutablePointer? + private var ptrack: ZenPTrack public static var defaultBufferSize: UInt32 { 4_096 } - public init(sampleRate: Int32, hopSize: Int32 = Int32(PitchTracker.defaultBufferSize), peakCount: Int32 = 20) { - withUnsafeMutablePointer(to: &data, zt_create) - data!.pointee.sr = sampleRate - withUnsafeMutablePointer(to: &ptrack, zt_ptrack_create) - zt_ptrack_init(data, ptrack, hopSize, peakCount) - } - - deinit { - withUnsafeMutablePointer(to: &ptrack, zt_ptrack_destroy) - withUnsafeMutablePointer(to: &data, zt_destroy) + public init( + sampleRate: Double, + hopSize: Double = Double(PitchTracker.defaultBufferSize), + peakCount: Int = 20 + ) { + ptrack = ZenPTrack(sampleRate: sampleRate, hopSize: hopSize, peakCount: peakCount) } public func getPitch(from buffer: AVAudioPCMBuffer, amplitudeThreshold: Double = 0.1) -> Double? { guard let floatData = buffer.floatChannelData else { return nil } - var fpitch: Float = 0 - var famplitude: Float = 0 + var pitch = 0.0 + var amplitude = 0.0 - let frames = (0.. amplitudeThreshold, pitch > 0 { return pitch } else { diff --git a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift index dd2653b..bed486f 100644 --- a/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift +++ b/Packages/MicrophonePitchDetector/Sources/PitchRecording/PitchRecording.swift @@ -33,7 +33,7 @@ public struct PitchRecording: Codable, Equatable { throw PitchRecordingError.couldNotCreateAudioPCMBuffer } - let tracker = PitchTracker(sampleRate: Int32(buffer.format.sampleRate)) + let tracker = PitchTracker(sampleRate: buffer.format.sampleRate) var pitchRecording = PitchRecording() for iteration in 0... { diff --git a/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenFFT.swift b/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenFFT.swift new file mode 100644 index 0000000..0114825 --- /dev/null +++ b/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenFFT.swift @@ -0,0 +1,832 @@ +/* + * FFT library + * based on public domain code by John Green + * original version is available at + * http://hyperarchive.lcs.mit.edu/ + * /HyperArchive/Archive/dev/src/ffts-for-risc-2-c.hqx + * ported to Csound by Istvan Varga, 2005 + * ported to Swift by JP Simard, 2022 + */ + +import Darwin + +// TODO: Remove this file in favor of the Accelerate framework's FFT support + +// Since this file was ported from C with many variable names preserved, disable SwiftLint +// swiftlint:disable:next blanket_disable_command +// swiftlint:disable all + +private let SQRT_TWO = sqrtf(2) +private let MCACHE = 11 - (MemoryLayout.size / 8) + +// MARK: - Public API + +final class ZenFFT { + private var utbl: [Float] + private var brLow: [Int] + private let logSize: Int + + init(M: Int, size: Double) { + logSize = Int(log2(size)) + utbl = fftCosInit(M) + brLow = fftBRInit(M) + } + + func compute(buf: inout [Float]) { + ffts1(&buf, logSize, &utbl, &brLow) + } +} + +// MARK: - Private Compute + +private func ffts1(_ ioptr: inout [Float], _ M: Int, _ Utbl: inout [Float], _ BRLow: inout [Int]) { + bitrevR2(&ioptr, M, &BRLow) + + let StageCnt = (M - 1) / 3 + var NDiffU = 2 + if (M - 1 - (StageCnt * 3)) == 1 { + bfR2(&ioptr, M, NDiffU) + NDiffU *= 2 + } else if (M - 1 - (StageCnt * 3)) == 2 { + bfR4(&ioptr, M, NDiffU, SQRT_TWO) + NDiffU *= 4 + } + + if M <= MCACHE { + bfstages(&ioptr, M, &Utbl, 1, NDiffU, StageCnt) + } else { + fftrecurs(&ioptr, M, &Utbl, 1, NDiffU, StageCnt) + } +} + +private func fftrecurs(_ ioptr: UnsafeMutablePointer, _ M: Int, _ Utbl: inout [Float], _ Ustride: Int, _ NDiffU: Int, _ StageCnt: Int) { + guard M > MCACHE else { + bfstages(ioptr, M, &Utbl, Ustride, NDiffU, StageCnt) + return + } + + let multiplier = pow2(M - 3) * 2 + for i1 in 0..<8 { + fftrecurs(ioptr + i1 * multiplier, M - 3, &Utbl, 8 * Ustride, NDiffU, StageCnt - 1) + } + + bfstages(ioptr, M, &Utbl, Ustride, multiplier / 2, 1) +} + +private func bfR2(_ ioptr: UnsafeMutablePointer, _ M: Int, _ NDiffU: Int) { + let pos = 2 + let posi = pos + 1 + let pinc = NDiffU * 2 + let pnext = pinc * 4 + let NSameU = pow2(M) / 4 / NDiffU + let pstrt = ioptr + var p0r = pstrt + var p1r = pstrt + pinc + var p2r = p1r + pinc + var p3r = p2r + pinc + + /* Butterflys */ + /* + f0 - - f4 + f1 - 1 - f5 + f2 - - f6 + f3 - 1 - f7 + */ + /* Butterflys */ + /* + f0 - - f4 + f1 - 1 - f5 + f2 - - f6 + f3 - 1 - f7 + */ + + for _ in 0.., _ M: Int, _ NDiffU: Int, _ sqrttwo: Float) { + /*** 1 radix 4 stage ***/ + var pos, posi, pinc, pnext, pnexti, NSameU, SameUCnt: Int + var pstrt, p0r, p1r, p2r, p3r: UnsafeMutablePointer + + let w1r = 1.0 / sqrttwo /* cos(pi/4) */ + var f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i: Float + var f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i: Float + var t1r, t1i: Float + let Two: Float = 2.0 + + pinc = NDiffU * 2 /* 2 floats per complex */ + pnext = pinc * 4 + pnexti = pnext + 1 + pos = 2 + posi = pos + 1 + NSameU = pow2(M) / 4 / NDiffU /* 4 pts per butterfly */ + pstrt = ioptr + p0r = pstrt + p1r = pstrt + pinc + p2r = p1r + pinc + p3r = p2r + pinc + + /* Butterflys */ + /* + f0 - - f0 - - f4 + f1 - 1 - f5 - - f5 + f2 - - f6 - 1 - f6 + f3 - 1 - f3 - -i - f7 + */ + /* Butterflys */ + /* + f0 - - f4 - - f4 + f1 - -i - t1 - - f5 + f2 - - f2 - w1 - f6 + f3 - -i - f7 - iw1- f7 + */ + + f0r = p0r[0] + f1r = p1r[0] + f2r = p2r[0] + f3r = p3r[0] + f0i = p0r[1] + f1i = p1r[1] + f2i = p2r[1] + f3i = p3r[1] + + f5r = f0r - f1r + f5i = f0i - f1i + f0r = f0r + f1r + f0i = f0i + f1i + + f6r = f2r + f3r + f6i = f2i + f3i + f3r = f2r - f3r + f3i = f2i - f3i + + SameUCnt = NSameU - 1 + while SameUCnt > 0 { + f7r = f5r - f3i + f7i = f5i + f3r + f5r = f5r + f3i + f5i = f5i - f3r + + f4r = f0r + f6r + f4i = f0i + f6i + f6r = f0r - f6r + f6i = f0i - f6i + + f2r = p2r[pos] + f2i = p2r[posi] + f1r = p1r[pos] + f1i = p1r[posi] + f3i = p3r[posi] + f0r = p0r[pos] + f3r = p3r[pos] + f0i = p0r[posi] + + p3r[0] = f7r + p0r[0] = f4r + p3r[1] = f7i + p0r[1] = f4i + p1r[0] = f5r + p2r[0] = f6r + p1r[1] = f5i + p2r[1] = f6i + + f7r = f2r - f3i + f7i = f2i + f3r + f2r = f2r + f3i + f2i = f2i - f3r + + f4r = f0r + f1i + f4i = f0i - f1r + t1r = f0r - f1i + t1i = f0i + f1r + + f5r = t1r - f7r * w1r + f7i * w1r + f5i = t1i - f7r * w1r - f7i * w1r + f7r = t1r * Two - f5r + f7i = t1i * Two - f5i + + f6r = f4r - f2r * w1r - f2i * w1r + f6i = f4i + f2r * w1r - f2i * w1r + f4r = f4r * Two - f6r + f4i = f4i * Two - f6i + + f3r = p3r[pnext] + f0r = p0r[pnext] + f3i = p3r[pnexti] + f0i = p0r[pnexti] + f2r = p2r[pnext] + f2i = p2r[pnexti] + f1r = p1r[pnext] + f1i = p1r[pnexti] + + p2r[pos] = f6r + p1r[pos] = f5r + p2r[posi] = f6i + p1r[posi] = f5i + p3r[pos] = f7r + p0r[pos] = f4r + p3r[posi] = f7i + p0r[posi] = f4i + + f6r = f2r + f3r + f6i = f2i + f3i + f3r = f2r - f3r + f3i = f2i - f3i + + f5r = f0r - f1r + f5i = f0i - f1i + f0r = f0r + f1r + f0i = f0i + f1i + + p3r += pnext + p0r += pnext + p1r += pnext + p2r += pnext + + SameUCnt -= 1 + } + + f7r = f5r - f3i + f7i = f5i + f3r + f5r = f5r + f3i + f5i = f5i - f3r + + f4r = f0r + f6r + f4i = f0i + f6i + f6r = f0r - f6r + f6i = f0i - f6i + + f2r = p2r[pos] + f2i = p2r[posi] + f1r = p1r[pos] + f1i = p1r[posi] + f3i = p3r[posi] + f0r = p0r[pos] + f3r = p3r[pos] + f0i = p0r[posi] + + p3r[0] = f7r + p0r[0] = f4r + p3r[1] = f7i + p0r[1] = f4i + p1r[0] = f5r + p2r[0] = f6r + p1r[1] = f5i + p2r[1] = f6i + + f7r = f2r - f3i + f7i = f2i + f3r + f2r = f2r + f3i + f2i = f2i - f3r + + f4r = f0r + f1i + f4i = f0i - f1r + t1r = f0r - f1i + t1i = f0i + f1r + + f5r = t1r - f7r * w1r + f7i * w1r + f5i = t1i - f7r * w1r - f7i * w1r + f7r = t1r * Two - f5r + f7i = t1i * Two - f5i + + f6r = f4r - f2r * w1r - f2i * w1r + f6i = f4i + f2r * w1r - f2i * w1r + f4r = f4r * Two - f6r + f4i = f4i * Two - f6i + + p2r[pos] = f6r + p1r[pos] = f5r + p2r[posi] = f6i + p1r[posi] = f5i + p3r[pos] = f7r + p0r[pos] = f4r + p3r[posi] = f7i + p0r[posi] = f4i +} + +private func bitrevR2(_ ioptr: UnsafeMutablePointer, _ M: Int, _ BRLow: UnsafeMutablePointer) { + var f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i, f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i, t0r, t0i, t1r, t1i: Float + var p0r, p1r, IOP, iolimit: UnsafeMutablePointer + var iCol: Int + var posA, posAi, posB, posBi: Int + + let Nrems2 = pow2((M + 3) / 2) + let Nroot_1_ColInc = pow2(M) - Nrems2 + let Nroot_1 = pow2(M / 2 - 1) - 1 + let ColstartShift = (M + 1) / 2 + 1 + + posA = pow2(M) /* 1/2 of POW2(M) complexes */ + posAi = posA + 1 + posB = posA + 2 + posBi = posB + 1 + + iolimit = ioptr + UnsafeMutablePointer.Stride(Nrems2) + for ioptr in stride(from: ioptr, to: iolimit, by: pow2(M / 2 + 1)) { + for Colstart in (0...Nroot_1).reversed() { + iCol = Nroot_1 + p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4 + IOP = ioptr + (Colstart << ColstartShift) + p1r = IOP + BRLow[iCol] * 4 + f0r = p0r[0] + f0i = p0r[1] + f1r = p0r[posA] + f1i = p0r[posAi] + while iCol > Colstart { + f2r = p0r[2] + f2i = p0r[2 + 1] + f3r = p0r[posB] + f3i = p0r[posBi] + f4r = p1r[0] + f4i = p1r[1] + f5r = p1r[posA] + f5i = p1r[posAi] + f6r = p1r[2] + f6i = p1r[2 + 1] + f7r = p1r[posB] + f7i = p1r[posBi] + + t0r = f0r + f1r + t0i = f0i + f1i + f1r = f0r - f1r + f1i = f0i - f1i + t1r = f2r + f3r + t1i = f2i + f3i + f3r = f2r - f3r + f3i = f2i - f3i + f0r = f4r + f5r + f0i = f4i + f5i + f5r = f4r - f5r + f5i = f4i - f5i + f2r = f6r + f7r + f2i = f6i + f7i + f7r = f6r - f7r + f7i = f6i - f7i + + p1r[0] = t0r + p1r[1] = t0i + p1r[2] = f1r + p1r[3] = f1i + p1r[posA] = t1r + p1r[posAi] = t1i + p1r[posB] = f3r + p1r[posBi] = f3i + p0r[0] = f0r + p0r[1] = f0i + p0r[2] = f5r + p0r[3] = f5i + p0r[posA] = f2r + p0r[posAi] = f2i + p0r[posB] = f7r + p0r[posBi] = f7i + + p0r -= Nrems2 + f0r = p0r[0] + f0i = p0r[1] + f1r = p0r[posA] + f1i = p0r[posAi] + iCol -= 1 + p1r = IOP + BRLow[iCol] * 4 + } + + f2r = p0r[2] + f2i = p0r[3] + f3r = p0r[posB] + f3i = p0r[posBi] + + t0r = f0r + f1r + t0i = f0i + f1i + f1r = f0r - f1r + f1i = f0i - f1i + t1r = f2r + f3r + t1i = f2i + f3i + f3r = f2r - f3r + f3i = f2i - f3i + + p0r[0] = t0r + p0r[1] = t0i + p0r[2] = f1r + p0r[3] = f1i + p0r[posA] = t1r + p0r[posAi] = t1i + p0r[posB] = f3r + p0r[posBi] = f3i + } + } +} + +private func bfstages(_ ioptr: UnsafeMutablePointer, _ M: Int, _ Utbl: UnsafeMutablePointer, _ Ustride: Int, _ NDiffU: Int, _ StageCnt: Int) { + var NDiffU = NDiffU + var pos: Int + var posi: Int + var pinc: Int + var pnext: Int + var NSameU: Int + var Uinc: Int + var Uinc2: Int + var Uinc4: Int + var DiffUCnt: Int + var SameUCnt: Int + var U2toU3: Int + + var pstrt: UnsafeMutablePointer + var p0r, p1r, p2r, p3r: UnsafeMutablePointer + var u0r, u0i, u1r, u1i, u2r, u2i: UnsafeMutablePointer + + var w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i: Float + var f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i: Float + var f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i: Float + var t0r, t0i, t1r, t1i: Float + let Two: Float = 2.0 + + pinc = NDiffU * 2 + pnext = pinc * 8 + pos = pinc * 4 + posi = pos + 1 + NSameU = pow2(M) / 8 / NDiffU + Uinc = NSameU * Ustride + Uinc2 = Uinc * 2 + Uinc4 = Uinc * 4 + U2toU3 = (pow2(M) / 8) * Ustride + for _ in 0.. 0 { + f0r = p0r[0] + f0i = p0r[1] + f1r = p1r[0] + f1i = p1r[1] + SameUCnt = NSameU - 1 + while SameUCnt > 0 { + f2r = p2r[0] + f2i = p2r[1] + f3r = p3r[0] + f3i = p3r[1] + + t0r = f0r + f1r * w0r + f1i * w0i + t0i = f0i - f1r * w0i + f1i * w0r + f1r = f0r * Two - t0r + f1i = f0i * Two - t0i + + f4r = p0r[pos] + f4i = p0r[posi] + f5r = p1r[pos] + f5i = p1r[posi] + + f6r = p2r[pos] + f6i = p2r[posi] + f7r = p3r[pos] + f7i = p3r[posi] + + t1r = f2r - f3r * w0r - f3i * w0i + t1i = f2i + f3r * w0i - f3i * w0r + f2r = f2r * Two - t1r + f2i = f2i * Two - t1i + + f0r = t0r + f2r * w1r + f2i * w1i + f0i = t0i - f2r * w1i + f2i * w1r + f2r = t0r * Two - f0r + f2i = t0i * Two - f0i + + f3r = f1r + t1r * w1i - t1i * w1r + f3i = f1i + t1r * w1r + t1i * w1i + f1r = f1r * Two - f3r + f1i = f1i * Two - f3i + + t0r = f4r + f5r * w0r + f5i * w0i + t0i = f4i - f5r * w0i + f5i * w0r + f5r = f4r * Two - t0r + f5i = f4i * Two - t0i + + t1r = f6r - f7r * w0r - f7i * w0i + t1i = f6i + f7r * w0i - f7i * w0r + f6r = f6r * Two - t1r + f6i = f6i * Two - t1i + + f4r = t0r + f6r * w1r + f6i * w1i + f4i = t0i - f6r * w1i + f6i * w1r + f6r = t0r * Two - f4r + f6i = t0i * Two - f4i + + f7r = f5r + t1r * w1i - t1i * w1r + f7i = f5i + t1r * w1r + t1i * w1i + f5r = f5r * Two - f7r + f5i = f5i * Two - f7i + + t0r = f0r - f4r * w2r - f4i * w2i + t0i = f0i + f4r * w2i - f4i * w2r + f0r = f0r * Two - t0r + f0i = f0i * Two - t0i + + t1r = f1r - f5r * w3r - f5i * w3i + t1i = f1i + f5r * w3i - f5i * w3r + f1r = f1r * Two - t1r + f1i = f1i * Two - t1i + + p0r[pos] = t0r + p1r[pos] = t1r + p0r[posi] = t0i + p1r[posi] = t1i + p0r[0] = f0r + p1r[0] = f1r + p0r[1] = f0i + p1r[1] = f1i + + p0r += pnext + f0r = p0r[0] + f0i = p0r[1] + + p1r += pnext + + f1r = p1r[0] + f1i = p1r[1] + + f4r = f2r - f6r * w2i + f6i * w2r + f4i = f2i - f6r * w2r - f6i * w2i + f6r = f2r * Two - f4r + f6i = f2i * Two - f4i + + f5r = f3r - f7r * w3i + f7i * w3r + f5i = f3i - f7r * w3r - f7i * w3i + f7r = f3r * Two - f5r + f7i = f3i * Two - f5i + + p2r[0] = f4r + p3r[0] = f5r + p2r[1] = f4i + p3r[1] = f5i + p2r[pos] = f6r + p3r[pos] = f7r + p2r[posi] = f6i + p3r[posi] = f7i + + p2r += pnext + p3r += pnext + + SameUCnt -= 1 + } + + f2r = p2r[0] + f2i = p2r[1] + f3r = p3r[0] + f3i = p3r[1] + + t0r = f0r + f1r * w0r + f1i * w0i + t0i = f0i - f1r * w0i + f1i * w0r + f1r = f0r * Two - t0r + f1i = f0i * Two - t0i + + f4r = p0r[pos] + f4i = p0r[posi] + f5r = p1r[pos] + f5i = p1r[posi] + + f6r = p2r[pos] + f6i = p2r[posi] + f7r = p3r[pos] + f7i = p3r[posi] + + t1r = f2r - f3r * w0r - f3i * w0i + t1i = f2i + f3r * w0i - f3i * w0r + f2r = f2r * Two - t1r + f2i = f2i * Two - t1i + + f0r = t0r + f2r * w1r + f2i * w1i + f0i = t0i - f2r * w1i + f2i * w1r + f2r = t0r * Two - f0r + f2i = t0i * Two - f0i + + f3r = f1r + t1r * w1i - t1i * w1r + f3i = f1i + t1r * w1r + t1i * w1i + f1r = f1r * Two - f3r + f1i = f1i * Two - f3i + + if DiffUCnt == NDiffU / 2 { + Uinc4 = -Uinc4 + } + + u0r += Uinc4 + u0i -= Uinc4 + u1r += Uinc2 + u1i -= Uinc2 + u2r += Uinc + u2i -= Uinc + + pstrt += 2 + + t0r = f4r + f5r * w0r + f5i * w0i + t0i = f4i - f5r * w0i + f5i * w0r + f5r = f4r * Two - t0r + f5i = f4i * Two - t0i + + t1r = f6r - f7r * w0r - f7i * w0i + t1i = f6i + f7r * w0i - f7i * w0r + f6r = f6r * Two - t1r + f6i = f6i * Two - t1i + + f4r = t0r + f6r * w1r + f6i * w1i + f4i = t0i - f6r * w1i + f6i * w1r + f6r = t0r * Two - f4r + f6i = t0i * Two - f4i + + f7r = f5r + t1r * w1i - t1i * w1r + f7i = f5i + t1r * w1r + t1i * w1i + f5r = f5r * Two - f7r + f5i = f5i * Two - f7i + + w0r = u0r[0] + w0i = u0i[0] + w1r = u1r[0] + w1i = u1i[0] + + if DiffUCnt <= NDiffU / 2 { + w0r = -w0r + } + + t0r = f0r - f4r * w2r - f4i * w2i + t0i = f0i + f4r * w2i - f4i * w2r + f0r = f0r * Two - t0r + f0i = f0i * Two - t0i + + f4r = f2r - f6r * w2i + f6i * w2r + f4i = f2i - f6r * w2r - f6i * w2i + f6r = f2r * Two - f4r + f6i = f2i * Two - f4i + + p0r[pos] = t0r + p2r[0] = f4r + p0r[posi] = t0i + p2r[1] = f4i + w2r = u2r[0] + w2i = u2i[0] + p0r[0] = f0r + p2r[pos] = f6r + p0r[1] = f0i + p2r[posi] = f6i + + p0r = pstrt + p2r = pstrt.advanced(by: pinc + pinc) + + t1r = f1r - f5r * w3r - f5i * w3i + t1i = f1i + f5r * w3i - f5i * w3r + f1r = f1r * Two - t1r + f1i = f1i * Two - t1i + + f5r = f3r - f7r * w3i + f7i * w3r + f5i = f3i - f7r * w3r - f7i * w3i + f7r = f3r * Two - f5r + f7i = f3i * Two - f5i + + p1r[pos] = t1r + p3r[0] = f5r + p1r[posi] = t1i + p3r[1] = f5i + w3r = u2r[U2toU3] + w3i = u2i[-U2toU3] + p1r[0] = f1r + p3r[pos] = f7r + p1r[1] = f1i + p3r[posi] = f7i + + p1r = pstrt.advanced(by: pinc) + p3r = p2r.advanced(by: pinc) + + DiffUCnt -= 1 + } + + NSameU /= 8 + Uinc /= 8 + Uinc2 /= 8 + Uinc4 = Uinc * 4 + NDiffU *= 8 + pinc *= 8 + pnext *= 8 + pos *= 8 + posi = pos + 1 + } +} + +// MARK: - FFT Tables + +private func fftCosInit(_ M: Int) -> [Float] { + let fftN = pow2(M) + return (0...fftN / 4).map { i in + switch i { + case 0: + 1 + case fftN / 4: + 0 + default: + cos(2.0 * .pi * Float(i) / Float(fftN)) + } + } +} + +private func fftBRInit(_ M: Int) -> [Int] { + let Mroot_1 = M / 2 - 1 + let Nroot_1 = pow2(Mroot_1) + return (0..> bit : 0) + } + } +} + +private func pow2(_ n: Int) -> Int { + 1 << n +} diff --git a/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenPTrack.swift b/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenPTrack.swift new file mode 100644 index 0000000..3ad9bd4 --- /dev/null +++ b/Packages/MicrophonePitchDetector/Sources/ZenPTrack/ZenPTrack.swift @@ -0,0 +1,459 @@ +/* + * PTrack + * + * This code has been extracted from the Csound opcode "ptrack". + * It was rewritten in Swift by JP Simard for use in Zen Tuner. + * + * Original Author(s): Victor Lazzarini, Miller Puckette (Original Algorithm), Aurelius Prochazka + * Year: 2007 + * Location: Opcodes/pitchtrack.c + * + */ + +import Darwin + +// Since this file was ported from C with many variable names preserved, disable SwiftLint +// swiftlint:disable:next blanket_disable_command +// swiftlint:disable all + +private let MINFREQINBINS = 5.0 +private let NPREV = 20 +private let MINBW = 0.03 +private let BINPEROCT = 48 +private let BPEROOVERLOG2 = 69.24936196 +private let FACTORTOBINS = 4 / 0.0145453 +private let BINGUARD = 10 +private let PARTIALDEVIANCE = 0.023 +private let DBSCAL = 3.333 +private let DBOFFSET = -92.3 +private let MINBIN = 3 +private let MINAMPS = 40.0 + +private let THRSH: Float = 10 + +private let COEF1: Float = 0.5 * 1.227054 +private let COEF2: Float = 0.5 * -0.302385 +private let COEF3: Float = 0.5 * 0.095326 +private let COEF4: Float = 0.5 * -0.022748 +private let COEF5: Float = 0.5 * 0.002533 +private let FLTLEN = 5 +private let HALF_SQRT_TWO = sqrtf(2) / 2 + +public struct ZenPTrack { + fileprivate let size: Double + fileprivate let numpks: Int + fileprivate let sr: Double + fileprivate let sinTable: [Float] + fileprivate let hopsize: Int + fileprivate let winsize: Int + fileprivate var signal: [Float] + fileprivate var spec1: [Float] + fileprivate var spec2: [Float] + fileprivate var prev: [Float] + fileprivate var peaklist = [Peak]() + fileprivate var cnt = 0 + fileprivate var histcnt = 0 + fileprivate var cps = 0.0 + fileprivate var dbs = Array(repeating: -144.0, count: 20) + fileprivate var fft: ZenFFT + + public init(sampleRate: Double, hopSize: Double, peakCount: Int) { + size = hopSize + numpks = peakCount + sr = sampleRate + hopsize = Int(size) + winsize = hopsize * 2 + + precondition(winsize.isPowerOfTwo) + + let powtwo = Int(log2(Double(winsize))) + + fft = ZenFFT(M: powtwo - 1, size: size) + signal = Array(repeating: 0, count: hopsize) + prev = Array(repeating: 0, count: winsize + 4 * FLTLEN) + spec1 = Array(repeating: 0, count: winsize * 4) + spec2 = Array(repeating: 0, count: winsize * 4 + 4 * FLTLEN) + peaklist = Array(repeating: Peak(), count: numpks + 1) + + sinTable = { [hopsize, winsize] in + Array(unsafeUninitializedCapacity: hopsize * 2) { buffer, initializedCount in + for i in 0..= MINAMPS { + ptrack(totals: totals) + } + } + + mutating func computePowerTotals() -> PowerTotals { + var totals = PowerTotals() + for i in stride(from: 4 * MINBIN, to: (winsize - 2) * 4, by: 4) { + let re = spec1[i] - 0.5 * (spec1[i - 8] + spec1[i + 8]) + let im = spec1[i + 1] - 0.5 * (spec1[i - 7] + spec1[i + 9]) + let power = re * re + im * im + spec1[i + 2] = power + totals.power += Double(power) + spec1[i + 3] = Float(totals.power) + } + + if totals.power > 1.0e-9 { + totals.db = DBSCAL * log(totals.power / Double(winsize)) + totals.loudness = sqrt(sqrt(totals.power)) + totals.db = max(totals.db, 0) + } else { + totals.db = 0.0 + totals.loudness = 0.0 + } + + dbs[histcnt] = totals.db + DBOFFSET + return totals + } + + mutating func ptrack(totals: PowerTotals) { + var npeak = 0 + + ptrackPt2( + npeak: &npeak, + totalpower: totals.power + ) + + let histogram = ptrackPt3(npeak: npeak, totalloudness: totals.loudness) + var histpeak = HISTOPEAK(histogram: histogram) + + var cumpow = 0.0 + var freqnum = 0.0 + var freqden = 0.0 + var npartials = 0 + var nbelow8 = 0 + + ptrackPt5( + histpeak: histpeak, + npeak: npeak, + npartials: &npartials, + nbelow8: &nbelow8, + cumpow: &cumpow, + freqnum: &freqnum, + freqden: &freqden + ) + + ptrackPt6( + nbelow8: nbelow8, + npartials: npartials, + totalpower: totals.power, + histpeak: &histpeak, + cumpow: cumpow, + freqnum: freqnum, + freqden: freqden + ) + } + + mutating func ptrackPt2(npeak: inout Int, totalpower: Double) { + let spec = spec1 + for i in stride(from: 4 * MINBIN, to: 4 * (winsize - 2), by: 4) { + if npeak >= numpks { break } + let height = spec[i + 2], h1 = spec[i - 2], h2 = spec[i + 6] + var totalfreq, peakfr, tmpfr1, tmpfr2, m, `var`, stdev: Float + + if height < h1 || height < h2 || h1 < 0.00001 * Float(totalpower) || h2 < 0.00001 * Float(totalpower) { continue } + + peakfr = ((spec[i - 8] - spec[i + 8]) * (2.0 * spec[i] - spec[i + 8] - spec[i - 8]) + + (spec[i - 7] - spec[i + 9]) * (2.0 * spec[i + 1] - spec[i + 9] - spec[i - 7])) / (height + height) + tmpfr1 = ((spec[i - 12] - spec[i + 4]) * (2.0 * spec[i - 4] - spec[i + 4] - spec[i - 12]) + + (spec[i - 11] - spec[i + 5]) * (2.0 * spec[i - 3] - spec[i + 5] - spec[i - 11])) / (2.0 * h1) - 1 + tmpfr2 = ((spec[i - 4] - spec[i + 12]) * (2.0 * spec[i + 4] - spec[i + 12] - spec[i - 4]) + + (spec[i - 3] - spec[i + 13]) * (2.0 * spec[i + 5] - spec[i + 13] - spec[i - 3])) / (2.0 * h2) + 1 + + m = (peakfr + tmpfr1 + tmpfr2) / 3 + `var` = ((peakfr - m) * (peakfr - m) + (tmpfr1 - m) * (tmpfr1 - m) + (tmpfr2 - m) * (tmpfr2 - m)) / 2 + + totalfreq = Float(i >> 2) + m + if `var` * Float(totalpower) > THRSH * height || `var` < 1.0e-30 { + continue + } + + stdev = sqrtf(`var`) + totalfreq = max(totalfreq, 4) + + peaklist[npeak] = Peak( + pfreq: Double(totalfreq), + pwidth: Double(stdev), + ppow: Double(height), + ploudness: sqrt(sqrt(Double(height))) + ) + npeak += 1 + } + } + + mutating func ptrackPt3(npeak: Int, totalloudness: Double) -> [Float] { + let histogram = spec2 + .withUnsafeMutableBufferPointer { $0.baseAddress!.advanced(by: BINGUARD) } + let maxbin = BINPEROCT * (Int(log2(Double(winsize))) - 2) + + for i in 0.. 16 || pnum < 1 { continue } + + let fipnum = Double(pnum) + let deviation = 1.0 - fpnum / fipnum + + guard abs(deviation) < PARTIALDEVIANCE else { + continue + } + + npartials += 1 + if pnum < 8 { nbelow8 += 1 } + cumpow += peak.ppow + let stdev = peak.pwidth > MINBW ? peak.pwidth : MINBW + let weight = 1.0 / pow(stdev * fipnum, 2) + freqden += weight + freqnum += weight * peak.pfreq / fipnum + } + } + + mutating func ptrackPt6(nbelow8: Int, npartials: Int, totalpower: Double, histpeak: inout HISTOPEAK, cumpow: Double, freqnum: Double, freqden: Double) { + if (nbelow8 < 4 || npartials < 7) && cumpow < 0.01 * totalpower { + return + } + + let freqinbins = freqnum / freqden + + if freqinbins < MINFREQINBINS { + return + } + + let hzperbin = sr / Double(winsize + winsize) + histpeak.hpitch = hzperbin * freqnum / freqden + cps = histpeak.hpitch + } + + mutating func setSpec() { + setSpecPt1() + setSpecPt2() + setSpecPt3() + setSpecPt4() + } + + mutating func setSpecPt1() { + for i in 0..> 1 + var j = 0 + var k = 2 * FLTLEN + + for _ in 0.. 0) && (self & (self - 1) == 0) + } +} From aff37b0a54241fa558e6936162613a415a7617d2 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Sun, 5 Nov 2023 10:20:22 -0500 Subject: [PATCH 22/27] [CI] Fix Xcode / Simulator versions (#82) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 408db61..6a38787 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,15 +12,15 @@ jobs: test: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app + DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - uses: actions/checkout@v3 - name: Test - run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.0" + run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.0.1" test_packages: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app + DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - uses: actions/checkout@v3 - name: Test @@ -28,7 +28,7 @@ jobs: macos: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app + DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - uses: actions/checkout@v3 - name: Build macOS @@ -36,7 +36,7 @@ jobs: watchos: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app + DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - uses: actions/checkout@v3 - name: Build watchOS From 532c81d5f94bdc05959f9ffe4b01b4a4ae646f24 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Sun, 5 Nov 2023 10:29:39 -0500 Subject: [PATCH 23/27] [CI] Update `actions/checkout` to v4 (#83) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a38787..1635d3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: env: DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.0.1" test_packages: @@ -22,7 +22,7 @@ jobs: env: DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test run: swift test --package-path Packages/MicrophonePitchDetector macos: @@ -30,7 +30,7 @@ jobs: env: DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build macOS run: xcodebuild build -scheme "Zen Tuner" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO watchos: @@ -38,7 +38,7 @@ jobs: env: DEVELOPER_DIR: /Applications/Xcode_15.0.1.app steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build watchOS run: xcodebuild build -scheme "ZenTuner_watchOS" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO lint: @@ -46,6 +46,6 @@ jobs: container: image: ghcr.io/realm/swiftlint:0.53.0 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run SwiftLint run: swiftlint lint --strict From 6729f12b6974821262aba7c7d23f631dc15e394e Mon Sep 17 00:00:00 2001 From: JP Simard Date: Sun, 5 Nov 2023 10:33:24 -0500 Subject: [PATCH 24/27] Update SwiftSyntax (#84) --- Packages/MicrophonePitchDetector/Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Package.resolved b/Packages/MicrophonePitchDetector/Package.resolved index d2dfc75..ddfe5f0 100644 --- a/Packages/MicrophonePitchDetector/Package.resolved +++ b/Packages/MicrophonePitchDetector/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-syntax.git", "state" : { - "revision" : "74203046135342e4a4a627476dd6caf8b28fe11b", - "version" : "509.0.0" + "revision" : "6ad4ea24b01559dde0773e3d091f1b9e36175036", + "version" : "509.0.2" } } ], From 69b2842f63581b6914f83fa06b44f6af3883181f Mon Sep 17 00:00:00 2001 From: Sam Soffes Date: Sun, 12 Nov 2023 05:25:37 -0800 Subject: [PATCH 25/27] Add setting to hide transposition menu (#85) * Hide concert pitch setting * Use AppStorage property wrapper * Wrap the whole header view * Revert development team * Update string to "Hide Transposition Menu" * Lint --- BuildSupport/iOS/Settings.bundle/Root.plist | 21 ++++++++++++++++++ .../iOS/Settings.bundle/en.lproj/Root.strings | Bin 0 -> 112 bytes ZenTuner.xcodeproj/project.pbxproj | 4 ++++ ZenTuner/Views/TunerView.swift | 13 +++++++---- 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 BuildSupport/iOS/Settings.bundle/Root.plist create mode 100644 BuildSupport/iOS/Settings.bundle/en.lproj/Root.strings diff --git a/BuildSupport/iOS/Settings.bundle/Root.plist b/BuildSupport/iOS/Settings.bundle/Root.plist new file mode 100644 index 0000000..f0df036 --- /dev/null +++ b/BuildSupport/iOS/Settings.bundle/Root.plist @@ -0,0 +1,21 @@ + + + + + StringsTable + Root + PreferenceSpecifiers + + + Type + PSToggleSwitchSpecifier + Title + Hide Transposition Menu + Key + HidesTranspositionMenu + DefaultValue + + + + + diff --git a/BuildSupport/iOS/Settings.bundle/en.lproj/Root.strings b/BuildSupport/iOS/Settings.bundle/en.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..690e32a919644475f8b16b94e98dcda459a9308b GIT binary patch literal 112 zcmezWPl>^UA(J76A(cUaA%vlbA(0`Ep_rk7As Date: Fri, 19 Jan 2024 02:21:35 -0500 Subject: [PATCH 26/27] Update to support visionOS (#86) --- .../MicrophonePitchDetector/MicrophoneAccess.swift | 4 ++-- ZenTuner.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift index bc2a2f3..177929d 100644 --- a/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift +++ b/Packages/MicrophonePitchDetector/Sources/MicrophonePitchDetector/MicrophoneAccess.swift @@ -7,7 +7,7 @@ enum MicrophoneAccess { } static func getOrRequestPermission() async -> Status { - if #available(iOS 17.0, macOS 14.0, watchOS 10.0, xrOS 1.0, *) { + if #available(iOS 17.0, macOS 14.0, watchOS 10.0, visionOS 1.0, *) { let recordPermission = AVAudioApplication.shared.recordPermission return switch recordPermission { case .undetermined: await AVAudioApplication.requestRecordPermission() ? .granted : .denied @@ -23,7 +23,7 @@ enum MicrophoneAccess { continuation.resume(with: .success(granted ? .granted : .denied)) } } -#elseif !os(xrOS) +#elseif !os(visionOS) let authorizationStatus = AVCaptureDevice.authorizationStatus(for: .audio) return switch authorizationStatus { case .notDetermined: await AVCaptureDevice.requestAccess(for: .audio) ? .granted : .denied diff --git a/ZenTuner.xcodeproj/project.pbxproj b/ZenTuner.xcodeproj/project.pbxproj index 59b81d3..9a01c50 100644 --- a/ZenTuner.xcodeproj/project.pbxproj +++ b/ZenTuner.xcodeproj/project.pbxproj @@ -807,7 +807,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -837,7 +837,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; }; @@ -865,7 +865,7 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZenTuner.app/ZenTuner"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -893,7 +893,7 @@ SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ZenTuner.app/ZenTuner"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; From 74b6862009189f02747c69538e7422c62639b961 Mon Sep 17 00:00:00 2001 From: JP Simard Date: Fri, 19 Jan 2024 02:32:30 -0500 Subject: [PATCH 27/27] [CI] Update to Xcode 15.2 (#87) --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1635d3e..52c44bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,15 +12,15 @@ jobs: test: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.1.app + DEVELOPER_DIR: /Applications/Xcode_15.2.app steps: - uses: actions/checkout@v4 - name: Test - run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.0.1" + run: xcodebuild test -scheme "Zen Tuner" -destination platform="iOS Simulator,name=iPhone 15 Pro Max,OS=17.2" test_packages: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.1.app + DEVELOPER_DIR: /Applications/Xcode_15.2.app steps: - uses: actions/checkout@v4 - name: Test @@ -28,7 +28,7 @@ jobs: macos: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.1.app + DEVELOPER_DIR: /Applications/Xcode_15.2.app steps: - uses: actions/checkout@v4 - name: Build macOS @@ -36,7 +36,7 @@ jobs: watchos: runs-on: macos-13 env: - DEVELOPER_DIR: /Applications/Xcode_15.0.1.app + DEVELOPER_DIR: /Applications/Xcode_15.2.app steps: - uses: actions/checkout@v4 - name: Build watchOS @@ -44,7 +44,7 @@ jobs: lint: runs-on: ubuntu-22.04 container: - image: ghcr.io/realm/swiftlint:0.53.0 + image: ghcr.io/realm/swiftlint:0.54.0 steps: - uses: actions/checkout@v4 - name: Run SwiftLint