Current Students

Students currently studying Master in Creative Arts Practice

Shawn Ma

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

CAP

2015-2016

Meena DaneshyarMaria Clemente – AlbaceteSean Cotterill

Xiyuan TanYue WangRiar Rizaldi

Daniel Parry

 

Previous Students

CAP

2014-2015

MeteorEdmund Nesveda

Clive WrightChilly Rain

Wenya ChenTrong Cuong Dao

Yousif AbdulghaniTan

BartiZhang Wei

 

2013-2014

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)

 

Objects and object-orientation

Aims:

to discuss objects in technology and philosophy
to learn about why grounding computing in objects brought about a revolution in the way that we use computers
to learn about objects in programming

In Computing

In the early 60s the development of Object Oriented Programming languages (of which Smalltalk is arguably the first) was a significant step towards what we would consider a contemporary interaction with a computer interface. Fascinatingly its development was closely tied in with the idea of graphical representations of objects. This binding of programmatic and visual objects was one of the things that then and now made programming tractable enough to bring it into the reach of non specialists. It’s interesting that then and now Kay was interested in how children learn about the world around him as a source of inspiration for his programming language.

‘Smalltalk’s design–and existence–is due to the insight that everything we can describe can be represented by the recursive composition of a single kind of behavioral building block that hides its combination of state and process inside itself and can be dealt with only through the exchange of messages. Philosophically, Smalltalk’s objects have much in common with the monads of Leibniz and the notions of 20th century physics and biology. Its way of making objects is quite Platonic in that some of them act as idealisations of concepts–Ideas–from which manifestations can be created. That the Ideas are themselves manifestations (of the Idea-Idea) and that the Idea-Idea is a-kind-of Manifestation-Idea–which is a-kind-of itself, so that the system is completely self-describing– would have been appreciated by Plato as an extremely practical joke [Plato].’

Kay, A. C., & C., A. (1996). The early history of Smalltalk. In History of programming languages—II (pp. 511–598). New York: ACM. http://doi.org/10.1145/234286.1057828

 

‘The graphic objects in a sketch are embedded with layers of topological intelligence’, Ivan Sutherland Sketchpad  http://www.madlab.cc/after-50-years-of-computer-aided-design/

 

Ubicomp (Ubiquitous Computing)

A view of seeing programming languages as more deeply related to the world around us through their increasingly expressive power to be representational was wound up in the development of ubicomp the Internet of Things avant la lettre.

‘The arcane aura that surrounds personal computers is not just a “user interface” problem. My colleagues and I at PARC think that the idea of a “personal” computer itself is misplaced, and that the vision of laptop machines, dynabooks and “knowledge navigators” is only a transitional step toward achieving the real potential of information technology. Such machines cannot truly make computing an integral, invisible part of the way people live their lives. Therefore we are trying to conceive a new way of thinking about computers in the world, one that takes into account the natural human environment and allows the computers themselves to vanish into the background.

Such a disappearance is a fundamental consequence not of technology, but of human psychology. Whenever people learn something sufficiently well, they cease to be aware of it. When you look at a street sign, for example, you absorb its information without consciously performing the act of reading.. Computer scientist, economist, and Nobelist Herb Simon calls this phenomenon “compiling”; philosopher Michael Polanyi calls it the “tacit dimension”; psychologist TK Gibson calls it “visual invariants”; philosophers Georg Gadamer and Martin Heidegger call it “the horizon” and the “ready-to-hand”, John Seely Brown at PARC calls it the “periphery”. All say, in essence, that only when things disappear in this way are we freed to use them without thinking and so to focus beyond them on new goals.’

Weiser, M. (1991). The Computer for the 21st Century. Scientific American, 265(3), 94–104. Magazine Article.

 

In Philosophy

Philosophy (phenomenology)

Edmund Husserl -> Martin Heidegger, vorhanden vs zuhanden
objects vs things

It is some of Heidegger’s ideas that perhaps had the most distinct Influence on HCI particularly as they encouraged theories of embodiment e.g. Winograd and Flores, Paul Dourish (Section 5.1)

In Both

Strange Ontologies, Mitchell Whitelaw

‘For philosophy, ontology is a reflective pro- cess, an ongoing questioning of how to think about what is. For the information sciences, ontology is applied, contextual, and specific; the question is how best to model what is for some computational system in some specific domain with some specific purposes. With that practical imperative, the open, reflective position of philosophy is impossible to sustain. An answer is required. If philosophical ontology asks what is?, computational ontology answers, this is—or at least, for our purposes, in this context, for this system, this is. ‘

Whitelaw, M., Guglielmetti, M., & Innocent, T. (2009). Strange ontologies in digital culture. Computers in Entertainment, 7(1), 1. http://doi.org/10.1145/1486508.1486512

 

“My central thesis is that computation became a medium when the concepts of medium and interface were implicitly embedded in computation at the material level of the programming language itself, an event I locate in the emergence of object-oriented programming. In doing so, I will argue the strong case: object orientation is not merely a way of thinking about computation that just happens to lend itself to viewing computation as a medium; rather, it is the medialization of computation. That is, it is both historically and conceptually impossible to conceive object orientation and computational mediality apart from each other, as they are in fact only different perspectives on the same phenomenon.”

