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.
And since Genuary is about generative work, I thought I’d share some other images generated by the code. All were created using logical operations on the individual bits of the numbers 0-255.
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()