triangleyur

Upon planning the release of Triangle Yur, Sondervan asked me if I could make a generative cover and label for it that was plottable using oldschool pen plotters. I extended the challenge by making every plot unique. The result of this labour-intensive project was several families of record covers, clearly from a common ancestor. That ancestor was a piece of music found on the record, the base DNA from which I extracted more data, visualised as linear waves, wel suited to the medium of plotters.

some records
release expo minutes before opening
release party performance
yellow vinyl in autumn leaves

 

trix algorave

In 2014 H.AL.I.C organised and played at the first belgian algorave

besides some belgian talent, we had a livestream from Alex McLean with a remote performance

early live coded visuals

Making the Roland DXY-1200 pen plotter wireless (bluetooth) for about 10€

Easy and cheap hack

My office is quite cluttered with hardware. I’ve been toying with chiplotle lately but doing so meant cleaning up my desk and make room for the big clunky 80ties plotter. Chiplotle just sends serial commands, so why not over bluetooth. I ordered a

hc06

HC06 serial bluetooth module widely available

 

and a

SKU065245h

serial to ttl converter powered by USB

 

just hooked it up together with a DB9-DB25 convertor and it just worked… pairing the HC06 was with the code 1234, instead of OSXs default 0000. besides that, no problems.

I set my

~/.chiplotle/config.py

to

serial_port_to_plotter_map = {‘/dev/tty.HC-06-DevB’ : ‘DXY-1300’}

and of we goplottersetup

The whole setup is usb powered and works really smooth. I can now leave the plotter at a convenient place in my office and play with it… wirelessly yay!

 

 

 

 

flashing the mi mini wifi router with OpenWRT

I lost connection with the mi mini wifi router after following this procedure. I flashed u-boot to the bootloader, and it succeeded, but It would no longer boot the firmware.
Apparently it did boot into u-boot, but to find that out I had to get a serial console. Instead of getting a usb serial to TTL I tried using a raspberry pi and the GPIOpins. It worked.

opening the MI mini wifi

two screws hold i together, opening it from there was a bit harder. You have to forcefully get underneathe four little hooks at the bottom front of the device

holes in the router

after opening it, all we need is accessible.

soldering a serial port on it

I used an old connector I had lying around, easy t get to the breadboard

nice solderpads, easy connection

next step involves the RPi

you can then hook it up to the RPis Tx, Rx and GND pins. As both devices use 3v3 TTL, no extra circuitry is needed

ssh over to the RPi

once your logged in, type

$ minicom -b 115200 -o -D /dev/ttyAMA0

to start a serial console on the RPis GPIOports. Once it runs, boot the mi and you should see this

Screen Shot 2015-06-09 at 20.46.36

 

now the easy part

connect a UTP cable from a LAN port directly to your computer, and assign your PC a manual address in th 192.168.1.x but not 192.168.1.1

start the http server on the mi

MT7620 # httpd
raspi_read: from:40028 len:6
NetTxPacket = 0x83FB5080

KSEG1ADDR(NetTxPacket) = 0xA3FB5080
Trying Eth0 (10/100-M)

Waitting for RX_DMA_BUSY status Start… done
ETH_STATE_ACTIVE!!
HTTP server is starting at IP : 192.168.1.1
HTTP server is ready!

Keep going WEB failsafe, rx_counter=0 , GoGoGo!!!

point you browser to 192.168.1.1

and upload your firmware…

I flashed openwrt-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin

connect to internet (cable)

and start setting up OpenWRT

$ opkg update && opkg list luci-*
$ opkg install luci-ssl

$ /etc/init.d/uhttpd start
$ /etc/init.d/uhttpd enable

$ uci set wireless.@wifi-device[0].disabled=0; uci commit wireless; wifi

 

make sure it boots from the flash partition

by default it waits for a tftp image to be transferred, so:

$ printenv

and take a look at the env variables

$ bootcmd=tftp

this should be

“bootcmd=bootm bc050000”

so set it and save it

$ setenv bootcmd bootm bc050000

$ saveenv

now reboot, test and go and configure it

OHM2013 moldover show

I was at OHM2013 for some hacking, meeting friends and meeting new people. One of them was @moldover and he brought his gear (mojo & robocaster)! As I’m building my own controller (for visuals and vegetables) I started talking to him. He was going to perform later that day at Rainbow Island. So I offered him a live VJset and after little to none preparation time I was able to fix my setup enough to get going. And so we did. And because it was fun, we did it again the next day. Inspired by the great place Rainbow Island is I gatherered some (retro) pixels during the day from dancing my little ponys to the masks from hotline miami. The people for rainbow Island added more beamers and splitters and lights and fire and the results was fun.

