Gesture Recorder

Chris Muir's icon

I made a Gesture Recorder system to enable me to capture gestures
from MIDI continuous controllers, and play them back in a variety of
ways. It works with normal continuous controllers, as well as pairs
of controllers (e.g. Joysticks). It uses tables as the storage
mechanism, and allows for changing the time base when recording as
well as playback. During playback, it can optionally loop,
interpolate, and modify the direction. There is a crude sync
facility, as well.

I didn't know about Andrew Benson's GestureStorage patch when I made
mine, but they are different enough that I think there are cases
where people might find my system useful.

Gesture Recorder can be found here:
http://www.xfade.com/max

-C

p.s.
Thanks to Barry Threw for doing what little external testing there
was, and for pointing out Andrew's approach to this problem

--
Chris Muir | "There are many futures and only one status quo.
cbm@well.com | This is why conservatives mostly agree,
http://www.xfade.com | and radicals always argue." - Brian Eno

jln's icon
Chris Muir's icon

Sorry, I should have mentioned this in the original email.

Gesture Recorder uses strcmp, from the Jasch Objects:
http://www.jasch.ch/dl/default.htm

I've modified the Gesture Recorder download page with this info.

Thanks,
-C

Anthony Palomba's icon

Thanks for sharing Chris. Is there a link to Andrew Benson's GestureStorage patch? What does it do that is different
from yours?

Chris Muir's icon

By popular request (well, ok, one person) I put up a version of Gesture Recorder that removes the dependancy on the Jasch Objects' strcmp. The Jasch Objects are well worth installing anyway, though.

Chris Muir's icon

By the way, at the risk of hijacking my own thread, is there a good way to compare strings using only stock Mac objects? I came up with this regexp based version, but it's fairly inelegant:

Max Patch
Copy patch and select New From Clipboard in Max.

barry threw's icon

Hey Chris.

This is a bit easier, and has the advantage of working on lists.

b

Max Patch
Copy patch and select New From Clipboard in Max.

Chris Muir wrote:
> By the way, at the risk of hijacking my own thread, is there a good way to compare strings using only stock Mac objects? I came up with this regexp based version, but it's fairly inelegant:
>
> #N comlet Str to test;
> #P inlet 29 55 15 0;
> #P window setfont "Sans Serif" 9.;
> #P window linecount 1;
> #P comment 45 55 58 196617 Str to test;
> #N comlet Str Equal;
> #P outlet 164 340 15 0;
> #P newex 164 309 27 196617 int;
> #P newex 180 289 31 196617 == 1;
> #P newex 248 223 27 196617 t b i;
> #P message 180 180 14 196617 1;
> #P message 248 180 14 196617 2;
> #P message 59 180 14 196617 0;
> #P newex 180 268 27 196617 +;
> #P newex 29 103 40 196617 t b s b;
> #N comlet Target Str;
> #P inlet 271 54 15 0;
> #P newex 271 99 58 196617 prepend re;
> #P button 248 162 15 0;
> #P button 180 162 15 0;
> #P newex 44 142 285 196617 regexp;
> #P comment 287 54 58 196617 Target Str;
> #P comment 180 340 51 196617 Str Equal;
> #P window setfont "Sans Serif" 18.;
> #P comment 4 6 136 196626 stringcompare;
> #P window setfont "Sans Serif" 9.;
> #P window linecount 2;
> #P comment 140 6 144 196617 amazing that there isn't a built-in way to do this easily;
> #P window linecount 1;
> #P hidden comment 0 357 55 196617 lower left;
> #P connect 9 0 8 0;
> #P connect 13 0 15 0;
> #P connect 7 0 13 0;
> #P connect 5 3 7 0;
> #P connect 15 1 11 1;
> #P connect 12 0 11 0;
> #P connect 12 0 11 1;
> #P connect 16 0 17 1;
> #P connect 11 0 16 0;
> #P connect 14 0 11 0;
> #P connect 15 0 11 0;
> #P connect 6 0 14 0;
> #P connect 5 2 6 0;
> #P connect 17 0 18 0;
> #P fasten 10 0 17 0 34 301 169 301;
> #P connect 10 2 12 0;
> #P fasten 8 0 5 0 276 129 49 129;
> #P lcolor 8;
> #P connect 10 1 5 0;
> #P lcolor 8;
> #P connect 20 0 10 0;
> #P window clipboard copycount 21;
>
>

--
barry threw
composition : sound : programming
http://www.barrythrew.com
bthrew(at)gmail(dot)com
857-544-3967

