Audio tempo change calculator
Changing a clip from one tempo to another affects more than its beat grid: when pitch-preserving time stretch is not being considered separately, the playback length changes by the inverse of the BPM ratio.
Run — free
This calculator takes the original BPM, target BPM, and known clip duration, then returns the signed tempo-change percentage, the duration multiplier, and the resulting length. It gives editors, producers, DJs, and developers a quick, reproducible answer without requiring audio upload or analysis.
Enter the tempos and the known clip length
Start with the BPM at which the source clip currently plays, then enter the BPM you want it to match. The original and target values must both be greater than zero because a zero or negative beat rate has no meaningful tempo ratio. Add the clip's current duration in seconds, including decimals when precision matters. For example, a region lasting 92.5 seconds can be entered directly without rounding it to a whole second. The calculator does not inspect an audio file, detect beats, or guess tempo; it uses the numbers you supply. That makes it useful after tempo detection, while preparing an edit, or inside an automated workflow where BPM metadata is already available. The duration can be zero for a boundary-case calculation, but it cannot be negative. Use the duration of the exact region being changed rather than the full project length if only one loop, stem, cue, or scene will adopt the new tempo. Accurate source values produce an accurate projected length.
Understand the percentage and multiplier
The tempo-change percentage compares the target BPM with the original BPM. It is calculated as the target-to-original ratio minus one, multiplied by one hundred. A positive result means the audio is being sped up; a negative result means it is being slowed down; zero means the tempos match. Duration moves in the opposite direction, so its multiplier is original BPM divided by target BPM. Raising a clip from 120 BPM to 150 BPM is a 25 percent tempo increase, while its duration multiplier becomes 0.8. The faster version therefore occupies 80 percent of the original running time. Moving from 120 BPM to 90 BPM gives a negative tempo change and a multiplier greater than one, indicating a longer result. The returned multiplier is deliberately explicit because it can be applied to other time measurements, such as marker positions or edit decision points, when those positions must follow the same uniform tempo transformation.
Apply the result in an audio workflow
Use the resulting duration as a planning value for timeline space, loop alignment, cue placement, export estimates, or synchronization with video. The calculation assumes one uniform change across the entire clip and an exact relationship between playback rate and duration. It does not predict artifacts, transient quality, pitch behavior, elastic-audio settings, or the choices made by a particular digital audio workstation. A pitch-preserving algorithm can still target the same duration, but its sound quality depends on material and software rather than this arithmetic. If a clip contains tempo automation or several sections with different source BPM values, calculate each constant-tempo section separately and add their resulting durations. Keep enough decimal precision when passing results into another system; display rounding can otherwise accumulate across many clips. For automated calls, the base price is $0.002 per request. The browser calculation uses the same deterministic formula and requires no audio upload, which is helpful when the source material should remain local.
What you can do with it
Fit a loop to a session tempo
Calculate how much a loop must speed up or slow down and how long it will occupy after matching the session BPM.
Plan music edits against picture
Estimate the changed music cue length before placing edit points or revising a video timeline.
Scale markers in an audio tool
Use the duration multiplier to transform cue, region, or marker times consistently in an automated workflow.
FAQ
How is tempo-change percentage calculated?
Divide target BPM by original BPM, subtract one, and multiply by 100. Positive values indicate an increase and negative values indicate a decrease.
Why is the duration multiplier the inverse BPM ratio?
A faster beat rate takes less time to play the same beat count, so duration scales by original BPM divided by target BPM.
Does this calculator preserve pitch?
It calculates tempo and duration only. Pitch behavior depends on whether your playback or time-stretch tool preserves pitch.
Can I use decimal BPM and duration values?
Yes. Finite decimal numbers are accepted for both BPM values and for the clip duration in seconds.
What happens if a BPM is zero or negative?
The request returns an invalid-input error because tempo ratios require positive original and target BPM values.
What does an API request cost?
Each API request costs $0.002. You can also perform the deterministic calculation in the browser.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/audio/tempo-change-percent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_bpm":120,"target_bpm":150,"duration_seconds":240}'const res = await fetch("https://api.kit.forhosting.com/audio/tempo-change-percent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_bpm": 120,
"target_bpm": 150,
"duration_seconds": 240
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/tempo-change-percent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_bpm": 120,
"target_bpm": 150,
"duration_seconds": 240
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/tempo-change-percent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_bpm":120,"target_bpm":150,"duration_seconds":240}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_bpm":120,"target_bpm":150,"duration_seconds":240}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/tempo-change-percent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"original_bpm": 120,
"target_bpm": 150,
"duration_seconds": 240
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.tempo_change_percent",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 200 |
max_minutes | 180 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |