เวลาซ้อมแซกโซโฟนกับ backing track สิ่งที่ลำบากที่สุดคือ เพลง backing อยู่คีย์นึง แต่เราเล่นอีกคีย์นึง ต้องมานั่ง transpose ในหัว หรือไม่ก็ต้องหา backing track ใหม่ทุกครั้ง
ผมเลยสร้าง Saxking Track ขึ้นมา — แอป iOS ที่ช่วยให้การซ้อมง่ายขึ้น: โหลดไฟล์เสียง, ตรวจจับ Key อัตโนมัติ, Transpose ได้ทันที, ปรับ EQ ได้, แถม lock screen controls ครบ
เมื่อโหลดไฟล์เสียงเข้าแอป ระบบจะวิเคราะห์ chroma (พลังงานของแต่ละโน้ต) จากไฟล์ แล้วเทียบกับ Krumhansl-Schmuckler key profiles เพื่อหาว่าเพลงอยู่คีย์อะไร — ทั้ง Major และ Minor
// วิเคราะห์ chroma จาก FFTstatic func computeChroma(samples: [Float], sampleRate: Float) -> [Float] {// ใช้ vDSP FFT ขนาด 8192 samples// แปลง frequency bin → MIDI note → pitch class (0-11)// สะสม magnitude ของแต่ละ pitch class}// เทียบ chroma กับ key profiles ด้วย Pearson correlationstatic func findKey(chroma: [Float]) -> Result {// ทดสอบ 12 major + 12 minor = 24 keys// เลือก key ที่ correlation สูงสุด}
ผลลัพธ์จะแสดงเป็น Key เช่น G Minor, Bb Major พร้อมอัปเดตทันทีเมื่อ transpose
กดปุ่ม +/- เพื่อเปลี่ยนคีย์ได้ทันที ใช้ AVAudioUnitTimePitch ของ Apple — เปลี่ยน pitch โดยไม่เปลี่ยนความเร็วเพลง
func setPitch(semitones: Int) {pitchEffect.pitch = Float(semitones * 100)}
แต่ละเพลงจำค่า transpose ไว้แยกกัน — กลับมาเปิดเพลงเดิมก็ได้คีย์เดิมที่เคยตั้งไว้
แสดง waveform ของเพลง สร้างจากการหา peak amplitude ทุกช่วง:
static func buildWaveform(url: URL, points: Int = 400) -> [Float] {// อ่านไฟล์เป็น chunk// หา peak magnitude ด้วย vDSP_maxmgv// normalize ให้ค่าสูงสุด = 1.0}
ลากบน waveform เพื่อ seek ไปตำแหน่งที่ต้องการได้เลย ส่วนที่เล่นผ่านแล้วจะเป็นสีส้ม ส่วนที่ยังไม่เล่นจะจางลง
ปรับเสียงได้ 3 แบนด์:
| แบนด์ | ความถี่ | ใช้ทำอะไร |
|---|---|---|
| LOW | 80 Hz | เพิ่ม/ลดเบส |
| MID | 1 kHz | ปรับความชัดของเสียงกลาง |
| HIGH | 10 kHz | เพิ่ม/ลดเสียงแหลม |
แต่ละแบนด์ปรับได้ -12 ถึง +12 dB และจำค่าไว้ต่อเพลง
เล่นเพลงได้จาก lock screen — แสดงชื่อเพลง, ปกอัลบั้ม (ดึงจาก metadata ของไฟล์), seek bar, play/pause ครบ
private func setupRemoteTransportControls() {let cmd = MPRemoteCommandCenter.shared()cmd.playCommand.addTarget { ... }cmd.pauseCommand.addTarget { ... }cmd.changePlaybackPositionCommand.addTarget { ... }}
แอปรองรับ background audio — ปิดจอแล้วเพลงยังเล่นต่อได้
แอปแบ่งเป็น 3 ส่วนหลัก:
AVAudioEngine pipeline: PlayerNode → TimePitch → EQ → Mixer[MP3/WAV File]↓AVAudioPlayerNode↓AVAudioUnitTimePitch ← transpose (semitones × 100 cents)↓AVAudioUnitEQ (3-band)├─ Low Shelf 80 Hz├─ Parametric 1 kHz└─ High Shelf 10 kHz↓MainMixerNode → Output
ออกแบบตาม Apple Music aesthetic:
git clone https://github.com/aofiee/SaxkingTrack.gitcd SaxkingTrackopen SaxBacking.xcodeproj
กด Run บน Simulator หรือ device ได้เลย ไม่ต้องติดตั้ง dependency เพิ่ม — ใช้แค่ frameworks ที่มากับ iOS (AVFoundation, Accelerate, MediaPlayer)
git clone https://github.com/aofiee/SaxkingTrack.git
สร้างด้วย SwiftUI + AVFoundation ล้วน ไม่พึ่ง library ภายนอก เหมาะสำหรับคนที่อยากศึกษาเรื่อง audio processing บน iOS
Technical Lead — building AI-powered platforms, omni-channel chat systems, and telemedicine solutions with Go, Next.js & clean architecture. 20+ years shipping software from crypto wallets to e-learning systems. Bangkok-based. Writes code late at night, brews beer on weekends.
