1. 요구사항 및 기획
- 목표: iPad에서 피아노 소리(특정 음정/박자)를 인식해 PDF 도서의 페이지를 자동으로 넘기는 앱 개발
- 주요 기능
- 마이크로 실시간 피아노 소리 입력
- AudioKit으로 음정(피치) 분석
- 특정 음정/박자 감지 시 PDFKit으로 페이지 넘김 (악보 마지막 마디의 3/4 박자 지점에서 페이지 넘김 추가)
- 감지 음정/박자 설정, 실시간 상태 표시, 간단한 UI 제공
2. 아키텍처 및 전체 구조
단계 | 설명 |
---|---|
마이크 입력 | iPad 마이크로 오디오 신호 실시간 수집 |
음정 분석 | AudioKit 등으로 FFT/피치 추출, 특정 음정/박자 감지 |
조건 판단 | 감지값이 사용자가 지정한 값과 일치하는지 확인 |
페이지 넘김 | PDFKit으로 PDF 뷰어 페이지 전환 |
UI/UX | 파일 불러오기, 감지 음정/박자 선택, 상태 표시, 결과 안내 등 |
3. 개발 환경 준비
- Xcode 최신 버전 설치 (Mac 필수)
- AudioKit: Swift 패키지 매니저(Swift Package Manager, SPM)로 설치
- PDFKit: iOS 기본 내장 프레임워크
- 테스트 디바이스: iPad 또는 시뮬레이터
4. 프로젝트 생성 및 세팅
- Xcode에서 새 iOS App 프로젝트 생성
- 언어: Swift
- 인터페이스: SwiftUI 또는 UIKit (SwiftUI 권장)
- AudioKit 추가
- Xcode 메뉴 → File → Add Packages →
https://github.com/AudioKit/AudioKit
- Xcode 메뉴 → File → Add Packages →
- 프로젝트 Info.plist에 마이크 권한 추가
Privacy - Microphone Usage Description
항목 추가 및 설명 입력
5. UI/UX 설계
- 메인 화면
- PDF 파일 불러오기 버튼
- 감지할 음정/박자 선택 드롭다운
- 감지 시작/종료 버튼
- 현재 감지 상태, 결과 표시(Label 등)
- 상태 안내
- “C4 감지됨, 페이지 넘김!” 등 실시간 알림 표시
6. 마이크 입력 및 오디오 신호 처리
- AudioKit의 마이크 입력 노드 활용
- 실시간 오디오 신호를 FFT 또는 피치 감지 알고리즘에 전달
Swift
import AudioKit
let mic = AudioEngine.input
let tracker = PitchTap(mic) { pitch, amplitude in
// pitch: 감지된 주파수(Hz)
// amplitude: 신호 세기
}
7. 음정(피치) 및 박자 감지
- PitchTap(AudioKit) 또는 별도 피치 감지 알고리즘 사용
- 감지된 주파수(Hz)를 음정(C4, D4 등)으로 변환
- 예: C4 = 261.6Hz, D4 = 293.7Hz 등
Swift
func frequencyToNoteName(_ frequency: Float) -> String {
// 주파수를 음정명으로 변환하는 함수 구현
}
- 박자 감지(선택): 신호의 강도 변화 주기 분석
8. 조건문 및 트리거 구현
- 감지된 음정/박자가 사용자가 선택한 값과 일치하면 페이지 넘김 실행
- 디바운스(연속 감지 방지): 한 번 넘긴 후 일정 시간 대기
Swift
if detectedNote == selectedNote && debounceFlag == false {
goToNextPDFPage()
debounceFlag = true
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
debounceFlag = false
}
}
9. PDFKit을 이용한 PDF 뷰어 및 페이지 넘김
- PDFView(PDFKit)로 PDF 파일 로드 및 표시
- 페이지 넘김 함수 구현
Swift
import PDFKit
let pdfView = PDFView()
pdfView.document = PDFDocument(url: pdfURL)
func goToNextPDFPage() {
pdfView.goToNextPage(nil)
}
10. 파일 불러오기 및 권한 처리
- UIDocumentPickerViewController로 PDF 파일 선택
- 선택한 파일을 PDFKit의 PDFView에 로드
Swift
import UIKit
struct DocumentPicker: UIViewControllerRepresentable {
// SwiftUI에서 파일 선택 구현
}
11. 실시간 상태 표시 및 UI 업데이트
- 감지된 음정, 박자, 페이지 넘김 결과를 실시간으로 UI에 표시
- SwiftUI의 @State, Combine 등 활용
12. 테스트 및 디버깅
- 실제 피아노 소리를 들려주며 감지 정확도, 페이지 넘김 동작 확인
- 여러 음정/박자에 대해 반복 테스트
- 잡음, 연속 감지 등 오작동 방지 로직 보완
13. 고급 확장 및 배포
- 음정 감지 정밀도 향상: 머신러닝 기반 피치 감지 모델 적용 가능
- 여러 음정/박자별 동작: 다양한 트리거 추가
- 앱스토어 배포: 개발자 계정 등록, 심사 및 배포 절차 진행
14. 전체 코드 구조 예시
Swift
import SwiftUI
import AudioKit
import PDFKit
struct ContentView: View {
// @State 변수 선언
// PDFView, AudioKit 세팅, UI 구현
// 마이크 입력 → 피치 감지 → 조건문 → PDF 페이지 넘김
}
15. 유지보수 및 운영
- 피드백 수집, 감지 민감도/정확도 개선
- 다양한 PDF 파일 호환성 테스트
- UI/UX 개선, 추가 기능 업데이트
결론
- Swift + PDFKit + AudioKit 조합으로 iPad에서 피아노 소리로 PDF 페이지를 넘기는 앱을 완전히 커스텀하게 개발할 수 있습니다.
- 기획 → 환경 세팅 → 오디오/음정 감지 → 조건문 → PDFKit 연동 → UI/UX → 테스트/배포까지 모든 과정을 순차적으로 따라가면 원하는 기능을 안정적으로 구현할 수 있습니다.
- 개발자라면 각 단계별로 세부 커스터마이징, 확장, 최적화가 자유롭습니다.