├── ScreenShots ├── ScreenShot1.png ├── ScreenShot2.png ├── ScreenShot3.png └── ScreenShot4.png ├── Pitch Perfect ├── Assets.xcassets │ ├── Contents.json │ ├── AppIcon.appiconset │ │ ├── Icon-40.png │ │ ├── Icon-76.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-40@3x.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-Small.png │ │ ├── Icon-40@2x-1.png │ │ ├── Icon-Small@2x-1.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon-Small@3x.png │ │ └── Contents.json │ ├── echoButton.imageset │ │ ├── echo_100.png │ │ ├── echo_200.png │ │ ├── echo_300.png │ │ └── Contents.json │ ├── snailButton.imageset │ │ ├── slow_100.png │ │ ├── slow_200.png │ │ ├── slow_300.png │ │ └── Contents.json │ ├── stopButton.imageset │ │ ├── stop_100.png │ │ ├── stop_150.png │ │ ├── stop_50.png │ │ └── Contents.json │ ├── rabbitButton.imageset │ │ ├── fast_100.png │ │ ├── fast_200.png │ │ ├── fast_300.png │ │ └── Contents.json │ ├── recordButton.imageset │ │ ├── record_100.png │ │ ├── record_200.png │ │ ├── record_300.png │ │ └── Contents.json │ ├── reverbButton.imageset │ │ ├── reverb_100.png │ │ ├── reverb_200.png │ │ ├── reverb_300.png │ │ └── Contents.json │ ├── chipmunkButton.imageset │ │ ├── chipmunk_100.png │ │ ├── chipmunk_200.png │ │ ├── chipmunk_300.png │ │ └── Contents.json │ └── darthVaderButton.imageset │ │ ├── darthvader_100.png │ │ ├── darthvader_200.png │ │ ├── darthvader_300.png │ │ └── Contents.json ├── RecordedAudio.swift ├── AppConstants.swift ├── Info.plist ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── AppDelegate.swift ├── RecordSoundsViewController.swift ├── PlaySoundsViewController+Audio.swift └── PlaySoundsViewController.swift ├── Pitch Perfect.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── iamsimranjot.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── iamsimranjot.xcuserdatad │ │ ├── xcschemes │ │ ├── xcschememanagement.plist │ │ └── Pitch Perfect.xcscheme │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── project.pbxproj ├── Pitch PerfectTests ├── Info.plist └── Pitch_PerfectTests.swift ├── Pitch PerfectUITests ├── Info.plist └── Pitch_PerfectUITests.swift └── README.md /ScreenShots/ScreenShot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot1.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot2.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot3.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/ScreenShots/ScreenShot4.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/echoButton.imageset/echo_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/snailButton.imageset/slow_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_150.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/stopButton.imageset/stop_50.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/rabbitButton.imageset/fast_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/recordButton.imageset/record_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/recordButton.imageset/record_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/recordButton.imageset/record_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/recordButton.imageset/record_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/reverbButton.imageset/reverb_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/chipmunk_300.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_100.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_200.png -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/darthvader_300.png -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/project.xcworkspace/xcuserdata/iamsimranjot.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamsimranjot/Pitch-Perfect/HEAD/Pitch Perfect.xcodeproj/project.xcworkspace/xcuserdata/iamsimranjot.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/stopButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "stop_50.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "stop_100.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "stop_150.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/echoButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "echo_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "echo_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "echo_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/rabbitButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "fast_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "fast_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "fast_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/snailButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "slow_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "slow_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "slow_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/recordButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "record_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "record_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "record_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/reverbButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "reverb_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "reverb_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "reverb_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/chipmunkButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "chipmunk_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "chipmunk_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "chipmunk_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/darthVaderButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "darthvader_100.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "darthvader_200.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "darthvader_300.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Pitch Perfect/RecordedAudio.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecordedAudio.swift 3 | // Pitch Perfect 4 | // 5 | // Created by SimranJot Singh on 14/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | //We can think of this class acting as a Model 12 | 13 | class RecordedAudio: NSObject { 14 | 15 | //Properties 16 | 17 | var filePathUrl: NSURL! 18 | var title: String! { 19 | 20 | get{ 21 | 22 | return filePathUrl.lastPathComponent 23 | } 24 | } 25 | 26 | //Initializer 27 | 28 | init(filePathUrl: NSURL) { 29 | self.filePathUrl = filePathUrl 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Pitch PerfectTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Pitch PerfectUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pitch Perfect.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 701C3A351D9693E2006F14A7 16 | 17 | primary 18 | 19 | 20 | 701C3A491D9693E2006F14A7 21 | 22 | primary 23 | 24 | 25 | 701C3A541D9693E2006F14A7 26 | 27 | primary 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Pitch PerfectTests/Pitch_PerfectTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pitch_PerfectTests.swift 3 | // Pitch PerfectTests 4 | // 5 | // Created by SimranJot Singh on 13/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Pitch_Perfect 11 | 12 | class Pitch_PerfectTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Pitch Perfect/AppConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppConstants.swift 3 | // Pitch Perfect 4 | // 5 | // Created by SimranJot Singh on 14/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | struct AppConstants { 10 | 11 | static let audioFileName = "recordedVoice.wav" 12 | static let stopRecordingSegueIdentifier = "stopRecording" 13 | 14 | struct labels { 15 | 16 | static let Recording = "Recording in Progress" 17 | static let ReadyToRecord = "Tap to Record" 18 | } 19 | 20 | struct alerts { 21 | 22 | static let dismiss = "Dismiss" 23 | static let recordingAudioError = "Audio Recording Error" 24 | static let recordingUnsuccessful = "Recording Un-Successful" 25 | static let recordingUnsuccessfulMessage = "Something went wrong with your recording." 26 | static let audioSessionError = "Audio Session Error" 27 | static let audioRecorderError = "Audio Recorder Error" 28 | static let recordingDisabledTitle = "Recording Disabled" 29 | static let recordingDisabledMessage = "You've disabled Pitch Perfect from recording your microphone. Check Settings." 30 | static let audioFileError = "Audio File Error" 31 | static let audioEngineError = "Audio Engine Error" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Pitch PerfectUITests/Pitch_PerfectUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pitch_PerfectUITests.swift 3 | // Pitch PerfectUITests 4 | // 5 | // Created by SimranJot Singh on 13/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class Pitch_PerfectUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | 18 | // In UI tests it is usually best to stop immediately when a failure occurs. 19 | continueAfterFailure = false 20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 21 | if #available(iOS 9.0, *) { 22 | XCUIApplication().launch() 23 | } else { 24 | // Fallback on earlier versions 25 | } 26 | 27 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 28 | } 29 | 30 | override func tearDown() { 31 | // Put teardown code here. This method is called after the invocation of each test method in the class. 32 | super.tearDown() 33 | } 34 | 35 | func testExample() { 36 | // Use recording to get started writing UI tests. 37 | // Use XCTAssert and related functions to verify your tests produce the correct results. 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Pitch Perfect/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | NSMicrophoneUsageDescription 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pitch-Perfect 2 | ### iOS Developer Nano Degree Project 3 | 4 | The Pitch Perfect app is result of Intro to iOS App Development with Swift lesson of Udacity's iOS Developer Nanodegree course. 5 | 6 | The App allows users to Record a sound using the Device’s Microphone. It then Allows Users to Play the Recorded Sound back with six different Sound Modulations: _Chipmunk_, _Darth Vader_, _Slow_, Fast with _Reverb_ and _Echo_ effect. 7 | 8 | Basic features Based on the criteria found in here: 9 | - https://docs.google.com/document/d/1LlcUT90j-ItbRQpB3ivLHwjP-KgKOUdoOLpz0WirpSo/pub?embedded=true 10 | 11 | ![](/ScreenShots/ScreenShot1.png) ![](/ScreenShots/ScreenShot2.png) ![](/ScreenShots/ScreenShot4.png) 12 | 13 | ## Implementation 14 | 15 | Pitch Perfect has two Scenes: 16 | 17 | - **RecordSoundsViewController** : consists a record button with a microphone image. Tapping this microphone button starts an audio recording session and present a stop button. When the stop button is clicked, the app completes recording and then show the PlaySound controller. 18 | - **PlaySoundsViewController** : contains six buttons to play the recorded sound file with different effects related to the button image and a stop button at the bottom 19 | 20 | *The App supports both orientations. I have varied traits for the landscape orientation of PlaySoundsViewController to make it look good with the use of stack views. App also gives a nice Pop Animation when ever we change the orientation.* 21 | 22 | The application uses code from `AVFoundation` to record sounds from the microphone `(AVAudioRecorder)` and play recorded audio with effects `(AVAudioPlayer, AVAudioEngine)`. 23 | 24 | ## Requirements 25 | 26 | - Xcode 8 Above 27 | - Swift 3.0 28 | -------------------------------------------------------------------------------- /Pitch Perfect/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Pitch Perfect/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Pitch Perfect 4 | // 5 | // Created by SimranJot Singh on 13/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Pitch Perfect/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "size" : "29x29", 15 | "idiom" : "iphone", 16 | "filename" : "Icon-Small@2x.png", 17 | "scale" : "2x" 18 | }, 19 | { 20 | "size" : "29x29", 21 | "idiom" : "iphone", 22 | "filename" : "Icon-Small@3x.png", 23 | "scale" : "3x" 24 | }, 25 | { 26 | "size" : "40x40", 27 | "idiom" : "iphone", 28 | "filename" : "Icon-40@2x.png", 29 | "scale" : "2x" 30 | }, 31 | { 32 | "size" : "40x40", 33 | "idiom" : "iphone", 34 | "filename" : "Icon-40@3x.png", 35 | "scale" : "3x" 36 | }, 37 | { 38 | "size" : "60x60", 39 | "idiom" : "iphone", 40 | "filename" : "Icon-60@2x.png", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "60x60", 45 | "idiom" : "iphone", 46 | "filename" : "Icon-60@3x.png", 47 | "scale" : "3x" 48 | }, 49 | { 50 | "idiom" : "ipad", 51 | "size" : "20x20", 52 | "scale" : "1x" 53 | }, 54 | { 55 | "idiom" : "ipad", 56 | "size" : "20x20", 57 | "scale" : "2x" 58 | }, 59 | { 60 | "size" : "29x29", 61 | "idiom" : "ipad", 62 | "filename" : "Icon-Small.png", 63 | "scale" : "1x" 64 | }, 65 | { 66 | "size" : "29x29", 67 | "idiom" : "ipad", 68 | "filename" : "Icon-Small@2x-1.png", 69 | "scale" : "2x" 70 | }, 71 | { 72 | "size" : "40x40", 73 | "idiom" : "ipad", 74 | "filename" : "Icon-40.png", 75 | "scale" : "1x" 76 | }, 77 | { 78 | "size" : "40x40", 79 | "idiom" : "ipad", 80 | "filename" : "Icon-40@2x-1.png", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "size" : "76x76", 85 | "idiom" : "ipad", 86 | "filename" : "Icon-76.png", 87 | "scale" : "1x" 88 | }, 89 | { 90 | "size" : "76x76", 91 | "idiom" : "ipad", 92 | "filename" : "Icon-76@2x.png", 93 | "scale" : "2x" 94 | }, 95 | { 96 | "idiom" : "ipad", 97 | "size" : "83.5x83.5", 98 | "scale" : "2x" 99 | } 100 | ], 101 | "info" : { 102 | "version" : 1, 103 | "author" : "xcode" 104 | } 105 | } -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 14 | 15 | 16 | 18 | 30 | 31 | 32 | 34 | 46 | 47 | 48 | 50 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/xcuserdata/iamsimranjot.xcuserdatad/xcschemes/Pitch Perfect.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 74 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 95 | 101 | 102 | 103 | 104 | 106 | 107 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /Pitch Perfect/RecordSoundsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecordSoundsViewController.swift 3 | // Pitch Perfect 4 | // 5 | // Created by SimranJot Singh on 13/10/16. 6 | // Copyright © 2016 SimranJot Singh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import AVFoundation 11 | 12 | class RecordSoundsViewController: UIViewController { 13 | 14 | //MARK: Outlets 15 | 16 | @IBOutlet weak var recordingLabel: UILabel! 17 | @IBOutlet weak var recordButton: UIButton! 18 | @IBOutlet weak var stopRecordingButton: UIButton! 19 | 20 | //MARK: Properties 21 | 22 | var audioRecorder: AVAudioRecorder! 23 | var recordedAudio: RecordedAudio! 24 | private var recordingEnabled: Bool! = false 25 | 26 | //MARK:: Enum 27 | 28 | enum RecordingState { case WaitingToRecord, Recording } 29 | 30 | //MARK: LifeCycle Methods 31 | 32 | override func viewDidLoad() { 33 | super.viewDidLoad() 34 | 35 | //Congigure Audio Session 36 | configureAudioSession() 37 | } 38 | 39 | override func viewWillAppear(_ animated: Bool) { 40 | super.viewWillAppear(animated) 41 | 42 | configureUI(recordingState: .WaitingToRecord) 43 | } 44 | 45 | //MARK: IBActions 46 | 47 | @IBAction func recordAudio(_ sender: AnyObject) { 48 | 49 | guard recordingEnabled == true else { 50 | 51 | showAlert(title: AppConstants.alerts.recordingDisabledTitle, errorMessage: AppConstants.alerts.recordingDisabledMessage) 52 | return 53 | } 54 | 55 | configureUI(recordingState: .Recording) 56 | 57 | do { 58 | recordedAudio = RecordedAudio(filePathUrl: createAudioFilePath()) 59 | audioRecorder = try AVAudioRecorder(url: recordedAudio.filePathUrl as URL, settings: [:]) 60 | audioRecorder.delegate = self 61 | } catch { 62 | 63 | showAlert(title: AppConstants.alerts.audioRecorderError, errorMessage: String(describing: error)) 64 | } 65 | 66 | audioRecorder.isMeteringEnabled = true 67 | audioRecorder.prepareToRecord() 68 | audioRecorder.record() 69 | } 70 | 71 | @IBAction func stopRecording(_ sender: AnyObject) { 72 | 73 | audioRecorder.stop() 74 | 75 | let audioSession = AVAudioSession.sharedInstance() 76 | try! audioSession.setActive(false) 77 | 78 | } 79 | 80 | //MARK: Helper Methods 81 | 82 | private func createAudioFilePath() -> NSURL { 83 | 84 | let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as [String] 85 | let documentsDirectory = paths[0] 86 | let audioURL = NSURL(fileURLWithPath: documentsDirectory).appendingPathComponent(AppConstants.audioFileName)! 87 | return audioURL as NSURL 88 | } 89 | 90 | private func configureAudioSession(){ 91 | 92 | let session = AVAudioSession.sharedInstance() 93 | do { 94 | 95 | try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.defaultToSpeaker) 96 | try session.setActive(true) 97 | session.requestRecordPermission{ (granted) in 98 | self.recordingEnabled = granted 99 | } 100 | } catch { 101 | 102 | showAlert(title: AppConstants.alerts.audioSessionError, errorMessage: String(describing: error)) 103 | } 104 | } 105 | 106 | private func configureUI(recordingState: RecordingState) { 107 | 108 | switch recordingState { 109 | 110 | case .WaitingToRecord: 111 | recordingLabel.text = AppConstants.labels.ReadyToRecord 112 | recordButton.isEnabled = true 113 | stopRecordingButton.isEnabled = false 114 | 115 | case .Recording: 116 | recordingLabel.text = AppConstants.labels.Recording 117 | recordButton.isEnabled = false 118 | stopRecordingButton.isEnabled = true 119 | } 120 | } 121 | 122 | func showAlert(title: String, errorMessage: String) { 123 | 124 | let alert = UIAlertController(title: title, message: errorMessage, preferredStyle: .alert) 125 | alert.addAction(UIAlertAction(title: AppConstants.alerts.dismiss, style: .default, handler: { (UIAlertAction) in 126 | self.configureUI(recordingState: .WaitingToRecord) 127 | })) 128 | 129 | present(alert, animated: true, completion: nil) 130 | } 131 | 132 | //MARK: prepareForSegue 133 | 134 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 135 | 136 | if (segue.identifier == AppConstants.stopRecordingSegueIdentifier) { 137 | let playSoundsVC = segue.destination as! PlaySoundsViewController 138 | let recordedAudioURL = sender as! RecordedAudio 139 | playSoundsVC.receivedAudioURL = recordedAudioURL 140 | playSoundsVC.view.layoutIfNeeded() 141 | } 142 | } 143 | } 144 | 145 | //MARK: AVAudioRecorderDelegate Extension 146 | 147 | extension RecordSoundsViewController: AVAudioRecorderDelegate { 148 | 149 | func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) { 150 | 151 | if(flag){ 152 | 153 | self.performSegue(withIdentifier: AppConstants.stopRecordingSegueIdentifier, sender: recordedAudio) 154 | 155 | }else{ 156 | 157 | showAlert(title: AppConstants.alerts.recordingUnsuccessful, errorMessage: AppConstants.alerts.recordingUnsuccessfulMessage) 158 | } 159 | } 160 | 161 | func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) { 162 | 163 | if let error = error { 164 | 165 | showAlert(title: AppConstants.alerts.recordingAudioError, errorMessage: error.localizedDescription) 166 | } 167 | 168 | } 169 | } 170 | 171 | -------------------------------------------------------------------------------- /Pitch Perfect/PlaySoundsViewController+Audio.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaySoundsViewController+Audio.swift 3 | // PitchPerfect 4 | // 5 | // Copyright © 2016 Udacity. All rights reserved. 6 | // 7 | import UIKit 8 | import AVFoundation 9 | 10 | extension PlaySoundsViewController: AVAudioPlayerDelegate { 11 | 12 | // raw values correspond to sender tags 13 | enum PlayingState { case Playing, NotPlaying } 14 | 15 | 16 | // MARK: Audio Functions 17 | 18 | func setupAudio() { 19 | // initialize (recording) audio file 20 | do { 21 | audioFile = try AVAudioFile(forReading: receivedAudioURL.filePathUrl as URL) 22 | } catch { 23 | 24 | showAlert(title: AppConstants.alerts.audioFileError, message: String(describing: error)) 25 | } 26 | print("Audio has been setup") 27 | } 28 | 29 | func playSound(rate: Float? = nil, pitch: Float? = nil, echo: Bool = false, reverb: Bool = false) { 30 | 31 | // initialize audio engine components 32 | audioEngine = AVAudioEngine() 33 | 34 | // node for playing audio 35 | audioPlayerNode = AVAudioPlayerNode() 36 | audioEngine.attach(audioPlayerNode) 37 | 38 | // node for adjusting rate/pitch 39 | let changeRatePitchNode = AVAudioUnitTimePitch() 40 | if let pitch = pitch { 41 | changeRatePitchNode.pitch = pitch 42 | } 43 | if let rate = rate { 44 | changeRatePitchNode.rate = rate 45 | } 46 | audioEngine.attach(changeRatePitchNode) 47 | 48 | // node for echo 49 | let echoNode = AVAudioUnitDistortion() 50 | echoNode.loadFactoryPreset(.multiEcho1) 51 | audioEngine.attach(echoNode) 52 | 53 | // node for reverb 54 | let reverbNode = AVAudioUnitReverb() 55 | reverbNode.loadFactoryPreset(.cathedral) 56 | reverbNode.wetDryMix = 50 57 | audioEngine.attach(reverbNode) 58 | 59 | // connect nodes 60 | if echo == true && reverb == true { 61 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, echoNode, reverbNode, audioEngine.outputNode) 62 | } else if echo == true { 63 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, echoNode, audioEngine.outputNode) 64 | } else if reverb == true { 65 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, reverbNode, audioEngine.outputNode) 66 | } else { 67 | connectAudioNodes(nodes: audioPlayerNode, changeRatePitchNode, audioEngine.outputNode) 68 | } 69 | 70 | // schedule to play and start the engine! 71 | audioPlayerNode.stop() 72 | audioPlayerNode.scheduleFile(audioFile, at: nil) { 73 | 74 | var delayInSeconds: Double = 0 75 | 76 | if let lastRenderTime = self.audioPlayerNode.lastRenderTime, let playerTime = self.audioPlayerNode.playerTime(forNodeTime: lastRenderTime) { 77 | 78 | if let rate = rate { 79 | delayInSeconds = Double(self.audioFile.length - playerTime.sampleTime) / Double(self.audioFile.processingFormat.sampleRate) / Double(rate) 80 | } else { 81 | delayInSeconds = Double(self.audioFile.length - playerTime.sampleTime) / Double(self.audioFile.processingFormat.sampleRate) 82 | } 83 | } 84 | 85 | // schedule a stop timer for when audio finishes playing 86 | self.stopTimer = Timer(timeInterval: delayInSeconds, target: self, selector: #selector(PlaySoundsViewController.stopAudio), userInfo: nil, repeats: false) 87 | RunLoop.main.add(self.stopTimer!, forMode: RunLoopMode.defaultRunLoopMode) 88 | } 89 | 90 | do { 91 | try audioEngine.start() 92 | } catch { 93 | showAlert(title: AppConstants.alerts.audioEngineError, message: String(describing: error)) 94 | return 95 | } 96 | 97 | // play the recording! 98 | audioPlayerNode.play() 99 | } 100 | 101 | 102 | // MARK: Connect List of Audio Nodes 103 | 104 | func connectAudioNodes(nodes: AVAudioNode...) { 105 | for x in 0.. 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 30 | 35 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 86 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 104 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 122 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /Pitch Perfect.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 701C3A3A1D9693E2006F14A7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A391D9693E2006F14A7 /* AppDelegate.swift */; }; 11 | 701C3A3C1D9693E2006F14A7 /* RecordSoundsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */; }; 12 | 701C3A3F1D9693E2006F14A7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A3D1D9693E2006F14A7 /* Main.storyboard */; }; 13 | 701C3A411D9693E2006F14A7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A401D9693E2006F14A7 /* Assets.xcassets */; }; 14 | 701C3A441D9693E2006F14A7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */; }; 15 | 701C3A4F1D9693E2006F14A7 /* Pitch_PerfectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */; }; 16 | 701C3A5A1D9693E2006F14A7 /* Pitch_PerfectUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */; }; 17 | 704EB53E1D96FCC8007B36B5 /* PlaySoundsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */; }; 18 | 704EB5401D97143F007B36B5 /* PlaySoundsViewController+Audio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */; }; 19 | 70D884281DB01F56004B69A7 /* AppConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D884271DB01F55004B69A7 /* AppConstants.swift */; }; 20 | 70D8842A1DB0AC22004B69A7 /* RecordedAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 701C3A4B1D9693E2006F14A7 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 701C3A2E1D9693E2006F14A7 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 701C3A351D9693E2006F14A7; 29 | remoteInfo = "Pitch Perfect"; 30 | }; 31 | 701C3A561D9693E2006F14A7 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 701C3A2E1D9693E2006F14A7 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 701C3A351D9693E2006F14A7; 36 | remoteInfo = "Pitch Perfect"; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Pitch Perfect.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 701C3A391D9693E2006F14A7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 43 | 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordSoundsViewController.swift; sourceTree = ""; }; 44 | 701C3A3E1D9693E2006F14A7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 701C3A401D9693E2006F14A7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 701C3A431D9693E2006F14A7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 701C3A451D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pitch PerfectTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pitch_PerfectTests.swift; sourceTree = ""; }; 50 | 701C3A501D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pitch PerfectUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pitch_PerfectUITests.swift; sourceTree = ""; }; 53 | 701C3A5B1D9693E2006F14A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaySoundsViewController.swift; sourceTree = ""; }; 55 | 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PlaySoundsViewController+Audio.swift"; sourceTree = ""; }; 56 | 70D884271DB01F55004B69A7 /* AppConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppConstants.swift; sourceTree = ""; }; 57 | 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordedAudio.swift; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 701C3A331D9693E2006F14A7 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | 701C3A471D9693E2006F14A7 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | 701C3A521D9693E2006F14A7 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | /* End PBXFrameworksBuildPhase section */ 83 | 84 | /* Begin PBXGroup section */ 85 | 701C3A2D1D9693E2006F14A7 = { 86 | isa = PBXGroup; 87 | children = ( 88 | 701C3A381D9693E2006F14A7 /* Pitch Perfect */, 89 | 701C3A4D1D9693E2006F14A7 /* Pitch PerfectTests */, 90 | 701C3A581D9693E2006F14A7 /* Pitch PerfectUITests */, 91 | 701C3A371D9693E2006F14A7 /* Products */, 92 | ); 93 | sourceTree = ""; 94 | }; 95 | 701C3A371D9693E2006F14A7 /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */, 99 | 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */, 100 | 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */, 101 | ); 102 | name = Products; 103 | sourceTree = ""; 104 | }; 105 | 701C3A381D9693E2006F14A7 /* Pitch Perfect */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 701C3A391D9693E2006F14A7 /* AppDelegate.swift */, 109 | 701C3A3B1D9693E2006F14A7 /* RecordSoundsViewController.swift */, 110 | 70D884291DB0AC22004B69A7 /* RecordedAudio.swift */, 111 | 70D884271DB01F55004B69A7 /* AppConstants.swift */, 112 | 704EB53D1D96FCC8007B36B5 /* PlaySoundsViewController.swift */, 113 | 704EB53F1D97143F007B36B5 /* PlaySoundsViewController+Audio.swift */, 114 | 701C3A3D1D9693E2006F14A7 /* Main.storyboard */, 115 | 701C3A401D9693E2006F14A7 /* Assets.xcassets */, 116 | 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */, 117 | 701C3A451D9693E2006F14A7 /* Info.plist */, 118 | ); 119 | path = "Pitch Perfect"; 120 | sourceTree = ""; 121 | }; 122 | 701C3A4D1D9693E2006F14A7 /* Pitch PerfectTests */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | 701C3A4E1D9693E2006F14A7 /* Pitch_PerfectTests.swift */, 126 | 701C3A501D9693E2006F14A7 /* Info.plist */, 127 | ); 128 | path = "Pitch PerfectTests"; 129 | sourceTree = ""; 130 | }; 131 | 701C3A581D9693E2006F14A7 /* Pitch PerfectUITests */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 701C3A591D9693E2006F14A7 /* Pitch_PerfectUITests.swift */, 135 | 701C3A5B1D9693E2006F14A7 /* Info.plist */, 136 | ); 137 | path = "Pitch PerfectUITests"; 138 | sourceTree = ""; 139 | }; 140 | /* End PBXGroup section */ 141 | 142 | /* Begin PBXNativeTarget section */ 143 | 701C3A351D9693E2006F14A7 /* Pitch Perfect */ = { 144 | isa = PBXNativeTarget; 145 | buildConfigurationList = 701C3A5E1D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch Perfect" */; 146 | buildPhases = ( 147 | 701C3A321D9693E2006F14A7 /* Sources */, 148 | 701C3A331D9693E2006F14A7 /* Frameworks */, 149 | 701C3A341D9693E2006F14A7 /* Resources */, 150 | ); 151 | buildRules = ( 152 | ); 153 | dependencies = ( 154 | ); 155 | name = "Pitch Perfect"; 156 | productName = "Pitch Perfect"; 157 | productReference = 701C3A361D9693E2006F14A7 /* Pitch Perfect.app */; 158 | productType = "com.apple.product-type.application"; 159 | }; 160 | 701C3A491D9693E2006F14A7 /* Pitch PerfectTests */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = 701C3A611D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectTests" */; 163 | buildPhases = ( 164 | 701C3A461D9693E2006F14A7 /* Sources */, 165 | 701C3A471D9693E2006F14A7 /* Frameworks */, 166 | 701C3A481D9693E2006F14A7 /* Resources */, 167 | ); 168 | buildRules = ( 169 | ); 170 | dependencies = ( 171 | 701C3A4C1D9693E2006F14A7 /* PBXTargetDependency */, 172 | ); 173 | name = "Pitch PerfectTests"; 174 | productName = "Pitch PerfectTests"; 175 | productReference = 701C3A4A1D9693E2006F14A7 /* Pitch PerfectTests.xctest */; 176 | productType = "com.apple.product-type.bundle.unit-test"; 177 | }; 178 | 701C3A541D9693E2006F14A7 /* Pitch PerfectUITests */ = { 179 | isa = PBXNativeTarget; 180 | buildConfigurationList = 701C3A641D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectUITests" */; 181 | buildPhases = ( 182 | 701C3A511D9693E2006F14A7 /* Sources */, 183 | 701C3A521D9693E2006F14A7 /* Frameworks */, 184 | 701C3A531D9693E2006F14A7 /* Resources */, 185 | ); 186 | buildRules = ( 187 | ); 188 | dependencies = ( 189 | 701C3A571D9693E2006F14A7 /* PBXTargetDependency */, 190 | ); 191 | name = "Pitch PerfectUITests"; 192 | productName = "Pitch PerfectUITests"; 193 | productReference = 701C3A551D9693E2006F14A7 /* Pitch PerfectUITests.xctest */; 194 | productType = "com.apple.product-type.bundle.ui-testing"; 195 | }; 196 | /* End PBXNativeTarget section */ 197 | 198 | /* Begin PBXProject section */ 199 | 701C3A2E1D9693E2006F14A7 /* Project object */ = { 200 | isa = PBXProject; 201 | attributes = { 202 | LastSwiftUpdateCheck = 0800; 203 | LastUpgradeCheck = 0800; 204 | ORGANIZATIONNAME = "SimranJot Singh"; 205 | TargetAttributes = { 206 | 701C3A351D9693E2006F14A7 = { 207 | CreatedOnToolsVersion = 8.0; 208 | ProvisioningStyle = Automatic; 209 | }; 210 | 701C3A491D9693E2006F14A7 = { 211 | CreatedOnToolsVersion = 8.0; 212 | ProvisioningStyle = Automatic; 213 | }; 214 | 701C3A541D9693E2006F14A7 = { 215 | CreatedOnToolsVersion = 8.0; 216 | ProvisioningStyle = Automatic; 217 | }; 218 | }; 219 | }; 220 | buildConfigurationList = 701C3A311D9693E2006F14A7 /* Build configuration list for PBXProject "Pitch Perfect" */; 221 | compatibilityVersion = "Xcode 3.2"; 222 | developmentRegion = English; 223 | hasScannedForEncodings = 0; 224 | knownRegions = ( 225 | en, 226 | Base, 227 | ); 228 | mainGroup = 701C3A2D1D9693E2006F14A7; 229 | productRefGroup = 701C3A371D9693E2006F14A7 /* Products */; 230 | projectDirPath = ""; 231 | projectRoot = ""; 232 | targets = ( 233 | 701C3A351D9693E2006F14A7 /* Pitch Perfect */, 234 | 701C3A491D9693E2006F14A7 /* Pitch PerfectTests */, 235 | 701C3A541D9693E2006F14A7 /* Pitch PerfectUITests */, 236 | ); 237 | }; 238 | /* End PBXProject section */ 239 | 240 | /* Begin PBXResourcesBuildPhase section */ 241 | 701C3A341D9693E2006F14A7 /* Resources */ = { 242 | isa = PBXResourcesBuildPhase; 243 | buildActionMask = 2147483647; 244 | files = ( 245 | 701C3A441D9693E2006F14A7 /* LaunchScreen.storyboard in Resources */, 246 | 701C3A411D9693E2006F14A7 /* Assets.xcassets in Resources */, 247 | 701C3A3F1D9693E2006F14A7 /* Main.storyboard in Resources */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | 701C3A481D9693E2006F14A7 /* Resources */ = { 252 | isa = PBXResourcesBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | }; 258 | 701C3A531D9693E2006F14A7 /* Resources */ = { 259 | isa = PBXResourcesBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | }; 265 | /* End PBXResourcesBuildPhase section */ 266 | 267 | /* Begin PBXSourcesBuildPhase section */ 268 | 701C3A321D9693E2006F14A7 /* Sources */ = { 269 | isa = PBXSourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | 70D8842A1DB0AC22004B69A7 /* RecordedAudio.swift in Sources */, 273 | 701C3A3C1D9693E2006F14A7 /* RecordSoundsViewController.swift in Sources */, 274 | 704EB5401D97143F007B36B5 /* PlaySoundsViewController+Audio.swift in Sources */, 275 | 704EB53E1D96FCC8007B36B5 /* PlaySoundsViewController.swift in Sources */, 276 | 701C3A3A1D9693E2006F14A7 /* AppDelegate.swift in Sources */, 277 | 70D884281DB01F56004B69A7 /* AppConstants.swift in Sources */, 278 | ); 279 | runOnlyForDeploymentPostprocessing = 0; 280 | }; 281 | 701C3A461D9693E2006F14A7 /* Sources */ = { 282 | isa = PBXSourcesBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | 701C3A4F1D9693E2006F14A7 /* Pitch_PerfectTests.swift in Sources */, 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | }; 289 | 701C3A511D9693E2006F14A7 /* Sources */ = { 290 | isa = PBXSourcesBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | 701C3A5A1D9693E2006F14A7 /* Pitch_PerfectUITests.swift in Sources */, 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | /* End PBXSourcesBuildPhase section */ 298 | 299 | /* Begin PBXTargetDependency section */ 300 | 701C3A4C1D9693E2006F14A7 /* PBXTargetDependency */ = { 301 | isa = PBXTargetDependency; 302 | target = 701C3A351D9693E2006F14A7 /* Pitch Perfect */; 303 | targetProxy = 701C3A4B1D9693E2006F14A7 /* PBXContainerItemProxy */; 304 | }; 305 | 701C3A571D9693E2006F14A7 /* PBXTargetDependency */ = { 306 | isa = PBXTargetDependency; 307 | target = 701C3A351D9693E2006F14A7 /* Pitch Perfect */; 308 | targetProxy = 701C3A561D9693E2006F14A7 /* PBXContainerItemProxy */; 309 | }; 310 | /* End PBXTargetDependency section */ 311 | 312 | /* Begin PBXVariantGroup section */ 313 | 701C3A3D1D9693E2006F14A7 /* Main.storyboard */ = { 314 | isa = PBXVariantGroup; 315 | children = ( 316 | 701C3A3E1D9693E2006F14A7 /* Base */, 317 | ); 318 | name = Main.storyboard; 319 | sourceTree = ""; 320 | }; 321 | 701C3A421D9693E2006F14A7 /* LaunchScreen.storyboard */ = { 322 | isa = PBXVariantGroup; 323 | children = ( 324 | 701C3A431D9693E2006F14A7 /* Base */, 325 | ); 326 | name = LaunchScreen.storyboard; 327 | sourceTree = ""; 328 | }; 329 | /* End PBXVariantGroup section */ 330 | 331 | /* Begin XCBuildConfiguration section */ 332 | 701C3A5C1D9693E3006F14A7 /* Debug */ = { 333 | isa = XCBuildConfiguration; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 338 | CLANG_CXX_LIBRARY = "libc++"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_WARN_BOOL_CONVERSION = YES; 342 | CLANG_WARN_CONSTANT_CONVERSION = YES; 343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 344 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 345 | CLANG_WARN_EMPTY_BODY = YES; 346 | CLANG_WARN_ENUM_CONVERSION = YES; 347 | CLANG_WARN_INFINITE_RECURSION = YES; 348 | CLANG_WARN_INT_CONVERSION = YES; 349 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 350 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 351 | CLANG_WARN_UNREACHABLE_CODE = YES; 352 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 353 | CODE_SIGN_IDENTITY = ""; 354 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 355 | COPY_PHASE_STRIP = NO; 356 | DEBUG_INFORMATION_FORMAT = dwarf; 357 | DEVELOPMENT_TEAM = ""; 358 | ENABLE_STRICT_OBJC_MSGSEND = YES; 359 | ENABLE_TESTABILITY = YES; 360 | GCC_C_LANGUAGE_STANDARD = gnu99; 361 | GCC_DYNAMIC_NO_PIC = NO; 362 | GCC_NO_COMMON_BLOCKS = YES; 363 | GCC_OPTIMIZATION_LEVEL = 0; 364 | GCC_PREPROCESSOR_DEFINITIONS = ( 365 | "DEBUG=1", 366 | "$(inherited)", 367 | ); 368 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 369 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 370 | GCC_WARN_UNDECLARED_SELECTOR = YES; 371 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 372 | GCC_WARN_UNUSED_FUNCTION = YES; 373 | GCC_WARN_UNUSED_VARIABLE = YES; 374 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 375 | MTL_ENABLE_DEBUG_INFO = YES; 376 | ONLY_ACTIVE_ARCH = YES; 377 | PROVISIONING_PROFILE = ""; 378 | SDKROOT = iphoneos; 379 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 380 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 381 | TARGETED_DEVICE_FAMILY = "1,2"; 382 | }; 383 | name = Debug; 384 | }; 385 | 701C3A5D1D9693E3006F14A7 /* Release */ = { 386 | isa = XCBuildConfiguration; 387 | buildSettings = { 388 | ALWAYS_SEARCH_USER_PATHS = NO; 389 | CLANG_ANALYZER_NONNULL = YES; 390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_WARN_BOOL_CONVERSION = YES; 395 | CLANG_WARN_CONSTANT_CONVERSION = YES; 396 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 397 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 398 | CLANG_WARN_EMPTY_BODY = YES; 399 | CLANG_WARN_ENUM_CONVERSION = YES; 400 | CLANG_WARN_INFINITE_RECURSION = YES; 401 | CLANG_WARN_INT_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 403 | CLANG_WARN_SUSPICIOUS_MOVES = YES; 404 | CLANG_WARN_UNREACHABLE_CODE = YES; 405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 406 | CODE_SIGN_IDENTITY = ""; 407 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 408 | COPY_PHASE_STRIP = NO; 409 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 410 | DEVELOPMENT_TEAM = ""; 411 | ENABLE_NS_ASSERTIONS = NO; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | GCC_C_LANGUAGE_STANDARD = gnu99; 414 | GCC_NO_COMMON_BLOCKS = YES; 415 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 416 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 417 | GCC_WARN_UNDECLARED_SELECTOR = YES; 418 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 419 | GCC_WARN_UNUSED_FUNCTION = YES; 420 | GCC_WARN_UNUSED_VARIABLE = YES; 421 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 422 | MTL_ENABLE_DEBUG_INFO = NO; 423 | PROVISIONING_PROFILE = ""; 424 | SDKROOT = iphoneos; 425 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 426 | TARGETED_DEVICE_FAMILY = "1,2"; 427 | VALIDATE_PRODUCT = YES; 428 | }; 429 | name = Release; 430 | }; 431 | 701C3A5F1D9693E3006F14A7 /* Debug */ = { 432 | isa = XCBuildConfiguration; 433 | buildSettings = { 434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 435 | CODE_SIGN_IDENTITY = "iPhone Developer"; 436 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 437 | DEVELOPMENT_TEAM = ""; 438 | INFOPLIST_FILE = "Pitch Perfect/Info.plist"; 439 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 441 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-Perfect"; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | PROVISIONING_PROFILE = ""; 444 | PROVISIONING_PROFILE_SPECIFIER = ""; 445 | SWIFT_VERSION = 3.0; 446 | }; 447 | name = Debug; 448 | }; 449 | 701C3A601D9693E3006F14A7 /* Release */ = { 450 | isa = XCBuildConfiguration; 451 | buildSettings = { 452 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 453 | CODE_SIGN_IDENTITY = "iPhone Developer"; 454 | DEVELOPMENT_TEAM = ""; 455 | INFOPLIST_FILE = "Pitch Perfect/Info.plist"; 456 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 457 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 458 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-Perfect"; 459 | PRODUCT_NAME = "$(TARGET_NAME)"; 460 | PROVISIONING_PROFILE = ""; 461 | PROVISIONING_PROFILE_SPECIFIER = ""; 462 | SWIFT_VERSION = 3.0; 463 | }; 464 | name = Release; 465 | }; 466 | 701C3A621D9693E3006F14A7 /* Debug */ = { 467 | isa = XCBuildConfiguration; 468 | buildSettings = { 469 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 470 | DEVELOPMENT_TEAM = ""; 471 | INFOPLIST_FILE = "Pitch PerfectTests/Info.plist"; 472 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 473 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectTests"; 474 | PRODUCT_NAME = "$(TARGET_NAME)"; 475 | SWIFT_VERSION = 3.0; 476 | }; 477 | name = Debug; 478 | }; 479 | 701C3A631D9693E3006F14A7 /* Release */ = { 480 | isa = XCBuildConfiguration; 481 | buildSettings = { 482 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 483 | DEVELOPMENT_TEAM = ""; 484 | INFOPLIST_FILE = "Pitch PerfectTests/Info.plist"; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 486 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectTests"; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | SWIFT_VERSION = 3.0; 489 | }; 490 | name = Release; 491 | }; 492 | 701C3A651D9693E3006F14A7 /* Debug */ = { 493 | isa = XCBuildConfiguration; 494 | buildSettings = { 495 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 496 | DEVELOPMENT_TEAM = ""; 497 | INFOPLIST_FILE = "Pitch PerfectUITests/Info.plist"; 498 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 499 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectUITests"; 500 | PRODUCT_NAME = "$(TARGET_NAME)"; 501 | PROVISIONING_PROFILE = ""; 502 | SWIFT_VERSION = 3.0; 503 | }; 504 | name = Debug; 505 | }; 506 | 701C3A661D9693E3006F14A7 /* Release */ = { 507 | isa = XCBuildConfiguration; 508 | buildSettings = { 509 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 510 | DEVELOPMENT_TEAM = ""; 511 | INFOPLIST_FILE = "Pitch PerfectUITests/Info.plist"; 512 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 513 | PRODUCT_BUNDLE_IDENTIFIER = "iamchanandlerbong.Pitch-PerfectUITests"; 514 | PRODUCT_NAME = "$(TARGET_NAME)"; 515 | PROVISIONING_PROFILE = ""; 516 | SWIFT_VERSION = 3.0; 517 | }; 518 | name = Release; 519 | }; 520 | /* End XCBuildConfiguration section */ 521 | 522 | /* Begin XCConfigurationList section */ 523 | 701C3A311D9693E2006F14A7 /* Build configuration list for PBXProject "Pitch Perfect" */ = { 524 | isa = XCConfigurationList; 525 | buildConfigurations = ( 526 | 701C3A5C1D9693E3006F14A7 /* Debug */, 527 | 701C3A5D1D9693E3006F14A7 /* Release */, 528 | ); 529 | defaultConfigurationIsVisible = 0; 530 | defaultConfigurationName = Release; 531 | }; 532 | 701C3A5E1D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch Perfect" */ = { 533 | isa = XCConfigurationList; 534 | buildConfigurations = ( 535 | 701C3A5F1D9693E3006F14A7 /* Debug */, 536 | 701C3A601D9693E3006F14A7 /* Release */, 537 | ); 538 | defaultConfigurationIsVisible = 0; 539 | defaultConfigurationName = Release; 540 | }; 541 | 701C3A611D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectTests" */ = { 542 | isa = XCConfigurationList; 543 | buildConfigurations = ( 544 | 701C3A621D9693E3006F14A7 /* Debug */, 545 | 701C3A631D9693E3006F14A7 /* Release */, 546 | ); 547 | defaultConfigurationIsVisible = 0; 548 | defaultConfigurationName = Release; 549 | }; 550 | 701C3A641D9693E3006F14A7 /* Build configuration list for PBXNativeTarget "Pitch PerfectUITests" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 701C3A651D9693E3006F14A7 /* Debug */, 554 | 701C3A661D9693E3006F14A7 /* Release */, 555 | ); 556 | defaultConfigurationIsVisible = 0; 557 | defaultConfigurationName = Release; 558 | }; 559 | /* End XCConfigurationList section */ 560 | }; 561 | rootObject = 701C3A2E1D9693E2006F14A7 /* Project object */; 562 | } 563 | --------------------------------------------------------------------------------