Need help recreating the Prismizer effect: A MIDI controllable polyphonic autotune

Aris Schoute's icon

I'm trying to recreate a MIDI-instrument that uses incoming audio as the source and uses pitch-shifting to play notes with it. You can hear this specific instrument/effect here: (skip to 1:21 to hear it fully in action)

According to various sources (interviews, social media, etc.) Bon Iver and other artists who use it, call it the Prismizer effect .It sounds a lot like a vocoder, but it isn't. Instead of a synthesized signal, the audio (his vocals) is being pitch-shifted based on the notes he plays on his keyboard. So, therefor there must be some sort of pitch-recognition going on there. It's pretty much a playable polyphonic autotune.

I've tried using fzero~ for the pitch-tracking, but it's not very accurate, and it does it very chunky (it's not very smooth, at least). I need some smooth pitch-tracking for this that can translate it to frequency signals very well. Pretty much like you'll hear in autotune.

I think I could use gizmo~ for the real-time pitchshifting, so that shouldn't be too much of a problem. I also understand that I should make it polyphonic, but that shouldn't be too hard either.
I just really need to get that smooth pitch-recognition too work.

Can someone help me out with this? Is this even possible with Max MSP?

antialias's icon

Have a look at retune~. It will do almost exactly what you describe.

Aris Schoute's icon

I've tried retune~. It's pretty much useless for this purpose, as it's just as dodgy and unreliable as the pitch-recognition from fzero~.

antialias's icon

Worked for me:
https://soundcloud.com/instantplaces/voxretune-180113-6-10

Michael Frazier's icon

Antialias - Might you be able to share your method for creating this retune example?

antialias's icon

retune-trio-180506.maxpat
Max Patch
Here is a version of the patch. The notebase and enablednotes values are ones that seemed to make sense when applied to sustained notes in the vocal material.

Michael Frazier's icon

Thank you so much for sharing your patch! One more request: might you detail what is featured in your "mixer20" and "mixnew_20" abstractions?

antialias's icon

mixer20.maxpat
Max Patch

mixnew_20.maxpat
Max Patch
forgot the abstractions--these are linear volume controls

Michael Frazier's icon

Thank you for sharing these! Patch definitely functions as above, but the next step would be to incorporate MIDI-control for the polyphony as opposed to messages dictating specific chords.

Nick W's icon

If I could throw my hat into the ring, here is my attempt (heavily influenced by examples above). I am a newbie, and had a hard time implementing the `poly~ ` encapsulation without getting lots of strange clips and lost messages, so I hard-coded the 4-voice polyphony. Next step is to deal with formants, etc. Any feedback is appreciated!

Max Patch
Copy patch and select New From Clipboard in Max.

iamnotnicola's icon

Hey Nick, I ended up using and cleaning your script! Did you resolve the formants?
I noticed that the delay of retune is pretty high (>150ms), how do we go around that?

benj3737's icon

If you don't consider it cheating, check out the Soundtoys Little AlterBoy effect. It does what you're looking for, but it's monophonic. You could probably embed one in a poly~ though

Nick W's icon

Hey iamnotnicola, hope it was helpful! I never got any further with doing the formant shifting. I had a long-term goal of moving this to a c++ JUCE plugin but work ended getting really busy, so I'm stuck with retune's latency for now. For recording its easy enough to drag region backways a bit; for live depending on the style of music it might be usable -- if you want the main vocal line to be audible, the latency can in your favor.

iamnotnicola's icon

Hey @nick, this is exactly what I was thinking! For other reasons, at work we have been writing an FFT library in rust and was thinking on writing my own abstraction for Max (maybe with JUCE or maybe with using gen~).

Do you have any update to your current patch that you can share? How can I use the latency in my favour?