Advertisement
UI & Interface Sounds

How to Create Randomized Blip Sound Variations to Avoid Repetition

A parameter-level guide to randomizing blip sounds, covering which parameters actually break repetition and which ones do not, the specific ranges that stay below the perceptual threshold, and why uniform random distribution produces a worse result than Gaussian distribution for UI sounds.

The naive fix for blip repetition is to add a random pitch offset on each playback. It is a two-line change, it is easy to implement, and it is the first thing most developers try. It almost never solves the problem, because the pitch offset is the wrong parameter to randomize on its own, and the uniform distribution that most random functions produce is the wrong distribution for UI sounds. The result is a blip set that still sounds repetitive after the first minute of play, and a developer who concludes that randomization does not work.

Randomization works. It just has to be applied to the right parameters, in the right ranges, with the right distribution. A blip has five parameters that can be varied, and three of them are effective at breaking repetition while two are not. The effective ranges are narrower than most developers assume, and the difference between a uniform distribution and a Gaussian distribution is audible in a way that is not obvious from the math.

This article is about the parameter-level decisions. The general variation system guide covers the pool management — how many variations to create, how to select between them, how to avoid consecutive repeats. This article assumes the pool exists and is about how each variation is generated: which parameters to randomize, how much, and with what distribution.

Which blip parameters actually break repetition when randomized?

A blip has five parameters that a game engine or a synthesis tool can vary at runtime: pitch, duration, volume, filter cutoff, and attack time. Each one affects the perceived sound differently, and only three of them break repetition in a useful way.

Parameter Effective Range that works Why
Pitch Yes ±3% of base frequency The ear detects pitch change above ~2%
Duration (decay) Yes ±10% of decay time Changes the perceived "weight" slightly
Volume Yes, subtly ±1.5 dB Above 2 dB the change becomes a distraction
Filter cutoff Yes, subtly ±15% of cutoff Changes brightness without changing identity
Attack time No — Attack is the blip's identity; changing it changes the sound

The pitch is the most effective parameter because the ear is most sensitive to it. A pitch change of 3 percent is enough to make the sound "different" without making it "a different sound." A pitch change of 10 percent starts to sound like a different blip entirely, which is the wrong kind of variation — it does not break repetition, it creates a new sound that the player has to learn.

The attack time is the parameter most often randomized by mistake. A developer who randomizes the attack will find that the blip sometimes sounds "soft" and sometimes sounds "clicky," which reads as inconsistency rather than variation. The attack is what identifies the blip as a blip; it should be fixed across all variations of the same sound. The blip synthesis guide covers why the attack matters for the perceived character.

The filter cutoff is the most underused parameter for variation. A 15 percent change in cutoff produces a blip that is slightly brighter or darker, which the ear reads as natural variation without the sound losing its identity. The effect is subtle enough that a player who is not listening for it will never notice it, but a player who is listening will hear the blips as distinct events rather than as a repeated sample.

How large should each random range actually be?

The ranges in the table above are the ones that work for most UI blips, but the exact values depend on the base sound. A blip that is already quite short (30 milliseconds) can tolerate less duration variation than a blip that is longer (80 milliseconds), because the duration change is a larger fraction of the total perceived length.

Blip duration Pitch range Duration range Volume range
20 to 40 ms ±2% ±5% ±1 dB
40 to 80 ms ±3% ±10% ±1.5 dB
80 to 150 ms ±4% ±15% ±2 dB

The relationship is not linear, and it is not the same for every parameter. The pitch range grows with duration because a longer sound gives the ear more time to resolve the pitch, which means the ear can detect a larger change as "variation" rather than as "a different sound." The duration range grows faster because the relative duration change is smaller for a longer sound. The volume range grows slowly because volume perception is not duration-dependent in the same way.

The values are calibrated to a perception threshold that is the same one the variation system guide describes: the change has to be above the threshold to register, but below the threshold that would make the sound a different sound. For pitch, the thresholds are roughly 2 percent (below which the change is not registered) and 8 percent (above which the change reads as a different sound). The range in the table sits between them.

The one parameter where the range should be wider than the table suggests is the filter cutoff. A cutoff change of 20 to 25 percent is often the right amount, because the cutoff is a subtler perceptual parameter than pitch. The ear is less sensitive to timbre change than to pitch change, so the same perceived "variation" requires a larger change. A developer who is tuning the ranges by ear will naturally end up with a wider filter range than the table shows.

