Alex McLean

Making music with text

Happy new year + upcoming

by Alex on December 27, 2012

Looking forward to 2013, some things I’m up to so far:

+ more on the cards..

Lurk recordings

by Alex on December 12, 2012

I’ve been recording some experiments with a new iteration of my livecoding system, and putting them up over on lurk.org. I’m going to continue doing that but here’s the latest recording for the tired of clicking:


All and any feedback is very welcome.

Audio blast festival

by Alex on November 22, 2012

Audio blast is a streaming festival by apo33, running in both Nantes and Piksel festival in Bergen.

I’m performing this Saturday November 24th, for an hour from 7pm GMT (8pm CET).  I’ll be streaming quadrophonic sound from my studio in Sheffield, which will be played in both spaces, with a stream for remote listeners from two AKG mics in one of the spaces.  More info and link to the network stream on the website.  If anyone wants to pop by Sheffield for a listen and beer they’re welcome too :)

Busy week

by Alex on November 21, 2012

That was fun..

Slub at the Mozilla party

First, full slub (Dave, Ade and I) at the Mozilla party. The most interested crowd we’ve had, it was hard to get any live coding done between all the questions!  Dave collected some photos from the many that appeared online..

Then to Mexico City for the week-long /* vivo */ live coding festival.  They have a really great scene there, so many great accomplished performances, philosophical talks and fun workshops.  They also have great food and mezcal. A festival report will hopefully appear on the TOPLAP website soon but here is some video from the 2/3 slub performance (Dave and I) there (check out the 3D and HD options..):

Hester Reeve and I performing at the AHRC moot

Then back to London for the AHRC Digital Transformations Moot, where Hester Reeve and I made an experimental, and (fairly) durational live code/art performance work, where I made marks by live coding, and Hester made marks on a blackboard-painted pole.

Next is a panel session at PPIG, a solo performance at iFIMPAC in December (as well as a co-written paper on live coding in education), and more to follow in the new year..

Upcoming events in November

by Alex on October 3, 2012

Slub – never been great at press shots

I’m hoping to keep October clear for getting things done, but November is looking fun:

  • 10th November, full Slub performance at the Mozilla party in at the National Film Museum, London.
  • 12-17th November, off to the /* vivo */ International Live Coding Symposium in Mexico City.  I’ll be giving a talk called “Is live coding really live?” (spoiler: yes), running a workshop with Dave called “Time as functions in space”, and doing a two-thirds Slub performance with him too.
  • 19th November, I need to confirm this 100%, but very likely I will be performing again in London, some exciting new work with Hester Reeve at a major national event.
  • 21-23rd November, back in London again for PPIG, it looks likely that there will be a live coding workshop, a performance or two and panel session during the conference.

 

Patterns again

by Alex on September 18, 2012

Back to patterns in Haskell, an unruly puzzle that’s run through the last few years of my life, trying to work out how I want to represent my music.  Here’s the current state of my types:

  data Pattern a = Sequence {arc :: Range -> [Event a]}
                 | Signal {at :: Rational -> [a]}
  type Event a = (Range, a)
  type Range = (Rational, Rational)

A Range is a time range, with a start (onset) and duration.  An Event is of some type a, that occurs over a Range.  A Pattern can be instantiated either as a Sequence or Signal.  These are directly equivalent to the distinction between digital and analogue, or discrete and continuous.  A Sequence is a set of discrete events (with start and duration) occurring within a given range, and a Signal is a set of values for a given position in time.  In other words, both are represented as functions from time to values, but Sequence is for representing a set of events which have beginnings and ends, and Range is for a continuously varying set of values.

This is a major improvement on my previous version, simply because the types are significantly simpler, which makes the code significantly easier to work with.  This simplicity is due to the structure of patterns being represented entirely with functional composition, so is closer to my (loose) understanding of functional reactive programming..

The Functor definition is straightforward enough:

  mapSnd f (x,y) = (x,f y)
  instance Functor Pattern where
    fmap f (Sequence a) = Sequence $ fmap (fmap (mapSnd f)) a
    fmap f (Signal a) = Signal $ fmap (fmap f) a

