text written for e-flux
”’
(*)~———————————————————————————-
Pitch for a feature film set in Timidity projects for Mr. O, in 2015 BKK, by New-Territories [eɪf/bʌt/c] architects.
—
Code re-interpreted from Moritz Kassner & William Patera python code for Pupil – eye tracking platform.
—
Scenario to be enhanced by Serge Brussolo novel ‘Trajets et itinéraires de l’oubli’
—
Script guided by 2 voices: the code used with the pupil & eardrum recording devices, and the inner monologue of the hero. A third, psychotic interference of the psyche, regularly surfaces.
———————————————————————————-~(*)
”’INT.-EXT. FOLIAGE – BANGKOK – SUNSET – 2015
import sys,os
import cv2 as cv
import numpy as np
import cProfile
import time
Sounds of birds… and insects … cicadas… faraway sounds of monkeys, voices nearby, sounds of glasses, laughter, and… my name…
def main():
save_video = False
Slowly coming out of the mist… mind mist… grey… and all around… stains… undulations… … leaves… slowly undulating leaves… I focus … texture… undulations of the texture… a rhythm… in grey translucence… … some branches behind, further away… different…. black… black
Open again… clearer… people… a lot of people… filling the frame… drinking… eating finger food… undulating… smartly chatting… touching delicately… or gesticulating… not attached to each other… representation… vague connections… I see…
try:
data_folder = sys.argv[1]
except:
print “You did not supply a datafolder when you called this script. \
\nI will use the path hardcoded into the script instead.”
data_folder = “/Users/Timidity/Desktop/002”
if not os.path.isdir(data_folder):
raise Exception(“Please supply a layer of memories”)
I hear… indistinctly… glasses choked… small talks, laughers… high pitch voices… ‘really?’ absolutely fabulous!’ ‘ ah yes..? and have you had the chance to visit yet?…’ leaves rustling… ‘no no.. only from rumours..’ ‘ he is so … hmm… shy… you know…’ ‘but tonight I have hope… I have hope..’ ‘oh there he is!…’
# when we first see the word ‘shy’ it should appear as a scandal
video_path = data_folder + “/world.avi”
timestamps_path = data_folder + “/timestamps.npy”
gaze_positions_path = data_folder + “/gaze_positions.npy”
record_path = data_folder + “/world_viz.avi”
Now I am the bacteria on your lip
cap = cv.VideoCapture(video_path)
gaze_list = list(np.load(gaze_positions_path))
timestamps = list(np.load(timestamps_path))
# gaze_list: gaze x | gaze y | pupil x | pupil y | timestamp
# timestamps timestamp
A BOURGEOISE
‘Mr O’! Mr O..!’
‘My… what a house you have! I first took it for the museum… where is it? Let me introduce you to my husband… an artist as well… would love to see your collection… your fantasies…. I have heard too much about it… How do we get there? Will you show us tonight…?’
# this takes the timestamps list and makes a list
# with the length of the number of recorded frames.
# Each slot contains a list that will have 0, 1 or more associated gaze positions.
positions_by_frame = [[] for i in timestamps]
Zoom in… lips… drinking… lipstick on the glass… red stripes… uneven… irregular… She smiles… looks at me… insistence… look down.. zoom out.. mist…
no_frames = len(timestamps)
frame_idx = 0
data_point = gaze_list.pop(0)
gaze_point = data_point[:2]
gaze_timestamp = data_point[4]
Open again… slowly… still down… dark wood from the tropics… feet… high heels… legs… bare
while gaze_list:
# if the current gaze point is before the mean of the current world frame timestamp and the next worldframe timestamp
if gaze_timestamp <= (timestamps[frame_idx]+timestamps[frame_idx+1])/2.:
positions_by_frame[frame_idx].append({‘x’: gaze_point[0],’y’:gaze_point[1], ‘timestamp’:gaze_timestamp})
data_point = gaze_list.pop(0)
gaze_point = data_point[:2]
gaze_timestamp = data_point[4]
Too long… they will notice… look up… slowly… freeze… give me a moment
else:
if frame_idx >= no_frames–2:
break
frame_idx+=1
status, img = cap.read()
prevgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
height, width = img.shape[0:2]
frame = 0
past_gaze = []
t = time.time()
Now I am the termite under your skin
fps = cap.get(5)
wait = int((1./fps)*1000)
Look up… leaves… shading… getting darker… greyer… shades of the leaves above my head suddenly go from light grey to dark… deep dark… a passing cloud… I loose visual connection to the garden
if save_video:
#FFV1 — good speed lossless big file
#DIVX — good speed good compression medium file
writer = cv.VideoWriter(record_path, cv.cv.CV_FOURCC(*‘DIVX’), fps, (img.shape[1], img.shape[0]))
Turn around… behind the glass accordion … on my left… a silhouette… approaching… very smart… thin… quite small… discreet
while status and frame < no_frames:
nt = time.time()
# print nt-t
t = nt
# apply optical flow displacement to previous gaze
‘Excuse me’
if past_gaze:
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
prevPts = np.array(past_gaze,dtype=np.float32)
nextPts = prevPts.copy()
nextPts, status, err = cv.calcOpticalFlowPyrLK(prevgray, gray,prevPts,nextPts)
prevgray = gray
INT. RCC GROTTO – CIVIL TWILLIGHT
Faster… down… down… don’t stop… follow him… turn here… there… don’t stop… don’t talk… pretend you’re in a hurry
past_gaze = list(nextPts)
#constrain gaze positions to
Strata… rough… skin… torn… passing by… small scrapes… unnoticeable.. undramatic.. lame…
Feet on the ground… grass in between slabs… traces of guests
c_gaze = []
for x,y in past_gaze:
if x >0 and x<width and y >0 and y <height:
c_gaze.append([x,y])
past_gaze = c_gaze
INT.-EXT. CANOPY – NAUTICAL TWILLIGHT
Now a clearing… a void in the foliage… ….
Now a jungle… ferns… stronger noise of insects…
Dark light… dark green of the night continuously falling… …dilatation
#load and map current gaze positions and append to the past_gaze list
current_gaze = positions_by_frame[frame]
for gaze_point in current_gaze:
dilatation = mydriasis ((gaze_point[‘x’], gaze_point[‘y’]), 2, max)
I follow… I remember … super-imposition of images… I foresee… in between the trees… wild tiny prisoners
for gaze_point in current_gaze:
x,y = denormalize((gaze_point[‘x’], gaze_point[‘y’]), width, height)
if x >0 and x<width and y >0 and y <height:
past_gaze.append([x,y])
vap = 20 #Visual_Attention_Span
window_string = “the last %i frames of visual attention” %vap
overlay = np.zeros(img.shape,dtype=img.dtype)
# remove everything but the last “vap” number of gaze positions from the list of past_gazes
for x in xrange(len(past_gaze)–vap):
past_gaze.pop(0)
Now I am a butterfly in your thoughts
# draw recent gaze positions as white spots on an overlay image.
for gaze_point in past_gaze[::–1]:
cv.circle(overlay,(int(gaze_point[0]),int(gaze_point[1])), int(vap*2), (255, 255, 255), int(vap*6))
Keep on…. don’t stop… follow the silhouette through your own garden
vap -=.9 # less recent gaze points are smaller
vap = max(1,vap)
#render the area of visual attention as sharp sights on blurred visions
Animals screams… wild… serene… of life and death… the gibbons, the insects… and everything else…
Each instant dying and resurrecting
blurred = cv.blur(img,(21,21))
# desaturate the image
# blurred = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
# blurred = cv.cvtColor(blurred,cv.COLOR_GRAY2BGR)
blurred *=.8
To become them
# multiply this overlay with the img (white spot = 1, black background = 0)
# img = cv.multiply(img,overlay/255)
mask = (overlay==255)
blurred[mask] = img[mask]
cv.imshow(window_string, blurred)
if save_video:
writer.write(blurred)
When… beneath the branches and the screams… a deformation… there’s a pause… all slowing down… until I am in front
INT. CANOPY – ASTRONOMICAL TWILLIGHT
There was no boundary between where I came from and where I am now… perhaps just a change in light… no pressure…
status, img = cap.read()
frame += 1
ch = cv.waitKey(wait)
if ch == 27:
break
Muffled sounds… a mass of bodies… immobile… on top of each other… assembled… everywhere…
def denormalize(pos, width, height, flip_y=True):
Extreme close-up… closer… touching… lightly… see through them… slow motion… my hand on a chest… grab the hair… black
“””
denormalize and return as free
“””
INT. WHITE BOUNDARYLESS – DUSK
Open again… white void… intense light… hurting… the glare… close eyelid… signs… vibrations… too strong…. … no sound
x = pos[0]
y = pos[1]
if flip_y:
I lose sight of my guide
y= –y
x = (x * width / 2.) + (width / 2.)
y = (y * height / 2.) + (height / 2.)
return x,y
EXT. HOLE – NIGHT
def mydriasis(pos, lightIntensity, diameter):
# to be specified
def dazzle(intensity, color):
# to be specified
def tears(humidity, blur, pain):
# to be specified
if __name__ == ‘__main__’:
main()
# code and scenario to be developed
INT. CANOPY – DAWN
They come… they enter… I hear them walking up… I hear the elevator… the gates…
I feel the gaze… the pupils wandering… I am immobile… they came to get lost… they will become part of it… as well
Now you cannot see me
NOTES
(work in progress)
– Erethism or erethism mercurialis is a neurological disorder which affects the whole central nervous system, as well as a symptom complex derived from mercury poisoning. This is also sometimes known as the mad hatter disease. Historically, this was common among old England felt-hatmakers who used mercury to stabilize the wool in a process called felting, where hair was cut from a pelt of an animal such as a rabbit. The industrial workers were exposed to the mercury vapours, giving rise to the expression “mad as a hatter.” Some believe that the character the Mad Hatter in Lewis Carroll’s Alice in Wonderland is an example of someone suffering from erethism…
It is commonly characterized through behavioural changes such as irritability, low self-confidence, depression, apathy, shyness and timidity, and in some extreme cases with prolonged exposure to mercury vapours, delirium, personality changes and memory loss occur as a result. People with erethism find it difficult to interact socially with others, with behaviours similar to that of a social phobia.
– Phases = Muscular tension / Blushing / Perspiration / Mouth dryness / Palpitation / Nausea / Restraint / Delirium
– Charles Darwin devoted Chapter 13 of his 1872 The Expression of the Emotions in Man and Animals to complex emotional states including self-attention, shame, shyness, modesty, and blushing. He described blushing as “… the most peculiar and most human of all expressions.”