Current Students

Students currently studying Master in Creative Arts Practice

Chloe Manyue Yu 

Chrissy Shou Yu Chen

Ben Woolsey

Megan Wilson

Jade Mallabone

Garry Lydon

Michael Hirst

Sarah Davy

Alexei Crawley

Lewis Brown

Daniel Bradwell

Ashley Bowes



Previous Students



Meena DaneshyarMaria Clemente – AlbaceteSean Cotterill

Xiyuan TanYue WangRiar Rizaldi

Daniel Parry


Previous Students



MeteorEdmund Nesveda

Clive WrightChilly Rain

Wenya ChenTrong Cuong Dao

Yousif AbdulghaniTan

BartiZhang Wei



Yinzhen BaoTatiana Fujimori
Jaejun HwangSaksit Knunkitti
Wenchang LinClare Robertson
Tunc Karkutoglu

Mres Digital Media
Adrian ParkBen HoldenIsobel Taylor
James DavollNina LimardoXue Yan
Aaron SmilesAlessandro AltavillaAndrew Nixon
Andrzwej WojtasBen FreethBen Thompson
Helen CollardJane DudmanJoseph Pochciol
Pengfei ZhangSanjay Mortimer
Ewelina Aleksandrowicz (Tikul)



So where are the new CAP students??





  • To think about maps as a broader analogy for other forms of mathematical representation (such as visualisation)
  • To think about how power finds its expression in maps
  • To experiment with mapping technologies

…In that Empire, the craft of Cartography attained such Perfection that the Map of a Single province covered the space of an entire City, and the Map of the Empire itself an entire Province. In the course of Time, these Extensive maps were found somehow wanting, and so the College of Cartographers evolved a Map of the Empire that was of the same Scale as the Empire and that coincided with it point for point. Less attentive to the Study of Cartography, succeeding Generations came to judge a map of such Magnitude cumbersome, and, not without Irreverence, they abandoned it to the Rigours of sun and Rain. In the western Deserts, tattered Fragments of the Map are still to be found, Sheltering an occasional Beast or beggar; in the whole Nation, no other relic is left of the Discipline of Geography.
Jorge. L. Borges, A Universal History of Infamy, London, Penguin Books, 1975.

Why Maps

A point where visual cultural, technology, politics and social life combine in a particularly visible way.

Lying with Maps

‘Not only is it easy to lie with maps, it’s essential. To portray meaningful relationships for a complex, three-dimensional world on a flat sheet of paper or a video screen, a map must distort reality.’ Monmonier, M. S. (1996). How to lie with maps. University of Chicago Press.

Monmonier identifies among other things scale, projection, symbols, geometry, content, mistakes, printing errors, time, abstraction (think of the tube), elision, propaganda, aggregation and colour all as ways that lies are told with maps.

Julian Oliver’s Cartofictions:

Owning The Map, Maps as a Site of (political, social, aesthetic) Action

‘Although other nations might have intentionally distorted their maps, the Soviet Union’s systematic falsification of geo- graphic location is now a well-known part of the recent history of cartography. In the late 1930s, after the NKVD, or security police, assumed control of mapmaking, the Soviet cartographic bureaucracy began to deliberately distort the position and form of villages, coastlines, rivers, highways, railroads, buildings, boundaries, and other features shown on maps and atlases sold for public use.’ Monmonier, M. S. (1996). How to lie with maps. University of Chicago Press. (pp115-116)

  • Post colonialism (and map projections), technocracy (and elision) and mapping
  • Selfie city (used mechanical turk)
  • Technocracy and mapping – community alternatives, in Garbage
  • New mappings e.g. drones lidar

In opposition we might consider the notion of ‘thick mapping’.

‘Instead of positing another depth model or yet another celebration of postmodern hyperspace, the HyperCities proj- ect strives for “thickness.” Thickness means extensibility and polyvocality: diachronic and synchronic, temporally layered, and polyvalent ways of authoring, knowing, and making meaning. Not unlike the notion of “thick description” made famous by anthropologist Clifford Geertz, thickness connotes a kind of cultural analysis trained on the political, economic, linguistic, social, and other stratificatory and contextual realities in which human beings act and create. By eschewing any kind of universalism, it is a kind of analysis that is intrinsi- cally incomplete, always under contestation, and never reaching any kind of final, underlying truth. […] Thick maps are not simply “more data” on maps, but interrogations of the very possibility of data, mapping, and cartographic representational practices. In this sense, “thickness” arises from the never-ending friction between maps and counter-maps, constructions and de-constructions, mappings and counter-mappings.’ Presner, T. S., Shepard, D., & Kawano, Y. (2014). HyperCities : thick mapping in the digital humanities.(pp18-19)

