Forums > MaxMSP

Work out the rate of change or similar (accelerometer data)??

March 10, 2010 | 8:46 pm

Hi,
Im trying to use a 3-axis acclerometer to capture gestural movements from a performer and use that data elsewhere in my patch. At the moment I have it just triggering an event if the movement goes above a certain threshold for example however it does not feel particularly responsive that way.

I’ve investigated using the change~ and edge~ objects then capture that peak to try and improve matters however to no avail….
Is there a better way of doing this or to calculate the rate of change of the data in order to make it some function of how fast it is moved?

Any suggestions at all would be greatly appreciated! Thanks.
===========================================================================
{
"boxes" : [ {
"box" : {
"maxclass" : "comment",
"text" : "Z-AXIS",
"fontsize" : 12.0,
"numoutlets" : 0,
"patching_rect" : [ 1085.0, 106.0, 55.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-34",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "button",
"numoutlets" : 1,
"patching_rect" : [ 1331.0, 558.0, 20.0, 20.0 ],
"outlettype" : [ "bang" ],
"id" : "obj-49",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "isn’t the same",
"fontsize" : 11.595187,
"numoutlets" : 0,
"patching_rect" : [ 1312.0, 580.0, 86.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-50",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "button",
"numoutlets" : 1,
"patching_rect" : [ 1268.0, 558.0, 20.0, 20.0 ],
"outlettype" : [ "bang" ],
"id" : "obj-51",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "edge~",
"fontsize" : 11.595187,
"numoutlets" : 2,
"patching_rect" : [ 1268.0, 535.0, 82.0, 20.0 ],
"outlettype" : [ "bang", "bang" ],
"fontname" : "Arial",
"id" : "obj-52",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "==~ 0.",
"fontsize" : 11.595187,
"numoutlets" : 1,
"patching_rect" : [ 1268.0, 510.0, 44.0, 20.0 ],
"outlettype" : [ "signal" ],
"fontname" : "Arial",
"id" : "obj-53",
"numinlets" : 2
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "increasing",
"fontsize" : 11.595187,
"numoutlets" : 0,
"patching_rect" : [ 1183.0, 580.0, 74.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-21",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "number~",
"fontsize" : 11.595187,
"numoutlets" : 2,
"patching_rect" : [ 1072.0, 513.0, 56.0, 20.0 ],
"sig" : 0.0,
"outlettype" : [ "signal", "float" ],
"mode" : 2,
"fontname" : "Arial",
"id" : "obj-22",
"numinlets" : 2
}

}
, {
"box" : {
"maxclass" : "button",
"numoutlets" : 1,
"patching_rect" : [ 1189.0, 558.0, 20.0, 20.0 ],
"outlettype" : [ "bang" ],
"id" : "obj-23",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "edge~",
"fontsize" : 11.595187,
"numoutlets" : 2,
"patching_rect" : [ 1189.0, 537.0, 43.0, 20.0 ],
"outlettype" : [ "bang", "bang" ],
"fontname" : "Arial",
"id" : "obj-54",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "button",
"numoutlets" : 1,
"patching_rect" : [ 1131.0, 558.0, 20.0, 20.0 ],
"outlettype" : [ "bang" ],
"id" : "obj-56",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "edge~",
"fontsize" : 11.595187,
"numoutlets" : 2,
"patching_rect" : [ 1131.0, 537.0, 43.0, 20.0 ],
"outlettype" : [ "bang", "bang" ],
"fontname" : "Arial",
"id" : "obj-57",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "==~ 1.",
"fontsize" : 11.595187,
"numoutlets" : 1,
"patching_rect" : [ 1189.0, 511.0, 44.0, 20.0 ],
"outlettype" : [ "signal" ],
"fontname" : "Arial",
"id" : "obj-61",
"numinlets" : 2
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "==~ -1.",
"fontsize" : 11.595187,
"numoutlets" : 1,
"patching_rect" : [ 1131.0, 511.0, 48.0, 20.0 ],
"outlettype" : [ "signal" ],
"fontname" : "Arial",
"id" : "obj-62",
"numinlets" : 2
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "line~",
"fontsize" : 11.595187,
"numoutlets" : 2,
"patching_rect" : [ 1131.0, 440.0, 35.0, 20.0 ],
"outlettype" : [ "signal", "bang" ],
"fontname" : "Arial",
"id" : "obj-64",
"numinlets" : 2
}

}
, {
"box" : {
"maxclass" : "newobj",
"text" : "change~",
"fontsize" : 11.595187,
"numoutlets" : 1,
"patching_rect" : [ 1131.0, 468.0, 55.0, 20.0 ],
"outlettype" : [ "signal" ],
"fontname" : "Arial",
"id" : "obj-65",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "decreasing",
"fontsize" : 11.595187,
"numoutlets" : 0,
"patching_rect" : [ 1102.0, 580.0, 74.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-66",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "the same",
"fontsize" : 11.595187,
"numoutlets" : 0,
"patching_rect" : [ 1253.0, 580.0, 69.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-32",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "number",
"fontsize" : 12.0,
"numoutlets" : 2,
"patching_rect" : [ 1131.0, 408.0, 50.0, 20.0 ],
"outlettype" : [ "int", "bang" ],
"fontname" : "Arial",
"id" : "obj-46",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "0G",
"fontsize" : 12.0,
"numoutlets" : 0,
"patching_rect" : [ 1182.0, 227.0, 29.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-5",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "1G",
"fontsize" : 12.0,
"numoutlets" : 0,
"patching_rect" : [ 1180.0, 154.0, 29.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-4",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "comment",
"text" : "-1G",
"fontsize" : 12.0,
"numoutlets" : 0,
"patching_rect" : [ 1182.0, 310.0, 29.0, 20.0 ],
"fontname" : "Arial",
"id" : "obj-3",
"numinlets" : 1
}

}
, {
"box" : {
"maxclass" : "slider",
"numoutlets" : 1,
"patching_rect" : [ 1136.0, 93.0, 42.0, 295.0 ],
"outlettype" : [ "" ],
"bgcolor" : [ 1.0, 0.984314, 0.941176, 1.0 ],
"knobcolor" : [ 0.0, 0.776471, 0.388235, 1.0 ],
"bordercolor" : [ 0.0, 0.0, 0.0, 1.0 ],
"id" : "obj-72",
"numinlets" : 1
}

}
],
"lines" : [ {
"patchline" : {
"source" : [ "obj-72", 0 ],
"destination" : [ "obj-46", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-64", 0 ],
"destination" : [ "obj-65", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-65", 0 ],
"destination" : [ "obj-22", 0 ],
"hidden" : 0,
"midpoints" : [ 1140.5, 498.0, 1081.5, 498.0 ]
}

}
, {
"patchline" : {
"source" : [ "obj-65", 0 ],
"destination" : [ "obj-62", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-62", 0 ],
"destination" : [ "obj-57", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-57", 0 ],
"destination" : [ "obj-56", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-65", 0 ],
"destination" : [ "obj-61", 0 ],
"hidden" : 0,
"midpoints" : [ 1140.5, 498.0, 1198.5, 498.0 ]
}

}
, {
"patchline" : {
"source" : [ "obj-61", 0 ],
"destination" : [ "obj-54", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-54", 0 ],
"destination" : [ "obj-23", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-65", 0 ],
"destination" : [ "obj-53", 0 ],
"hidden" : 0,
"midpoints" : [ 1140.5, 498.0, 1277.5, 498.0 ]
}

}
, {
"patchline" : {
"source" : [ "obj-53", 0 ],
"destination" : [ "obj-52", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-52", 0 ],
"destination" : [ "obj-51", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-52", 1 ],
"destination" : [ "obj-49", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
, {
"patchline" : {
"source" : [ "obj-46", 0 ],
"destination" : [ "obj-64", 0 ],
"hidden" : 0,
"midpoints" : [ ]
}

}
]
}


March 10, 2010 | 10:28 pm

Hi
it’s quite easy to detect and output value peaks, which would give you a kind of velocity capture functionality, but it’s a little unclear from your post exactly what you require; here’s a solution using just Max objects ([togedge], [gate] and [delay], and assuming that your values always return to zero before the next peak, but i don’t think this is what you want:

– Pasted Max Patch, click to expand. –

March 10, 2010 | 11:30 pm

Thanks alot, I guess what I’m really trying to do is to find a way to tell not just the peak value of the accelerometer data (which is just scaled 0-127) but how fast the accelerometer was moved to arrive there -some kind of differential possibly?

Or I believe I could arrive at much the same effect by simply capturing the peak value of where the data stops increasing and begins to decrease, allthough I have been unsuccessgul in doing this!!

Hope this is a little clearer!?

Thanks again.


March 11, 2010 | 12:14 am

subtract the peak from the trough after a short sampling window? For example sample min and max every 10ms and the larger the differential the faster the accelerometer has moved?


March 11, 2010 | 1:01 am

Here’s a little patch I knocked up that that should tell you how fast the accelerometer moved

– Pasted Max Patch, click to expand. –

March 11, 2010 | 1:26 am

Here is an alternative which does a similar thing to brokenman’s patch:

– Pasted Max Patch, click to expand. –

March 11, 2010 | 6:35 pm

Thanks alot guys! Thats exactly what I was I was going for. Good to know the Max forum has people keen to help.


Viewing 7 posts - 1 through 7 (of 7 total)