Why does uniform random distribution produce a worse result than Gaussian distribution?

The random functions that most programming languages provide — Math.random() in JavaScript, Random.value in Unity, randf() in Godot — produce a uniform distribution. Every value in the range is equally likely. For a pitch range of ±3 percent, the values cluster at ±3 percent as often as they cluster at 0 percent, which means half the variations are at the edges of the range rather than at the center.

For a blip, this produces a set of variations that are mostly at the extremes. A player who hears twenty blips in a row will hear more ±3 percent variations than ±1 percent variations, which is the opposite of what natural variation would produce. In real-world variation — footsteps, bird calls, human speech — most instances cluster near the average, with fewer at the extremes. The uniform distribution produces a set that sounds artificial in a way that the individual sounds do not.

A Gaussian (normal) distribution produces a set that clusters near the mean, with fewer instances at the extremes. The shape is what natural variation looks like, and the ear responds to it differently from a uniform distribution even when the ranges are the same.

// Uniform random — produces edge-heavy variation
function uniformRandom(range) {
    return (Math.random() * 2 - 1) * range;
}

// Gaussian random — produces center-heavy variation
function gaussianRandom(range) {
    // Box-Muller transform
    let u = 0, v = 0;
    while (u === 0) u = Math.random();
    while (v === 0) v = Math.random();
    const normal = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);

    // Scale so that 98% of values fall within ±range
    // (normal has stddev 1, so multiply by range / 2.33)
    return normal * (range / 2.33);
}

The Box-Muller transform produces a standard normal distribution, which has a standard deviation of 1 and about 98 percent of values within ±2.33. Scaling by range / 2.33 makes the 98 percent confidence interval equal to ±range, which is the same total spread as the uniform random but with a different distribution within that spread.

The audible difference between the two is subtle but consistent. A set of twenty blips with uniform distribution has eight to ten at the extremes and zero or one near the center. A set with Gaussian distribution has twelve to fifteen near the center and two or three at the extremes. The Gaussian set sounds like natural variation; the uniform set sounds like the same sound played with a random pitch shifter attached.

The Gaussian distribution also solves a specific problem with uniform distribution: the occasional "outlier" blip. With a uniform distribution over ±3 percent, one in twenty blips is at exactly the edge of the range, which the ear sometimes registers as "out of tune." With a Gaussian distribution, the probability of a value at the edge is much lower, which means the occasional outlier that breaks the identity of the set is much rarer.

How does randomizing the timing of the blip affect the perceived repetition?

The timing of the blip is a parameter that most designers ignore, because the blip's start time is determined by the game event that triggered it, not by the sound system. A button click happens when the player clicks; the blip plays at that moment. There is no randomness in the start time.

But there are two timing parameters that can be randomized within the blip itself. The first is the start offset of the sound relative to the trigger moment, which is usually called the "latency" and should not be randomized because the player expects the blip to arrive immediately after the action. The second is the internal timing of the grain or envelope, which is a subtle parameter that most engines do not expose but that has a real effect when it is available.

The start offset — the delay between the trigger and the sound — should be constant across all variations of the same blip. A player who clicks a button and hears the blip 10 milliseconds later on one click and 30 milliseconds later on the next will perceive the second click as slower, even if the actual game logic is identical. The consistency of the start offset is what makes the game feel responsive.

The internal timing — the exact sample where the envelope's attack begins, or the exact grain position in a sample-based blip — can be randomized within a very narrow range, typically ±2 to ±5 milliseconds. This is short enough that the player does not register it as latency variation, but it is long enough to produce small differences in the phase of the sound. The Web Audio game guide covers the precise scheduling that makes this kind of micro-timing possible.

For most projects, the internal timing is not worth randomizing. The effect is subtle, and the risk of introducing a timing glitch is larger than the benefit of the variation. The cases where it matters are sample-based blips that come from a longer recorded source; a small timing offset means different grains of the source are being captured, which produces a different timbre as well as a different timing.

When does randomization make a blip set worse instead of better?

Randomization is not always an improvement. There are specific situations where adding randomness to a blip set makes the player experience worse rather than better, and knowing these situations prevents the over-randomization that new designers often slip into.

