Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
triss committed Nov 18, 2010
0 parents commit 5315df1
Show file tree
Hide file tree
Showing 3 changed files with 245 additions and 0 deletions.
131 changes: 131 additions & 0 deletions MonomEm.sc
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
//-----------------------------------------------------------------
//
// Visual emulator for the Monome 40h.
// Sends OSC messages to the specified host/port in the same
// format as the 40h, and responds to LED actions.
// __ Daniel Jones
// http://www.erase.net
//
// Usage:
// e = MonomEm.new(host, port);
// m = Monome.new(host, port);
// m.action = { |x, y, on| [x, y, on].postln };
// m.led(5, 6, 1);
//
// or:
// m = Monome.emu;
// m.led(6, 7, 1);
//
//-----------------------------------------------------------------


MonomEm
{

var <host, <port;
var win, matrix;
var bw = 16;
var keymap;
var addr, target;
var resps;

*new { |host = "127.0.0.1", port = 8080|
^super.newCopyArgs(host, port).init;
}

init {
win = Window.new("40h", Rect(30, 50, bw * 17, bw * 17), false, true);
8.do({ |y|
matrix = matrix.add([]);
8.do({ |x|
var button;
button = Button(win, Rect(bw + (x * bw * 2), bw + (y * bw * 2), bw, bw));
button.states = [
[ "", Color.gray, Color.gray ],
[ "", Color.green, Color.green ]
];

button.mouseDownAction = { |button|
this.press(x, y, 1);
};
button.mouseUpAction = { |button|
this.press(x, y, 0);
};

button.action = { button.value = 1 - button.value; };
matrix[y] = matrix[y].add(button);
});
});

keymap = [
[ $1, $2, $3, $4, $5, $6, $7, $8 ],
[ $q, $w, $e, $r, $t, $y, $u, $i ],
[ $a, $s, $d, $f, $g, $h, $j, $k ],
[ $z, $x, $c, $v, $b, $n, $m, $, ],
[ $!, $@ ,$#, $$, $%, $^, $&, $* ],
[ $Q, $W, $E, $R, $T, $Y, $U, $I ],
[ $A, $S, $D, $F, $G, $H, $J, $K ],
[ $Z, $X, $C, $V, $B, $N, $M, $< ],
];

win.view.keyDownAction = { |view, char, modifiers, unicode, keycode|
keymap.do({ |row, y|
if (row.indexOf(char).notNil)
{ this.press(row.indexOf(char), y, 1); };
});
};
win.view.keyUpAction = { |view, char, modifiers, unicode, keycode|
keymap.do({ |row, y|
if (row.indexOf(char).notNil)
{ this.press(row.indexOf(char), y, 0); };
});
};
win.onClose = {
resps.do({ |resp|
OSCresponder.remove(resp);
});
};

CmdPeriod.add({ win.close; });

win.front;

addr = NetAddr(host, port);
resps = [];
resps = resps.add(OSCresponder(addr, "/box/led", { |r, t, msg| this.led(msg[1], msg[2], msg[3]); }).add);
resps = resps.add(OSCresponder(addr, "/box/led_row", { |r, t, msg| this.led_row(msg[1], msg[2]); }).add);
resps = resps.add(OSCresponder(addr, "/box/led_col", { |r, t, msg| this.led_col(msg[1], msg[2]); }).add);

target = NetAddr("127.0.0.1", port);
}

close {
win.close;
}

press { |x, y, on|
target.sendMsg("/box/press", x, y, on);
}

led { |x, y, on|
defer({ matrix[y][x].value = on; });
}

led_row { |y, on|
defer({
8.do({ |x|
var pow = (2 ** x).asInteger;
matrix[y][x].value = ((pow & on) > 0).binaryValue
});
});
}

led_col { |x, on|
defer({
8.do({ |y|
var pow = (2 ** y).asInteger;
matrix[y][x].value = ((pow & on) > 0).binaryValue
});
});
}
}
110 changes: 110 additions & 0 deletions Monome.sc
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
//-----------------------------------------------------------------
//
// Clean interactions with the Monome
//
// Origanally written by:
// __ Daniel Jones
// http://www.erase.net
//
// Heavily modified by:
// __ Tristan Strange
// tristan.strange@gmail.com
//
// Run serialio with:
// ./serialio localhost:57120
//
// Usage:
// m = Monome.new(host, port, prefix, height, width);
// m = Monome.new;
// m.action = { |x, y, on|
// [x, y, on].postln;
// };
// m.led(5, 6, 1);
// m.led_row(4, 255);
// m.intensity(0.5);
// m.clear;
//
//-----------------------------------------------------------------

Monome {

var <host, <port;
var <prefix;

var <height, <width;

var incomingPressResponder, monomeAddress;

var <>action;

*new { | host = "127.0.0.1", port = 8080, prefix = "/box", height = 16, width = 16 |
^super.newCopyArgs(host, port, prefix, height, width).init;
}

*emu { | port = 57120 |
// spawn emulator
MonomEm.new(port: port);
^this.new(port: port).init;
}

init {
// set up OSC
this.initMonomePressesResponder;
monomeAddress = NetAddr(host, port);
}

initMonomePressesResponder {
incomingPressResponder = OSCresponderNode(nil, prefix ++ "/press", { |time, resp, msg|
if (action.notNil)
{ action.value(msg[1], msg[2], msg[3]); };
});
incomingPressResponder.add;
}

prefix_ { | newPrefix |
newPrefix.notNil.if {
// prefix a / to the new prefix if it doesn't have one
(newPrefix.asString.at(0) != '/').if { newPrefix = "/" ++ newPrefix };

// update the prefix
prefix = newPrefix;
monomeAddress.sendMsg("/sys/prefix", prefix);

// reinitialise OSC responder
incomingPressResponder.remove;
this.initMonomePressesResponder;
};
}

led { | x, y, on = 1 |
monomeAddress.sendMsg(prefix ++ "/led", x.asInteger, y.asInteger, on.asInteger);
}

led_row { | y, on = 255, on2 |
(on2.isNil).if({
monomeAddress.sendMsg(prefix ++ "/led_row", y.asInteger, on.asInteger);
}, {
monomeAddress.sendMsg(prefix ++ "/led_row", y.asInteger, on.asInteger, on2.asInteger);
});
}

led_col { | x, on = 255, on2 |
(on2.isNil).if({
monomeAddress.sendMsg(prefix ++ "/led_col", x.asInteger, on.asInteger);
}, {
monomeAddress.sendMsg(prefix ++ "/led_col", x.asInteger, on.asInteger, on2.asInteger);
});
}

intensity { | i |
monomeAddress.sendMsg(prefix ++ "/intensity", i);
}

clear { | on = 0 |
width.do { |i| this.led_col(i, on * 255, on * 255) };
}

test { | on = 1 |
monomeAddress.sendMsg(prefix ++ "/test", on.asInteger);
}
}
4 changes: 4 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
This code provides a class for simplifying the interfacing of the monome with SuperCollider.

It currently consists of a slightly modified version of Daniel Jones sc_monome library but will eventually contain classes for creating widgets of various shapes and sizes on the monome quickly and easily.

0 comments on commit 5315df1

Please sign in to comment.