TITLE:: FluidBufNMFCross
summary:: Cross Synthesis with Nonnegative Matrix Factorization
categories:: FluidManipulation
related:: Classes/FluidBufNMF, Classes/FluidNMFMatch, Classes/FluidNMFFilter

DESCRIPTION::

Produces hybridisations of two link::Classes/Buffer::s by using Nonnegative Maxtrix Factorization (NMF)

See Driedger, J., Prätzlich, T., & Müller, M. (2015). Let it Bee-Towards NMF-Inspired Audio Mosaicing. ISMIR, 350–356. http://ismir2015.uma.es/articles/13_Paper.pdf

The process works by attempting to reconstruct the code::target:: sound using the timbre of the code::source:: sound, resulting in a hybrid whose character depends on how well the target can be represnted by the source's spectral frames.

In contrast to link::Classes/FluidBufNMF::, the size and content of the bases dictionary are fixed in this application to be the spectrogram of the code::source::. Each spectral frame of code::source:: is a template: be aware that NMF is O(N^2) in the number of templates, so longer code::source:: buffers will take dramatically longer to process.


CLASSMETHODS::

private:: kr, new1

METHOD:: process, processBlocking

Process two buffers. code::process:: will use its own worker thread on the server, and so avoid blocking the command FIFO queue. For very small jobs, it may be quicker to use code::processBlocking::, which runs directly in the server's queue.

ARGUMENT:: server
The link::Classes/Server:: on which to process

ARGUMENT:: source
A link::Classes/Buffer:: whose content will supply the spectral bases used in the hybrid

ARGUMENT:: target
A link::Classes/Buffer:: whose content will supply the temporal activations used in the hybrid

ARGUMENT:: output
A link::Classes/Buffer:: to contain the new sound

ARGUMENT:: timeSparsity
Control the repetition of source templates in the reconstruction by specifying a number of frames within which a template should not be re-used. Units are spectral frames.

ARGUMENT:: polyphony
Control the spectral density of the output sound by restricting the number of simultaneous templates that can be used. Units are spectral bins.

ARGUMENT:: iterations
How many iterations of NMF to run

ARGUMENT:: windowSize
The analysis window size in samples

ARGUMENT:: hopSize
The analysus hop size in samples (default winSize / 2)

ARGUMENT:: fftSize
The analsyis FFT size in samples (default = winSize)

ARGUMENT:: action
A function to run when processing is complete, taking the output buffer as its argument


INSTANCEMETHODS::


EXAMPLES::

code::

~path = File.realpath(FluidBufNMF.class.filenameSymbol).dirname.withTrailingSlash +/+ "../AudioFiles/"
b = Buffer.read(s,~path+/+"Nicol-LoopE-M.wav")
t = Buffer.read(s,~path+/+"Tremblay-SA-UprightPianoPedalWide.wav")
o = Buffer.new
FluidBufNMFCross.process(s,t,b,o,action:{"Ding".postln})
o.play
::