{"record":{"id":"13320bd2e43c508f","repo":"remotion-dev/remotion","slug":"the-tonefrequency-prop-of-component-must-be","errorCode":null,"errorMessage":"The `toneFrequency` prop of <${component}> must be a finite number between 0.01 and 2, but got ${String(toneFrequency)}.","messagePattern":"The `toneFrequency` prop of <(.+?)> must be a finite number between 0\\.01 and 2, but got (.+?)\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/media/src/validate-tone-frequency.ts","lineNumber":18,"sourceCode":"export const validateToneFrequency = ({\n\ttoneFrequency,\n\tcomponent,\n}: {\n\ttoneFrequency: number | undefined;\n\tcomponent: 'Audio' | 'Video';\n}) => {\n\tif (toneFrequency === undefined) {\n\t\treturn;\n\t}\n\n\tif (\n\t\ttypeof toneFrequency !== 'number' ||\n\t\t!Number.isFinite(toneFrequency) ||\n\t\ttoneFrequency < 0.01 ||\n\t\ttoneFrequency > 2\n\t) {\n\t\tthrow new TypeError(\n\t\t\t`The \\`toneFrequency\\` prop of <${component}> must be a finite number between 0.01 and 2, but got ${String(toneFrequency)}.`,\n\t\t);\n\t}\n};\n","sourceCodeStart":1,"sourceCodeEnd":23,"githubUrl":"https://github.com/remotion-dev/remotion/blob/a6a7485a9aeb04219510fbe4874f8941486424df/packages/media/src/validate-tone-frequency.ts#L1-L23","documentation":"validateToneFrequency checks the toneFrequency prop used by pitch-shifting audio components (<OffthreadAudioWithPitch>, pitch helpers). It must be a finite number in [0.01, 2] — below 0.01 the shift is imperceptible/degenerate, above 2 the time-stretcher quality degrades. Anything else (NaN, Infinity, strings, out-of-range) throws this TypeError.","triggerScenarios":"Passing toneFrequency as NaN/Infinity, a string (e.g. from an env var or URL param), 0, a negative number, or a value > 2 to a component/hook that validates it with validateToneFrequency.","commonSituations":"Parsing toneFrequency from JSON/query params without Number(); computing it with a formula that divides by zero; experimenting with extreme pitch values like 3x; passing undefined-adjacent values coerced by upstream code.","solutions":["Clamp/validate toneFrequency to [0.01, 2] before passing it","Coerce string inputs with Number() and check Number.isFinite","Fix the computation producing NaN/Infinity (guard divide-by-zero)","If higher pitch is needed, chain processing or raise a feature request instead of exceeding 2"],"exampleFix":"// before\n<OffthreadAudioWithPitch toneFrequency={Number(searchParams.get('pitch'))} .../>\n// after\nconst raw = Number(searchParams.get('pitch'));\nconst toneFrequency = Math.min(2, Math.max(0.01, Number.isFinite(raw) ? raw : 1));\n<OffthreadAudioWithPitch toneFrequency={toneFrequency} .../>","handlingStrategy":"validation","validationCode":"const toToneFrequency = (v: unknown): number => {\n  const n = Number(v);\n  if (!Number.isFinite(n) || n < 0.01 || n > 2) {\n    throw new TypeError(`toneFrequency must be a finite number in [0.01, 2], got ${String(v)}`);\n  }\n  return n;\n};","typeGuard":"const isToneFrequency = (v: unknown): v is number =>\n  typeof v === 'number' && Number.isFinite(v) && v >= 0.01 && v <= 2;","tryCatchPattern":"try {\n  validateToneFrequency({component: 'OffthreadAudioWithPitch', toneFrequency});\n} catch (e) {\n  if (e instanceof TypeError && e.message.includes('toneFrequency')) {\n    toneFrequency = 1; // sensible default (no pitch shift)\n  } else throw e;\n}","preventionTips":["Coerce and validate toneFrequency at the edge (props, query params, config)","Clamp user-provided values into [0.01, 2] with Math.min/Math.max","Guard computed values against NaN/Infinity before passing","Default to 1 (no pitch change) when input is invalid"],"tags":["validation","audio","pitch-shift","props"],"backgroundTag":"invalid-prop-value","analyzedSha":"a6a7485a9aeb04219510fbe4874f8941486424df","analyzedAt":"2026-09-02T16:25:19.997Z","contentChangedAt":"2026-09-02T16:25:19.997Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}