Sinusoidal re-synthesis - manipulating lists question

Ben Carey's icon

Hi,

I've been working on some sinusoidal re-synthesis of a live signal for a while now - mostly I do this using Puckette's sigmund~ to output 50 peaks, and re-synthesise them using CNMAT's sinusoids~ object. I have this working quite well for the moment, and am able to dynamically vary the amplitude profile of my captured models using zl scramble and also by sending the model through sweeping format filters using resonators~ (also from CNMAT). Here's are a couple of demos of the patch using saxophone input: here - with screenshot and here - with more detailed description

I like the list-interpolate object from CNMAT as it allows me to interpolate smoothly between the original timbre and the scrambled version without having to split the list up. I would however like to be able to add an option to vary the individual frequencies in my captured list. What I'm after is the possibility of adding a frequency deviation range - that I can then use to interpolate to and from in a similar way to my amplitude scrambler - moving from harmonic to slightly inharmonic timbres. Adding a random range above or below the captured frequency would require me to do something other than just scramble the list - but I would like to find a solution that doesn't require me to split the list and use 50 line objects!!

I have been looking into the ftm objects - so powerful - but I am still a novice with these right now so would love it if anyone had any advice on dealing with lists in this way?

Thanks in advance!!

Ben

Anthony Palomba's icon

Hey Ben, thats some very cool stuff you got going on.

As far as suggestions for how to improve your list processing.
You could always create a secondary list that contains some
range of random numbers and then use vexpr to add that to your
original list.

But if you really want to get crazy with your lists, I would
suggest converting the list into a jit.matrix (1 x 50 matrix).
From there you can do some pretty amazing things with jit.op
and jit.bfg. The cool thing is you can chain matrix operations
together and play with the order in which things are combined.
You could very easily scale sinusoidal values, then deform them,
add noise, then animate them.

Anthony

Ben Carey's icon

Hi Anthony, thanks for the reply and for taking a look and having a listen to those links.

Yes I have been looking into the FTM&Co. externals as I think I will be needing to treat my lists in the form of a matrix - thanks for your advice on the jitter objects - I have never really gotten into jitter and now see that it might be useful for my purposes. In the short term however - your suggestion of vexpr looks like it could be a cheap and effective way of doing this - I can't believe I'd totally forgotten about this object so thanks for the reminder!!

Have you used the FTM externals yourself by the way?

Ben

Ben Carey's icon

Update - thanks to your advice Anthony, for the time being vexpr works wonders for what I was after:

Example: vexpr $f1*(random($f2,$f3)/1000.) @scalarmode 1 - where $f1 is the input list and ($f2,$f3)/1000. is the variable input for random range around these frequencies - think it will work a charm..

Thanks once more.

mzed's icon

Hidden in the CNMAT MMJ Depot is an abstraction called something like "jit.sdif.tuples" or something. Perhaps in /modules/DataStorage/. It has the basics of getting this kind of data in and out of jitter. Plain Max is a pain with long lists. Other solutions: javascript, java, maxlisp.

Ben Carey's icon

Thanks mzed I'll look into that also

Cheers

tep's icon

Very interesting topic !
I'm doing similar things, except the sinusoids source comes from SDIF files. So i find myself with huge lists in (quite) the same form as in sigmund~ : index, frequency, amplitude.
So i tried different librairies to treat these lists, in order to alter / morph / slightly change them.

- FTM is tough for me ! Succeeded in a few things by plundering here and there only, so i can't help at all.
- Emmanuel Jourdan's ejies is very helpful : ej.lchange, ej.linterp ... and the ej.ldrunk !!! (check also the 'zsa.decriptors')
- as a friend suggested, started to use jitter matrix at last (i wasn't using it until now). So many new prospects :)

But then i'm kind of stuck here, because all this is new to me. Especially, i'm using the jit.slide object but, as the frequency list i have is ordered by biggest amplitude to lowest, sliding between different values makes frequency sweeps.
What i'd like to achieve would rather be : when new list, make the frequencies disappear in n time, and make the new ones appear in n time.
Spent much time using the coll object, and don't know yet how to treat parts of the values in jitter ...

Anthony Palomba's icon

I have not used FTM much. To me it seems overly complicated. I don't
have time to learn it.

If you are interested in learning more about how to utilize jitter
matrices for list processing, check out the tutorial 11jListsAndMatrcies.

I'll see if I can't come up with an example too.

Ben Carey's icon

Thanks for the tips Anthony - and yes the FTM are really complex - I know at some point soon I'll begin to dig into them as they are really useful. The spectral tutorials from CNMAT are good too - especially for manipulating SDIF models... although I'm more interested in analysing the models in real-time the manipulating them - haven't found a way to dynamically write an SDIF file yet, though I think it's possible in FTM - having said that I'm not even sure if writing an SDIF file on the fly would be more useful than treating these lists as matrices directly???

mzed's icon

I don't think you're going to get much out of writing an SDIF file, unless you want to save it and use it later. I don't know of any tools for real-time manipulation of SDIF.

Iana~ (*) makes a good front end for realtime analysis-resynthesis.

mz

Ben Carey's icon

Hi Mike - yes that's what I thought. Iana~ does look good - unfortunately I am not a member of the IRCAM forum yet - it is quite expensive - though am looking into this for the new year. I use sigmund~ for extracting 50 peaks - is there much difference between these two objects? I imagine that Iana~ takes periodicity into account as per the yin~ algorithm?

Ben

fen's icon

Hi Ben,

I haven't got anything to add technically, I just wanted to say how much I enjoyed the various audio samples on your site. They're reminiscent of Evan Parker's/AMM's electro-acoustic improvisations. Very interesting, progressive work, and beautiful at times. Keep it up.

Ben Carey's icon

Cheers thanks for the comments... :)