The Applicative definition allows signals and patterns to be combined in in a fairly reasonable manner too, although I imagine this could be tidied up a fair bit:

  instance Applicative Pattern where
    pure x = Signal $ const [x]
    (Sequence fs) <*> (Sequence xs) = 
      Sequence $ \r -> concatMap
                       (\((o,d),x) -> map
                                      (\(r', f) -> (r', f x))
                                      (
                                        filter
                                        (\((o',d'),_) -> (o' >= o) && (o' < (o+d)))
                                        (fs r)
                                      )
                       )
                       (xs r)
  (Signal fs) <*> (Signal xs) = Signal $ \t -> (fs t) <*> (xs t)
  (Signal fs) <*> px@(Sequence _) = 
    Signal $ \t -> concatMap (\(_, x) -> map (\f -> f x) (fs t)) (at' px t)
  (Sequence fs) <*> (Signal xs) = 
    Sequence $ \r -> concatMap (\((o,d), f) -> 
                                map (\x -> ((o,d), f x)) (xs o)) (fs r)

In the Pattern datatype, time values are represented using Rational numbers, where each whole number represents the start of a metrical cycle, i.e. something like a bar.  Therefore, concatenating patterns involves ‘playing’ one cycle from each pattern within every cycle:

  cat :: [Pattern a] -> Pattern a
  cat ps = combine $ map (squash l) (zip [0..] ps)
    where l = length ps
  squash :: Int -> (Int, Pattern a) -> Pattern a
  squash n (i, p) = Sequence $ \r -> concatMap doBit (bits r)
    where o' = (fromIntegral i)%(fromIntegral n)
          d' = 1%(fromIntegral n)
          cycle o = (fromIntegral $ floor o)
          subR o = ((cycle o) + o', d')
          doBit (o,d) = mapFsts scaleOut $ maybe [] ((arc p) . scaleIn) (subRange (o,d) (subR o))
          scaleIn (o,d) = (o-o',d* (fromIntegral n))
          scaleOut (o,d) = ((cycle o)+o'+ ((o-(cycle o))/(fromIntegral n)), d/ (fromIntegral n))
  subRange :: Range -> Range -> Maybe Range
  subRange (o,d) (o',d') | d'' > 0 = Just (o'', d'')
                       | otherwise = Nothing
    where o'' = max o (o')
          d'' = (min (o+d) (o'+d')) - o''
  -- chop range into ranges of unit cycles
  bits :: Range -> [Range]
  bits (_, 0) = []
  bits (o, d) = (o,d'):bits (o+d',d-d')
    where d' = min ((fromIntegral $ (floor o) + 1) - o) d

Well this code could definitely be improved..

If anyone is interested the code is on github, but is not really ready for public consumption yet.  Now I can get back to making music with it though, more on that elsewhere, soon, maybe under a new pseudonym..

Upcoming events in September

by Alex on September 2, 2012

7/8th September 2012, Leeds – Live Interfaces

As my first act as research fellow at ICSRiM, I’m chairing this conference on live interaction in performance technology, two days of papers and performances, including a (free) club night.  The quality of submissions has been fantastic, and we have people coming from 11 different countries outside the UK, can’t wait!

10th September, Slovenia – ICMC 2012

Then I’m off to give a paper on Live notation at the International Computer Music Conference with Hester Reeve.   Looking forward to hanging out in Ljubljana, hope to spend some time in the kiberpapa while I’m there (Sunday-Thursday).

16th September, Germany – Documenta festival

This isn’t 100% confirmed, but the book Speaking Code will be launched at Documenta festival, and while I can’t be there, I will still be live coding there.  More on this once it’s done..

17th September, Goldsmiths – Graduation

Although I was done with this back in November 2011, this is the final step where I get to wear the stupid clothes.  Hoo.

25th September, Leeds – Psychogeography Pecha Kucha

I’ll be trying to argue for computer programming being a form of psychogeography in 20 slides over 6.66 minutes. Drop me a line if you’re interested and I’ll pass on the room info once I know..  The event is organised by Tina Richardson.

29th September, Sheffield – Do It Thissen

Happy to be performing in the exhibition about post-punk Sheffield, I’ll be somehow re-interpreting a wall of 7″ record sleeve cover art.  Neil Webb and Ron Wright will be playing too, and Sensoria will be launching their musical map. Register here for a free beer!

SmoothDirt programme notes

by Alex on June 21, 2012

I’m doing a few solo performances over the next days, in Cambridge, Uxbridge and Birmingbridge.  Here’s the programme notes/rationale;

Yaxu – SmoothDirt

From a linear perspective of time, live coding will always be somewhat distant from human experience.  As computer programming is a fundamentally indirect manipulation of sound, is live coding really live?  If we consider the flow of time from past to future, the time necessary to modify an algorithm acts as an impenetrable barrier between coder and experience.  An alternative perspective is to think of time in terms of cycles. From this perspective, if a coder’s actions lag behind the present moment, then they are also ahead of it.  They are inside time, the cycle of development enmeshed with rhythmic cycles of music, in mutual resonance.  Smoothdirt is a simple language built around this simple idea, allowing extremes of repetition at multiple scales to be explored as musical performance.

Yaxu will produce broken techno from his laptop for around twenty minutes.