{"id":20345,"date":"2026-09-24T11:12:51","date_gmt":"2026-09-24T09:12:51","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/"},"modified":"2026-09-24T11:12:51","modified_gmt":"2026-09-24T09:12:51","slug":"tempo-converter-time-stretch-factor-length-pitch","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/","title":{"rendered":"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift"},"content":{"rendered":"<div class=\"lw-tu\" id=\"tu-wurzel\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<style>\n.lw-tu { --tu-warn: #e8a33d; }\n:root[data-theme=\"light\"] .lw-tu { --tu-warn: #8f5300; }\n.lw-tu .tu-felder { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }\n.lw-tu label { display: block; font-size: 0.8rem; color: var(--text-secondary, #a0a0b0); margin-bottom: 4px; }\n.lw-tu input, .lw-tu select { width: 100%; box-sizing: border-box; background: var(--bg-body, #14141a); color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 9px 10px; font-family: monospace; font-size: 1rem; }\n.lw-tu input.tu-falsch { border-color: var(--fehler, #f0857a); }\n.lw-tu .tu-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin: 18px 0 4px; }\n.lw-tu .tu-kachel { background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 11px 14px; min-width: 0; }\n.lw-tu .tu-kachel-name { font-size: 0.74rem; color: var(--text-secondary, #a0a0b0); text-transform: uppercase; letter-spacing: 0.4px; }\n.lw-tu .tu-kachel-wert { font-family: monospace; font-size: 1.4rem; font-weight: 700; color: var(--text-primary, #e8e8ee); line-height: 1.25; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.lw-tu .tu-hinweis { border-radius: 8px; padding: 10px 14px; margin-top: 12px; border: 1px solid var(--border, #2a2a35); background: var(--bg-body, #14141a); font-size: 0.86rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; }\n.lw-tu .tu-hinweis strong { color: var(--tu-warn); }\n.lw-tu .tu-tabelle { overflow-x: auto; margin-top: 6px; }\n.lw-tu table { border-collapse: collapse; width: 100%; font-size: 0.86rem; }\n.lw-tu th, .lw-tu td { text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--border, #2a2a35); vertical-align: top; }\n.lw-tu th { color: var(--text-primary, #e8e8ee); }\n.lw-tu td { color: var(--text-primary, #e8e8ee); }\n.lw-tu td.tu-wert { font-family: monospace; color: var(--text-secondary, #a0a0b0); white-space: nowrap; }\n.lw-tu .tu-befehl-name { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.88rem; margin: 14px 0 4px; }\n.lw-tu .tu-befehl { font-family: monospace; font-size: 0.84rem; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 10px 12px; overflow-wrap: anywhere; color: var(--text-primary, #e8e8ee); }\n.lw-tu .tu-h { font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 24px 0 8px; }\n.lw-tu .tu-klein { font-size: 0.84rem; color: var(--text-secondary, #a0a0b0); line-height: 1.55; }\n.lw-tu .tu-knopf { background: transparent; color: var(--text-secondary, #a0a0b0); border: 1px solid var(--border, #2a2a35); padding: 9px 14px; border-radius: 6px; cursor: pointer; font-size: 0.9rem; margin-top: 12px; }\n.lw-tu .tu-fehler { color: var(--fehler, #f0857a); font-size: 0.88rem; margin-top: 12px; }\n.lw-tu a { color: var(--accent, #2ba6df); }\n@media (max-width: 600px) {\n    .lw-tu .tu-kacheln { grid-template-columns: 1fr 1fr; gap: 8px; }\n    .lw-tu .tu-kachel-wert { font-size: 1.15rem; }\n    .lw-tu table.tu-karten thead { display: none; }\n    .lw-tu table.tu-karten tr { display: block; padding: 8px 0; border-bottom: 1px solid var(--border, #2a2a35); }\n    .lw-tu table.tu-karten td { display: block; border: none; padding: 1px 0; }\n    .lw-tu table.tu-karten td:first-child { font-weight: 700; }\n    .lw-tu table.tu-karten td.tu-wert { white-space: normal; }\n    .lw-tu table.tu-karten td[data-name]::before { content: attr(data-name) \": \"; color: var(--text-secondary, #a0a0b0); font-family: inherit; }\n}\n<\/style>\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 18px;\">Converts one tempo into another for time-stretching: the tempo factor for atempo and rubberband, the new length of a file in time and samples, beat and bar lengths, and the pitch shift that a speed change without time-stretching (varispeed) would bring. The ffmpeg commands follow the measurement in the article on time-stretching.<\/p>\n<div class=\"tu-felder\">\n<div><label for=\"tu-von\">Original tempo (BPM)<\/label><input id=\"tu-von\" type=\"text\" inputmode=\"decimal\" value=\"128\" autocomplete=\"off\" data-mp-mask><\/div>\n<div><label for=\"tu-nach\">Target tempo (BPM)<\/label><input id=\"tu-nach\" type=\"text\" inputmode=\"decimal\" value=\"124\" autocomplete=\"off\" data-mp-mask><\/div>\n<div><label for=\"tu-prozent\">Tempo change (%)<\/label><input id=\"tu-prozent\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" data-mp-mask><\/div>\n<div><label for=\"tu-halbtoene\">Semitones (varispeed)<\/label><input id=\"tu-halbtoene\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" data-mp-mask><\/div>\n<\/p><\/div>\n<div class=\"tu-felder\" style=\"margin-top: 12px;\">\n<div><label for=\"tu-dauer\">Length of the file (optional)<\/label><input id=\"tu-dauer\" type=\"text\" inputmode=\"decimal\" placeholder=\"3:30\" autocomplete=\"off\" data-mp-mask><\/div>\n<div><label for=\"tu-rate\">Sample rate<\/label><select id=\"tu-rate\"><option value=\"44100\">44100 Hz<\/option><option value=\"48000\">48000 Hz<\/option><option value=\"88200\">88200 Hz<\/option><option value=\"96000\">96000 Hz<\/option><\/select><\/div>\n<div><label for=\"tu-schlaege\">Beats per bar<\/label><input id=\"tu-schlaege\" type=\"text\" inputmode=\"numeric\" value=\"4\" autocomplete=\"off\" data-mp-mask><\/div>\n<\/p><\/div>\n<p class=\"tu-klein\" style=\"margin: 10px 0 0;\">Target tempo, percentage and semitones are linked: the field edited last sets the target tempo. Length as seconds, m:ss or h:mm:ss.<\/p>\n<div id=\"tu-fehler\" class=\"tu-fehler\" data-mp-mask hidden><\/div>\n<div id=\"tu-ausgabe\" data-mp-mask aria-live=\"polite\">\n<div id=\"tu-kacheln\" class=\"tu-kacheln\"><\/div>\n<div id=\"tu-hinweise\"><\/div>\n<div class=\"tu-h\">Lengths<\/div>\n<div class=\"tu-tabelle\">\n<table class=\"tu-karten\">\n<thead>\n<tr>\n<th>What<\/th>\n<th>Original tempo<\/th>\n<th>Target tempo<\/th>\n<th>Samples at target tempo<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"tu-laengen\"><\/tbody>\n<\/table><\/div>\n<div class=\"tu-h\">ffmpeg commands<\/div>\n<div id=\"tu-befehle\"><\/div>\n<p>        <button id=\"tu-kopieren\" type=\"button\" class=\"tu-knopf\">Copy result<\/button><br \/>\n        <span id=\"tu-kopiert\" class=\"tu-klein\" style=\"margin-left: 10px;\"><\/span>\n    <\/div>\n<div class=\"tu-h\">How it calculates<\/div>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">The tempo factor is the target tempo divided by the original tempo: 120 to 132 BPM is tempo 1.1, 128 to 124 BPM is 0.96875. The file becomes longer by the inverse factor. The commands pass the factor as an exact fraction such as 124\/128; ffmpeg evaluates it as an expression. atempo accepts 0.5 to 100, but above 2 it skips samples according to the documentation, so the tool splits larger and smaller factors into a chain.<\/p>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">The choice of method follows the measurement at tempo 0.9 to 1.1: with channels=together, rubberband kept every hit within 0.48\u00a0ms of its place and the stereo image at a correlation of 0.92, at the price of a ramp before every hit and dips on steady tones. transients=smooth left pure tones almost unchanged but made the mix 2.6 to 3.0\u00a0dB quieter. atempo kept sound and level best, but shifted single hits by up to 10.84\u00a0ms and damaged a 55\u00a0Hz tone.<\/p>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">Tested with ffmpeg 7.1.5 on a 10\u00a0s test signal at factors from 0.4 to 2.5: both rubberband commands hit the calculated length to the sample in all seven cases, varispeed to within one sample and the calculated pitch to within 0.01 semitones. atempo deviated by \u221230.4 to +8.0\u00a0ms, within the measured range of 0.9 to 1.1 by no more than 4.6\u00a0ms; at 128 to 124 BPM, 4.58\u00a0ms were missing.<\/p>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">The ISRC Handbook (4th edition 2021, A.10.2) distinguishes: if a recording changes its length only through speed or fade-out, a new ISRC is due from a difference of 10 seconds; below that it keeps its code.<\/p>\n<div class=\"tu-h\">Articles on this<\/div>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">How atempo and rubberband handle timing, transients, pure and harmonic tones and the stereo image at \u00b15 and \u00b110\u00a0% is measured in the article \u201c<span class=\"lw-artikel-geplant\">Time-Stretching by 10 Percent With atempo and rubberband<\/span>\u201d.<\/p>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">When a new version needs its own ISRC, including the 10-second rule for tempo changes, is shown in the tutorial \u201c<a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/music-production\/tutorials-en-music-production\/release-metadata-isrc-upc-iswc-assign-embed-check-step-by-step\/\">Release Metadata 2026<\/a>\u201d.<\/p>\n<p class=\"tu-klein\" style=\"margin: 0 0 6px;\">How the DAWs of 2026 stretch audio to the project tempo, with Ableton Live\u2019s warping as the benchmark, is compared in the article \u201c<a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/music-production\/top-5-daws-2026-fl-studio-ableton-logic-cubase-bitwig\/\">Top 5 DAWs in 2026<\/a>\u201d.<\/p>\n<p class=\"tu-klein\" style=\"margin: 20px 0 0;\">Sources:<br \/>\n        <a href=\"https:\/\/ffmpeg.org\/ffmpeg-filters.html#atempo\" rel=\"noopener\">ffmpeg Filters Documentation (atempo, rubberband, asetrate)<\/a> \u00b7<br \/>\n        <a href=\"https:\/\/breakfastquay.com\/rubberband\/\" rel=\"noopener\">Rubber Band Library<\/a> \u00b7<br \/>\n        <a href=\"https:\/\/isrc.ifpi.org\/images\/downloads\/ISRC_Handbook.pdf\" rel=\"noopener\">ISRC Handbook, 4th Edition 2021, A.10.2 (IFPI)<\/a>\n    <\/p>\n<p class=\"tu-klein\" style=\"font-size: 0.8rem; margin: 14px 0 0;\">The calculation assumes a constant tempo; tempo changes within a file and swing are not covered. asetrate only takes whole hertz, so varispeed deviates from the exact rate by no more than 0.5\u00a0Hz, which is no more than 0.02 cents. Which method sounds better was not decided by a listening test.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';\n    const T = {\"dezimal\":\".\",\"tausender\":\",\",\"einleitung\":\"Converts one tempo into another for time-stretching: the tempo factor for atempo and rubberband, the new length of a file in time and samples, beat and bar lengths, and the pitch shift that a speed change without time-stretching (varispeed) would bring. The ffmpeg commands follow the measurement in the article on time-stretching.\",\"f_von\":\"Original tempo (BPM)\",\"f_nach\":\"Target tempo (BPM)\",\"f_prozent\":\"Tempo change (%)\",\"f_halbtoene\":\"Semitones (varispeed)\",\"f_dauer\":\"Length of the file (optional)\",\"f_rate\":\"Sample rate\",\"f_schlaege\":\"Beats per bar\",\"felder_hinweis\":\"Target tempo, percentage and semitones are linked: the field edited last sets the target tempo. Length as seconds, m:ss or h:mm:ss.\",\"k_faktor\":\"Tempo factor\",\"k_laenge\":\"Length changes by\",\"k_tonhoehe\":\"Pitch with varispeed\",\"k_dauer\":\"New length\",\"st\":\"st\",\"achtung\":\"Note:\",\"hinweis_gleich\":\"Both tempos are the same; there is nothing to stretch.\",\"hinweis_ausserhalb\":\"A change of {p} lies outside the range measured in the article (\u00b110\u00a0%); the notes on the methods below are based on that range.\",\"hinweis_isrc_neu\":\"The length changes by {d}. According to the ISRC Handbook, a speed change of 10\u00a0s or more calls for a new ISRC.\",\"hinweis_isrc_bleibt\":\"The length changes by {d}. According to the ISRC Handbook, a speed change of less than 10\u00a0s keeps the ISRC, provided nothing else changes.\",\"hinweis_varispeed\":\"Varispeed, the speed change without time-stretching as on a turntable, would shift the pitch by {st} semitones ({ct} cents). Time-stretching keeps the pitch.\",\"h_laengen\":\"Lengths\",\"sp_was\":\"What\",\"sp_alt\":\"Original tempo\",\"sp_neu\":\"Target tempo\",\"sp_werte\":\"Samples at target tempo\",\"z_schlag\":\"One beat\",\"z_takt\":\"One bar ({n} beats)\",\"z_vier\":\"Four bars\",\"z_datei\":\"File\",\"h_befehle\":\"ffmpeg commands\",\"werte\":\"samples\",\"b_schlag\":\"Drums and full mixes (timing matters)\",\"b_flaeche\":\"Pads, vocals and sustained tones\",\"b_atempo\":\"atempo (without fixed hits and without low tones)\",\"b_atempo_kette\":\"atempo as a chain (without fixed hits and without low tones)\",\"b_varispeed\":\"Varispeed: tempo and pitch together\",\"keine_befehle\":\"No command needed at a factor of 1.\",\"knopf_kopieren\":\"Copy result\",\"kopiert\":\"copied\",\"kopieren_fehler\":\"copying not possible\",\"bericht_kopf\":\"Tempo conversion\",\"fehler_bpm\":\"Both tempos have to lie between 1 and 999 BPM.\",\"fehler_dauer\":\"The length is not readable; seconds, m:ss or h:mm:ss are accepted, such as 3:30 or 210.5.\",\"fehler_schlaege\":\"Beats per bar: a whole number from 1 to 32.\",\"h_erklaerung\":\"How it calculates\",\"erkl_faktor\":\"The tempo factor is the target tempo divided by the original tempo: 120 to 132 BPM is tempo 1.1, 128 to 124 BPM is 0.96875. The file becomes longer by the inverse factor. The commands pass the factor as an exact fraction such as 124\\\/128; ffmpeg evaluates it as an expression. atempo accepts 0.5 to 100, but above 2 it skips samples according to the documentation, so the tool splits larger and smaller factors into a chain.\",\"erkl_verfahren\":\"The choice of method follows the measurement at tempo 0.9 to 1.1: with channels=together, rubberband kept every hit within 0.48\u00a0ms of its place and the stereo image at a correlation of 0.92, at the price of a ramp before every hit and dips on steady tones. transients=smooth left pure tones almost unchanged but made the mix 2.6 to 3.0\u00a0dB quieter. atempo kept sound and level best, but shifted single hits by up to 10.84\u00a0ms and damaged a 55\u00a0Hz tone.\",\"erkl_laenge\":\"Tested with ffmpeg 7.1.5 on a 10\u00a0s test signal at factors from 0.4 to 2.5: both rubberband commands hit the calculated length to the sample in all seven cases, varispeed to within one sample and the calculated pitch to within 0.01 semitones. atempo deviated by \u221230.4 to +8.0\u00a0ms, within the measured range of 0.9 to 1.1 by no more than 4.6\u00a0ms; at 128 to 124 BPM, 4.58\u00a0ms were missing.\",\"erkl_isrc\":\"The ISRC Handbook (4th edition 2021, A.10.2) distinguishes: if a recording changes its length only through speed or fade-out, a new ISRC is due from a difference of 10 seconds; below that it keeps its code.\",\"h_artikel\":\"Articles on this\",\"art_ts_vor\":\"How atempo and rubberband handle timing, transients, pure and harmonic tones and the stereo image at \u00b15 and \u00b110\u00a0% is measured in the article \u201c\",\"art_ts_titel\":\"Time-Stretching by 10 Percent With atempo and rubberband\",\"art_ts_nach\":\"\u201d.\",\"art_isrc_vor\":\"When a new version needs its own ISRC, including the 10-second rule for tempo changes, is shown in the tutorial \u201c\",\"art_isrc_titel\":\"Release Metadata 2026\",\"art_isrc_nach\":\"\u201d.\",\"art_daw_vor\":\"How the DAWs of 2026 stretch audio to the project tempo, with Ableton Live\u2019s warping as the benchmark, is compared in the article \u201c\",\"art_daw_titel\":\"Top 5 DAWs in 2026\",\"art_daw_nach\":\"\u201d.\",\"quellen_titel\":\"Sources\",\"grenze\":\"The calculation assumes a constant tempo; tempo changes within a file and swing are not covered. asetrate only takes whole hertz, so varispeed deviates from the exact rate by no more than 0.5\u00a0Hz, which is no more than 0.02 cents. Which method sounds better was not decided by a listening test.\"};<\/p>\n<p>    \/\/ KERN-ANFANG ------------------------------------------------------------\n    \/\/ Tempo-Umrechner: Tempo-Faktor, neue Laenge, Tonhoehe bei Varispeed und die ffmpeg-Befehle.\n    var GEMESSEN = 0.1;            \/\/ im Timestretching-Artikel gemessen: Tempo 0,9 bis 1,1\n    var ISRC_S = 10;               \/\/ ISRC-Handbuch, 4. Auflage 2021, A.10.2: ab 10 s Laengenunterschied neue ISRC\n    var MIN_BPM = 1, MAX_BPM = 999;<\/p>\n<p>    function halbtoene(f) { return 12 * Math.log(f) \/ Math.LN2; }\n    function ausHalbtoenen(st) { return Math.pow(2, st \/ 12); }<\/p>\n<p>    \/\/ Dauer als Sekunden, m:ss, h:mm:ss, jeweils mit Punkt oder Komma als Dezimaltrenner\n    function dauerLesen(s) {\n        s = String(s === undefined || s === null ? '' : s).trim().replace(',', '.');\n        if (s === '') { return null; }\n        if (!\/^\\d+(:\\d{1,2}){0,2}(\\.\\d+)?$\/.test(s)) { return NaN; }\n        var teile = s.split(':'), sek = 0, i;\n        for (i = 0; i < teile.length; i++) {\n            var v = parseFloat(teile[i]);\n            if (i > 0 && v >= 60) { return NaN; }\n            sek = sek * 60 + v;\n        }\n        return sek;\n    }\n    function zahlLesen(s) {\n        s = String(s === undefined || s === null ? '' : s).trim().replace(',', '.').replace('\u2212', '-');\n        if (s === '' || !\/^[-+]?\\d*\\.?\\d+$\/.test(s)) { return NaN; }\n        return parseFloat(s);\n    }<\/p>\n<p>    \/\/ Kurzform einer Zahl fuer Befehle: hoechstens zehn Nachkommastellen, ohne Nullen am Ende\n    function kurz(v) { return Number(v.toFixed(10)).toString(); }<\/p>\n<p>    \/\/ Tempo-Faktor als Ausdruck: exakt als Bruch, wenn beide Tempi ganze Zahlen oder kurze Dezimalzahlen sind\n    function bruch(nach, von) { return von === nach ? '1' : kurz(nach) + '\/' + kurz(von); }<\/p>\n<p>    \/\/ atempo nimmt 0,5 bis 100; ueber 2 ueberspringt es laut Dokumentation Werte, deshalb ab 2 als Kette\n    function atempoKette(f) {\n        var teile = [], rest = f;\n        while (rest > 2) { teile.push(2); rest \/= 2; }\n        while (rest < 0.5) { teile.push(0.5); rest \/= 0.5; }\n        return { teile: teile, rest: rest };\n    }\n\n    function rechnen(e) {\n        var von = e.von, nach = e.nach, schlaege = e.schlaege === undefined ? 4 : e.schlaege, rate = e.rate || 44100;\n        if (!(von >= MIN_BPM && von <= MAX_BPM) || !(nach >= MIN_BPM && nach <= MAX_BPM)) { return { fehler: 'bpm' }; }\n        if (!(schlaege >= 1 && schlaege <= 32 &#038;&#038; Math.round(schlaege) === schlaege)) { return { fehler: 'schlaege' }; }\n        var f = nach \/ von, lf = von \/ nach, r = {\n            von: von, nach: nach, faktor: f, laenge: lf, tempo_prozent: (f - 1) * 100, laenge_prozent: (lf - 1) * 100,\n            halbtoene: halbtoene(f), rate: rate, schlaege: schlaege,\n            schlag_alt_ms: 60000 \/ von, schlag_neu_ms: 60000 \/ nach,\n            takt_alt_ms: schlaege * 60000 \/ von, takt_neu_ms: schlaege * 60000 \/ nach,\n            ausserhalb: Math.abs(f - 1) > GEMESSEN + 1e-9, gleich: Math.abs(f - 1) < 1e-12\n        };\n        \/\/ vier Takte im neuen Tempo in Abtastwerten: ganzzahlig oder nicht (Schleifen)\n        r.vier_takte_werte = 4 * schlaege * 60 \/ nach * rate;\n        r.vier_takte_ganz = Math.abs(r.vier_takte_werte - Math.round(r.vier_takte_werte)) < 1e-6;\n        if (e.dauer_s !== null &#038;&#038; e.dauer_s !== undefined) {\n            if (!(e.dauer_s > 0 && e.dauer_s < 86400)) { return { fehler: 'dauer' }; }\n            r.dauer_alt_s = e.dauer_s;\n            r.dauer_neu_s = e.dauer_s * lf;\n            r.dauer_diff_s = r.dauer_neu_s - e.dauer_s;\n            r.werte_alt = Math.round(e.dauer_s * rate);\n            r.werte_neu = Math.round(r.werte_alt * lf);\n            r.isrc_neu = Math.abs(r.dauer_diff_s) >= ISRC_S;\n        }\n        \/\/ Varispeed: asetrate nimmt eine ganze Zahl, damit weicht der Faktor minimal ab\n        r.asetrate = Math.round(rate * f);\n        r.varispeed_faktor = r.asetrate \/ rate;\n        return r;\n    }<\/p>\n<p>    function befehle(r) {\n        if (!r || r.fehler || r.gleich) { return null; }\n        var t = bruch(r.nach, r.von), k = atempoKette(r.faktor), at;\n        if (!k.teile.length) { at = 'atempo=' + t; }\n        else { at = k.teile.map(function (x) { return 'atempo=' + x; }).concat(['atempo=' + kurz(k.rest)]).join(','); }\n        function ff(filter) { return 'ffmpeg -i ein.wav -af \"' + filter + '\" aus.wav'; }\n        return {\n            schlag: ff('rubberband=tempo=' + t + ':channels=together'),\n            flaeche: ff('rubberband=tempo=' + t + ':transients=smooth:channels=together'),\n            atempo: ff(at),\n            varispeed: ff('asetrate=' + r.asetrate + ',aresample=' + r.rate),\n            kette: k.teile.length > 0\n        };\n    }\n    \/\/ KERN-ENDE --------------------------------------------------------------<\/p>\n<p>    function el(id) { return document.getElementById(id); }\n    var NB = ' ';\n    function satz(k, w) { return (T[k] || '').replace(\/\\{(\\w+)\\}\/g, function (_, x) { return w && w[x] !== undefined ? w[x] : ''; }); }\n    function zahl(v, st) {\n        if (v === null || v === undefined || !isFinite(v)) { return '\u2013'; }\n        var s = Number(v).toFixed(st === undefined ? 2 : st);\n        if (\/^-0(\\.0+)?$\/.test(s)) { s = s.slice(1); }\n        s = s.replace('-', '\u2212');\n        return T.dezimal === ',' ? s.replace('.', ',') : s;\n    }\n    function vorz(v, st) { var s = zahl(v, st); return isFinite(v) && Number(Number(v).toFixed(st)) > 0 ? '+' + s : s; }\n    function tausend(n) { return String(n).replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, T.tausender); }\n    function dauer(s) {\n        var h = Math.floor(s \/ 3600), m = Math.floor((s - 3600 * h) \/ 60), r = s - 3600 * h - 60 * m;\n        var rs = zahl(r, 3); if (r < 10) { rs = '0' + rs; }\n        return (h ? h + ':' + (m < 10 ? '0' : '') : '') + m + ':' + rs;\n    }\n    function ms(v) { return zahl(v, v >= 1000 ? 1 : 2) + NB + 'ms'; }<\/p>\n<p>    \/\/ gekoppelte Felder: das zuletzt bearbeitete von Zieltempo, Prozent und Halbtoenen bestimmt das Zieltempo\n    var fuehrt = 'nach', letztes = null;\n    function eingaben() {\n        var von = zahlLesen(el('tu-von').value), nach;\n        if (fuehrt === 'prozent') { nach = von * (1 + zahlLesen(el('tu-prozent').value) \/ 100); }\n        else if (fuehrt === 'halbtoene') { nach = von * ausHalbtoenen(zahlLesen(el('tu-halbtoene').value)); }\n        else { nach = zahlLesen(el('tu-nach').value); }\n        return { von: von, nach: nach, dauer_s: dauerLesen(el('tu-dauer').value), rate: parseInt(el('tu-rate').value, 10),\n            schlaege: zahlLesen(el('tu-schlaege').value) };\n    }<\/p>\n<p>    function zeile(t, werte) {\n        var tr = document.createElement('tr'), namen = [T.sp_was, T.sp_alt, T.sp_neu, T.sp_werte];\n        werte.forEach(function (w, i) {\n            var td = document.createElement('td');\n            if (i > 0) { td.className = 'tu-wert'; td.setAttribute('data-name', namen[i]); }\n            td.textContent = w; tr.appendChild(td);\n        });\n        t.appendChild(tr);\n    }\n    function kachel(name, wert) {\n        var d = document.createElement('div'); d.className = 'tu-kachel';\n        var a = document.createElement('div'); a.className = 'tu-kachel-name'; a.textContent = name;\n        var b = document.createElement('div'); b.className = 'tu-kachel-wert'; b.textContent = wert;\n        d.appendChild(a); d.appendChild(b);\n        return d;\n    }\n    function hinweis(text, warn) {\n        var d = document.createElement('div'); d.className = 'tu-hinweis';\n        if (warn) { var s = document.createElement('strong'); s.textContent = warn + ' '; d.appendChild(s); }\n        d.appendChild(document.createTextNode(text));\n        el('tu-hinweise').appendChild(d);\n    }<\/p>\n<p>    function darstellen(r, e) {\n        var f = el('tu-fehler'), aus = el('tu-ausgabe');\n        ['tu-von', 'tu-nach', 'tu-prozent', 'tu-halbtoene', 'tu-dauer', 'tu-schlaege'].forEach(function (id) { el(id).classList.remove('tu-falsch'); });\n        if (r.fehler) {\n            f.textContent = T['fehler_' + r.fehler]; f.hidden = false; aus.hidden = true;\n            el({ bpm: fuehrt === 'nach' ? 'tu-nach' : 'tu-' + fuehrt, dauer: 'tu-dauer', schlaege: 'tu-schlaege' }[r.fehler]).classList.add('tu-falsch');\n            if (r.fehler === 'bpm' && !(e.von >= MIN_BPM && e.von <= MAX_BPM)) { el('tu-von').classList.add('tu-falsch'); }\n            letztes = null;\n            return r;\n        }\n        f.hidden = true; aus.hidden = false;\n        \/\/ die nicht fuehrenden Felder nachziehen\n        if (fuehrt !== 'nach') { el('tu-nach').value = zahl(r.nach, 3).replace(\/[.,]?0+$\/, ''); }\n        if (fuehrt !== 'prozent') { el('tu-prozent').value = zahl(r.tempo_prozent, 3).replace(\/[.,]?0+$\/, '').replace('\u2212', '-'); }\n        if (fuehrt !== 'halbtoene') { el('tu-halbtoene').value = zahl(r.halbtoene, 3).replace(\/[.,]?0+$\/, '').replace('\u2212', '-'); }\n        var k = el('tu-kacheln');\n        k.textContent = '';\n        k.appendChild(kachel(T.k_faktor, zahl(r.faktor, 5)));\n        k.appendChild(kachel(T.k_laenge, vorz(r.laenge_prozent, 2) + NB + '%'));\n        k.appendChild(kachel(T.k_tonhoehe, vorz(r.halbtoene, 2) + NB + T.st));\n        k.appendChild(kachel(T.k_dauer, r.dauer_neu_s !== undefined ? dauer(r.dauer_neu_s) : '\u2013'));\n        el('tu-hinweise').textContent = '';\n        if (r.gleich) { hinweis(T.hinweis_gleich); }\n        if (r.ausserhalb) { hinweis(satz('hinweis_ausserhalb', { p: vorz(r.tempo_prozent, 1) + NB + '%' }), T.achtung); }\n        if (r.dauer_neu_s !== undefined) {\n            hinweis(satz(r.isrc_neu ? 'hinweis_isrc_neu' : 'hinweis_isrc_bleibt', { d: vorz(r.dauer_diff_s, 2) + NB + 's' }), r.isrc_neu ? T.achtung : '');\n        }\n        hinweis(satz('hinweis_varispeed', { st: vorz(r.halbtoene, 2), ct: vorz(r.halbtoene * 100, 0) }));\n        var t = el('tu-laengen');\n        t.textContent = '';\n        zeile(t, [T.z_schlag, ms(r.schlag_alt_ms), ms(r.schlag_neu_ms), tausend(Math.round(r.schlag_neu_ms * r.rate \/ 1000))]);\n        zeile(t, [satz('z_takt', { n: r.schlaege }), ms(r.takt_alt_ms), ms(r.takt_neu_ms), tausend(Math.round(r.takt_neu_ms * r.rate \/ 1000))]);\n        zeile(t, [T.z_vier, ms(4 * r.takt_alt_ms), ms(4 * r.takt_neu_ms),\n            (r.vier_takte_ganz ? '' : '\u2248 ') + tausend(Math.round(r.vier_takte_werte))]);\n        if (r.dauer_neu_s !== undefined) { zeile(t, [T.z_datei, dauer(r.dauer_alt_s), dauer(r.dauer_neu_s), tausend(r.werte_neu)]); }\n        var b = befehle(r), bb = el('tu-befehle');\n        bb.textContent = '';\n        if (b) {\n            [['b_schlag', b.schlag], ['b_flaeche', b.flaeche], [b.kette ? 'b_atempo_kette' : 'b_atempo', b.atempo], ['b_varispeed', b.varispeed]].forEach(function (x) {\n                var n = document.createElement('div'); n.className = 'tu-befehl-name'; n.textContent = T[x[0]];\n                var c = document.createElement('div'); c.className = 'tu-befehl'; c.textContent = x[1];\n                bb.appendChild(n); bb.appendChild(c);\n            });\n        } else {\n            var p = document.createElement('p'); p.className = 'tu-klein'; p.textContent = T.keine_befehle; bb.appendChild(p);\n        }\n        letztes = r;\n        return r;\n    }\n\n    function aktualisieren() { var e = eingaben(); return darstellen(rechnen(e), e); }\n\n    function bericht(r) {\n        if (!r) { return ''; }\n        var z = [T.bericht_kopf + ': ' + zahl(r.von, 3).replace(\/[.,]?0+$\/, '') + ' \u2192 ' + zahl(r.nach, 3).replace(\/[.,]?0+$\/, '') + ' BPM'];\n        z.push(T.k_faktor + ': ' + zahl(r.faktor, 6) + ' | ' + T.k_laenge + ': ' + vorz(r.laenge_prozent, 3) + ' % | ' + T.k_tonhoehe + ': ' + vorz(r.halbtoene, 3) + ' ' + T.st);\n        if (r.dauer_neu_s !== undefined) { z.push(T.z_datei + ': ' + dauer(r.dauer_alt_s) + ' \u2192 ' + dauer(r.dauer_neu_s) + ' (' + r.werte_neu + ' ' + T.werte + ')'); }\n        var b = befehle(r);\n        if (b) { z.push(b.schlag, b.flaeche, b.atempo, b.varispeed); }\n        return z.join('\\n');\n    }\n\n    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.TU = { T: T, rechnen: rechnen, befehle: befehle, dauerLesen: dauerLesen, zahlLesen: zahlLesen, atempoKette: atempoKette,\n        aktualisieren: aktualisieren, bericht: bericht, fuehren: function (x) { fuehrt = x; }, letztes: function () { return letztes; } };\n\n    if (!el('tu-von')) { return; }\n    el('tu-nach').addEventListener('input', function () { fuehrt = 'nach'; aktualisieren(); });\n    el('tu-prozent').addEventListener('input', function () { fuehrt = 'prozent'; aktualisieren(); });\n    el('tu-halbtoene').addEventListener('input', function () { fuehrt = 'halbtoene'; aktualisieren(); });\n    ['tu-von', 'tu-dauer', 'tu-schlaege'].forEach(function (id) { el(id).addEventListener('input', aktualisieren); });\n    el('tu-rate').addEventListener('change', aktualisieren);\n    var kop = el('tu-kopieren'), kopiert = el('tu-kopiert');\n    kop.addEventListener('click', function () {\n        var t = bericht(letztes);\n        if (!t) { return; }\n        if (navigator.clipboard &#038;&#038; navigator.clipboard.writeText) {\n            navigator.clipboard.writeText(t).then(function () { kopiert.textContent = T.kopiert; }, function () { kopiert.textContent = T.kopieren_fehler; });\n        } else { kopiert.textContent = T.kopieren_fehler; }\n    });\n    aktualisieren();\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Converts an original tempo into a target tempo for time-stretching: tempo factor for atempo and rubberband, new length in time and samples, beat and bar lengths, the pitch shift of varispeed and the ISRC rule for length changes, with ffmpeg commands based on a measurement.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":38,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92901],"class_list":["post-20345","page","type-page","status-publish","hentry","tag-music-production"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Converts an original tempo into a target tempo for time-stretching: tempo factor for atempo and rubberband, new length in time and samples, beat and bar lengths, the pitch shift of varispeed and the ISRC rule for length changes, with ffmpeg commands based on a measurement.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/tempo-converter-time-stretch-factor-length-pitch\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/tempo-converter-time-stretch-factor-length-pitch\\\/\",\"name\":\"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-24T09:12:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/tempo-converter-time-stretch-factor-length-pitch\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/tempo-converter-time-stretch-factor-length-pitch\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/tempo-converter-time-stretch-factor-length-pitch\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/toolbox\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/","og_locale":"en_US","og_type":"article","og_title":"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog","og_description":"Converts an original tempo into a target tempo for time-stretching: tempo factor for atempo and rubberband, new length in time and samples, beat and bar lengths, the pitch shift of varispeed and the ISRC rule for length changes, with ffmpeg commands based on a measurement.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/","name":"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-24T09:12:51+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/tempo-converter-time-stretch-factor-length-pitch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/en\/toolbox\/"},{"@type":"ListItem","position":3,"name":"Tempo Converter for Time-Stretching: tempo factor, new length and pitch shift"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=20345"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/20345\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/38"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=20345"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=20345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}