-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 5315df1
Showing
3 changed files
with
245 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
}); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
|