Vuorovesi Trio Performs Worldlines

Excerpt of the Worldlines score showing black music notation on a white background

The Vurorovesi Trio will perform my composition Worldlines on Monday, January 12 at 7pm in the Moore Gallery in Bryce Main on the campus of the University of Alabama. The Vuorovesi Trio is made up of University of Alabama School of Music faculty members Diane Boyd Schultz, Mary Lindsey Bailey, Osiris J. Molina.

Monday, January 12, 2026 7:00pm
Vuorovesi Trio
Moore Gallery in Bryce Main
University of Alabama
Tuscaloosa AL

Like many of my scores, the musicians performing Worldlines determine the moment-to-moment shape of the music. In this case, all of the musicians share the same written material and use hand-signals to determine how they navigate through it. One hand signal may cue players to repeat their current phrase, while another may cause them to read backwards through the score. A worldline is a tool from physics which describes an object’s path in both three-dimensional space and in time.

Worldlines is scored for 3 or more sustaining instruments. I love how well it fits the wind trio format and Vuorovesi, in particular. Here’s a video from Vuorovesi’s April 2025 performance at the Alabama School of Fine Arts.

YouTube player

Genuary 5

Write “Genuary”. Avoid using a font.

I made these letters using the loop drawing algorithm I created for my Loop Line Logics series of plots. The Processing function code is below.

void hhAdjustaLoop(float x, float y, float loopWidth, float loopHeight, float loopLean, float loopEnd) {
  /* draws adjustable loops
   * extra curves added to start and end points to smooth out transitions
   */

  float loopCenter = 0.5 * loopEnd; //calculate center position for the loop proportional to the end point

  //derive anchor and control points - this keeps c1c2 and c3c1 always in the middle
  //in order keep straight lines between control points and prevent kinks
  //curve1
  PVector c1a1 = new PVector(0, 0);
  PVector c1c1 = new PVector(0, 0);
  PVector c1c2 = new PVector(loopCenter, 0);
  //the next PVectors are all assigned dynamically based on loopHeight value
  PVector c1a2 = new PVector(0, 0); //declare a new PVector

  //curve2
  PVector c2c1 = new PVector(0, 0); //declare a new PVector
  PVector c2c2 = new PVector(0, 0); //declare a new PVector
  PVector c2a2 = new PVector(0, 0); //declare a new PVector
  if (loopHeight > 0) {
    c1a2.set(loopCenter+loopWidth+(loopLean*1.0), loopHeight*0.5-(loopLean*0.5));
    c2c1.set(loopCenter+(loopWidth*2.0)+(loopLean*2.0), loopHeight-(loopLean*1.0));
    c2c2.set(loopCenter-(loopWidth*2.0)+(loopLean*2.0), loopHeight+(loopLean*1.0));
    c2a2.set(loopCenter-loopWidth+(loopLean*1.0), loopHeight*0.5+(loopLean*0.5));
  } else {
    c1a2.set(loopCenter+loopWidth+(loopLean*1.0), loopHeight*0.5+(loopLean*0.5));
    c2c1.set(loopCenter+(loopWidth*2.0)+(loopLean*2.0), loopHeight+(loopLean*1.0));
    c2c2.set(loopCenter-(loopWidth*2.0)+(loopLean*2.0), loopHeight-(loopLean*1.0));
    c2a2.set(loopCenter-loopWidth+(loopLean*1.0), loopHeight*0.5-(loopLean*0.5));
  }

  //curve3
  //PVector c3c1 = new PVector(loopCenter-loopWidth+(loopLean*1.0), (loopHeight*0.5)+(loopLean*0.5));
  PVector c3c1 = new PVector(loopCenter, 0);
  PVector c3c2 = new PVector(loopEnd, 0);
  PVector c3a2 = new PVector(loopEnd, 0);

  pushMatrix();
  translate(x, y); //move to starting point
  beginShape();
  vertex(c1a1.x, c1a1.y); //first point
  bezierVertex(c1c1.x, c1c1.y, c1c2.x, c1c2.y, c1a2.x, c1a2.y); //transition from start to center curve
  bezierVertex(c2c1.x, c2c1.y, c2c2.x, c2c2.y, c2a2.x, c2a2.y); //center curve
  bezierVertex(c3c1.x, c3c1.y, c3c2.x, c3c2.y, c3a2.x, c3a2.y); //transition from center curve to end
  endShape();
  popMatrix();
} //end hhAdjustaLoop()