Takafumi Horiuchi

A Metronome with a Pulse

Overview

The circle at the center of the screen pulses in time with each click, matching its intensity. I made an iPhone metronome with no ads, accounts, or settings screen.

The metronome screen. A white circle sits at the center of a black background, with four beat dots above it and 120 BPM and −/+ buttons below. The circle expands and returns to its resting size with each beat.
This interactive screen uses the same equations as the app and runs at 120 BPM, with four beats per bar. Tap the circle to stop it.

I made it for my own tenor saxophone practice. Open the app and start it right away; the beat stays visible even when the clicks are hard to hear. I handled the planning, design, SwiftUI implementation, and click synthesis myself.

Controls: touch what you want to change

The controls are beat dots, a circle, and a tempo value. There are no menus or written instructions: touch what you want to change.

The app when stopped. A pale gray circle with a play triangle at its center, four beat dots above, 120 BPM and −/+ buttons below, and a small information icon at the top left.
ⓘ
Open the support page.
Beat dots
Tap to add one beat, from one to seven beats per bar. Slide to add or remove beats.
Circle
Tap to start or stop. Press and hold, then tap along with a song to set the tempo.
Tempo
Drag to increase or decrease the tempo. Move slowly for finer adjustments. Tap − or + to change it by 1 BPM.
The app when stopped. Its text is limited to numbers and “BPM.”

Pulse: matching the timing and intensity of each click

The circle’s pulse is timed to align with the click using the output latency reported by iOS. Bluetooth earphones can introduce a delay of roughly 0.1–0.3 seconds. The amount of expansion is proportional to the click’s volume: the first beat has a higher-pitched, louder click and a noticeably larger pulse.

A graph of clicks and circle size over a four-beat bar. The circle expands with each click, reaching 1.25 times its resting size on beat 1 and 1.15 times on beats 2–4, then briefly dipping below its resting size before settling.
Clicks (filled areas) and circle size (line) over one bar at 120 BPM, with four beats per bar. The circle reaches its maximum size 0.02 seconds after the click begins, then contracts slightly below its resting size before settling, like jelly.

The audio thread schedules each beat at sample-level precision. The timing calculation avoids cumulative error, keeping the drift within 0.5 samples even after an hour of continuous playback.

The scope and calculation conditions behind the 0.5-sample figure still need confirmation. It should not be read as a measure of when sound reaches the listener or of synchronization with the display.

Tap tempo: silence while you tap

Press and hold the circle to make it wobble like jelly. Tap along with a song or the tempo in your head: the circle dents where you touch it, wobbles, and springs back. Haptic feedback lets you feel the tempo.

Six frames showing the circle’s outline after a single tap at its top edge. The top dents at 0.03 seconds, starts returning at 0.08 seconds, distorts slightly vertically and horizontally at 0.17 and 0.3 seconds, and is circular again at 1.3 seconds.
The circle’s outline after a single tap at its top edge, drawn using the same equations as the app. The dotted outline is a perfect circle.
A development build of the app. The circle is gray in tap-tempo mode. Below it is a Japanese “Jelly tuning” panel with sliders and explanations, including “Elasticity (oscillation speed): 3.6 cycles per second” and “Viscosity (how oscillations settle): 0.10.”
I tuned the wobble using a panel available only in the development build. I adjusted ten parameters, including elasticity and viscosity, with sliders while tapping the circle to feel the results. I compared presets called “pudding,” “warabi mochi,” and “more liquid,” then chose “jelly” as the default: a lively bounce that settles in about 0.9 seconds.

The app deliberately stays silent while you tap. Playing a sound in response to each tap would introduce an audible delay over Bluetooth and overlap with the metronome’s clicks. When you stop tapping, clicks at the tempo you set begin almost inaudibly and fade up to their usual volume over six seconds.

After five taps, dots representing vibration gradually shrink as the click bars grow from an almost inaudible level over six seconds.
Five taps at 120 BPM, followed by a pause. From bottom to top: taps, vibration (smaller marks mean weaker vibration), and clicks (taller marks mean louder clicks). The volume increases at a constant rate in decibels, avoiding an abrupt jump from a faint sound.

Sound: choosing a pitch I can hear over the saxophone

The clicks are synthesized from sine waves, without recorded audio files. I built a comparison page and compared the sounds through the iPhone speaker three times while playing tenor saxophone. I chose 1875 Hz and 1250 Hz, 1.25 times the original frequencies. They sit above the range where the saxophone’s energy is strongest and below the range that tends to sound piercing.

A frequency axis from 100 Hz to 10 kHz. The tenor saxophone’s energy is concentrated at the lower end; the range that tends to sound piercing is 2.5–4 kHz. Clicks at 1250 Hz and 1875 Hz sit between the two bands, with the original 1000 Hz and 1500 Hz shown as dotted lines.
The shaded band shows where the tenor saxophone’s energy is concentrated, decreasing toward the right. The hatched band marks the 2.5–4 kHz range, which tends to sound piercing. Dotted lines show the original frequencies (1000 and 1500 Hz); solid lines show the selected frequencies. Line height represents volume.

Higher-pitched, longer sounds and versions with added harmonics were easier to hear. I still chose sounds that preserved a mellow, neutral electronic tone.

Keeping it simple: what I left out

I left out options that would make people hesitate. For each feature, I checked whether the app could work without it before removing it.

Ads, tracking, and accounts
I ruled these out from the start. The app does not initiate network requests.
Settings screen
Everything happens on one screen.
Choice of tones
Two sounds are enough: one for accented beats and one for unaccented beats. More options invite indecision.
Volume slider
The device’s volume buttons are enough.
Light mode
A single screen with a black background.
Eight or more beats per bar
Count 12/8 in four beats and 9/8 in three.
Subdivisions (eighth notes, triplets, sixteenth notes)
These are not essential to the app’s core function, but they are the first feature I would consider adding.
Typing a tempo
The −/+ buttons and dragging are enough.

Built in SwiftUI with no external libraries, the app runs on iPhones with iOS 17 or later. Its English name is No Ads Simplest Metronome. Full instructions and the privacy policy are on the support page.