Several years ago, my friend Justin gave me a Journey to Wild Divine set he had found at a good price. I have finally gotten around to getting the data from its biofeedback device (which measures heart rate variability and skin conductance) into Processing so I can use it for weird projects (such as sorcerous robots that respond to fear — MWAHAHAHA!).
I am using Processing 2.0.1 (should also work with 2.2), oscP5 0.9.8, and GlovePIE 0.45. GlovePIE (Programmable Input Emulator) is a Windows program that can read data from many old and new video-game peripherals, including the LightStone device for JtWD (since replaced by the iOM). GlovePIE’s docu says that OSC messages are broken in versions >= 0.40, but I had no problem on a machine running Windows XP SP3 and the latest DirectX update.
The GlovePIE script could not be any simpler:
var.host = "192.168.2.4" // host IP address var.port = 7400 // host port number SendOsc(var.host, var.port, "/ls_hrv", LightStone.HeartRateVariance) SendOSC(var.host, var.port, "/ls_scl", LightStone.SkinConductanceLevel)
The processing code is a little longer, so I have placed it at the end of this article. For the example, I just read the data into two variables, then draw bar graphs from those values — here is an image of the output:
One of the cool things about this sketch is you can watch the graph for skin conductance level go up and down with your pulse (I should upload a video). I mapped the values based on those given in the GlovePIE docu and what I observed in Processing. I will tweak them as I play more with this and get a better idea of my actual ranges.
The OSC messages from GlovePie look like this:
-OscMessage---------- received from /192.168.2.4:1589 addrpattern /ls_hrv typetag f [0] 0.261 ---------------------
Here is the Processing code:
/** * LightStone to Processing * by Joshua Madara, hyperRitual.com * This sketch reads and graphs heart rate variability and * skin conductance level data from the LightStone device * via OSC messages from GlovePIE. */ import oscP5.*; import netP5.*; OscP5 oscP5; float hrv = 0.0; // heart rate variability float scl = 0.0; // skin conductance level void setup() { size(200, 200); frameRate(30); noStroke(); // create OSC listener oscP5 = new OscP5(this, 7400); // plug the input values to functions defined at end of sketch oscP5.plug(this, "updateHrv", "/ls_hrv"); oscP5.plug(this, "updateScl", "/ls_scl"); } void draw() { background(#012232); // fill background with dark blue // draw bar graph for HRV fill(#ff0000); // set fill color to red float mHrv = map(hrv, 0.0, 0.4, 0, 100); // map hrv to bar height rect(50, 150, 25, -mHrv); // draw bar // draw bar graph for SCL fill(#00f149); // set fill color to green float mScl = map(scl, 0.0, 20.0, 0, 100); // map scl to bar height rect(125, 150, 25, -mScl); // draw bar } // update hrv value void updateHrv(float val) { hrv = val; println("hrv: " + hrv); } // update scl value void updateScl(float val) { scl = val; println("scl: " + scl); }