A singing teacher for iPhone, built for kids who want to learn to sing in tune.

Inspiration

My daughter is into singing. She'd sing around the house and ask me whether it sounded right, and I never had a real answer for her. "That sounded good" is not the same as "that note was flat."

The tools that can answer it are built for adults. A chromatic tuner shows you a needle. A needle tells a kid nothing.

I wanted her to see the note she just sang next to the note she was going for. We ended up building it together, and it's full of cute animals.

What it does

A cartoon animal sings a short phrase. You sing it back.

A line follows your voice across the screen while you sing. When the phrase ends, every note is marked with how far off you were in cents, and which way you missed.

Before the first lesson the app listens to your lowest and highest comfortable note, and everything after that is set in your key. A kid and a parent get the same lesson in different places on the keyboard.

Clover the sheep sings scales on "ah." Maisie the cow teaches Old MacDonald a piece at a time on "oo." Banjo the goat climbs to the octave and back on "eh," a little higher each round, then runs the whole climb again faster.

Your voice is analyzed on the phone and never leaves it. Nothing is recorded and there's no account. There are no ads.

How I built it

Pitch detection is the McLeod Pitch Method over a 2048-sample window, running about 90 times a second off the audio I/O thread. When the line jumps more than six semitones, a despiker holds it one frame and keeps the jump only if the next frame agrees. Scoring never sees that filter, so you're graded on the raw reading.

The singing is synthesized in the app, a sawtooth through three formant filters, no samples. Each character opens a note with its own animal call that slides into a vowel. The held part sits exactly on pitch, which matters, because you're matching it.

The characters are SVG paths drawn in SwiftUI. Their mouths open off the note schedule, so you can watch a sheep sing each note of the phrase. Their cheeks warm while the app can hear you, and they never react to whether you were right. I didn't want a cartoon animal looking disappointed in a kid.

Purchases run through RevenueCat. Three products, one entitlement, and the prices and trial terms are read at runtime instead of hardcoded.

Challenges I ran into

The app went silent on my iPhone 13 mini while every diagnostic said it was playing. Pitch detection was running inside the microphone tap and overran the 43 ms buffer on the A15, so iOS dropped the whole audio cycle rather than glitching. It only happened on the device, never the simulator, and only in Release builds. The tap now hands samples to a background queue and does no work itself.

Apple rejected the paid version because the reviewer couldn't find the in-app purchases. They sat behind a singing test, and the reviewer wasn't going to sing. I had only ever tested the purchase the way a singer reaches it, never the way a stranger would.

Accomplishments I'm proud of

My daughter uses it, and her notes changed it. Clover used to say "I get a little nervous too, so we can be nervous together." My daughter told me she wasn't nervous. There's a rule in the character bible now: a character can say how it feels, and never how the singer feels.

The whole thing runs on the phone. No server, no account, no analytics, no ads. The privacy label lists two items, a user ID and purchase history, both from the payment system, neither used for tracking.

It's live on the App Store. Anybody with an iPhone can download it tonight and sing with Clover.

What's next for Callsong

A native iPad layout, and I want the web tools at callsong.app to sell the app directly.

Built With

Share this project:

Updates

Submission history