Other objects/externals/patchers like table or function
Jan 26, 2007 at 11:55pm
Other objects/externals/patchers like table or function
Can anyone tell me what other objects or externals or patchers are out there which are similar to the objects “table” or “function”?
I’m designing a patcher which will use something like “table” or “function”, but “table” and “function” are less full featured and ergonomic than I would like.
Idealy, I would like the object/external/patcher to:
Display a graph of its data in the main patcher window, and automatically set its max/min displayed y value as the maximum and minimum values of the data points in the displayed data.
Display tick marks on the the x and y axis to indicate the displayed data range, as well as a numerical value indicating how many data points are represented by one tick (for each axis).
Allow the user to double click on the graph in the main patcher window, to open a full screen version of the graph, sort of like “table,” except hopefully without these bugs that “table” has:
When using the horizontal “zoom” feature, the currently displayed y-axis range changes sometimes. This is pretty bad, because it causes you to get totally lost if you’re navigating through some complicated data set. (Is there any way around this in table?)
When data is “cut” from a table, the data which comes after the data which was “cut” out shifts to the left, into the space that used to be occupied by the data which was “cut” out. (Is there any way around this in table?)
Thanks, any help would be greatly appreciated
Jan 27, 2007 at 9:22am
* bump *
i could really save a lot of headaches by getting feedback from max users that are more experienced than me on this one, sorry to bump but i’m really hoping people will tell me what they know about this
thanks, any help is greatly appreciated
Jan 27, 2007 at 9:32am
check out the waveform object, that’ll give you the necessary speed bump
> * bump *
Jan 28, 2007 at 7:52am
how about looking closely at the toolbar of any patch in edit mode?
the idea is to use a [buffer~] as floating point table with
> I have all of the CNMAT objects, as well as FTM.1.7.11.BETA, and
Jan 28, 2007 at 9:51am
Waveform~ is located at the end of the toolbar.
And keep a stiff upper lip, don’t you mind ?
f.e chanfrault | aka | personal computer music
Max Planck wrote:
Jan 29, 2007 at 11:27pm
yeah sorry, the toolbar sometimes displays an incorrect name for the item which the mouse is hovering over in the lower left corner of the window… dunno why, but that’s why i missed waveform~
thanks for the replies
i didn’t realize it when i originally posted, but i need the values between the data points entered by the user (timewise) to not be output. since the values between the user entered data points in waveform and table will be output as “0,” this won’t cut it.
it looks like the only graphical data editor in Max that does what i need is function’s dump output… unless there’s some other graphical data editor that will not output any data for points between the user entered points.
Jan 29, 2007 at 11:46pm
Jan 31, 2007 at 1:33am
OK, here’s what i’m trying to do:
Basic idea: Start with a SDIF file that was produced by SPEAR (for additive resynthesis of a sound that was analyzed by SPEAR). For each partial, pass the frequency as a function of time data to a graphical interface which will display and allow the user to graphically edit the data, and also for each partial pass the amplitude as a function of time data to a graphical interface which will display and allow the user to graphically edit the data. Then, pass this user edited (or unedited) data to a bank of sine oscillators to synthesize a sound using the data.
This will provide funtionality in manipulating SDIF data that SPEAR doesn’t provide, because I’m going to add the ability to, for any partial, hold amplitude or frequency constant at a user specifiable value, so that the user can listen to each time varying property indepent from the other, in order to appreciate how each time varying property by itself contributes to the whole sound. My hope is that with enough studying of sounds this way, the user will eventually develop the ability to imagine various sounds, and then build them from the ground up using an array of sine oscillators… or, at least take certain properties from some sounds and apply them in new contexts.
Method (what I’ve got so far, modeled after CNMAT Spectral Synthesis Tutorial #9… see attached file for structure and specifics): I’ve been able to get the frequency vs. time and amplitude vs. time data into seperate function objects. However, the tricky thing at this point seems to involve timing, and interpolation.
For one thing, I want the function objects to only have data points at time locations where there exists an SDIF frame for said time location. Using the standard “line” playback method from the CNMAT Spectral Tutorials won’t do this, it will only produce data points that are evenly spaced in time. If I can get the time location of each SDIF frame out of the SDIF file and into Max as numerical values, then I can use these values to trigger SDIF-tuples to output values only at the instants where an SDIF frame exists with time value = the time value of that instant (which is what I’m trying to do).
The reason that I want to do it like this is:
if I’m feeding the SDIF data to a function object for user examination and editing, I will have redundant clutter of extra data points if I use a line object with data point spacing less than the smallest time distance between SDIF frames.
if I use a line object with data point spacing greater than the smallest time distance between SDIF frames, then some of the SDIF data may not make it to the function objects. (i.e. the curve created by the data points may change shape slightly, compared to how it exists in the SDIF file)
If I only output a time value to SDIF-tuples at instants in time where there exists an SDIF frame for that instant in time, then the data points in the function objects will match exactly the data points in the SDIF file, which is what I want.
The method outlined in CNMAT Spectral Tutorial #9 has SDIF-Tuples going into threefates, and then threefates going into sinusoids~. In this setup, the time position of each (frequency, amplitude) data point is communicated between SDIF-tuples and threefates, and then from threefates to sinusoids~, by the timing of the (frequency, amplitude) data messages that are sent by SDIF-tuples.
For example, at time t=0, the message (440, 1) is sent from threefates to sinusoids~, and sinusoids starts one sine oscillator playing at frequency=440Hz and Amplitude=1. Then, at time t=0.010, threefates sends (445, 1) to sinusoids~, and the oscillator that was playing at frequency=440Hz and Amplitude=1 increases in frequency to play frequency=445Hz and Amplitude=1.
In Max I want to seperate the (frequency, amplitude) data into (frequency) and (amplitude) data, and then associate the time value of the SDIF frame from which each value came from with each (frequency) and (amplitude) value to form a set of (time, frequency) and (time, amplitude) values. Then I want to send each of these data sets to seperate function objects, so that I can allow users to graphically edit the (time, frequency) and (time, amplitude) data, and then output the user edited (time, frequency) and (time, amplitude) values from these function objects.
I would like to then combine the (time, frequency) and (time, amplitude) data into a set of (frequency, amplitude) data, and then output the corresponding “frame” of data to sinusoids~ whenever the playback clock/line/whatever passes through that “frame”‘s time value.
Getting the data from the function objects back into a format that sinusoids~ will understand seems tricky and I’m not certain of a method that will work, any advice would be appreciated.
I realize that I could simply output interpolated values from the function objects (after having inserted a very quick amplitude ramp from zero to the first amplitude point for each partial, and a very quick amplitude ramp from the last amplitude point to zero for each partial), and feed this data to an array of cycle~ objects. But I’m concerned about CPU effeciency, and I’m operating under the assumption that sinusoids~ will be more CPU efficient than a huge array of cycle~ objects… any info about whether I’m right or wrong on this would be appreciated.
Jan 31, 2007 at 1:35am
oops, here’s the example patcher (what I have so far)
Jan 31, 2007 at 2:45pm
Max Planck wrote:
I just created a listfunnel mod which only spits out changes in a list,
#P window setfont “Sans Serif” 9.;
Jan 31, 2007 at 4:41pm
Sounds like an interesting idea. The problem I see is that if your time data is variable, the function object could give you trouble–not in getting the values in, but in editing them and sending them out. That’s because the user can drag points (or add new ones, if you allow it) to the left or right, thus altering the time value / parameter. Then your playback wouldn’t match the SDIF values exactly (which might still be OK, I don’t know).
You can advance from one point to the next without getting any interpolation between them. If you do this in sync with the time deltas between points that might be what you’re looking for.
If the time data in is constant (as would be nice), you could also use table or multislider, these are also good options. If the time data is close to constant, you could use a divisor and some rounding / truncating to map the times to the sliders/table points’ indices.
I’m not at my Max machine so I don’t know if there’s a “constrain to point’s current x value” parameter for function. If there is then editing wouldn’t allow dragging left or right through time.
Also check out the mtr object (for *much more* than just this project). You might be able to use it here at least for testing. Use a track for time, one for frequency, and one for amplitude. mtr will spit out the delta times between received data out the left outlet. This might be usable somehow in managing your data. If not, it’s at least an easy way to play long series of changing values so you can do some experimentation and testing, and it allows you to save and read your numerical recordings… great stuff.
Feb 1, 2007 at 2:19am
Quote: seejayjames wrote on Wed, 31 January 2007 09:41
This is OK, I only want playback to match the original SDIF values exactly if the user does not modify the data in the function object. Once the user starts modifying the data in the function object, then I want the sound to be modified as per the modified data.
This would make the data displayed in the table or multislider slightly different than the data in the SDIF file. Function can display the data from the SDIF file exactly, if only I can find a way to get the time value of each frame in the SDIF file into Max as a set of numerical values…
If I send the message “print” to SDIF-buffer, the time value of each SDIF frame is displayed in the Max window… so I know that Max can access the time data… (I already knew that b/c Max is using the time data in order for SDIF-tuples to function as it does)… it’s just a matter of finding an object or some way to get this time data into Max as numbers… it just seems as if nothing has been built that can do this, although it shouldn’t be hard to program some custom C code or something to take care of this… all that has to be done is access one column value for each row of the matrix that’s present in any additive analysis type SDIF file. I wish I knew how to program so that I could just make this custom object! If anyone can do this or tell me how to to do it, I would be eternally greatful (or show me some way in Max to get the time values…)
Thanks for the tip about mtr, i’ll check it out.
Feb 2, 2007 at 2:47pm
Max Planck wrote:
oops, may I repeat the wish, that patches are best pasted into the mail
Your experiments with sdif files are interesting I must say, I’d like to
Feb 5, 2007 at 7:51am
Now it worked…
Erik Bowen wrote:
If you’re not afraid of rtfm/ftmr answers, ther is a FTM list with all
When looking at that list, it seems to be a constant distance, maybe its
You must be logged in to reply to this topic.