Communication Maps

‘In Ersilia,to establish the relationships that sustain the city’s life, the inhabitants stretch strings from the corners of the houses, white or black or gray or black-and-white according to whether they mark a relationship of blood, of trade, authority, agency. When the strings become so numerous that you can no longer pass between them, the inhabitants leave: the houses are dismantled; only the strings and their supports remain.’ Calvino, Italo. Invisible cities. Houghton Mifflin Harcourt, 1978.

The topography of the contemporary internet mirrors one from 150 years previously. They suffer from the same topological problems.

The abstraction of the system to a map is actually it’s weakness.

Optical communciation - Chappe telegraph. Maps as bringers of speed, shrinkers of worlds. I wrote about this here.


Political Maps

Geometry Vs Geography in the Antarctic.

Mapping Knowledge

From Lullian Wheels

To the contemporary equivalents.

Many more here.

Techniques of Mapping

Body Mapping

For instance with FACEOSC

Or maps on the web

Like static maps.

And now to work.


Approaching invisible maps

First download Processing here

Get resources here

All about the google street view API here

Here’s a tool for finding the latitude longitude of a point

[HSS8123] – Rolling Alphabet/ Project Documentation

[HSS8123] – Rolling Alphabet/ code

Basic code from TUIO library, main conncet support from reacTIVISion app.

Code develop help from Tom and Xiyuan.
import TUIO.*;
import processing.sound.*;
TuioProcessing tuioClient;
float cursor_size = 15;
float object_size = 60;
float table_size = 760;
float scale_factor = 1;
PFont font;
boolean verbose = false;
boolean callback = true;
///——–IMPORT IMAGES——–/////
PImage background;
PImage veraA;
PImage veraB;
PImage veraC;
PImage veraD;
PImage veraE;
PImage veraF;
PImage veraG;
PImage veraH;
PImage veraI;
PImage veraJ;
PImage veraK;
PImage veraL;
PImage veraM;
PImage veraN;
PImage veraO;
PImage veraP;
PImage veraQ;
PImage veraR;
PImage veraS;
PImage veraT;
PImage veraU;
PImage veraV;
PImage veraW;
PImage veraX;
PImage veraY;
PImage veraZ;
///——-IMPORT SOUND—-////
SoundFile veraAsound;
SoundFile veraBsound;
SoundFile veraCsound;
SoundFile veraDsound;
SoundFile veraEsound;
SoundFile veraFsound;
SoundFile veraGsound;
SoundFile veraHsound;
SoundFile veraIsound;
SoundFile veraJsound;
SoundFile veraKsound;
SoundFile veraLsound;
SoundFile veraMsound;
SoundFile veraNsound;
SoundFile veraOsound;
SoundFile veraPsound;
SoundFile veraQsound;
SoundFile veraRsound;
SoundFile veraSsound;
SoundFile veraTsound;
SoundFile veraUsound;
SoundFile veraVsound;
SoundFile veraWsound;
SoundFile veraXsound;
SoundFile veraYsound;
SoundFile veraZsound;
///——-SOUND SWITCHES—//////
boolean Asound = false;
boolean Bsound = false;
boolean Csound = false;
boolean Dsound = false;
boolean Esound = false;
boolean Fsound = false;
boolean Gsound = false;
boolean Hsound = false;
boolean Isound = false;
boolean Jsound = false;
boolean Ksound = false;
boolean Lsound = false;
boolean Msound = false;
boolean Nsound = false;
boolean Osound = false;
boolean Psound = false;
boolean Qsound = false;
boolean Rsound = false;
boolean Ssound = false;
boolean Tsound = false;

boolean Usound = false;
boolean Vsound = false;
boolean Wsound = false;

boolean Xsound = false;
boolean Ysound = false;
boolean Zsound = false;
float tobjNo = -1;
float symbolFoundThisTime = -1;
void setup()



if (!callback) {
} else noLoop();

font = createFont(“Arial”, 18);
scale_factor = height/table_size;

tuioClient = new TuioProcessing(this);

