HomeArtTechHackBlockchain
ONLINE ·
Index
/
Technology
/
Article

Saxking Track — แอป iOS สำหรับฝึกซ้อมแซกโซโฟนกับ Backing Track

Operator
Khomkrid Lerdprasert
Filed
April 23, 2026
Channel
Technology
Read
~1 min
Saxking Track — แอป iOS สำหรับฝึกซ้อมแซกโซโฟนกับ Backing Track

Saxking Track — แอป iOS สำหรับฝึกซ้อมแซกโซโฟนกับ Backing Track

เวลาซ้อมแซกโซโฟนกับ backing track สิ่งที่ลำบากที่สุดคือ เพลง backing อยู่คีย์นึง แต่เราเล่นอีกคีย์นึง ต้องมานั่ง transpose ในหัว หรือไม่ก็ต้องหา backing track ใหม่ทุกครั้ง

ผมเลยสร้าง Saxking Track ขึ้นมา — แอป iOS ที่ช่วยให้การซ้อมง่ายขึ้น: โหลดไฟล์เสียง, ตรวจจับ Key อัตโนมัติ, Transpose ได้ทันที, ปรับ EQ ได้, แถม lock screen controls ครบ


ปัญหาที่แก้

  1. ไม่รู้ว่า backing track อยู่คีย์อะไร — ต้องมานั่งหาเอง
  2. อยากเปลี่ยนคีย์แต่ไม่มีเครื่องมือ — ต้องใช้ DAW หรือหาไฟล์ใหม่
  3. สลับเพลงยุ่งยาก — เปิด Files app, เลือก, กลับมา
  4. ปรับเสียงไม่ได้ — backing track บางอันเบสหนักไป หรือเสียงแหลมบาดหู

Features

1. Auto Key Detection

เมื่อโหลดไฟล์เสียงเข้าแอป ระบบจะวิเคราะห์ chroma (พลังงานของแต่ละโน้ต) จากไฟล์ แล้วเทียบกับ Krumhansl-Schmuckler key profiles เพื่อหาว่าเพลงอยู่คีย์อะไร — ทั้ง Major และ Minor

// วิเคราะห์ chroma จาก FFT
static 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 correlation
static func findKey(chroma: [Float]) -> Result {
// ทดสอบ 12 major + 12 minor = 24 keys
// เลือก key ที่ correlation สูงสุด
}

ผลลัพธ์จะแสดงเป็น Key เช่น G Minor, Bb Major พร้อมอัปเดตทันทีเมื่อ transpose

2. Real-time Transpose

กดปุ่ม +/- เพื่อเปลี่ยนคีย์ได้ทันที ใช้ AVAudioUnitTimePitch ของ Apple — เปลี่ยน pitch โดยไม่เปลี่ยนความเร็วเพลง

func setPitch(semitones: Int) {
pitchEffect.pitch = Float(semitones * 100)
}

แต่ละเพลงจำค่า transpose ไว้แยกกัน — กลับมาเปิดเพลงเดิมก็ได้คีย์เดิมที่เคยตั้งไว้

3. Waveform Display + Seek

แสดง waveform ของเพลง สร้างจากการหา peak amplitude ทุกช่วง:

static func buildWaveform(url: URL, points: Int = 400) -> [Float] {
// อ่านไฟล์เป็น chunk
// หา peak magnitude ด้วย vDSP_maxmgv
// normalize ให้ค่าสูงสุด = 1.0
}

ลากบน waveform เพื่อ seek ไปตำแหน่งที่ต้องการได้เลย ส่วนที่เล่นผ่านแล้วจะเป็นสีส้ม ส่วนที่ยังไม่เล่นจะจางลง

4. 3-Band EQ

ปรับเสียงได้ 3 แบนด์:

แบนด์ความถี่ใช้ทำอะไร
LOW80 Hzเพิ่ม/ลดเบส
MID1 kHzปรับความชัดของเสียงกลาง
HIGH10 kHzเพิ่ม/ลดเสียงแหลม

แต่ละแบนด์ปรับได้ -12 ถึง +12 dB และจำค่าไว้ต่อเพลง

