Nodes/ComfyUI-MMAudio-Suite/MMAudioSuite Pitch (Mono)
ComfyUI Node

MMAudioSuite Pitch (Mono)

Pitch-shift your generated audio without ever touching torchaudio

By Takenoko3333·Created 10 months ago·Updated 9 months ago· 5
MMAudioSuite Pitch (Mono)
  • audio
  • audio
n_steps0
bins_per_octave12
n_fft1024
win_length-1
hop_length-1

MMAudio gives you a track that fits the scene, but "fits the scene" isn't always "sounds right." A voice lands a semitone flat, you want a deeper narrator, or the clip needs a higher, cartoonish energy. MMAudioSuitePitchMono is the pitch-shift node that fixes that - and it's the reason a lot of people install this pack even if they already have the base MMAudio wrapper.

It exists because pitch-shifting audio in ComfyUI traditionally meant torchaudio's PitchShift, and that dependency has been a Windows headache forever. The pack's author wrote a pitch tool that avoids it entirely (it started life as the separate comfyui-audio-pitch project, now folded into the suite). It changes pitch the old-fashioned way - a phase vocoder - so there's no torchaudio, no new dependency, just math on the CPU.

How it works

A phase vocoder pitch-shift is a two-step trick: time-stretch the audio by the inverse of the pitch ratio, then resample it back to the original length. Stretching slows the waveform (pitch drops), resampling speeds it up (pitch rises) - net result, the pitch moved and the duration didn't. The node does the STFT, applies phase accumulation across frequency bins with a Hann window, then a linear resample to restore the length. The pitch ratio is 2^(n_steps / bins_per_octave), so each step of n_steps is one semitone.

A few implementation details you'll feel: n_steps = 0 is a pure bypass (handy, since the node always runs). It runs entirely on CPU in float32, and it always returns a (1, 1, T) float32 waveform on CPU so PreviewAudio never chokes on shape or device. It also hashes a short digest of the audio head plus the parameters for IS_CHANGED, so ComfyUI doesn't re-run the whole shift when you tweak something unrelated in the graph.

Inputs and output

  • audio - any AUDIO you've got, typically the Sampler's output.
  • n_steps - semitones, −24 to +24 (±2 octaves). Default 0 (no change). This is the dial you actually touch.
  • bins_per_octave - 12 by default; leave it.
  • n_fft - 1024 default. Bigger = smoother but heavier. This is the one you might bump if the result sounds wobbly.
  • win_length / hop_length - default −1 means "use n_fft" and "use win_length // 4". Leave them.

One output, audio, back into PreviewAudio or VHS_VideoCombine.

The author's example workflow includes practical ranges: low voice at n_steps −4 to −2, high voice +2 to +4, "higher" +5 to +8, all with n_fft 1024, and explicitly notes the other three knobs "generally require no adjustment." Trust that note - 95% of the time it's n_steps only.

The honest caveats

It's mono. The node force-downmixes to a single channel (it takes the first channel), so if you're pitch-shifting a stereo mix expecting to keep stereo separation, this isn't your node - it's built for the mono output MMAudio produces anyway, which is exactly the workflow it lives in. And it's CPU math on the whole clip: on a long file with a big n_fft, expect a real wait, not an instant. If the shift sounds phase-y or "phwoar" artifacts show up, raise n_fft a notch before you touch anything else.

Install

Identical to the rest of the pack: ComfyUI Manager (search "ComfyUI-MMAudio-Suite") or git clone https://github.com/Takenoko3333/ComfyUI-MMAudio-Suite into custom_nodes, restart, and on the portable Windows build run python_embeded\python.exe -m pip install -r ComfyUI\custom_nodes\ComfyUI-MMAudio-Suite\requirements.txt if deps don't auto-install. No model files needed for this node - it's pure signal processing on whatever audio you feed it, which makes it the one node in the suite you can test the moment the pack is installed.

CategoryMMAudioSuite

Inputs (6)

NameTypeDefaultDescription
audioAUDIO
n_stepsINT0-24–24Semitone shift (−24 to +24 ≈ ±2 octaves).
bins_per_octaveoptINT12The number of steps per octave (Default : 12).
n_fftoptINT1024Size of FFT, creates n_fft // 2 + 1 bins (Default: 1024). Larger = smoother, but heavier.
win_lengthoptINT-1Window size. If -1, then n_fft is used
hop_lengthoptINT-1Length of hop between STFT windows. If None, then win_length // 4 is used

Outputs (1)

NameTypeDescription
audioAUDIO