Mono -> stereo fun with nmf~

I wanted to share a simple and effective application of NMF for creating a fake stereo enhancement or up-mix.

My source is a gritty crackle composed from concatenating some raw-data samples together. I wanted to gradually create a separation of the heavily monophonic sound as if it were ‘bisecting’. This was really easy and effective using nmf.


  1. From the command line I nmfed my sound source into two components.
nmf -source crackle.wav  -components 2 -resynth ~/crackle_split.wav -fftsettings 2048 512 2048 -iterations 75 -numchans 1
  1. I then replaced the original mono source in my reaper project with my new stereo file. Using the ‘width’ control in reaper I automated this to go from 0 -> 100% over the specified duration for increasing the stereo-ness of the sound.


Mono Original

Stereo Upmix <-- Compare the start and the end for up-mix effect.

A friend was visiting and we were recording some impromptu musicking and so here are there results in their original habitat<-- by the end of this example the stereo separation is huge


That’s my kind of music <3 (ah, it seems that discourse does not have the heart emoji shortcut)

To try to tackle the phasiness, have you tried other fft settings? another idea would be to m/s funnel mix, aka low mid in mono, top in stereo, simply done with MS-encode -> high-pass the S -> MS-decode. Playing with the freq of the HP is a fun and creative thing :wink:

I used a fairly cheap nmf as you can see from my args. What are you suggesting? Something super fat?

would you be able to create this kind of processing chain in Max or talk me through it? It would be nice to combine it with the NMF for a generic stereo up-mix tool.

something super lean actually. 128

there are no mastering grade filters in Max, but the principle is

M= L+R
S = L-R

put S in a high pass

then L = M/2 + S/2
S = M/2 - S/2

That is the dirty way (the proper way is -3dB at encode and decode but in this case it changes nothing)

You can then play with the level and HP freq of S to get a narrower or wider image. Because the process in is nullsumming it means M is your original :wink:


1 Like

thanks - i’ll try this soon