"Starting the projector, we felt the walls of our minds shake. " -- Hollis Frampton

 We are all Projectionists

some notes on software construction, interactivity, and media archives

In the parallel world of the Ideal Audience, we would all arrive well before the film is scheduled to begin. We would crowd into the projection booth and, by the light of a small lamp, we -the Ideal Audience - would wrap the flat strand of film around toothed gears and rollers, curl and tuck it into the projector gate and coax it through its final stretch onto an old dented reel. Slipping coins under a corner of the machine, we square the faulty tilt of the image and zoom the lens to let the projection light fill the screen. We advance the film as we test the volume and balance the sound; we focus the lens, then casually watch the film in reverse as we rewind the film to its starting point. We are ready.

When it becomes time to begin the film, we push the switch forward, lamp on. We re-test the focus of the lens and slightly adjust the sound level. Then we lay down on the floorboards, blanketed by the din of movie soundtrack mixed with racket of gears, hammering film claw, and celluloid scraping against the revolving reels. The specters on the screen "take care of their own", while we, the Ideal Audience, together close our eyes, receptive to the light flickering through eyelids as we transition into an inward communicative sphere often mistaken for sleep.

Not Formless but Incomplete

The Cultural Producer who samples from the raging flows of media detritus - endless satellite feeds, cable and broadcast transmissions, and the sedimentary layers of these through the past 25-50 years - becomes the heroic Luther, wresting deconstructive (re)form(ation)s out of the desultory, formless industrial wasteland. Deconstructive film and video-making demonstrate the inherent formlessness of mass media by making it into the "new Nature."

However, the same quarter-century period that spurs these sampling tactics of protestant (deconstructive, oppositional) media-making has also seen the expansive growth of media archives outside the contexts of industrial or commercial production. The media artifacts of cultural archives resist deconstruction through their state of "incompletion". These ubiquitous archives - home movies, surveillance, porn, editing out-takes, activist interventions, agit-prop, and video witnessing - are not forms that deconstruct themselves, but forms molding forms in an ongoing process of deferred completion, passed on from one Projectionist to the next, generation after generation.

Finite State Machines

  1. "The mind begins with the matter at hand - the incidental curve of a road or the accidental movement of a passing figure. As it perceives these it possesses them as images, as the stuff of which it composes its night and day dreams in the forms of its desires and despairs."

    - Maya Deren, quoted on the Mystic Fire video distribution package of her films.

  2. "It is typical of the Roosevelt government that when they came to me in 1941 - before the United States entered the War - they had already decided to make use of the input-output approach in a study of the implication of eventual disarmament in the United States after the War."

    - Wassily Leontief, Russian-born, mid-20thc. Harvard economist, who developed a mathematical way to predict the consequences of large-scale economic decision-making. The year of his story, 1941, is 2 years before Deren and Alexander Hammid produce "Meshes of the Afternoon". (Quoted in A Computer Perspective: Background to the Computer Age by the office of Charles and Ray Eames)

  3. The machine begins with the matter at hand - the instance of a polymorphic collection of data and methods, or the changing conditions of random inputs. As the mind perceives the audio or visual output, it possesses these simulacra as images, as the virtual objects with which it compiles its night and day dreams into the machinic language of its desires and despairs, and actualizes a predictive model of affect and affections to emerge after perception.

    - a liberally re-worked hybrid of Deren + Leontief approximately 60 years later.

Software construction offers a form of aesthetic-cultural practice which involves the staging of intensified forms of perception. The quotation exercise above - hybridizing the poetics of cinema with the input-output calculus of economic modelling - suggests (however obliquely or tongue-in-cheek) possible traces in a story of lineage.

It is more than "serendipity" (the term used in the groundbreaking 1968 exhibition of computer art, "Cybernetic Serendipity") that antagonistic currents of cybernetics and surrealist-inspired art/anti-art movements begin to weave connective tissue in the "expanded cinema" of the 1950s, 60s and early 70s. Since that time, cinema practices have expanded to absorb the structural component of the computer interface via the viewer-performative, multiple genres of computer gaming.

