She Was A Visitor

“She Was A Visitor” is a vocal piece written by Robert Ashley in 1967. It is based completely on speech and is performed by one single speaker and number of singers that are divided in chorus groups. This recreation is an attempt to model the chorus digitally using Max and Gen, allowing a computer to perform the piece on its own or interactively. It was done for a course at the TU Berlin Electronic Studio and was performed by Sebastian Arnold using the 12 speaker multichannel system.


Looking at the score of “She Was A Visitor”, one will instantly recognize the algorithmic form that the piece is given in. The instrumentation consists of a speaker and a vocal chorus, with each performer following a dedicated instruction that does not change for the duration of the performance. The speaker repeats the phrase “she was a visitor” periodically and without variation. The chorus (which may include the audience) is divided into chorus groups of equal size, each following one leader. Each leader periodically chooses a single phoneme that he or she can hear from the speaker’s voice (e.g. “sh”) and sustains it for one breath. The corresponding chorus group reflects the choice of the leader by sustaining the same phoneme in their individual voice-pitch level. The piece ends when the speaker decides to stop repeating the phrase. The result of the described process is a “cloud of sound” that seems completely unrelated to the sound of speech.

The 1967 score represents an early idea of what is known today as granular synthesis: small pieces of sound (so-called grains) are sampled and layered on top of each other, with slight variation of speed, volume, phase and frequency in the playback. The main idea of this recreation is to adopt the score for a computer performance while maintaining the simplistic setting of singers sustaining phonemes. However, the resulting sound may open up new vistas, depending on the parameters that can be controlled by the performer.


Speaker: The speaker is implemented as a sample buffer~ which, when activated, is being played back in a loop by a groove~ object. The playback cursor position is available to all choir groups to mirror the auditive communication between the vocalists. The buffer can be loaded with any WAV file from hard disk or the user can record his own voice via the audio input. Files of differing sample rates are resampled on the fly. The output of the speaker can be mapped to any audio output on the interface.

Chorus Group: Chorus groups are modeled in a bpatcher abstraction. That way, it is possible to instantiate multiple groups (up to 8) on demand using the +/− buttons. Each group consists of one leader and an adjustable number of singers (1–16, default 5) utilizing the poly~ object. By choosing the corresponding audio outputs, it is possible to distribute the groups over a multi channel playback system. Each group offers interactive controls for the choose action, on/off switch and a speed slider that controls the grain size of the singers. For visual feedback, the audible output of the singers is displayed in a real-time spectrogram.

Leader: The leader is triggered by a choose action. When activated, the current playback cursor position is set as reference point for the granular synthesis of the singers’ sustain. The phoneme at this position is then played back for the length of one breath and the chorus group is activated.

Singer: The core of this recreation is the singer model. For a given cursor position, a loop envelope with adjustable size is played back repeatedly. To avoid clicks, the envelope includes a fade length of 10 samples. Note that in the current version, there is no overlap between the periods. The envelope is generated in a gen~ patcher, which runs at sample rate and accesses the buffer with cubic spline interpolation. Each singer is randomly initialized with different parameters for grain size and playback speed to introduce variation between the voices.
The breath simulation is implemented using a curve~ envelope with randomized parameters. Each singer fades in with an exponential and out with a logarithmic volume curve and adopts the position chosen by the leader for the whole period. Because of differing parameters between the voices, the singers distribute their voices over time and newly chosen phonemes will blend with sounds of the last period.


The workflow of the patch is laid out from top to bottom. After configuration, the user starts by loading or recording a speaker sound into the playback box. By hitting play, the sound is played back in a loop. Each chorus group can now “grab” a moment of time by clicking choose and will slowly start to sustain the chosen position of the speaker loop. Using the size fader, the user can tweak the chorus. All controls habe MIDI and keyboard mappings available. The parameter values reach from very long grain sizes, where the repeating sounds can be recognized, up into the audio range, where completely new waveforms emerge out of the material. If he or she wants to follow the score, the user can stop the speaker at a given point and turn off the chorus groups. While the speaker will stop after the currently running loop, the singers will decay for a moment until the patch is silent again.


For a demo, you can listen to this recording on SoundCloud:
A standalone application (Win32 and OSX) and more documentation can be downloaded at

The project is implemented in pure Max 6 and Gen.

More Links

Explore More

Subscribe to the Cycling ’74 Weekly Newsletter

Let us tell you about notable Max projects, obscure facts, and creative media artists of all kinds.

* indicates required