MMAudioSuite Pitch (Mono)
Pitch-shift your generated audio without ever touching torchaudio
- audio
- audio
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
AUDIOyou'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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | — | |
| n_steps | INT | 0-24–24 | Semitone shift (−24 to +24 ≈ ±2 octaves). |
| bins_per_octaveopt | INT | 12 | The number of steps per octave (Default : 12). |
| n_fftopt | INT | 1024 | Size of FFT, creates n_fft // 2 + 1 bins (Default: 1024). Larger = smoother, but heavier. |
| win_lengthopt | INT | -1 | Window size. If -1, then n_fft is used |
| hop_lengthopt | INT | -1 | Length of hop between STFT windows. If None, then win_length // 4 is used |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |