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
* 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
check out the waveform object, that’ll give you the necessary speed bump
> * bump *
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
[waveform~] interfacing with it.
> I have all of the CNMAT objects, as well as FTM.1.7.11.BETA, and
> MSP, and from all of these objects I don’t see any named
> "waveform." Where can i find this object?
> Does anyone have any info relating to the post at the top of this
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
> >>>>>> http://www.personal-computer-music.com
> >>>>>> |sublime music for a desperate people|
Max Planck wrote:
> I have all of the CNMAT objects, as well as FTM.1.7.11.BETA, and MSP, and from all of these objects I don’t see any named "waveform." Where can i find this object?
> Does anyone have any info relating to the post at the top of this thread?
> maxmsp mailing list
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.
Perhaps you could explain to us why function isn’t working for you in
this instance? If we all know more about what you are trying to
accomplish, we are much more likely to be able to help. A simple
example patch may be helpful.
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.
oops, here’s the example patcher (what I have so far)
Max Planck wrote:
> 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.
I just created a listfunnel mod which only spits out changes in a list,
maybe its helpfull…
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#N vpatcher 30 89 454 424;
#P window setfont "Sans Serif" 9.;
#P newex 224 151 39 196617 zl reg;
#P newex 224 184 51 196617 zl ecils;
#P newex 265 151 40 196617 !-;
#P newex 265 127 40 196617 t i i;
#P newex 265 103 36 196617 zl len;
#P newex 50 188 36 196617 zl reg;
#P newex 128 80 50 196617 listfunnel;
#P newex 76 80 50 196617 listfunnel;
#P newex 166 133 47 196617 zl slice 1;
#P newex 50 234 88 196617 gate 2;
#P newex 50 210 163 196617 != $1;
#P newex 128 101 94 196617 t l b l 2147483647;
#N coll ;
#P newobj 76 163 49 196617 coll;
#P newex 76 50 140 196617 t l clear l l b l;
#P inlet 76 30 15 0;
#P outlet 265 256 15 0;
#P outlet 50 256 15 0;
#P fasten 5 1 11 0 161 126 55 126;
#P connect 11 0 6 0;
#P connect 6 0 7 0;
#P connect 7 0 0 0;
#P connect 2 0 3 0;
#P connect 3 0 9 0;
#P connect 9 0 4 0;
#P fasten 8 0 4 0 171 156 81 156;
#P connect 3 1 4 0;
#P connect 4 0 11 1;
#P fasten 5 3 11 1 217 184 81 184;
#P connect 3 2 10 0;
#P connect 10 0 5 0;
#P connect 5 0 7 1;
#P fasten 5 2 8 0 189 125 171 125;
#P connect 8 1 6 1;
#P fasten 3 4 16 0 185 73 229 73;
#P connect 16 0 15 0;
#P fasten 3 3 16 1 159 77 258 77;
#P fasten 3 5 12 0 211 70 270 70;
#P connect 12 0 13 0;
#P connect 13 1 14 0;
#P connect 14 0 15 1;
#P connect 15 1 1 0;
#P connect 13 0 14 1;
#P newobj 46 116 78 196617 p lfunnelchange;
#P window linecount 2;
#P newex 96 150 34 196617 print rest;
#P window linecount 1;
#P message 231 66 69 196617 10 80 30 50;
#P message 190 66 38 196617 10 80;
#P message 118 66 69 196617 10 20 60 40;
#P window linecount 2;
#P newex 46 150 38 196617 print funnel;
#P window linecount 1;
#P message 46 66 69 196617 10 20 30 40;
#P connect 6 0 1 0;
#P connect 0 0 6 0;
#P fasten 4 0 6 0 236 102 51 102;
#P fasten 3 0 6 0 195 102 51 102;
#P fasten 2 0 6 0 123 102 51 102;
#P connect 6 1 5 0;
#P window clipboard copycount 7;
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.
Quote: seejayjames wrote on Wed, 31 January 2007 09:41
> 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).
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.
> 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.
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.
Max Planck wrote:
> oops, here’s the example patcher (what I have so far)
oops, may I repeat the wish, that patches are best pasted into the mail
body. This has not only the advantage that I would be able to open them
(I am not for crapy browser reasons, not your fault…), it would be
more convenient for you and anybody who wants to have a look at it because
1. I don’t need to save it to disk,
2. I just copy and open it directly in Max which is just faster, nicer ….
And for you its easier, because it’s just copy/paste, no clicking to
Your experiments with sdif files are interesting I must say, I’d like to
be able to open your patch…
Now it worked…
Erik Bowen wrote:
> However, I can’t seem to figure out how to get these
> values out of the track ftm.object and into Max as a set of numbers. If
> I could do this, it would be no sweat to get the exact SDIF data into
> Max, and then completing this project would probably be a snap… i just
> need to get the time tags into max… if anyone knows how, please help
> me out of my ignorance
If you’re not afraid of rtfm/ftmr answers, ther is a FTM list with all
these experts for FTM. (I am not through all the FTM tutorials yet and
can’t help, but I am sure its simple…)
When looking at that list, it seems to be a constant distance, maybe its
just calculated, framesize*index maybe…