5. Playlist Manager

  • เพิ่มเพลงจาก Files app
  • ลาก reorder ลำดับได้
  • ลบด้วย swipe
  • เล่นจบเพลงนึงจะข้ามไปเพลงถัดไปอัตโนมัติ
  • รองรับ Loop เพลงเดียวซ้ำ

6. Lock Screen & Control Center

เล่นเพลงได้จาก 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 ส่วนหลัก:

AudioManager

  • จัดการ AVAudioEngine pipeline: PlayerNode → TimePitch → EQ → Mixer
  • ควบคุม play, pause, stop, seek, loop
  • สร้าง waveform data จากไฟล์
  • ดึง artwork จาก metadata
  • อัปเดต Now Playing info สำหรับ lock screen

KeyDetector

  • วิเคราะห์ key ด้วย FFT + chroma analysis
  • ใช้ Krumhansl-Schmuckler algorithm
  • คำนวณ Pearson correlation เทียบกับ key profiles

PlaylistManager

  • CRUD playlist (เพิ่ม, ลบ, reorder)
  • persist ลง JSON ใน Documents directory
  • จำค่า transpose และ EQ ต่อเพลง

Audio Pipeline

[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

UI Design

ออกแบบตาม Apple Music aesthetic:

  • Waveform สีส้ม (#FF9500) สไตล์ pro-audio
  • Key card พื้นเทาเข้ม + ตัวอักษรสี Cyan สำหรับ readability
  • Transpose card gradient ส้ม-แดง สไตล์ Apple Music
  • Playlist drawer แบบ bottom sheet ลากขึ้น-ลงได้
  • Controls เป็น circle buttons ขนาดสม่ำเสมอ

การติดตั้งและใช้งาน

Requirements

  • Xcode 15+
  • iOS 17+
  • Swift 5.9+

Build

git clone https://github.com/aofiee/SaxkingTrack.git
cd SaxkingTrack
open SaxBacking.xcodeproj

กด Run บน Simulator หรือ device ได้เลย ไม่ต้องติดตั้ง dependency เพิ่ม — ใช้แค่ frameworks ที่มากับ iOS (AVFoundation, Accelerate, MediaPlayer)

วิธีใช้

  1. กดปุ่ม + เพื่อเพิ่มไฟล์เสียง (MP3, WAV, M4A)
  2. เลือกเพลงจาก playlist
  3. ระบบจะ วิเคราะห์ Key อัตโนมัติ
  4. กด Play แล้วเริ่มซ้อมได้เลย
  5. กด +/- ที่ Transpose เพื่อเปลี่ยนคีย์
  6. ปรับ EQ ตามชอบ
  7. ค่าทุกอย่างจำไว้ต่อเพลง — ครั้งหน้าเปิดมาก็ได้ค่าเดิม

Source Code

Download on GitHub

git clone https://github.com/aofiee/SaxkingTrack.git

สร้างด้วย SwiftUI + AVFoundation ล้วน ไม่พึ่ง library ภายนอก เหมาะสำหรับคนที่อยากศึกษาเรื่อง audio processing บน iOS

◎ Tags

##swiftui##ios##music##saxophone##audio
Khomkrid Lerdprasert
Operator

Khomkrid Lerdprasert

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.

GithubInstagram
Previous · transmission
ชานชรา ที่ 1 — เพื่อนไม่ครบ ไม่เป็นไร กลับมาขี่คนเดียวได้
Next · transmission
Friender M.C. — กรุงเทพ–สระบุรี–มวกเหลือก CC น้อย แต่ใจถึง
Metadata
Channel
Technology
Filed
April 23, 2026
Read
~1 min
Language
TH / EN
Transmit

Related

สร้าง RAG Pipeline ด้วย Go + pgvector + Hexagonal Architecture
Khomkrid Lerdprasert
April 23, 2026
1 min
aofiee.dev
signal / noise / code · craft
© 2019 – 2026, Khomkrid Lerdprasert.
All transmissions logged.
No newsletter. No profiling. Cookies require consent.
PGP · 7F3D 2024 A21E B584 · 0x7F3D
Channels
  • Art & Culture
  • Technology
  • Hack 101
  • Blockchain 101
  • Archive / All posts
— END OF TRANSMISSION —
// powered by curiosity, coffee, & wuxia
BKK · 13°45′N · 100°30′E