[Haskell-cafe] Livecoding music in Haskell

alex alex at slab.org
Tue Nov 7 16:32:11 EST 2006


On Tue, 2006-11-07 at 14:29 +0100, Henning Thielemann wrote:
> I also tried to create some music with the SuperCollider wrapper by Rohan
> Drape and the Haskore music package.

That's great, I have used the OSC part of the wrapper but not the rest,
and haven't looked at Haskore yet but have some time tonight and
tomorrow for that...  I would like to hear more about how you got them
to work together though.

> However I had problems with accurate timing. How do you do the timing?

The way I see it there are two big issues - the first is drift and the
second is latency.

A drift error would be something like running at 120.2 bpm instead of
120 bpm.  This isn't a problem until you try playing with other people.
To fix it you have to avoid accumulating errors.  I take a note of the
time at the start of the program (or the last bpm change), then perform
calculations based on what time it *should* be as an offset from that.
The first time measurement you take is the only one you should keep.

Latency I deal with by calculating everything a second or so ahead of
time, and timestamping my OSC packets with times in the future.  Then on
the other side I have some scheduling stuff to trigger sounds at the
right moment, for example in SuperCollider's sclang:

  response = { 
    arg time, responder, message; 
    if (message[1] == 'on',
      {
        SystemClock.sched(time - Date.getDate.rawSeconds,
          {Synth("noisebox",
                 [\lgain,    message[2] / 100,
                  \rgain,    message[3] / 100,
                  \ts,       message[4] / 100,
                  \browndel, message[5] / 100,
                  \filter,   message[6],
                  \envtype,  message[7]
                 ]
                ); nil;
          };
        );
      });
    };
    o = OSCresponder(nil, '/noise', response);
    o.add;

However, as is quite obvious from that screencast, I haven't quite got
around to timestamping Haskell OSC packets yet, I wanted to hear the
latency.  To timestamp a packet you just have to put it in a timestamped
bundle though.

I hope that's useful, if not let me know more about your timing
problems, maybe I can still help.


alex




More information about the Haskell-Cafe mailing list