With the intensification of modes of human-computer feedback through development of the Graphic User Interface (GUI), computer gaming genres extend cinema practices into a domain where Deren and Leontief can encounter each other in the suggestive interplay of inputs and outputs, actualities and simulacra. The GUI (intriguingly described by Allucquère Rosanne Stone as a "structured absence") presents a stage and a set of actions for the viewer's (the inter-actor's) performance. Interactivity extends systems of narrative, via "finite state machines" (FSMs) - code-object inputs and outputs simulating a kind of "artificial intelligence", in responsive engagement with the performance of the inter-actor as well as with other FSMs.

Software design, as cinematic form in this viewer-performative sense, resists the end-product orientation and generalizing approach to the design and use of digital video software editing tools. Software designed for the staging of the inter-actor's performance is in antagonistic relation to the design of professionalized software applications (Media 100, Avid, and others) for the way that these shrivel and subordinate the expansive potential of Interactive Modes of Projection to the Industrial Mode of Montage.

 

 "HF Critical Mass" script  

--"HF CRITICAL MASS" Software
-- written by Barbara Lattanzi
-- copyleft 08.25.01
-- dedicated to the memory of Hollis Frampton

------------------

-- This script is applied to a Quicktime video sprite.
-- This script is written in Lingo, the programming
-- language associated with Macromedia Director,
-- but is translatable to any language capable
-- of controlling digital video.

------------------

--This behavior applies a playback pattern algorithm to the video sprite.

-- The pattern involves alternately moving the video forward a certain length - temporally playing point 'a' to point 'c' - then
jumping back (an instant "rewinding") to a point 'b' somewhere after 'point a' and proceeding then toward point 'd', then jumping back toward point 'c', proceeding toward point 'e', and so on.

--1st. The script determines the duration (measured in tics, 60 tics per second) of the castmember video. There is a variable parameter for selecting which castmember is being referenced. When the video reaches that point, then the video is over. However, the video needs to "doubly" reach that point because of the looping repetitions. Therefore, the video is over when looping is complete.

--2nd. The script has a variable parameter that is the temporal amount (measured in tics) that the video plays before "rewinding".

--3rd. The script has a variable parameter that is the point in the video where the playback algorithm starts to apply. (This allows the algorithm to 'skip' such things as credits). There is also a variable parameter for a stopping point, allowing algorithm to be applied only across a range of the video.

--4th. The script has a variable parameter that is the temporal amount (measured in fraction of the forward amount) that the video "rewinds" before moving forward again.

--5th. Whenever the video advances forward, the sum of its starting point (movieTime property) plus the variable (2nd) gets put in a variable.

--6th. Every frame the movie checks the video's movieTime property against the variable described in 5. When the movieTime is more than the variable then the movieTime gets reset (the movieTime minus the value described in 4). The rewinding action will occur through the video jumping to a point indicated by this new movieTime property value

property videoSpr, videoMemNm, videoDur
property forwardAmt, rewindAmt, startTheAlgorithm, stopTheAlgorithm, tempInterval, diffValue, reversalAmt
property videoPlaybackMemberNum, videoForwardSome, fixedFraction, someFloatNumber
property startThisPoint, stopAtThisPoint, sprChannelForRewindControl, controllerBarSpr, manipulatorSpr
property flagMovieRate
--sprite that allows interaction with controller
property circleSpr
-- trigger the recursive playback only after a certain amount of video has played
property tempStartFlag

---------------------------------
on beginSprite me

   puppetTempo 5 
  -- NOTE: Although 1fps framerate is recommended for playback of video, 5 or higher fps smooths the controller movement Also note that the video castmember has been set to loop.

  videoMemNm = videoPlaybackMemberNum
  videoSpr = sprite(me.spriteNum)
  videoSprNum = me.spriteNum

  if the framelabel = "relocate" then
    videoDur = member(videoMemNm).duration
    forwardAmt = videoForwardSome
     fixedFraction = someFloatNumber
    rewindAmt = forwardAmt * fixedFraction
    startTheAlgorithm = startThisPoint
    stopTheAlgorithm = videoDur - (stopAtThisPoint )
    tempInterval = videoSpr.movieTime + forwardAmt
    diffValue = tempInterval - rewindAmt

    if videoSpr.movieTime <= startTheAlgorithm then
      -- the movie is under one-second playback
      videoSpr.movieTime = startTheAlgorithm
    end if

    controllerBarSpr = sprChannelForRewindControl
    flagMovieRate = 1
    tempStartFlag = 1
    circleSpr = manipulatorSpr

    member(videoMemNm).directToStage = 1
    member(videoMemNm).crop = 1
    member(videoMemNm).video = 1
    member(videoMemNm).sound = 0
    member(videoMemNm).loop = 1
  end if

