├── README ├── brain_grapher ├── Channel.pde ├── ConnectionLight.pde ├── Graph.pde ├── Monitor.pde ├── Point.pde ├── application.linux │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ ├── brain_grapher │ └── lib │ │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ │ ├── brain_grapher.jar │ │ ├── controlP5.jar │ │ ├── core.jar │ │ ├── json.jar │ │ └── net.jar ├── application.macosx │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ └── brain_grapher.app │ │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ │ └── Contents │ │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ │ ├── Info.plist │ │ ├── MacOS │ │ ├── CVS │ │ │ ├── Entries │ │ │ ├── Repository │ │ │ ├── Root │ │ │ └── Template │ │ ├── JavaApplicationStub │ │ └── JavaApplicationStub64 │ │ ├── PkgInfo │ │ └── Resources │ │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ │ ├── Java │ │ ├── CVS │ │ │ ├── Entries │ │ │ ├── Repository │ │ │ ├── Root │ │ │ └── Template │ │ ├── brain_grapher.jar │ │ ├── controlP5.jar │ │ ├── core.jar │ │ ├── json.jar │ │ └── net.jar │ │ └── sketch.icns ├── application.windows │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ ├── brain_grapher.exe │ └── lib │ │ ├── CVS │ │ ├── Entries │ │ ├── Repository │ │ ├── Root │ │ └── Template │ │ ├── args.txt │ │ ├── brain_grapher.jar │ │ ├── controlP5.jar │ │ ├── core.jar │ │ ├── json.jar │ │ └── net.jar ├── brain_grapher.pde ├── data │ └── DIN-MediumAlternate-14.vlw └── lib │ ├── controlP5.zip │ └── json.zip └── screenshots └── screenshot-brain-grapher.png /README: -------------------------------------------------------------------------------- 1 | # Author: Eric Blue 2 | # url = http://eric-blue.com/2011/07/13/neurosky-brainwave-visualizer/ 3 | # email = ericblue76 (at) gmail (dot) com 4 | # Project: Neurosky Brainwave Visualizer 5 | 6 | [Overview] 7 | 8 | After purchasing a Neurosky Mindwave EEG device, I was surprised to see limited apps for 9 | viewing and visualizing EEG output (brainwave activity for delta, theta, alpha, and beta waves). 10 | Upon discovering 'How to Hack Toy EEGs' (http://frontiernerds.com/brain-hack), I was inspired 11 | by the Processing visualization of the Arduino-based serial output. I wanted to visualize the 12 | same set of data, however decided to obtain it using Neurosky's published ThinkGear Socket Protocol 13 | (http://developer.neurosky.com/docs/doku.php?id=thinkgear_connector_tgc). 14 | 15 | This fork of kitschpatrol's original code differs in that it doesn't use the Serial interface 16 | to obtain brainwave data. Rather, it communicates via the ThinkGear connector using the 17 | ThinkGear Socket Protocol and requests data in JSON format. 18 | 19 | [MindWave/MindSet Communication] 20 | 21 | By default the ThinkGear Connector allows applications to connect over TCP (default 127.0.0.1:13854) 22 | and request data in either binary or JSON format. This application will connect to the ThinkGear socket, 23 | and read the streaming real-time data. Format: 24 | 25 | { 26 | "eSense": 27 | {"attention":91,"meditation":41}, 28 | "eegPower": 29 | {"delta":1105014,"theta":211310, 30 | "lowAlpha":7730,"highAlpha":68568, 31 | "lowBeta":12949,"highBeta":47455, 32 | "lowGamma":55770,"highGamma":28247}, 33 | "poorSignalLevel":0 34 | } 35 | 36 | The default IP and port will be used, unless alternatives are specified as environment variables (THINKGEAR_HOST 37 | and THINKGEAR_PORT). Port forwarding can be used on the host Windows or Mac computer to allow remote servers to connect. 38 | To allow other hosts to connect and run Processing, run ReplayTCP (http://www.dlcsistemas.com/html/relay_tcp.html) 39 | OR, use netcat (windows or mac) to port forward (clients can now connect to port 13855). 40 | Ex: nc -l -p 13855 -c ' nc localhost 13854' 41 | 42 | [Required Libraries] 43 | 44 | The following required libraries are included: 45 | 46 | - ControlP5 (See http://www.sojamo.de/libraries/controlP5/) 47 | - JSON (See http://www.blprnt.com/processing/json.zip) 48 | 49 | Make sure to unzip and include under your normal 'sketchbook' libraries folder. Example directory structure: 50 | 51 | /usr/local/processing/libraries/ 52 | |-- controlP5 53 | | `-- library 54 | | `-- controlP5.jar 55 | |-- json 56 | | `-- library 57 | | `-- json.jar 58 | 59 | 60 | [Binaries] 61 | 62 | Binaries were created using Processing's app builder (platforms = windows, mac & linux) 63 | 64 | [Todo] 65 | - Re-visit previous todo from original code 66 | - Add ability to record data (CSV, etc.) 67 | 68 | [Credits] 69 | 70 | This code was inspired by the 'How to Hack Toy EEGs' article and forked from 71 | kitschpatrol (https://github.com/kitschpatrol/Processing-Brain-Grapher). 72 | - Original Processing code from 73 | Eric Mika, Arturo Vidich and Sofy Yuditskaya (http://frontiernerds.com) 74 | - Integration with Neurosky Thinkgear Socket Protocol from 75 | Eric Blue (http://eric-blue.com) 76 | -------------------------------------------------------------------------------- /brain_grapher/Channel.pde: -------------------------------------------------------------------------------- 1 | class Channel { 2 | 3 | String name; 4 | int drawColor; 5 | String description; 6 | boolean graphMe; 7 | boolean relative; 8 | int maxValue; 9 | int minValue; 10 | ArrayList points; 11 | boolean allowGlobal; 12 | 13 | 14 | 15 | Channel(String _name, int _drawColor, String _description) { 16 | name = _name; 17 | drawColor = _drawColor; 18 | description = _description; 19 | allowGlobal = true; 20 | points = new ArrayList(); 21 | } 22 | 23 | 24 | void addDataPoint(int value) { 25 | 26 | long time = System.currentTimeMillis(); 27 | 28 | if(value > maxValue) maxValue = value; 29 | if(value < minValue) minValue = value; 30 | 31 | points.add(new Point(time, value)); 32 | 33 | // tk max length handling 34 | } 35 | 36 | Point getLatestPoint() { 37 | if(points.size() > 0) { 38 | return (Point)points.get(points.size() - 1); 39 | } 40 | else { 41 | return new Point(0, 0); 42 | } 43 | } 44 | 45 | 46 | } -------------------------------------------------------------------------------- /brain_grapher/ConnectionLight.pde: -------------------------------------------------------------------------------- 1 | class ConnectionLight { 2 | int x, y; 3 | int currentColor = 0; 4 | int goodColor = color(0, 255, 0); 5 | int badColor = color(255, 255, 0); 6 | int noColor = color(255, 0, 0); 7 | int diameter; 8 | int latestConnectionValue; 9 | Textlabel label; 10 | PApplet parent; 11 | 12 | ConnectionLight(int _x, int _y, int _diameter, PApplet _parent) { 13 | x = _x; 14 | y = _y; 15 | diameter = _diameter; 16 | parent = _parent; 17 | 18 | label = new Textlabel(parent,"CONNECTION\nQUALITY", 32, 6); 19 | label.setFont(ControlP5.standard58); 20 | label.setColorValue(color(0)); 21 | } 22 | 23 | void update() { 24 | latestConnectionValue = channels[0].getLatestPoint().value; 25 | if(latestConnectionValue == 200) currentColor = noColor; 26 | if(latestConnectionValue < 200) currentColor = badColor; 27 | if(latestConnectionValue == 00) currentColor = goodColor; 28 | } 29 | 30 | void draw() { 31 | 32 | 33 | pushMatrix(); 34 | translate(x, y); 35 | 36 | noStroke(); 37 | fill(255, 150); 38 | rect(0, 0, 88, 28); 39 | 40 | noStroke(); 41 | fill(currentColor); 42 | ellipseMode(CORNER); 43 | ellipse(5, 4, diameter, diameter); 44 | 45 | label.draw(parent); 46 | popMatrix(); 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /brain_grapher/Graph.pde: -------------------------------------------------------------------------------- 1 | class Graph { 2 | int x, y, w, h, pixelsPerSecond, gridColor, gridX, originalW, originalX; 3 | long leftTime, rightTime, gridTime; 4 | boolean scrollGrid; 5 | String renderMode; 6 | float gridSeconds; 7 | Slider pixelSecondsSlider; 8 | RadioButton renderModeRadio; 9 | RadioButton scaleRadio; 10 | 11 | 12 | 13 | Graph(int _x, int _y, int _w, int _h) { 14 | x = _x; 15 | y = _y; 16 | w = _w; 17 | h = _h; 18 | pixelsPerSecond = 50; 19 | gridColor = color(0); 20 | gridSeconds = 1; // seconds per grid line 21 | scrollGrid = false; 22 | 23 | 24 | 25 | // temporary overdraw kludge to keep graph smooth 26 | originalW = w; 27 | originalX = x; 28 | 29 | w += (pixelsPerSecond * 2); 30 | x -= pixelsPerSecond; 31 | 32 | 33 | pixelSecondsSlider = controlP5.addSlider("PIXELS PER SECOND",10,width,50,16,16,100,10); 34 | pixelSecondsSlider.setColorForeground(color(180)); 35 | pixelSecondsSlider.setColorActive(color(180)); 36 | 37 | renderModeRadio = controlP5.addRadioButton("RENDER MODE",16,36); 38 | //renderModeRadio.setSpacingColumn(40); 39 | 40 | renderModeRadio.setColorForeground(color(255)); 41 | renderModeRadio.setColorActive(color(0)); 42 | renderModeRadio.addItem("Lines",1); 43 | renderModeRadio.addItem("Curves",2); 44 | renderModeRadio.addItem("Shaded",3); 45 | renderModeRadio.addItem("Triangles",4); 46 | renderModeRadio.activate(0); 47 | // triangles, too? 48 | 49 | scaleRadio = controlP5.addRadioButton("SCALE MODE",104,36); 50 | scaleRadio.setColorForeground(color(255)); 51 | scaleRadio.setColorActive(color(0)); 52 | scaleRadio.addItem("Local Maximum",1); 53 | scaleRadio.addItem("Global Maximum",2); 54 | scaleRadio.activate(0); 55 | } 56 | 57 | void update() { 58 | } 59 | 60 | void draw() { 61 | 62 | 63 | 64 | 65 | pixelsPerSecond = round(pixelSecondsSlider.value()); 66 | 67 | switch(round(renderModeRadio.value())) { 68 | case 1: 69 | renderMode = "Lines"; 70 | break; 71 | case 2: 72 | renderMode = "Curves"; 73 | break; 74 | case 3: 75 | renderMode = "Shaded"; 76 | break; 77 | case 4: 78 | renderMode = "Triangles"; 79 | break; 80 | } 81 | 82 | switch(round(scaleRadio.value())) { 83 | case 1: 84 | scaleMode = "Local"; 85 | break; 86 | case 2: 87 | scaleMode = "Global"; 88 | break; 89 | } 90 | 91 | w = originalW; 92 | x = originalX; 93 | 94 | w += (pixelsPerSecond * 2); 95 | x -= pixelsPerSecond; 96 | 97 | 98 | // Figure out the left and right time bounds of the graph, based on 99 | // the pixels per second value 100 | rightTime = System.currentTimeMillis(); 101 | leftTime = rightTime - ((w / pixelsPerSecond) * 1000); 102 | 103 | pushMatrix(); 104 | translate(x, y); 105 | 106 | // Background 107 | fill(220); 108 | rect(0, 0, w, h); 109 | 110 | 111 | // Draw the background graph 112 | strokeWeight(1); 113 | stroke(255); 114 | 115 | if (scrollGrid) { 116 | // Start from the first whole second and work right 117 | gridTime = (rightTime / (long)(1000 * gridSeconds)) * (long)(1000 * gridSeconds); 118 | } 119 | else { 120 | gridTime = rightTime; 121 | } 122 | 123 | while (gridTime >= leftTime) { 124 | int gridX = (int)mapLong(gridTime, leftTime, rightTime, 0L, (long)w); 125 | line(gridX, 0, gridX, h); 126 | gridTime -= (long)(1000 * gridSeconds); 127 | } 128 | 129 | // Draw square horizontal grid for now 130 | int gridY = h; 131 | while (gridY >= 0) { 132 | gridY -= pixelsPerSecond * gridSeconds; 133 | line(0, gridY, w, gridY); 134 | } 135 | 136 | 137 | // Draw each channel (pass in as constructor arg?) 138 | 139 | noFill(); 140 | if(renderMode == "Shaded" || renderMode == "Triangles") noStroke(); 141 | if(renderMode == "Curves" || renderMode == "Lines") strokeWeight(2); 142 | 143 | for (int i = 0; i < channels.length; i++) { 144 | Channel thisChannel = channels[i]; 145 | 146 | if(thisChannel.graphMe) { 147 | 148 | // Draw the line 149 | if(renderMode == "Lines" || renderMode == "Curves") stroke(thisChannel.drawColor); 150 | 151 | if(renderMode == "Shaded" || renderMode == "Triangles") { 152 | noStroke(); 153 | fill(thisChannel.drawColor, 120); 154 | } 155 | 156 | if(renderMode == "Triangles") { 157 | beginShape(TRIANGLES); 158 | } 159 | else { 160 | beginShape(); 161 | } 162 | 163 | if(renderMode == "Curves" || renderMode == "Shaded") vertex(0, h); 164 | 165 | 166 | for (int j = 0; j < thisChannel.points.size(); j++) { 167 | Point thisPoint = (Point)thisChannel.points.get(j); 168 | 169 | // check bounds 170 | if((thisPoint.time >= leftTime) && (thisPoint.time <= rightTime)) { 171 | 172 | int pointX = (int)mapLong(thisPoint.time, leftTime, rightTime, 0L, (long)w); 173 | 174 | int pointY = 0; 175 | if((scaleMode == "Global") && (i > 2)) { 176 | pointY = (int)map(thisPoint.value, 0, globalMax, h, 0); 177 | } 178 | else { 179 | // Local scale 180 | pointY = (int)map(thisPoint.value, thisChannel.minValue, thisChannel.maxValue, h, 0); 181 | } 182 | 183 | //ellipseMode(CENTER); 184 | //ellipse(pointX, pointY, 5, 5); 185 | 186 | if(renderMode == "Curves") { 187 | curveVertex(pointX, pointY); 188 | } 189 | else { 190 | vertex(pointX, pointY); 191 | } 192 | } 193 | } 194 | } 195 | 196 | if(renderMode == "Curves" || renderMode == "Shaded") vertex(w, h); 197 | if(renderMode == "Lines" || renderMode == "Curves" || renderMode == "Triangles") endShape(); 198 | if(renderMode == "Shaded") endShape(CLOSE); 199 | } 200 | 201 | 202 | 203 | 204 | popMatrix(); 205 | 206 | // gui matte 207 | noStroke(); 208 | fill(255, 150); 209 | rect(10, 10, 195, 81); 210 | 211 | } 212 | 213 | 214 | 215 | 216 | } 217 | -------------------------------------------------------------------------------- /brain_grapher/Monitor.pde: -------------------------------------------------------------------------------- 1 | class Monitor { 2 | int x, y, w, h, currentValue, targetValue, backgroundColor; 3 | Channel sourceChannel; 4 | CheckBox showGraph; 5 | Textlabel label; 6 | PApplet parent; 7 | 8 | Monitor(Channel _sourceChannel, int _x, int _y, int _w, int _h, PApplet _parent) { 9 | sourceChannel = _sourceChannel; 10 | x = _x; 11 | y = _y; 12 | w = _w; 13 | h = _h; 14 | parent = _parent; 15 | currentValue = 0; 16 | backgroundColor = color(255); 17 | showGraph = controlP5.addCheckBox("showGraph",x + 16, y + 34); 18 | showGraph.addItem("GRAPH",0); 19 | showGraph.activate(0); 20 | showGraph.setColorForeground(sourceChannel.drawColor); 21 | showGraph.setColorActive(color(0)); 22 | 23 | label = new Textlabel(parent,sourceChannel.name, x + 16, y + 16); 24 | label.setFont(ControlP5.grixel); 25 | label.setColorValue(0); 26 | 27 | } 28 | 29 | void update() { 30 | 31 | } 32 | 33 | void draw() { 34 | // this technically only neds to happen on the packet, not every frame 35 | if(showGraph.getItem(0).value() == 0) { 36 | sourceChannel.graphMe = false; 37 | } 38 | else { 39 | sourceChannel.graphMe = true; 40 | } 41 | 42 | 43 | pushMatrix(); 44 | translate(x, y); 45 | // Background 46 | noStroke(); 47 | fill(backgroundColor); 48 | rect(0, 0, w, h); 49 | 50 | // border line 51 | strokeWeight(1); 52 | stroke(220); 53 | line(w - 1, 0, w - 1, h); 54 | 55 | 56 | if(sourceChannel.points.size() > 0) { 57 | 58 | Point targetPoint = (Point)sourceChannel.points.get(sourceChannel.points.size() - 1); 59 | targetValue = round(map(targetPoint.value, sourceChannel.minValue, sourceChannel.maxValue, 0, h)); 60 | 61 | if((scaleMode == "Global") && sourceChannel.allowGlobal) { 62 | targetValue = (int)map(targetPoint.value, 0, globalMax, 0, h); 63 | } 64 | 65 | // Calculate the new position on the way to the target with easing 66 | currentValue = currentValue + round(((float)(targetValue - currentValue) * .08)); 67 | 68 | // Bar 69 | noStroke(); 70 | fill(sourceChannel.drawColor); 71 | rect(0, h - currentValue, w, h); 72 | } 73 | 74 | // Draw the checkbox matte 75 | 76 | noStroke(); 77 | fill(255, 150); 78 | rect(10, 10, w - 20, 40); 79 | 80 | popMatrix(); 81 | 82 | 83 | label.draw(parent); 84 | } 85 | 86 | 87 | 88 | } 89 | 90 | -------------------------------------------------------------------------------- /brain_grapher/Point.pde: -------------------------------------------------------------------------------- 1 | class Point { 2 | long time; 3 | int value; 4 | 5 | Point(long _time, int _value) { 6 | time = _time; 7 | value = _value; 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /brain_grapher/application.linux/CVS/Entries: -------------------------------------------------------------------------------- 1 | /brain_grapher/1.1/Wed Jul 13 06:27:23 2011/-kb/ 2 | D/lib//// 3 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.linux 2 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.linux/brain_grapher: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | APPDIR=$(dirname "$0") 4 | java -Djava.library.path="$APPDIR" -cp "$APPDIR/lib/brain_grapher.jar:$APPDIR/lib/core.jar:$APPDIR/lib/controlP5.jar:$APPDIR/lib/json.jar:$APPDIR/lib/net.jar" brain_grapher 5 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/CVS/Entries: -------------------------------------------------------------------------------- 1 | /brain_grapher.jar/1.1/Wed Jul 13 06:27:23 2011/-kb/ 2 | /controlP5.jar/1.1/Tue Oct 5 20:14:10 2010/-kb/ 3 | /core.jar/1.1/Sun May 15 22:42:21 2011/-kb/ 4 | /json.jar/1.1/Thu Feb 5 20:09:24 2009/-kb/ 5 | /net.jar/1.1/Sun May 15 22:42:23 2011/-kb/ 6 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.linux/lib 2 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/brain_grapher.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/brain_grapher.jar -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/controlP5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/controlP5.jar -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/core.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/core.jar -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/json.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/json.jar -------------------------------------------------------------------------------- /brain_grapher/application.linux/lib/net.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.linux/lib/net.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/CVS/Entries: -------------------------------------------------------------------------------- 1 | D/brain_grapher.app//// 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/CVS/Entries: -------------------------------------------------------------------------------- 1 | D/Contents//// 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx/brain_grapher.app 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/CVS/Entries: -------------------------------------------------------------------------------- 1 | /Info.plist/1.1/Wed Jul 13 06:27:23 2011/-kb/ 2 | D/MacOS//// 3 | /PkgInfo/1.1/Sun May 15 22:42:23 2011/-kb/ 4 | D/Resources//// 5 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx/brain_grapher.app/Contents 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleName 6 | brain_grapher 7 | CFBundleVersion 8 | 1.0 9 | CFBundleAllowMixedLocalizations 10 | true 11 | CFBundleExecutable 12 | JavaApplicationStub 13 | CFBundleDevelopmentRegion 14 | English 15 | CFBundlePackageType 16 | APPL 17 | CFBundleSignature 18 | ???? 19 | CFBundleInfoDictionaryVersion 20 | 6.0 21 | CFBundleIconFile 22 | sketch.icns 23 | CFBundleIdentifier 24 | brain_grapher 25 | 26 | 27 | LSUIPresentationMode 28 | 0 29 | 30 | 33 | LSArchitecturePriority 34 | 35 | i386 36 | ppc 37 | 38 | 39 | Java 40 | 41 | VMOptions 42 | 43 | MainClass 44 | brain_grapher 45 | JVMVersion 46 | 1.5* 47 | JVMArchs 48 | 49 | i386 50 | ppc 51 | 52 | ClassPath 53 | $JAVAROOT/brain_grapher.jar:$JAVAROOT/core.jar:$JAVAROOT/controlP5.jar:$JAVAROOT/json.jar:$JAVAROOT/net.jar 54 | 55 | 56 | Properties 57 | 58 | apple.laf.useScreenMenuBar 59 | true 60 | apple.awt.showGrowBox 61 | false 62 | com.apple.smallTabs 63 | true 64 | apple.awt.Antialiasing 65 | false 66 | apple.awt.TextAntialiasing 67 | true 68 | com.apple.hwaccel 69 | true 70 | apple.awt.use-file-dialog-packages 71 | false 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/CVS/Entries: -------------------------------------------------------------------------------- 1 | /JavaApplicationStub/1.1/Sun May 15 22:42:22 2011/-kb/ 2 | /JavaApplicationStub64/1.1/Sun May 15 22:42:23 2011/-kb/ 3 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/JavaApplicationStub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/JavaApplicationStub -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/JavaApplicationStub64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/MacOS/JavaApplicationStub64 -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/CVS/Entries: -------------------------------------------------------------------------------- 1 | D/Java//// 2 | /sketch.icns/1.1/Sun May 15 22:42:23 2011/-kb/ 3 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/CVS/Entries: -------------------------------------------------------------------------------- 1 | /brain_grapher.jar/1.1/Wed Jul 13 06:27:23 2011/-kb/ 2 | /controlP5.jar/1.1/Tue Oct 5 20:14:10 2010/-kb/ 3 | /core.jar/1.1/Sun May 15 22:42:21 2011/-kb/ 4 | /json.jar/1.1/Thu Feb 5 20:09:24 2009/-kb/ 5 | /net.jar/1.1/Sun May 15 22:42:23 2011/-kb/ 6 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/brain_grapher.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/brain_grapher.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/controlP5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/controlP5.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/core.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/core.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/json.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/json.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/net.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/Java/net.jar -------------------------------------------------------------------------------- /brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/sketch.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.macosx/brain_grapher.app/Contents/Resources/sketch.icns -------------------------------------------------------------------------------- /brain_grapher/application.windows/CVS/Entries: -------------------------------------------------------------------------------- 1 | /brain_grapher.exe/1.1/Sun May 15 22:42:23 2011/-kb/ 2 | D/lib//// 3 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.windows 2 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.windows/brain_grapher.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/brain_grapher.exe -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/CVS/Entries: -------------------------------------------------------------------------------- 1 | /args.txt/1.1/Wed Jul 13 06:27:22 2011// 2 | /brain_grapher.jar/1.1/Wed Jul 13 06:27:22 2011/-kb/ 3 | /controlP5.jar/1.1/Tue Oct 5 20:14:10 2010/-kb/ 4 | /core.jar/1.1/Sun May 15 22:42:21 2011/-kb/ 5 | /json.jar/1.1/Thu Feb 5 20:09:24 2009/-kb/ 6 | /net.jar/1.1/Sun May 15 22:42:23 2011/-kb/ 7 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/CVS/Repository: -------------------------------------------------------------------------------- 1 | dev/neurosky_brain_grapher/brain_grapher/application.windows/lib 2 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/CVS/Root: -------------------------------------------------------------------------------- 1 | :extssh:ericblue76@localhost:40000/usr/local/cvsroot 2 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/CVS/Template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/CVS/Template -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/args.txt: -------------------------------------------------------------------------------- 1 | 2 | brain_grapher 3 | brain_grapher.jar,core.jar,controlP5.jar,json.jar,net.jar 4 | -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/brain_grapher.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/brain_grapher.jar -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/controlP5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/controlP5.jar -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/core.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/core.jar -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/json.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/json.jar -------------------------------------------------------------------------------- /brain_grapher/application.windows/lib/net.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/application.windows/lib/net.jar -------------------------------------------------------------------------------- /brain_grapher/brain_grapher.pde: -------------------------------------------------------------------------------- 1 | import controlP5.*; 2 | import org.json.*; 3 | import processing.net.*; 4 | 5 | 6 | ControlP5 controlP5; 7 | ControlFont font; 8 | 9 | Client myClient; 10 | Channel[] channels = new Channel[11]; 11 | Monitor[] monitors = new Monitor[10]; 12 | Graph graph; 13 | ConnectionLight connectionLight; 14 | int packetCount = 0; 15 | int globalMax; 16 | String scaleMode; 17 | 18 | void setup() { 19 | size(1024, 768); 20 | smooth(); 21 | 22 | // Set up the knobs and dials 23 | controlP5 = new ControlP5(this); 24 | controlP5.setColorLabel(color(0)); 25 | // controlP5.setColorValue(color(0)); 26 | controlP5.setColorBackground(color(0)); 27 | //controlP5.setColorForeground(color(130)); 28 | // controlP5.setColorActive(color(0)); 29 | 30 | font = new ControlFont(createFont("DIN-MediumAlternate", 12), 12); 31 | 32 | 33 | // Connect to ThinkGear socket (default = 127.0.0.1:13854) 34 | // By default, Thinkgear only binds to localhost: 35 | // To allow other hosts to connect and run Processing from another machine, run ReplayTCP (http://www.dlcsistemas.com/html/relay_tcp.html) 36 | // OR, use netcat (windows or mac) to port forard (clients can now connect to port 13855). Ex: nc -l -p 13855 -c ' nc localhost 13854' 37 | 38 | String thinkgearHost = "127.0.0.1"; 39 | int thinkgearPort = 13854; 40 | 41 | String envHost = System.getenv("THINKGEAR_HOST"); 42 | if (envHost != null) { 43 | thinkgearHost = envHost; 44 | } 45 | String envPort = System.getenv("THINKGEAR_PORT"); 46 | if (envPort != null) { 47 | thinkgearPort = Integer.parseInt(envPort); 48 | } 49 | 50 | println("Connecting to host = " + thinkgearHost + ", port = " + thinkgearPort); 51 | myClient = new Client(this, thinkgearHost, thinkgearPort); 52 | String command = "{\"enableRawOutput\": false, \"format\": \"Json\"}\n"; 53 | print("Sending command"); 54 | println (command); 55 | myClient.write(command); 56 | 57 | 58 | 59 | // Creat the channel objects 60 | // yellow to purple and then the space in between, grays for the alphas 61 | channels[0] = new Channel("Signal Quality", color(0), ""); 62 | channels[1] = new Channel("Attention", color(100), ""); 63 | channels[2] = new Channel("Meditation", color(50), ""); 64 | channels[3] = new Channel("Delta", color(219, 211, 42), "Dreamless Sleep"); 65 | channels[4] = new Channel("Theta", color(245, 80, 71), "Drowsy"); 66 | channels[5] = new Channel("Low Alpha", color(237, 0, 119), "Relaxed"); 67 | channels[6] = new Channel("High Alpha", color(212, 0, 149), "Relaxed"); 68 | channels[7] = new Channel("Low Beta", color(158, 18, 188), "Alert"); 69 | channels[8] = new Channel("High Beta", color(116, 23, 190), "Alert"); 70 | channels[9] = new Channel("Low Gamma", color(39, 25, 159), "???"); 71 | channels[10] = new Channel("High Gamma", color(23, 26, 153), "???"); 72 | 73 | // Manual override for a couple of limits. 74 | channels[0].minValue = 0; 75 | channels[0].maxValue = 200; 76 | channels[1].minValue = 0; 77 | channels[1].maxValue = 100; 78 | channels[2].minValue = 0; 79 | channels[2].maxValue = 100; 80 | channels[0].allowGlobal = false; 81 | channels[1].allowGlobal = false; 82 | channels[2].allowGlobal = false; 83 | 84 | // Set up the monitors, skip the signal quality 85 | 86 | for (int i = 0; i < monitors.length; i++) { 87 | monitors[i] = new Monitor(channels[i + 1], i * (width / 10), height / 2, width / 10, height / 2, this); 88 | } 89 | 90 | monitors[monitors.length - 1].w += width % monitors.length; 91 | 92 | 93 | 94 | // Set up the graph 95 | graph = new Graph(0, 0, width, height / 2); 96 | 97 | connectionLight = new ConnectionLight(width - 98, 10, 20, this); 98 | 99 | globalMax = 0; 100 | } 101 | 102 | void draw() { 103 | 104 | // find the global max 105 | if(scaleMode == "Global") { 106 | if(channels.length > 3) { 107 | for(int i = 3; i < channels.length; i++) { 108 | if (channels[i].maxValue > globalMax) globalMax = channels[i].maxValue; 109 | } 110 | } 111 | } 112 | 113 | background(255); 114 | 115 | graph.update(); 116 | graph.draw(); 117 | 118 | connectionLight.update(); 119 | connectionLight.draw(); 120 | 121 | for (int i = 0; i < monitors.length; i++) { 122 | monitors[i].update(); 123 | monitors[i].draw(); 124 | } 125 | 126 | 127 | 128 | } 129 | 130 | void clientEvent(Client myClient) { 131 | 132 | // Sample JSON data: 133 | // {"eSense":{"attention":91,"meditation":41},"eegPower":{"delta":1105014,"theta":211310,"lowAlpha":7730,"highAlpha":68568,"lowBeta":12949,"highBeta":47455,"lowGamma":55770,"highGamma":28247},"poorSignalLevel":0} 134 | 135 | if (myClient.available() > 0) { 136 | 137 | String data = myClient.readString(); 138 | try { 139 | JSONObject json = new JSONObject(data); 140 | 141 | channels[0].addDataPoint(Integer.parseInt(json.getString("poorSignalLevel"))); 142 | 143 | JSONObject esense = json.getJSONObject("eSense"); 144 | if (esense != null) { 145 | channels[1].addDataPoint(Integer.parseInt(esense.getString("attention"))); 146 | channels[2].addDataPoint(Integer.parseInt(esense.getString("meditation"))); 147 | } 148 | 149 | JSONObject eegPower = json.getJSONObject("eegPower"); 150 | if (eegPower != null) { 151 | channels[3].addDataPoint(Integer.parseInt(eegPower.getString("delta"))); 152 | channels[4].addDataPoint(Integer.parseInt(eegPower.getString("theta"))); 153 | channels[5].addDataPoint(Integer.parseInt(eegPower.getString("lowAlpha"))); 154 | channels[6].addDataPoint(Integer.parseInt(eegPower.getString("highAlpha"))); 155 | channels[7].addDataPoint(Integer.parseInt(eegPower.getString("lowBeta"))); 156 | channels[8].addDataPoint(Integer.parseInt(eegPower.getString("highBeta"))); 157 | channels[9].addDataPoint(Integer.parseInt(eegPower.getString("lowGamma"))); 158 | channels[10].addDataPoint(Integer.parseInt(eegPower.getString("highGamma"))); 159 | } 160 | 161 | packetCount++; 162 | 163 | 164 | } 165 | catch (JSONException e) { 166 | println ("There was an error parsing the JSONObject." + e); 167 | }; 168 | 169 | } 170 | 171 | } 172 | 173 | 174 | // Extend core's Map function to the Long datatype. 175 | long mapLong(long x, long in_min, long in_max, long out_min, long out_max) { 176 | return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; 177 | } 178 | 179 | long constrainLong(long value, long min_value, long max_value) { 180 | if(value > max_value) return max_value; 181 | if(value < min_value) return min_value; 182 | return value; 183 | } 184 | -------------------------------------------------------------------------------- /brain_grapher/data/DIN-MediumAlternate-14.vlw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/data/DIN-MediumAlternate-14.vlw -------------------------------------------------------------------------------- /brain_grapher/lib/controlP5.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/lib/controlP5.zip -------------------------------------------------------------------------------- /brain_grapher/lib/json.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/brain_grapher/lib/json.zip -------------------------------------------------------------------------------- /screenshots/screenshot-brain-grapher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ericblue/Processing-Brain-Grapher/655ff10dd95db033c7d2525b91cf57ab53ff9dc8/screenshots/screenshot-brain-grapher.png --------------------------------------------------------------------------------