Takafumi Horiuchi

A Metronome with a Pulse

Overview

The circle in the middle of the screen pulses at the same moment and with the same intensity as each click. I made a metronome for iPhone with no ads, accounts or settings screen.

The metronome’s screen. A white circle sits in the middle of a black screen, with four beat dots above and 120 BPM and −/+ below. The circle swells and returns with each beat.
This screen runs within the page using the same equations as the app (120 BPM, four beats per bar). Tap the circle to stop it.

I made it for my own tenor saxophone practice. Open it and start playing straight away; the beat stays visible even when the sound is hard to hear. I did everything myself, from planning and design to implementation in SwiftUI and synthesizing the clicks.

Controls — touch what you want to change

All the screen has is beat dots, a circle and a tempo value. There are no menus or instructions: touch the thing you want to change.

The stopped screen. A pale gray circle with a play triangle in the center, four dots above, 120 BPM and −/+ below, and a small ⓘ at the top left.
ⓘ
Open the support page.
Dots
Tap to add a beat (1–7 beats). 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.
Numbers
Drag to speed up or slow down. Move slowly for fine adjustments. −/+ changes it by one.
The stopped screen. The only text on the screen is numbers and “BPM”.

Pulse — the same moment, the same intensity

The circle swells when the sound reaches your ears, rather than when it is sent. It compensates for the roughly 0.1–0.3-second delay of Bluetooth earphones using the output latency reported by iOS. The amount it swells is proportional to the click’s volume: the first beat has a higher, louder click and a noticeably larger pulse.

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

The audio thread determines beat times to the sample. The calculation avoids accumulating error, keeping the drift within 0.5 samples even after an hour of continuous playback.

Tap tempo — silence while you tap

Press and hold the circle and it begins to 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. Vibration feeds the tempo back to you.

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, distorts slightly vertically and horizontally at 0.17 and 0.3, and is circular again at 1.3 seconds.
The outline after a single tap at the circle’s top edge, drawn from the same equations as the app. The dotted outline is a perfect circle.
A development version of the app. The circle is gray in tap-tempo mode. Below it, a Japanese “Jelly tuning” panel has sliders and explanations, including “Elasticity (oscillation speed): 3.6 cycles/second” and “Viscosity (how oscillations settle): 0.10”.
I tuned the wobble with a panel available only in the development build. I adjusted ten values, including elasticity and viscosity, with sliders while tapping the circle to feel the result. After comparing “pudding”, “warabi mochi” and “more liquid” settings, I chose “jelly” as the default: a lively bounce that settles in about 0.9 seconds.

It deliberately stays silent while you tap. An immediate audio response would arrive late over Bluetooth and overlap with the metronome’s clicks. When you stop tapping, clicks at that tempo begin almost inaudibly and reach their usual volume over six seconds.

After five taps, dots representing vibration gradually shrink while click bars grow from an almost inaudible level over six seconds.
Five taps at 120 BPM, then a pause. From bottom to top: taps, vibration (smaller means weaker), clicks (taller means louder). Volume rises evenly in decibels, avoiding a sudden jump from a faint sound.

Sound — choosing by ear a pitch that carries over the saxophone

The clicks are synthesized from sine waves, without audio files. I built a comparison page and ran three listening comparisons through the iPhone speaker while playing tenor saxophone. I settled on 1875 Hz and 1250 Hz, 1.25 times the original frequencies: above the saxophone’s strongest range and below the range that tends to sound piercing.

A frequency axis from 100 Hz to 10 kHz. The tenor saxophone’s range occupies the lower end; the piercing range lies at 2.5–4 kHz. Clicks at 1250 Hz and 1875 Hz sit between them, with the original 1000 Hz and 1500 Hz shown as dotted lines.
The shaded band shows where the tenor saxophone’s energy is concentrated (weaker toward the right); the hatched band marks the piercing 2.5–4 kHz range. Dotted lines are the original sounds (1000/1500 Hz); solid lines are the chosen ones. Line height represents volume.

Higher, longer sounds and candidates with added harmonics were easier to hear. Even so, I chose within the range that kept a mellow, neutral electronic character.

Subtraction — what I left out

Nothing that leaves you wondering what to choose. I checked each item to see whether the app could work without it, then removed it.

Ads, tracking and accounts
Decided from the start. The app makes no network requests on its own.
Settings screen
Everything happens on one screen.
Choice of tones
Two sounds, for accented and unaccented beats, are enough. Options invite indecision.
Volume slider
The device’s volume buttons are enough.
Light mode
Just one black screen.
Eight or more beats
Count 12/8 in four beats and 9/8 in three.
Subdivisions (eighths, triplets, sixteenths)
Not essential for the app to work. The first candidate for a future addition.
Typing a tempo
−/+ and dragging are enough.

Built in SwiftUI with no external libraries. Runs on iPhone with iOS 17 or later. Its English name is No Ads Simplest Metronome. I am preparing it for release on the App Store (September 2026). Full instructions and the privacy policy are on the support page.