Splinterfields: Mathematickal Arts #2

For my contribution to the Mathematickal Arts workshop, I wanted to explore weaving, specifically plain weave. This is the simplest form of weaving, but when combined with sequences of colour it can produce many different types of pattern.

Some of these patterns when combined with muted colours, have in the past been used as a type of camouflage – and are classified into District Checks for use in hunting in Lowland Scotland. This is, I guess, a kind of less prestigious form of Tartan.

I started off by trying to understand how the patterns emerge, beginning with the basic structure:

The threads running top to bottom are the warp, those running across are the weft. If we consider the top most thread as visible, we can figure out the colours of this small section of weave. A few lines of scheme calculate and print the colours of an arbitrarily sized weave, by using lists of warp and weft as input.

; return warp or weft, dependant on the position
(define (stitch x y warp weft)
  (if (eq? (modulo x 2)
           (modulo y 2))
      warp weft))

; prints out a weaving
(define (weave warp weft)
  (for ((x (in-range 0 (length weft))))
       (for ((y (in-range 0 (length warp))))
            (display (stitch x y 
                             (list-ref warp y)
                             (list-ref weft x))))
       (newline)))

I’ve been visualising the weaves with single characters representing colours for ascii previewing, here are some examples:

(weave '(O O O O O O O) '(: : : : : : : : :))
=>
 O : O : O : O
 : O : O : O :
 O : O : O : O
 : O : O : O :
 O : O : O : O
 : O : O : O :
 O : O : O : O
 : O : O : O :
 O : O : O : O

(weave '(O O : : O O : : O O) '(O : : O O : : O O :))
 =>
 : O : : : O : : : O
 O : : : O : : : O :
 O O O : O O O : O O
 O O : O O O : O O O
 : O : : : O : : : O
 O : : : O : : : O :
 O O O : O O O : O O
 O O : O O O : O O O
 : O : : : O : : : O

This looked quite promising as ascii art, but I didn’t really know how it would translate into a textile. I also wanted to look into ways of generating new patterns algorithmically, using formal grammars – this was actually one of the simpler parts of the project. The idea is that you begin with an axiom, or starting state, and do a search replace on it repeatedly following one or more simple rules:

Axiom: O
Rule: O -> :O:O

Generation 1: O
Generation 2: :O:O
Generation 3: ::O:O::O:O 
Generation 4: :::O:O::O:O:::O:O::O:O

We can then generate quite complex patterns for the warp and the weft from very small instructions, next I’ll show what happens when some of these are translated into real woven fabric…

Splinterfields: Mathematickal Arts #1

Textiles and mathematics have a long but sometimes easy to ignore shared history. The Mathematickal Arts workshop at FoAM in Brussels last weekend celebrated and brought this history to the fore with Tim Boykett and Carole Collet taking us on an exploration including knots, origami, group theory, mobius strips, donut making, weaving, symmetry, crochet and non-euclidean geometry systems.

This workshop underlined the importance of applying a hypothesis led process to creative work – testing your assumptions, recording experiments well and attempting classification to further understanding and avoid repeating mistakes. Right at the start we were confronted by the strange things that happen when you cut a moebius strip in half, a good reminder of the fragility of intuition and common sense.

As always with FoAM, the food blended seamlessly into the workshop with woven, rolled and knotted dishes being provided by Annabel Meuleman. We also contributed to the sugar intake by making donuts from knotted and pleated dough and observing the transformations undertaken while cooking (and shortly after, eating).

This workshop was one of the first activities connected with the resilients project which is engaged with promoting long term thinking. One of the things we discussed related to this was the way that textiles are used to store memory. For example knots were used as a language in the Inca civilisation in order to communicate using Quipu. Carole also introduced us to Ikat, a weaving technique where warp and weft fibres are tie dyed prior to weaving. This is a very complex process, and the accumulation of slight errors results in a hazy look (It’s known as “abra”, or “cloud” in Central Asia). The knowledge of the precise technique – where to tie the fibre to achieve a desired pattern, are passed down the maternal line from mother to daughter.

Many many more pictures here, and another post soon on what I ended up making.

Messages from plants and plant spirits

In Germination X plants can now send messages to the players that planted them – and these are stored individually for each player as well as globally so you can see what other people are up to. Plant spirits can also send you messages when they see something happening that interests them (such as a plant of their permaculture layer getting ill).

The messages are obviously more debug text than anything helpful at the moment – but they will be expanded.

We’ve been talking about making a kind of transition from the players thinking of the plants as being their property to the reverse situation. Playing with these messages might give us a way to make this possible.

Visualising Elastic Versailles

Naked on Pluto is a text adventure game, it’s world is comprised of descriptions, populated by bits and pieces of text from your facebook profile while the space is largely left to your interpretation and imagination. There are some ways of visualising it though.

We have been archiving versions of the game world every hour for the last year in a git repo. In these files the only facebook profile information we have stored are names, which are considered public information in the agreement with facebook. We are interested in using this data to see how we built the game and potentially how people have been playing it (although one snapshot per hour isn’t really enough for that).

I started out experimenting with GraphViz and Gephi but I ended up switching to fluxus and adapting the exquisite code visualiser to read through thousands of dot files to make a dynamically changing graph. This animation shows the process from us building the world to the introduction of the first playtesters over the course of a few months:

Golden Medallions and in-game programming

Once the low level code for a Naked on Pluto bot is written in Scheme, it’s added by the game using secret commands which program the game inside itself, while it’s running. This means the game can be changed while people are playing it – which makes it much easier to add new things without worrying about the disruption caused by restarting the server. We can also work on the game collaboratively, at the same time this way.


(Programming a spybot with it’s behaviour)

Eventually the plan is to be able to program the bots fully within the game client – this is still a long term goal, but there are of course some fairly complex security problems with this idea.


(dressing a AudienceBot with another object)

Not all players have the ability to use these secret commands right now, in order to access them a player has to be carrying a special object (also known as a “Golden Medallion”). This allows you access to all areas of the game, including an “administration room” and various other secret powers.

Naked on Pluto goes to São Paulo

(Originally posted here)

Naked on Pluto has been selected for FILE festival São Paulo 2011 which, in addition to some funding from the Finnish Promotion Centre for Audiovisual Culture (AVEK) allows us to develop the game for an art gallery installation setting.

I’ve been reacquainting myself with bot programming, and trying some experimental and dangerous things with conversations.

As an example, here is a bot that simply repeats things it overhears – if you throw a couple of these in a room and start them going by saying something – chaos follows as they start to repeat you and then each other’s messages:

(define (talkative-action entity graph node)
  (if (and
       (< (random 5) 3) ; do this 3 out of 5 times
       (< (length (pluto-node-old-messages node)) 10)) ; safety valve
      (foldl                ; loop over all the messages
       (lambda (msg node)
         ; get the name of the sender
         (let ((name (entity-name 
                      (pluto-node-entity-get 
                       node (pluto-message-from msg)))))
           (pluto-say-to-random ; make a new message 
            node                ; to a random entity
            entity 
            (string-append ; build the message
             (choose
              (list
               (string-append name " just said: ")
               (string-append "I just heard " name " saying: ")))
             (pluto-message-txt msg))))) ; repeat the message
       node
       (pluto-node-old-messages node))
      node))