Today, Noise is triumphant and reigns sovereign over the sensibility of men.
- Luigi Russolo, The Art of Noises

Chris Muir's icon

Thanks for the "match" solution. That's certainly simpler than my regexp solution. Max could use a better way to do this, imo.

tim_thompson@mac.com's icon

Chris,

Love the gesture recorder! Very handy. And the scrambler is cool too.

Tim

Chris Muir's icon

Quote: tim_thompson@mac.com wrote on Sat, 03 March 2007 11:11
> Love the gesture recorder! Very handy.

Glad you like it. If you find any problems, make any good changes, or have any feature requests let me know.

> And the scrambler is cool too.

I just noticed that the plug-in is a little broken, at least in Logic 7.2. I'll try to fix it soon.

-C

Andrew Benson's icon

Hi Chris,
Great patch. I especially like the visual feedback and playback
options. I always enjoy it when someone comes up with some way to do
things that is totally different from my own approach.

cool stuff.

Andrew B.

Chris Muir's icon

At 11:19 AM -0800 3/5/07, andrew benson wrote:
>Great patch. I especially like the visual feedback and playback options. I always enjoy it when someone comes up with some way to do things that is totally different from my own approach.
>
>cool stuff.

Thanks. I'm glad that I was blissfully ignorant of your patch. Had I known about it I probably would have (happily) used it, and wouldn't have bothered with my GestureRecorder thing, and as I'm sure you know, nothing fits your needs like something you build yourself.

-C

--
Chris Muir | "There are many futures and only one status quo.
cbm@well.com | This is why conservatives mostly agree,
http://www.xfade.com | and radicals always argue." - Brian Eno

Stefan Tiedje's icon

Chris Muir schrieb:
> By the way, at the risk of hijacking my own thread, is there a good
> way to compare strings using only stock Mac objects? I came up with
> this regexp based version, but it's fairly inelegant:

Not at all, my St.== based on match isn't more elegant:

Max Patch
Copy patch and select New From Clipboard in Max.

--
Stefan Tiedje------------x-------
--_____-----------|--------------
--(_|_ ----|-----|-----()-------
-- _|_)----|-----()--------------
----------()--------www.ccmix.com

Stefan Tiedje's icon

Barry Threw schrieb:
> Hey Chris.
>
> This is a bit easier, and has the advantage of working on lists.
>
> b

Unfortunately it doesn't work correctly with lists if you send it as to
match only "muir", it will still find a match for the a list which
contains muir. (That's why I included the tosymbols into the St.== which
is basically the same...)

Stefan

--
Stefan Tiedje------------x-------
--_____-----------|--------------
--(_|_ ----|-----|-----()-------
-- _|_)----|-----()--------------
----------()--------www.ccmix.com

jhochenbaum's icon

does anyone know what the best way to compare incoming data / gestures to recorded ones? This patch is great and I'd love to come up with something that enables me to store gestures and use those gestures to trigger or manipulate audio in realtime...Im trying it with wii controllers...any insight or pointers is greatly appreciated!

Jordan

Anthony Palomba's icon

Hey Chris, I opend FunctionViewer and can see there are many
tables for capture. Is there a built in way to route signals
that I want to record or do I have to manually hook things up?

Chris Muir's icon

At 10:47 AM -0600 3/22/07, Anthony Palomba wrote:
>Hey Chris, I opend FunctionViewer and can see there are many
>tables for capture. Is there a built in way to route signals
>that I want to record or do I have to manually hook things up?

Well I left any advanced table management or controller routing as an exercise for the reader, more or less. The GestureRecorder was intended as a bunch of stuff that people would incorporate pieces of into their patches in their own ways.

In the GestureRecorder that I put on my web site, there is no way to record into a table other than with the Data sliders.

The way I use it in my patches is to have an abstraction that manages the recording of Gestures. It presents a menu of recordable function table names to FunctionRecord-XY, as well as allowing you to select what data source is feeding FunctionRecord-XY. There should be nothing stopping you from having multiple instances of FunctionRecord-XY, feeding different tables, with different control sources.

I have a different abstraction that presents table names for FunctionPlay-XY. There are several tables that I want to have available for playback that I don't want to be able to record into (e.g. sine/cosine, triangle/"cotringle", etc.)

-C

--
Chris Muir | "There are many futures and only one status quo.
cbm@well.com | This is why conservatives mostly agree,
http://www.xfade.com | and radicals always argue." - Brian Eno