Alt, C. (2011). Object of Our Affection: How Object Orientation Made Computers a Medium. In E. Huhtamo  Parikka, Jussi (Ed.), Media Archaeology: Approaches, Applications, and Implications (pp. 278–301). Book Section, University of California Press.

 

;)

So where are the new CAP students??

mapping

screen-shot-2016-10-10-at-06-59-45

HSS8120

Aims

  • 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.

http://www.scar.org/antarctic-treaty-system

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

https://www.youtube.com/watch?v=8cDeZoaUohs

[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()
{

noCursor();

size(displayWidth,displayHeight);
noStroke();
fill(0);

if (!callback) {
frameRate(60);
loop();
} 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()
{
textFont(font,18*scale_factor);
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();
}
println(symbolFoundThisTime);
if(symbolFoundThisTime == tobjNo){
}
else{
chooseAndStopSample(tobjNo);
chooseAndPlaySample(symbolFoundThisTime);
tobjNo = symbolFoundThisTime;
}
chooseAndDrawImage(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);
veraAsound.play();
}
else if(tobjNo == 1){
image(veraB, 0,0,width,height);
veraBsound.play();
}
else if(tobjNo == 2){
image(veraC, 0,0,width,height);
veraCsound.play();
}
else if(tobjNo == 3){
image(veraD, 0,0,width,height);
veraDsound.play();
}
else if(tobjNo == 4){
image(veraE, 0,0,width,height);
veraEsound.play();
}
else if(tobjNo == 5){
image(veraF, 0,0,width,height);
veraFsound.play();
}

else if(tobjNo == 6){
image(veraG, 0,0,width,height);
veraGsound.play();
}
else if(tobjNo == 7){
image(veraH, 0,0,width,height);
veraHsound.play();
}
else if(tobjNo == 8){
image(veraI, 0,0,width,height);
veraIsound.play();
}
else if(tobjNo == 9){
image(veraJ, 0,0,width,height);
veraJsound.play();
}
else if(tobjNo == 10){
image(veraK, 0,0,width,height);
veraKsound.play();
}
else if(tobjNo == 11){
image(veraL, 0,0,width,height);
veraLsound.play();
}
else if(tobjNo == 12){
image(veraM, 0,0,width,height);
veraMsound.play();
}
else if(tobjNo == 13){
image(veraN, 0,0,width,height);
veraNsound.play();
}
else if(tobjNo == 14){
image(veraO, 0,0,width,height);
veraOsound.play();
}
else if(tobjNo == 15){
image(veraP, 0,0,width,height);
veraPsound.play();
}
else if(tobjNo == 16){
image(veraQ, 0,0,width,height);
veraQsound.play();
}

else if(tobjNo == 17){
image(veraR, 0,0,width,height);
veraRsound.play();
}
else if(tobjNo == 18){
image(veraS, 0,0,width,height);
veraSsound.play();
}
else if(tobjNo == 19){
image(veraT, 0,0,width,height);
veraTsound.play();
}
else if(tobjNo == 20){
image(veraU, 0,0,width,height);
veraUsound.play();
}
else if(tobjNo == 21){
image(veraV, 0,0,width,height);
veraVsound.play();
}
else if(tobjNo == 22){
image(veraW, 0,0,width,height);
veraWsound.play();
}

else if(tobjNo == 23){
image(veraX, 0,0,width,height);
veraXsound.play();
}

else if(tobjNo == 24){
image(veraY, 0,0,width,height);
veraYsound.play();
}
else if(tobjNo == 25){
image(veraZ, 0,0,width,height);
veraZsound.play();
}
}
void chooseAndStopSample(float tobjNo){
if(tobjNo == 0){
veraAsound.stop();////stops the file many times instead of once. how to solve?
}
else if(tobjNo == 1){
veraBsound.stop();
}
else if(tobjNo == 2){
veraCsound.stop();
}
else if(tobjNo == 3){
veraDsound.stop();
}
else if(tobjNo == 4){
veraEsound.stop();
}
else if(tobjNo == 5){
veraFsound.stop();
}
else if(tobjNo == 6){
veraGsound.stop();
}
else if(tobjNo == 7){
veraHsound.stop();
}
else if(tobjNo == 8){
veraIsound.stop();
}
else if(tobjNo == 9){
veraJsound.stop();
}
else if(tobjNo == 10){
veraKsound.stop();
}
else if(tobjNo == 11){
veraLsound.stop();
}
else if(tobjNo == 12){
veraMsound.stop();
}
else if(tobjNo == 13){
veraNsound.stop();
}
else if(tobjNo == 14){
veraOsound.stop();
}
else if(tobjNo == 15){
veraPsound.stop();
}
else if(tobjNo == 16){
veraQsound.stop();
}
else if(tobjNo == 17){
veraRsound.stop();
}
else if(tobjNo == 18){
veraSsound.stop();
}
else if(tobjNo == 19){
veraTsound.stop();
}
else if(tobjNo == 20){
veraUsound.stop();
}
else if(tobjNo == 21){
veraVsound.stop();
}
else if(tobjNo == 22){
veraWsound.stop();
}
else if(tobjNo == 23){
veraXsound.stop();
}
else if(tobjNo == 24){
veraYsound.stop();
}
else if(tobjNo == 25){
veraZsound.stop();
}
}
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

IMG_0355