MUMT 618: Computational Modeling of Musical Acoustic Systems [course page]
Winter 2012 :: Final Project
Hannah Robertson [home page]

Modeling the penny-whistle in STK


Jump to:
[ Introduction ] [ Implementation ] [ Challenges ] [ Future work ] [ Resources ] [ Bibliography ]


This project involved implementing a waveguide model of the penny-whistle in STK, with a focus on the tone holes. The penny-whistle model contains six three-port dynamic tone holes and seven delaylines, and player control parameters that change the state (openness) of each individual hole, the placement of each hole on the instrument, and the speed of finger motion when changing hole state.

The tone holes are the main focus for two reasons. First, the relative placement of tone holes along an instrument body greatly influences the intonation of each note of the instrument. Unlike keyed flutes or other woodwinds with more tone holes and register vents than fingers, and therefore more open-shut hole configurations so more cross-fingering opportunities, the penny-whistle has just six holes, so the placement of each hole is especially critical to the intonation of each possible note. Second, much of the ornamentation and musical expressivity of the penny-whistle is based on finger ornamentation, which involves varying speeds of finger movement adjusting the openness of each hole to create interesting effects.

Try it for yourself: [ Code and usage ]



As described by Scavone and Smith (1997), a tone hole on the body of a cylindrical instrument can be modeled as a distributed three-port junction, with both fixed and variable components (Figure 1).

Figure 1: Distributed three-port scattering junction (Scavone and Smith 1997).

A cylindrical tube with multiple tone holes can be modeled by connecting successive segments, as in Figure 2, where each tone hole junction is a three-port scattering junction.

Figure 2: Multi-tone hole system (Bartsch 2000).

This penny-whistle model is a modification of the pre-existing STK BlowHole class, which is a basic clarinet model with one tone hole and one register hole. The end reflection filter in Figure 2 is just a basic one-pole lowpass filter; the emboucher junction is a combination of breath pressure and a reedtable lookup function; while a more realistic edgetone-based sound production mechanism would be optimal, it was beyond the scope of this project.

By properties of linearity and time-invariance, the delayline pairs associated with each of the six tone hole junctions (as in Figure 2), were collapsed into single delaylines. This is best illustrated by comparing the dual-delayline implementation of plane-wave propagation in a cylindrical tube, as in Figure 3, with the single, simplified-delayline implementation of Figure 4. In these two figures, RL(z) represents a lumped reflectance filter. In this model it is replaced by the three-port scattering junction discussed above, which introduces additional feedback and feedforward terms into the delaylines but doesn't negate the effectiveness of the single delayline implementation.

Figure 3: Plane-wave propagation in a cylindrical tube, two-delayline implementation (Scavone: Course notes MUMT618).

Figure 4: Plane-wave propagation in a cylindrical tube, simplified single-delayline implementation (Scavone: Course notes MUMT618).


Several factors affect the resonant frequencies and therefore intonation of the penny-whistle; in this model, adjustable parameters include tone hole spacing along the instrument body, size of each tone hole, and effective "height" of each tone hole (based in part on the tube thickness of the instrument body) (Hopkin 1992). Other adjustable parameters include the initial length of the cylindrical body (in terms of lowest frequency) and the bore radius of the body. The distance between each tone hole can be modified through the command-line, and two general body sizes (high whistle and low whistle) can be set by command-line; other parameters must be adjusted within the header and sources files, and are clearly marked.

In addition to the instrument construction variables, a function was added to set the openness of each tone hole individually, and a function to change the speed at which the hole state changes, which mimics the speed at which a finger opens or closes the holes. This means that when a hole state is changed, the change is governed by an openness 'envelope' rather than by a binary 'open' vs. 'closed' state, and so happens gradually, at whatever speed was set by the user. This allows a user to make stylistic choices about switching between two notes; fast finger speed for crisp note changes, and slower fingerspeeds to allow ornamentaiton such as slides.

While the current model contains 6 tone holes (and therefore 6 + 1 = 7 delaylines for the instrument body), a single variable in the main header file allows for any number of holes to be included (all 24-fingered aerophone players, rejoice!).

[ Top ]


The biggest technical challenge for this project was figuring out how to properly juggle multiple tone hole junctions (and their associated delaylines) in a clean, accurate, and easily extensible way. After a failed attempt to extend the single, simplified delayline implementation of the stk::BlowHole class, an attempt was made to start from scratch with the dual-delayline method --- one each for the positive and negative direction along the instrument. This failed for the same reason the earlier attempt did: the direct feed-forward components of the tone hole junctions had been missed, meaning that the input to each delayline was incomplete. Once this was pointed out (thanks, Prof. Scavone!), the simplified single-delayline method was fixed. This was chosen over the dual-delayline aproach for extensibility, because it enables the addition of extra holes without first reordering existing lines.

Another main challenge involved figuring out how best to program note changes. Many of the instruments in STK (including woodwind instruments Flute, Clarinet, and BlowHole) change notes by changing the effective length of the instrument, i.e. resetting the length of the delayline to correspond with the new frequency desired. In order to give the penny-whistle model the same hole-based inharmonicity of the real whistle, the whistle length needed to stay constant, with note changes altering the "openness" of the various holes rather than the instrument length. MIDI note numbers now correspond to each of the possible fingerings, so now affect the open/close state of each hole rather than delayline lenghts. This also mirrors how real whistles operate: because they are strongest in a single key and weak on accidentals, players that need to play in a new key simply switch whistles, rather than transposing their fingerings to play different notes on the same instrument, as musicians on orchestral-type instruments do. This means that MIDI or SKINI score files will sound in different keys if the instrument is modified, and a transposition of the score will need to take place in order to play the same score file in the same key on "different" whistles.

Intonation was another challenge; finding optimal hole placements is not a trivial exercise! Hopkin's guide to wind instrument design (1992) came in very handy for approximating hole placement; educated guesswork did the rest (as it does for many instrument-makers). Figure 5 shows the difference between actual tone hole spacing and effective-length spacing for real whistles. Because the sound production mechanism affects the sounding frequency of the penny-whistle --- blowing faster air causes the sound to jump up an octave --- the current preset whistle sizes "cheat" by setting the intial length of the whistle to twice its true length, so that the sounding notes are tuned to be the lower octave of the intended whistles. This means that the high whistle (preset "-w 0") is actually the higher octave of the low whistle, and the low whistle (preset "-w 1") is actually the higher octave of a whistle twice the size of an actual low whistle. Presumably, adjusting the breath input would alter this, but the breath control aspect and sound production mechanism was beyond the scope of this project.

Figure 5: Effective tube lengths in relation to actual lengths (Hopkin 1992).

Smaller challenges included allowing the hole position ratio to be modified from the command-line (in the play_whistle.cpp file); gradually incrementing the hole state from open to close or vice versa, rather than setting it at strictly 0 or 1, and allowing the player to choose the speed at which that happens; and determining respectably-in-tune hole placement settings for the two built-in whistles.

[ Top ]

Future work

Future improvements to the model include: Improvements to the interface include: [ Top ]



Jump to:
[ Introduction ] [ Implementation ] [ Challenges ] [ Future work ] [ Resources ] [ Bibliography ]