Zoë Blade's notebook

Transposing tempos

If you have a track in one of the following common tempos, and want to pitch it up or down by a few semitones, changing its key and tempo proportionally, this table will tell you its new tempo.

If you're adventurous, you can sidestep this whole issue by using what I like to call pitched tempos.

Tempo (BPM) -2 semitones -1 semitone +1 semitone +2 semitones
80 71.272 75.510 84.757 89.797
85 75.726 80.229 90.054 95.409
90 80.181 84.949 95.352 101.022
95 84.635 89.668 100.649 106.634
100 89.090 94.387 105.946 112.246
105 93.544 99.107 111.244 117.859
110 97.999 103.826 116.541 123.471
115 102.453 108.546 121.838 129.083
120 106.908 113.265 127.136 134.695
125 111.362 117.984 132.433 140.308
130 115.817 122.704 137.730 145.920
135 120.271 127.423 143.028 151.532
140 124.726 132.142 148.325 157.145

Source code

I tabulated these using a simple C program, transpose-bpm.c:

/* BPM transposer, for ANSI C, by Zoe Blade, 2024-04-04 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void transposeBeatsPerMinute(int beatsPerMinute) {
    int semitones;

    /*
     * The new tempo = the old tempo * 2 ^ (the pitch change in semitones / 12)
     */

    for (semitones = -2; semitones < 3; semitones++) {
        printf("%3d\t%+3d\t%7.3f\n", beatsPerMinute, semitones, beatsPerMinute * pow(2, semitones / 12.0));
    }

    return;
}

int main(int argc, char *argv[]) {
    int beatsPerMinute;

    printf("BPM\tSts\tBPM\n");
    printf("===\t===\t=======\n\n");

    if (argc == 1) {
        for (beatsPerMinute = 80; beatsPerMinute < 145; beatsPerMinute += 5) {
            transposeBeatsPerMinute(beatsPerMinute);
        }
    } else {
        transposeBeatsPerMinute(atoi(argv[1]));
    }

    return 0;
}

C programs: BPM to milliseconds | Transposing tempos

Electronic music making tables: BPM to milliseconds | DX21 guide | Interval | MicroVerb III guide | Pitched tempos | Pitches | S1000 page map | ST MIDI sequencer timeline | Transposing tempos