////—–LOAD IMAGES——////
background = loadImage(“background.jpg”);
veraA = loadImage(“p1.jpg”);
veraB = loadImage(“p2.jpg”);
veraC = loadImage(“p3.jpg”);
veraD = loadImage(“p4.jpg”);
veraE = loadImage(“p5.jpg”);
veraF = loadImage(“p6.jpg”);
veraG = loadImage(“p7.jpg”);
veraH = loadImage(“p8.jpg”);
veraI = loadImage(“p9.jpg”);
veraJ = loadImage(“p10.jpg”);
veraK = loadImage(“p11.jpg”);
veraL = loadImage(“p12.jpg”);
veraM = loadImage(“p13.jpg”);
veraN = loadImage(“p14.jpg”);
veraO = loadImage(“p15.jpg”);
veraP = loadImage(“p16.jpg”);
veraQ = loadImage(“p17.jpg”);
veraR = loadImage(“p18.jpg”);
veraS = loadImage(“p19.jpg”);
veraT = loadImage(“p20.jpg”);
veraU = loadImage(“p21.jpg”);
veraV = loadImage(“p22.jpg”);
veraW = loadImage(“p23.jpg”);
veraX = loadImage(“p24.jpg”);
veraY = loadImage(“p25.jpg”);
veraZ = loadImage(“p26.jpg”);

///——LOAD SOUND—-/////
veraAsound = new SoundFile(this, “A.mp3″);
veraBsound = new SoundFile(this, “B.mp3″);
veraCsound = new SoundFile(this, “C.mp3″);
veraDsound = new SoundFile(this, “D.mp3″);

