Pitch Feature Extractor β‘π ‘π π £π
Turn pitch into a reactive signal
- audio
- opt_pitch_range_collections
- FEATURE
AudioFeatureExtractor covers loudness, brightness, and rhythm-adjacent stuff; this node is specifically about pitch - which note, or how high a frequency, is present in the audio at each moment. If you want an effect that follows a vocal melody, gets more intense as a bassline drops lower, or catches a singer's vibrato, this is the extractor built for it.
The five extraction methods
extraction_method is where the personality lives: frequency gives you the raw pitch in Hz, best for closely following a melody. semitone rounds that to the nearest musical note, which behaves more predictably for musically-timed effects than a continuous Hz value would. pitch_direction tells you whether pitch is rising or falling, which is a great driver for directional animations - something that visibly moves up as a note climbs. vibrato_signal and vibrato_strength detect the wobble singers and string players add on sustained notes - the signal itself for tremolo-style effects, or the strength value if you just want intensity, not the raw wobble.
Pitch detection under the hood
opt_crepe_model (none, tiny, small, medium, large, full) picks how the actual pitch tracking is done. CREPE is a well-known neural pitch tracker - picking anything other than none swaps in that model instead of basic pitch detection. It's a straightforward speed/accuracy trade: tiny/small run fast but track less precisely, medium is the balanced default, large/full are the most accurate and the slowest. Worth knowing: crepe/torchcrepe isn't in the pack's pinned requirements.txt - if switching opt_crepe_model away from none throws an import error, you may need to install that dependency into your ComfyUI environment yourself.
opt_pitch_range_collections (optional) restricts detection to specific frequency windows, built from this pack's PitchRange, PitchRangeByNoteNode, or PitchRangePreset nodes. Without one, the extractor listens across its whole detectable range; with one, it can ignore, say, everything outside a vocalist's actual register - useful for cutting out low-end rumble or high-frequency noise that isn't the pitch you actually care about.
The inputs and outputs that matter
audio(required,AUDIO) - the source.extraction_method- frequency / semitone / pitch_direction / vibrato_signal / vibrato_strength.opt_crepe_model- pitch-tracking accuracy vs. speed.opt_pitch_range_collections(optional,PITCH_RANGE_COLLECTION) - narrow the detectable range.frame_count(default 0) - auto-calculates from audio length andframe_rate; set explicitly to interpolate to a target length instead.
Output is a single FEATURE - wire it into any Flex target's reactive input, FeatureToMask for a plain mask, or PitchVisualizer to burn the value onto video for a sanity check.
How to install it
ComfyUI Manager: search "RyanOnTheInside", install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
cd ComfyUI_RyanOnTheInside
pip install -r requirements.txt
then restart.
Common issues & troubleshooting
Feature is flat or noisy on a busy mix. Pitch detection assumes something close to a single dominant pitch at a time - polyphonic music (a full band, layered vocals) confuses any monophonic pitch tracker, CREPE included. Isolate the vocal or lead instrument first if you can (a stem separator, or a cleaner solo recording) for a usable signal.
opt_crepe_model set to large/full and processing crawls. That's the expected trade-off - the larger CREPE models are meaningfully slower. Drop to medium or small unless you specifically need the extra accuracy.
Detection misses notes outside where you expect. Check opt_pitch_range_collections isn't accidentally excluding the range your source actually sits in - a range built for a bass part will silently miss a soprano vocal layered on top.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| extraction_method | COMBO | Choose how to analyze the pitch: - frequency: Raw pitch frequency - good for following melody - semitone: Rounds to nearest musical note - better for musical effects - pitch_direction: Whether pitch is rising or falling - great for directional animations - vibrato_signal: Detects pitch wobble - perfect for tremolo effects - vibrato_strength: How intense the vibrato is - use for intensity-based effects | |
| frame_rate | FLOAT | 30.01β120 | Frame rate of the video (1.0 to 120.0 fps) |
| frame_count | INT | 0 | Number of frames to generate (default of 0 will automatically calculate frames from audio length and frame rate). When set to 0, automatically calculates frames from audio length and frame rate. When specified, interpolates feature to match the target frame count. |
| width | INT | 51264β4096 | Width of the output feature (64 to 4096) |
| height | INT | 51264β4096 | Height of the output feature (64 to 4096) |
| audio | AUDIO | Input audio to analyze | |
| opt_crepe_model | COMBO | medium | CREPE model size for pitch detection: - none: Use basic pitch detection - tiny/small: Fast but less accurate - medium: Good balance of speed and accuracy - large/full: Most accurate but slower |
| opt_pitch_range_collectionsopt | PITCH_RANGE_COLLECTION | Optional collections of pitch ranges to consider |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| FEATURE | FEATURE | β |