some pics

IMG_20130801_221232
full video

Moldover full show 2-8-2013 @ Rainbow Stage - OHM2013 - YouTube

extracting earth earth’s entropy for generating aliens

I need to fill a lineair space and generate a continuously evolving series of abstract drawings. All this to fill up some leftover space at the office (to make it less boring). In particular a 30 cm (1ft) high space below the windows. This stretches along the windows and is quite long.

To avoid repetetivity, I chose to seed the algorithm with somewhat random data in the form of a series of pixels extracted along the image of the earth.

 

I work at a hi-tech internet  innovation research institute but are in no way affiliated to Silicon Valley, we came up with the idea of connecting Ghent with a line to silicon valley, the result, is not that interesting to show, but it is a line, one pixel wide. It is however an interesting series of pixels, where neighbouring pixels are related.

but what to  to with pixels.

It’s not an awful lot of data. A color, an RGB value(3 times 8 bits), a sequence number perhaps, maybe the relation to the neighbor? Does it within a certain threshold have the same amount of blue, green and red? Or does it represent a bump? As it comes from a terrain map, maybe  it can represent an altitude. not sure yet.

But what I was looking for was more something that contains enough data to allow to generate specific images

You’re looking at it, just above this sentence. after parsing the pixel color data from it, half an alien is generated according to this procedure.

 

which is then mirrored and completed. Repeat this for every pixel and you get a lot of different aliens, first 25 of the above line, pictured below

[processing code]

/**
* aliens
*/

PImage lijn;
int px = 0;
int pxmax = 5;
int offsetY = 0;
int alienSize = 160;

void setup() {
frameRate(4);
size(pxmax*alienSize, pxmax*alienSize);
smooth();
background(0);
noStroke();
lijn = loadImage(“lijn.png”);

}
void alien(color code, int px){
//println(red(code));
//int Rr = Integer
int offsetX = px – (pxmax*offsetY) ;

fill(red(lijn.pixels[px]),green(lijn.pixels[px]),blue(lijn.pixels[px]));
rect((offsetX*alienSize),(offsetY*alienSize),alienSize, alienSize);
fill(0);

String alienR = Integer.toBinaryString(parseInt(red(code)));
alienR = “0000000” + alienR;
alienR = alienR.substring(alienR.length()-8);
String alienG = Integer.toBinaryString(parseInt(green(code)));
alienG = “0000000” + alienG;
alienG = alienG.substring(alienG.length()-8);
String alienB = Integer.toBinaryString(parseInt(blue(code)));
alienB = “0000000” + alienB;
alienB = alienB.substring(alienB.length()-8);
//
//println(alienR);
for(int i=0;i<8;i++){
//println(alienR.charAt(i));
}

for (int col = 0 ; col < 4; col++) {
for (int row = 0; row < 8; row++){
if(col == 1) {
String[] alienRArray = alienR.split(“”);
if(parseInt(alienRArray[row+1]) == 1) {
rect((col*20)+offsetX*alienSize, (row*20)+offsetY*alienSize, 20, 20);
rect(((7-col)*20)+offsetX*alienSize, (row*20)+offsetY*alienSize,20,20);
}
}
if(col == 2) {
String[] alienGArray = alienG.split(“”);
if(parseInt(alienGArray[row+1]) == 1) {
rect((col*20)+offsetX*alienSize, (row*20)+offsetY*alienSize, 20, 20);
rect(((7-col)*20)+offsetX*alienSize, (row*20)+offsetY*alienSize,20,20);
}
}
if(col == 3) {
String[] alienBArray = alienB.split(“”);
if(parseInt(alienBArray[row+1]) == 1) {
rect((col*20)+offsetX*alienSize, (row*20)+offsetY*alienSize, 20, 20);
rect(((7-col)*20)+offsetX*alienSize, (row*20)+offsetY*alienSize,20,20);
}
}
}
}
if(offsetX == 4){
offsetY++;
}
}
void draw(){
lijn.loadPixels();
color code = color(red(lijn.pixels[px]),green(lijn.pixels[px]),blue(lijn.pixels[px])) ;
alien(code, px);
px++;
}

[/processing code]