veraEsound = new SoundFile(this, “E.mp3″);
veraFsound = new SoundFile(this, “F.mp3″);
veraGsound = new SoundFile(this, “G.mp3″);
veraHsound = new SoundFile(this, “H.mp3″);
veraIsound = new SoundFile(this, “I.mp3″);
veraJsound = new SoundFile(this, “J.mp3″);
veraKsound = new SoundFile(this, “K.mp3″);
veraLsound = new SoundFile(this, “L.mp3″);
veraMsound = new SoundFile(this, “M.mp3″);
veraNsound = new SoundFile(this, “N.mp3″);
veraOsound = new SoundFile(this, “O.mp3″);
veraPsound = new SoundFile(this, “P.mp3″);
veraQsound = new SoundFile(this, “Q.mp3″);
veraRsound = new SoundFile(this, “R.mp3″);
veraSsound = new SoundFile(this, “S.mp3″);
veraTsound = new SoundFile(this, “T.mp3″);
veraUsound = new SoundFile(this, “U.mp3″);
veraVsound = new SoundFile(this, “V.mp3″);
veraWsound = new SoundFile(this, “W.mp3″);
veraXsound = new SoundFile(this, “X.mp3″);
veraYsound = new SoundFile(this, “Y.mp3″);
veraZsound = new SoundFile(this, “Z.mp3″);
void draw()
float obj_size = object_size*scale_factor;
float cur_size = cursor_size*scale_factor;
ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList();
for (int i=0;i<tuioObjectList.size();i++) {
TuioObject tobj = tuioObjectList.get(i);
symbolFoundThisTime = tobj.getSymbolID();
if(symbolFoundThisTime == tobjNo){
tobjNo = symbolFoundThisTime;

void addTuioObject(TuioObject tobj) {
if (verbose) println(“add obj “+tobj.getSymbolID()+” (“+tobj.getSessionID()+”) “+tobj.getX()+” “+tobj.getY()+” “+tobj.getAngle());
void chooseAndDrawImage(float tobjNo){
if (tobjNo == -1){
image(background, 0,0,width,height);
else if(tobjNo == 0){
image(veraA, 0,0,width,height);
else if(tobjNo == 1){
image(veraB, 0,0,width,height);
void chooseAndPlaySample(float tobjNo){
if(tobjNo == 0){
image(veraA, 0,0,width,height);;
else if(tobjNo == 1){
image(veraB, 0,0,width,height);;
else if(tobjNo == 2){
image(veraC, 0,0,width,height);;
else if(tobjNo == 3){
image(veraD, 0,0,width,height);;
else if(tobjNo == 4){
image(veraE, 0,0,width,height);;
else if(tobjNo == 5){
image(veraF, 0,0,width,height);;

else if(tobjNo == 6){
image(veraG, 0,0,width,height);;
else if(tobjNo == 7){
image(veraH, 0,0,width,height);;
else if(tobjNo == 8){
image(veraI, 0,0,width,height);;
else if(tobjNo == 9){
image(veraJ, 0,0,width,height);;
else if(tobjNo == 10){
image(veraK, 0,0,width,height);;
else if(tobjNo == 11){
image(veraL, 0,0,width,height);;
else if(tobjNo == 12){
image(veraM, 0,0,width,height);;
else if(tobjNo == 13){
image(veraN, 0,0,width,height);;
else if(tobjNo == 14){
image(veraO, 0,0,width,height);;
else if(tobjNo == 15){
image(veraP, 0,0,width,height);;
else if(tobjNo == 16){
image(veraQ, 0,0,width,height);;

else if(tobjNo == 17){
image(veraR, 0,0,width,height);;
else if(tobjNo == 18){
image(veraS, 0,0,width,height);;
else if(tobjNo == 19){
image(veraT, 0,0,width,height);;
else if(tobjNo == 20){
image(veraU, 0,0,width,height);;
else if(tobjNo == 21){
image(veraV, 0,0,width,height);;
else if(tobjNo == 22){
image(veraW, 0,0,width,height);;

else if(tobjNo == 23){
image(veraX, 0,0,width,height);;

else if(tobjNo == 24){
image(veraY, 0,0,width,height);;
else if(tobjNo == 25){
image(veraZ, 0,0,width,height);;
void chooseAndStopSample(float tobjNo){
if(tobjNo == 0){
veraAsound.stop();////stops the file many times instead of once. how to solve?
else if(tobjNo == 1){
else if(tobjNo == 2){
else if(tobjNo == 3){
else if(tobjNo == 4){
else if(tobjNo == 5){
else if(tobjNo == 6){
else if(tobjNo == 7){
else if(tobjNo == 8){
else if(tobjNo == 9){
else if(tobjNo == 10){
else if(tobjNo == 11){
else if(tobjNo == 12){
else if(tobjNo == 13){
else if(tobjNo == 14){
else if(tobjNo == 15){
else if(tobjNo == 16){
else if(tobjNo == 17){
else if(tobjNo == 18){
else if(tobjNo == 19){
else if(tobjNo == 20){
else if(tobjNo == 21){
else if(tobjNo == 22){
else if(tobjNo == 23){
else if(tobjNo == 24){
else if(tobjNo == 25){
void updateTuioObject (TuioObject tobj) {
if (verbose) println(“set obj “+tobj.getSymbolID()+” (“+tobj.getSessionID()+”) “+tobj.getX()+” “+tobj.getY()+” “+tobj.getAngle()
+” “+tobj.getMotionSpeed()+” “+tobj.getRotationSpeed()+” “+tobj.getMotionAccel()+” “+tobj.getRotationAccel());
void removeTuioObject(TuioObject tobj) {
if (verbose) println(“del obj “+tobj.getSymbolID()+” (“+tobj.getSessionID()+”)”);
void addTuioCursor(TuioCursor tcur) {
if (verbose) println(“add cur “+tcur.getCursorID()+” (“+tcur.getSessionID()+ “) ” +tcur.getX()+” “+tcur.getY());
void updateTuioCursor (TuioCursor tcur) {
if (verbose) println(“set cur “+tcur.getCursorID()+” (“+tcur.getSessionID()+ “) ” +tcur.getX()+” “+tcur.getY()
+” “+tcur.getMotionSpeed()+” “+tcur.getMotionAccel());
void removeTuioCursor(TuioCursor tcur) {
if (verbose) println(“del cur “+tcur.getCursorID()+” (“+tcur.getSessionID()+”)”);
void addTuioBlob(TuioBlob tblb) {
if (verbose) println(“add blb “+tblb.getBlobID()+” (“+tblb.getSessionID()+”) “+tblb.getX()+” “+tblb.getY()+” “+tblb.getAngle()+” “+tblb.getWidth()+” “+tblb.getHeight()+” “+tblb.getArea());

void updateTuioBlob (TuioBlob tblb) {
if (verbose) println(“set blb “+tblb.getBlobID()+” (“+tblb.getSessionID()+”) “+tblb.getX()+” “+tblb.getY()+” “+tblb.getAngle()+” “+tblb.getWidth()+” “+tblb.getHeight()+” “+tblb.getArea()
+” “+tblb.getMotionSpeed()+” “+tblb.getRotationSpeed()+” “+tblb.getMotionAccel()+” “+tblb.getRotationAccel());
void removeTuioBlob(TuioBlob tblb) {
if (verbose) println(“del blb “+tblb.getBlobID()+” (“+tblb.getSessionID()+”)”);
void refresh(TuioTime frameTime) {
if (verbose) println(“frame #”+frameTime.getFrameID()+” (“+frameTime.getTotalMilliseconds()+”)”);
if (callback) redraw();

[HSS8123] – Rolling Alphabet/experience table and model box

Processed with VSCO with a5 preset

[HSS8123] – Rolling Alphabet/model post

background 2

[HSS8123] – Rolling Alphabet/sounds for each alphabet

26 pieces of sounds from 26 different people’s vioce that talk about their stories, feeling or thinking about each alphabet: music, poem, special vox, and so on.

I collected them and record at my alphabets, when people move the model, hear the sound.

HSS8123: Final Video Documentation

Big thanks to Daniel Parry who shot and edited this film.

HSS8123: Pictures from the exhibition


HSS8123: Pictures of the build