end beginSprite

---------------------------------
on exitFrame me
  if the framelabel = "criticalmass" then
    doCriticalMass
  end if
end exitFrame

---------------------------------
on doCriticalMass me
  member(videoMemNm).sound = 1
  if controllerBarSpr > 0 then
    -- viewer is controlling the playback

    if tempStartFlag = 1 then
      -- the QT video is at the beginning
    
 -- The following condition signals time to begin the rewind cycle:

      if videoSpr.movieTime >            sprite(controllerBarSpr).width then
       tempStartFlag = 0
      if flagMovieRate = 1 then
        checkForwardAmount
      else
        if flagMovieRate = 0 then
          checkReversalAmount
        end if
      end if
    end if
   end if
  end if

  if videoSpr.movieTime >= stopTheAlgorithm - (forwardAmt ) then
-- QT video is nearly at the end
 
   tempStartFlag = 1
  end if

  if flagMovieRate = 1 then
    --QT video should play forward (at whatever rate of speed)
     if tempStartFlag = 0 then
    -- QT video is passed the beginning
    --The following condition signals that the segment has played thru and is ready to be rewound
    if videoSpr.movieTime > tempInterval then
      diffValue = videoSpr.movieTime - rewindAmt
    -- calculate the point to rewind to:
      videoSpr.movieTime = diffValue
      checkForwardAmount
     end if
    end if
   end if

 

 

Images from video documentation by Julie Zando, from her archive of 1992 Buffalo Women's Clinic Defense videos.
 

 

"We are just trying to slow them down!"

Software such as "HF Critical Mass", "AG Strain" - both based upon the earlier "Surface Tension: Applied Memory Mutation Software" - have been designed to be used with archives: video 'raw footage', unedited documents, movie "out-takes", surveillance tapes, porn, home movies, etc. The inter-actor samples the digital videos in a reconfigured timeframe - literally projecting her or his interaction, working with the software as an improvisational performance or presentation instrument.

"Surface Tension: Applied Memory Mutation Software" was conceived at the invitation of Hallwalls Contemporary Arts Center, in Buffalo, New York, (Media Curator, Julie Zando), to produce a work for the presentation of video documentation gathered in Buffalo, New York, during the legendary Defense of Women's Abortion and Reproductive Health Clinics during the 1990s.

While the pretext for "Surface Tension: Applied Memory Mutation Software" was the existence of these particular activist videotapes, the concept behind the software has its conscious lineage in 1970s film experimentation as well as in late 80s/early 90s tactical video practices. The software title derives from one of the works of the late Hollis Frampton - a film titled "Surface Tension". The software's algorithms translate and test some cinematic structures used in several of his films from the 1970s. An additional algorithm, "Strain Andromeda, The" is based on a 1992 video of the same name by the video artist, Anne McGuire.

In the words of a 1992 Clinic Defense organizer, (documented in one of the videos from the archives) as she is training volunteer abortion clinic defenders how to stand off the vehement rush of anti-abortion crowds, without themselves getting arrested: "We are just trying to slow them down!" The sum total of clinic defense tactics as well as (surprisingly) the tensions within the factions of defense organizers/volunteers, with respect to those tactics, meant that the "slowing down" became much more than one particular tactical goal. It became the operative component which focused attention and galvanized purpose through a complex disputational process (with rival predicitive models of outcomes) documented in the video archives.

Labors of Affective Projection

"Well, usually the idea with computers is that you do a little bit of work, and then the computer does a lot of work for you. In our case it is exactly the other way round: we do most of the work and then the computer has to do only a little bit. One idea is to slow technology down..."

