Skip to content

Numula tips

David Anderson edited this page Jul 21, 2026 · 10 revisions

Using Numula to create a rendition that approximates a human performance (or has a similar level of complexity) can take considerable thought, work, and time. Here are some suggestions.

Maintain a mental model

Start with a clear idea of how you want the piece to sound. Perhaps you already have this. Try listening to multiple recordings to get ideas.

It may be useful to diagram your mental model on a paper copy of the score, away from your computer.

Approximating your mental model using Numula is an iterative process. At any given point you'll have

  1. The mental model
  2. The current Numula output

The mental model may change over time; the important thing is to maintain it in your mind. Avoid the mode in which you lose track of the mental model and just fiddle around with the Numula version.

Structuring nuance specifications

Use layers (but not too many)

It can be useful to factor nuance into separate pieces; this makes it easier to adjust things. For example, you could factor timing control into

  1. Tempo fluctuation at the phrase level (8+ measures)
  2. Tempo fluctuation at the scale of a measure or less
  3. Pauses, e.g. between phrases

... and specify each of these in a separate PFT.

The goal is that when you want to change something, it's clear which layer is involved. Each nuance should have a logical place. Avoid combining conceptually different nuances into one specification (e.g. combining 1-measure swells with an 8-measure crescendo).

Try to avoid situations where one layer bleeds into another. For example, if you use too many little pauses, they can add up to a tempo change.

You might use a similar structure for volume control:

  1. Long-term fluctuation
  2. Short-term fluctuation
  3. Accents

You may, depending on the piece, want these to apply only to a subset of the notes - for example, to have separate short-term dynamics for the LH and RH notes in a piano piece. There are two ways to do this:

  1. Define the LH and RH each as a separate Score. Apply the relevant dynamic changes to each, then combine them into a single Score.
  2. Tag the LH and RH notes, and use selector functions.

For pedaling and articulation, you can use

... as needed.

Work strategy

Adding complex nuance to a complex piece can be daunting, and it's easy to become paralyzed. Here are some ways to avoid this:

  1. Work on one small part of the piece at a time - say, the first measure or phrase. Use Score.trim() so that only that part of the piece plays.
  2. Work on one voice at a time - say, the RH. Play only this voice if that's helpful.
  3. Work on one nuance layer at a time. For example, if you're working on dynamics, disable timing control and set the tempo to a reasonable average value.

It's important to minimize clicks in the work cycle:

  1. Press Fn-F5 to play the current piece. (this brings the Idle shell window to the front - is there a way to prevent this?)
  2. If you want to hear it again, click the play button in Pianoteq.
  3. Click on the Idle source window to bring your program to the front.
  4. Make the change you want.
  5. Repeat

In an ideal world, we'd have a GUI for Numula, and the work cycle would be much more intuitive and streamlined.

Also, check out interactive parameter adjustment.

Computational efficiency

Modern computers are fast, so efficiency is not normally an issue. But if the time to run a Numula program becomes excessive:

  • It's more efficient to do lots of adjustments using a PFT rather than function calls. When you apply a PFT (say, with tempo_adjust_pft()), Numula scans the score until it reaches the start time of the PFT; then it traverses the score and the PFT in parallel. A nuance function, e.g. pause_after(), scans the score until it reaches the time of the pause, then adjusts the start times of all the subsequent notes. If the score has lots of notes and you use lots of nuance functions, it's possible that performance could become an issue.

  • It may help to apply nuance separate sections of a score, then combine them (as described above).

Clone this wiki locally