The sound is a signature. If the blip is associated with a specific character, weapon, or game moment that the player is supposed to identify, the variation undermines the identification. A legendary item pickup sound should be the same every time, because the player is supposed to recognize it as that specific item. A common UI click can be varied, because the player is not supposed to recognize the specific instance.

The sound plays infrequently. If the blip plays once every thirty seconds, the player is not going to notice repetition. The randomness adds nothing the player can perceive, and it adds complexity to the code. Randomization is worth doing for sounds that play more than once every few seconds.

The sound is a feedback cue for a precise action. If the player is using the blip to judge timing — a rhythm game, a precision platformer, a combat timing cue — the random variation makes the feedback unreliable. The player needs to hear the sound's timing consistently, which means the start offset must be fixed and the internal timing should not vary. The haptic timing guide covers the related concerns for feedback that has to land at a specific moment.

The random range is too wide. This is the most common failure mode and the reason most randomization attempts fail. A designer who sets the pitch range to ±10 percent thinking "more variation is better" will produce a blip set that sounds like a broken pitch shifter. The player cannot tell whether the sound is varying intentionally or whether the audio system is malfunctioning. The ranges in the earlier table are the ranges that work; exceeding them is almost always a mistake.

The over-randomization problem is specific to UI sounds in a way that it is not specific to other sound categories. A footstep that varies by ±10 percent sounds natural, because footsteps in the real world vary by more than that. A blip that varies by ±10 percent sounds broken, because the blip is a synthetic sound that the player expects to be consistent. The footstep surface guide covers the ranges that work for footsteps; the difference in acceptable variation is what makes a blip harder to randomize than a footstep.

How do you test whether randomization is actually working?

The test for a randomized blip set is not whether the individual blips sound different. It is whether the player notices the repetition. These are different questions, and the second one is the one that matters.

The first test is the prediction test. Play the blip twenty times in a row and try to predict the pitch of the next one. If you can predict it (for example, because the sequence alternates high-low-high-low), the randomization is not working. If you cannot predict it, the randomization is working, even if the individual blips sound more similar than you expected.

The second test is the recognition test. Play the blip twenty times and try to identify any two blips as "the same." With uniform random distribution, a few pairs will fall close enough to sound identical. With Gaussian distribution, the pairs that fall close are more common, but they sound more natural because the clustering matches the way real variation works.

The third test is the in-game test. Play the game for five minutes with the randomized blips and try to ignore the audio. If you notice the repetition, the randomization is not enough. If you do not notice it, the randomization is working, even if the individual blips sound less varied than you expected when you listened to them in isolation.

The final test is the disable test. Turn off the randomization and play the same five minutes again. The difference between the two sessions is what the randomization is contributing. If the sessions sound the same, the randomization is not doing anything, and the parameters or ranges need to be reconsidered. If the sessions sound different, the randomization is doing the work it was designed for.

The disable test is the most useful because it forces the designer to evaluate the randomization in context rather than in isolation. A set of blips that sounds varied when played alone can sound identical when played in a game, because the other sounds mask the differences. A set of blips that sounds subtle when played alone can sound varied when played in a game, because the player's attention is on the gameplay rather than on the audio. The context is what determines whether the randomization is working, not the isolated sound.

The variation system guide covers the pool selection and the anti-repetition mechanics. This article covers the parameter-level decisions that determine whether the variations in the pool are actually distinguishable to the player. The two are complementary: the pool management determines how many variations exist, and the parameter randomization determines how different each one is.

The randomized blip is a small detail in the overall audio of a game. But it is a detail that plays hundreds of times in a session, and a set that sounds repetitive becomes a set the player turns off. The randomness is not decoration; it is what makes the blip set tolerable over a long play session. The specific parameters and ranges in this article are the ones that work, and the difference between a set that works and one that does not is often a few percentage points in the pitch range and the choice between uniform and Gaussian distribution.

Generate Reference Blips for a Randomized Set

Open the SfxMaker blip generator and create the base blip for your randomized set. Export it as a WAV file if you are using sample playback, or note its parameters if you are generating at runtime. The randomization is applied to the parameters described in this article, so having a clean base sound is the starting point.

Open Blip Sound Generator →
Advertisement