-- Charles Lim of artist group tsunamii.net, interviewed by Tilman Baumgärtel (nettime post 6.27.02)

"HF Critical Mass", "AMG Strain" and "Surface Tension: Applied Memory Mutation Software" offer the inter-actor a means to generate perceptual objects in collaboration with the machine. That is, these works of software art offer interactive modes of affective projection. In this way the software serves the attentional moment: slowing things down by means of a "surface tension" on the flows of past, just-past, and present.


Barbara Lattanzi
July 2002

 


      --...continued

  if flagMovieRate = 0 then
    if tempStartFlag = 0 then
      if videoSpr.movieTime < tempInterval then
        diffValue = videoSpr.movieTime + reversalAmt         videoSpr.movieTime = diffValue
        checkReversalAmount
      end if
    end if
  end if

end doCriticalMass

---------------------------------
-- This handler called by script attached to slider bar gadget sprite
on changeTimeOverlap me, newAmount
-- Subtract small amount to insure that the video segment doesn't go into an endless loop.
 
  newAmt = (newAmount * 2) - 4
    fixedFraction = .01 * newAmt
end

---------------------------------
on changeTimeOverlapNow me, newAmount
  -- Subtract small amount to insure that the video segment doesn't go into an endless loop.
  tempStartFlag = 1
  newAmt = (newAmount * 2) - 4
  fixedFraction = .01 * newAmt
end changeTimeOverlap

---------------------------------
on checkForwardAmount me
  if sprite(controllerBarSpr).width > 2 then
   -- This value is problematic if it = 0 or 1, so set at a min. of 2 

    forwardAmt = sprite(controllerBarSpr).width
  -- measure this width to determine time-span measure.
  else
    forwardAmt = 2
  end if
 rewindAmt = forwardAmt * fixedFraction
  tempInterval = videoSpr.movieTime + forwardAmt
end checkForwardAmount

---------------------------------
on checkReversalAmount me
  if sprite(controllerBarSpr).width > 2 then
   -- This value is problematic if it = 0 or 1, so set at a min. of 2
  
 reversalAmt = sprite(controllerBarSpr).width
    -- measure this width to determine time-span measure.
 
 else
    reversalAmt = 2
  end if
  reversalJumpAmt = reversalAmt * fixedFraction
  tempInterval = videoSpr.movieTime - reversalAmt
end checkReversalAmount

---------------------------------
on forwardOrBackward me, setDirection

  -- Parameter passed in by another sprite broadcasting with "sendSprite" message, based on whether the interactor has moved the moveable sprite across the middle boundary between forward and reverse.

  -- NOTE: in order for the parameter to be read as a value, use keyword "me". Otherwise the parameter is understood as a new object instance, rather than a humble passed-in value.

  if setDirection = 1 then
    videoSpr.movieRate = 1
    flagMovieRate = 1
  else
    if setDirection = -1 then
      videoSpr.movieRate = -1
      flagMovieRate = 0
    end if
  end if

end forwardOrBackward

---------------------------------
on getPropertyDescriptionList

    criticalMassList = [:]

    addProp criticalMassList, #videoPlaybackMemberNum, [#default :0, #format :#integer, #comment:"slot into which video is imported for playback algorithm"]

addProp criticalMassList, #videoForwardSome, [#default :120, #format :#integer, #comment:"advance how many tics, 60/sec"] addProp criticalMassList, #someFloatNumber, [#default :.90, #format :#float, #comment:"rewind by what fraction of forward amount"]

addProp criticalMassList, #startThisPoint, [#default :0, #format :#integer, #comment:"when to begin algorithm"]

addProp criticalMassList, #stopAtThisPoint, [#default :#0, #format :#integer, #comment:"stop algorithm this amount prior to end of clip"]

addProp criticalMassList, #manipulatorSpr, [#default :#0, #format :#integer, #comment:"sprite that viewer uses to change playback"]

-- The following property is to accomodate user-interface for manipulating the video:

addProp criticalMassList, #sprChannelForRewindControl, \ [#default :0, #format :#integer, #comment:"leave at 0 if viewer does not control, else spriteNum that changes length"]

return criticalMassList

end