Overview of the athenaCL System

The athenaCL system is a software tool for creating musical structures. Music is rendered as a polyphonic event list, or an EventSequence object. This EventSequence can be converted into diverse forms, or OutputFormats, including scores for the Csound synthesis language, Musical Instrument Digital Interface (MIDI) files, and other specialized formats. Within athenaCL, Orchestra and Instrument models provide control of and integration with diverse OutputFormats. Orchestra models may include complete specification, at the code level, of external sound sources that are created in the process of OutputFormat generation.

The athenaCL system features specialized objects for creating and manipulating pitch structures, including the Pitch, the Multiset (a collection of Pitches), and the Path (a collection of Multisets). Paths define reusable pitch groups. When used as a compositional resource, a Path is interpreted by a Texture object (described below).

The athenaCL system features three levels of algorithmic design. The first two levels are provided by the ParameterObject and the Texture. The ParameterObject is a model of a low-level one-dimensional parameter generator and transformer. The Texture is a model of a multi-dimensional generative musical part. A Texture is controlled and configured by numerous embedded ParameterObjects. Each ParameterObject is assigned to either event parameters, such as amplitude and rhythm, or Texture configuration parameters. The Texture interprets ParameterObject values to create EventSequences. The number of ParameterObjects in a Texture, as well as their function and interaction, is determined by the Texture's parent type (TextureModule) and Instrument model. Each Texture is an instance of a TextureModule. TextureModules encode diverse approaches to multi-dimensional algorithmic generation. The TextureModule manages the deployment and interaction of lower level ParameterObjects, as well as linear or non-linear event generation. Specialized TextureModules may be designed to create a wide variety of musical structures.

The third layer of algorithmic design is provided by the Clone, a model of the multi-dimensional transformative part. The Clone transforms EventSequences generated by a Texture. Similar to Textures, Clones are controlled and configured by numerous embedded ParameterObjects.

Each Texture and Clone creates a collection of Events. Each Event is a rich data representation that includes detailed timing, pitch, rhythm, and parameter data. Events are stored in EventSequence objects. The collection all Texture and Clone EventSequences is the complete output of athenaCL. These EventSequences are transformed into various OutputFormats for compositional deployment.

For general information on computer aided algorithmic composition and generative music systems, see the resources listed here and in (Ariza [AN#969], [AN#1940]).

The athenaCL system has been under development since June 2000. The software is cross platform, developed under an open-source license, and programmed in the Python language. An interactive command-line interface provides an easy-to-use environment for beginners and a quick reference for advanced users. The complete functionality of the system is alternatively available as a scriptable batch processor or as a programmable Python extension library.

Getting Started and Advanced Work

To learn the athenaCL system, many basic concepts of the system design and command interface must be examined in depth. The tutorials included in this document provide an overview to all essential concepts. Following the tutorials are appendices, providing documentation useful for reference. Much of this reference documentation is also available from within athenaCL.

All users should read and to gain familiarity with the interface and basic athenaCL concepts. Basic composition tools are covered in , , and . For more detailed information on organizing pitch structures, see .

Users with experience with Python and/or other generative music systems, or users who have mastered the athenaCL interactive command-line interface, will likely want to begin storing athenaCL command scripts in Python code files. This approach provides a wide range of opportunities for programmatically extending the power of athenaCL. A common approach for advanced usage of athenaCL is to use the interactive command-line interface for reference and sketching, and then store series of commands or command-generating procedures in Python files. The section provides basic examples for this approach. Additional, over 30 demonstration Python scripts are distributed with athenaCL and included in .

More Information

This document does not offer a complete description of the history, context, and internal structure of the athenaCL system; such a description, including comparative analysis to related historical and contemporary systems and detailed explanation of object models and interactions, is provided in the text An Open Design for Computer-Aided Algorithmic Music Composition: athenaCL (Ariza 2005 [AN#900]). Numerous additional articles are available that explore aspects of the athenaCL system in detail (Ariza 2002 [AN#5], 2003 [AN#425], 2004 [AN#443], 2005 [AN#613], 2006 [AN#1343], 2007 [AN#1355], 2007 [AN#1617], 2008 [AN#1824], 2009 [AN#1990]).

Conventions Used in This Manual

The following typographical conventions are used throughout this book: Constant width Used for athenaCL text output as transcribed in examples. This is what the program displays to the user. Constant width bold

Used for user text input as transcribed in examples. This is what the user enters into the program.

Production of This Manual

The first edition of the athenaCL Tutorial Manual was released in August of 2001 and covered athenaCL versions 1.0 to 1.3. The second edition was released in June 2005 and covers athenaCL versions 1.4 and beyond. The third edition was released in July 2010 and convers athenaCL versions 2.0.

This manual is constructed and maintained with the help of various open-source tools: DocBook, the Modular DocBook Stylesheet distribution, OpenJade, Python, and ImageMagick.

Software Dependencies

athenaCL produces both Csound and MIDI scores. Csound is free and runs on every platform. Download Csound here: https://csound.com/.

Quick-Start

$ cargo run --release

Installation

Run from source code directory:

$ cargo install --path . 

Then:

$ athenacl

Tutorial 1: The Interactive Command Line Interface

This tutorial provides essential information and examples for using athenaCL's interactive command-line Interpreter. This material is essential for understanding basic athenaCL operation and how to obtain help within the program.

Starting the athenaCL Interpreter

Depending on your platform, there are a number of different ways to launch the athenaCL program and start the athenaCL Interpreter. For all platforms, using athenaCL requires installing (or finding) Python 2.6 (or better) on your system. Many advanced operating systems (UNIX-based operating systems including GNU/Linux and MacOS X) ship with Python installed.

For complete instructions on installing and launching athenaCL in each platform, please see the file "README.txt" included in the athenaCL distribution and in .

After launching athenaCL, the user is presented with a text-based display in a terminal or Python-interactive window. The user is presented with the following initialization information:

Initialization information

athenaCL 2.0.0 (on darwin via terminal)
Enter "cmd" to see all commands. For help enter "?".
Enter "c" for copyright, "w" for warranty, "r" for credits.

pi{}ti{} :: 

When starting up the Interpreter, athenaCL looks in the athenaCL directory for the "libATH" folder, and then various directories within the "libATH" folder. These directories contain essential files and must be present for the program to run. The athenaCL prompt "::" is preceded by information concerning the AthenaObject. This will be explained in greater detail below.

Introduction to Commands

When using athenaCL, the user enters commands to get things done. athenaCL commands are organized by prefixes, two-letter codes that designate what the command operates upon. Prefixes are always displayed as capitalized letters, though the user, when entering commands, may use lower-case letters. Some common prefixes are "PI", for PathInstance, or "TI", for TextureInstance. What follows the prefix usually resembles UNIX shell commands: "ls" for listing objects, "rm" for removing objects. For example, the command to list all the available TextureModules is TMls: "TM" for TextureModule, "ls" for list. When no common UNIX command-abbreviation is available, intuitive short abbreviations are used. For example, the command to create the retrograde of a PathInstance is PIret: "PI" for PathInstance, "ret" for retrograde.

The division of commands into prefixes demonstrates, in part, the large-scale design of the AthenaObject. The AthenaObject consists of PathInstances and TextureInstances. PathInstances are objects that define pitch materials. TextureInstances define algorithmic music layers. Users can create, copy, edit and store collections of Paths and Textures within the AthenaObject. All Texture related commands, for example, start with a "T", like TextureTemperament ("TT"), TextureClone("TC") and TextureModule ("TM").

In addition to the commands available for working with Paths and Textures, there are commands for creating various event list formats (such as Csound scores and MIDI files) with the EventList commands (prefix "EL"). The complete AthenaObject, with all its Paths and Textures, is handled with AthenaObject commands (prefix "AO"). These commands are used to save and control the complete collection of Paths and Textures.

Viewing Command Names

When starting athenaCL, the user is presented with a prompt (::). To display a listing of all commands enter "cmd", for command:

Listing all commands

pi{y0}ti{a2} :: cmd
athenaCL Commands:
................................................................................
PathInstance        PIn(new)            PIcp(copy)          PIrm(remove)
                    PIo(select)         PIv(view)           PIe(edit)           
                    PIdf(duration)      PIls(list)          PIh(hear)           
                    PIret(retro)        PIrot(rot)          PIslc(slice)        
................................................................................
TextureModule       TMo(select)         TMv(view)           TMls(list)
TextureParameter    TPls(list)          TPv(select)         TPmap(map)          
                    TPe(export)         
TextureInstance     TIn(new)            TIcp(copy)          TIrm(remove)        
                    TIo(select)         TIv(view)           TIe(edit)           
                    TIls(list)          TImode(mode)        TImute(mute)        
                    TIdoc(doc)          TImap(map)          TImidi(midi)        
TextureClone        TCn(new)            TCcp(copy)          TCrm(remove)        
                    TCo(select)         TCv(view)           TCe(edit)           
                    TCls(list)          TCmute(mute)        TCmap(map)          
TextureTemperament  TTls(list)          TTo(select)         
TextureEnsemble     TEv(view)           TEe(edit)           TEmap(map)          
                    TEmidi(midi)        
................................................................................
EventOutput         EOls(list)          EOo(select)         EOrm(remove)
EventMode           EMls(list)          EMo(select)         EMv(view)           
                    EMi(inst)           
EventList           ELn(new)            ELw(save)           ELv(view)           
                    ELh(hear)           ELr(render)         ELauto(auto)        
................................................................................
AthenaPreferences   APdir(directory)    APea(external)      APa(audio)
                    APgfx(graphics)     APcurs(cursor)      APr(refresh)
                    APwid(width)        
AthenaHistory       AHls(list)          AHexe(execute)      
AthenaUtility       AUsys(system)       AUdoc(docs)         AUup(update)        
                    AUbeat(beat)        AUpc(pitch)         AUmg(markov)        
                    AUma(markov)        AUca(automata)      
AthenaObject        AOw(save)           AOl(load)           AOmg(merge)         
                    AOrm(remove)  

This display, organized by prefix heading, shows each command followed by a longer description of the commands name.

Executing Commands

To use a command, simply enter its name. The user will be prompted for all additional information. For example, type "PIn" (or "pin") at the athenaCL prompt:

Entering a command

pi{}ti{} :: pin
name this PathInstance: a
enter a pitch set, sieve, spectrum, or set-class: b,c#,g
      SC 3-8B as (B4,C#4,G4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): n
PI a added to PathInstances.

This command prompts the user for a "pitch set, sieve, spectrum, or set-class" and then creates a multiset component of a Path. A Xenakis sieve (Xenakis 1990 [AN#327], 1992 [AN#60]; Ariza 2004 [AN#443], 2005 [AN#613], 2009 [AN#1990]) can be entered using a logical string and a pitch range. Set class labels are given using Forte names. The user may enter the chord itself as pitch-names (with sharps as "#" and flats as "$") or pitch-classes (integers that represent the notes of the chromatic scale) (Straus 1990 [AN#34]). For instance, the chord D-major can be represented with the following pitch-name string: (D, F#, A). Or, the same chord can be represented as a pitch class set: (2,6,9), where 0 is always C, 1=C#, 2=D, …, 10=A#, and 11=B. Calling the PIn command to create a new path named "b" with this pitch class set gives us the following results:

Entering a command with arguments

pi{a}ti{} :: pin b d,f#,a
PI b added to PathInstances.

Notice that in the above example the Path name and pitch collection arguments are entered at the same time as the command: "pin b d,f#,a". As an interactive command-line program, athenaCL can obtain arguments from the user, and can, alternatively, accept space-separated arguments following a command. Command-line arguments allow advanced users ease and speed and, when called from an external environment (such as a UNIX shell or Python script), permit advanced scripting automation. All athenaCL commands can function both with arguments and with interactive prompts. Command-line arguments, however, are never required: if arguments are absent, the user is prompted for the necessary details.

Getting Help for Commands

athenaCL provides two ways of helping the user access and learn commands. If the user only remembers the prefix of a command, this prefix can be entered at the prompt to produce a list of all commands associated with that prefix:

Displaying a command listing

pi{b}ti{} :: pi
PI (PathInstance) commands:
   PIn              new      
   PIcp             copy     
   PIrm             remove   
   PIo              select   
   PIv              view     
   PIe              edit     
   PIdf             duration 
   PIls             list     
   PIh              hear     
   PIret            retro    
   PIrot            rot      
   PIslc            slice 

Help information is available for each command and can be accessed from the athenaCL prompt by typing either "?" or "help" followed by the name of the command. The following example provides the documentation for the PIn command. Notice that the main documentation is followed by "usage" documentation, or the format required for providing command-line arguments:

Using the help command

pi{b}ti{} :: help pin
{topic,documentation}
PIn                 PIn: PathInstance: New: Create a new Path from user-
                    specified pitch groups. Users may specify pitch groups in a
                    variety of formats. A Forte set class number (6-23A), a
                    pitch-class set (4,3,9), a pitch-space set (-3, 23.2, 14),
                    standard pitch letter names (A, C##, E~, G#), MIDI note
                    numbers (58m, 62m), frequency values (222hz, 1403hz), a
                    Xenakis sieve (5&3|11), or an Audacity frequency-analysis
                    file (import) all may be provided. Pitches may be specified
                    by letter name (psName), pitch space (psReal), pitch class,
                    MIDI note number, or frequency. Pitch letter names may be
                    specified as follows: a sharp is represented as "#"; a flat
                    is represented as "$"; a quarter sharp is represented as
                    "~"; multiple sharps, quarter sharps, and flats are valid.
                    Octave numbers (where middle-C is C4) can be used with pitch
                    letter names to provide register. Pitch space values (as
                    well as pitch class) place C4 at 0.0. MIDI note numbers
                    place C4 at 60. Numerical representations may encode
                    microtones with additional decimal places. MIDI note-numbers
                    and frequency values must contain the appropriate unit as a
                    string ("m" or "hz"). Xenakis sieves are entered using logic
                    constructions of residual classes. Residual classes are
                    specified by a modulus and shift, where modulus 3 at shift 1
                    is notated 3@1. Logical operations are notated with "&"
                    (and), "|" (or), "^" (symmetric difference), and "-"
                    (complementation). Residual classes and logical operators
                    may be nested and grouped by use of braces ({}).
                    Complementation can be applied to a single residual class or
                    a group of residual classes. For example:
                    -{7@0|{-5@2&-4@3}}. When entering a sieve as a pitch set,
                    the logic string may be followed by two comma-separated
                    pitch notations for register bounds. For example "3@2|4, c1,
                    c4" will take the sieve between c1 and c4. Audacity
                    frequency-analysis files can be produced with the cross-
                    platform open-source audio editor Audacity. In Audacity,
                    under menu View, select Plot Spectrum, configure, and
                    export. The file must have a .txt extension. To use the
                    file-browser, enter "import"; to select the file from the
                    prompt, enter the complete file path, optionally followed by
                    a comma and the number of ranked pitches to read.
usage:              pin name set1 ... setN

The same help command can be used to access information concerning additional topics, notations, and representations used within athenaCL. For example, information about Markov transition strings can be accessed with the same help command:

Accessing additional help topics

pi{b}ti{} :: ? markov
{topic,documentation}
Markov Notation     Markov transition strings are entered using symbolic
                    definitions and incomplete n-order weight specifications.
                    The complete transition string consists of two parts: symbol
                    definition and weights. Symbols are defined with alphabetic
                    variable names, such as "a" or "b"; symbols may be numbers,
                    strings, or other objects. Key and value pairs are notated
                    as such: name{symbol}. Weights may be give in integers or
                    floating point values. All transitions not specified are
                    assumed to have equal weights. Weights are specified with
                    key and value pairs notated as such: transition{name=weight
                    | name=weight}. The ":" character is used as the zero-order
                    weight key. Higher order weight keys are specified using the
                    defined variable names separated by ":" characters. Weight
                    values are given with the variable name followed by an "="
                    and the desired weight. Multiple weights are separated by
                    the "|" character. All weights not specified, within a
                    defined transition, are assumed to be zero. For example, the
                    following string defines three variable names for the values
                    .2, 5, and 8 and provides a zero order weight for b at 50%,
                    a at 25%, and c at 25%: a{.2}b{5}c{8} :{a=1|b=2|c=1}.
                    N-order weights can be included in a transition string.
                    Thus, the following string adds first and second order
                    weights to the same symbol definitions: a{.2}b{5}c{8}
                    :{a=1|b=2|c=1} a:{c=2|a=1} c:{b=1} a:a:{a=3|b=9}
                    c:b:{a=2|b=7|c=4}. For greater generality, weight keys may
                    employ limited single-operator regular expressions within
                    transitions. Operators permitted are "*" (to match all
                    names), "-" (to not match a single name), and "|" (to match
                    any number of names). For example, a:*:{a=3|b=9} will match
                    "a" followed by any name; a:-b:{a=3|b=9} will match "a"
                    followed by any name that is not "b"; a:b|c:{a=3|b=9} will
                    match "a" followed by either "b" or "c".

Throughout this document additional information for the reader may be recommended by suggesting the use of the help command. For example: (enter "help markov" for more information).

Configuring the User Environment

athenaCL has many configurable settings that are saved in a preference file and loaded for each athenaCL session. Some of these settings have default values; others will need to be configured the first time a command is used.

For example, following the athenaCL prompt ("::") is the the athenaCL "cursor tool." This tool, providing information on the active Texture and Path, can be turned on or off with the command APcurs, for AthenaPreferences cursor:

Toggling the athenaCL cursor tool with APcurs

pi{b}ti{} :: apcurs
cursor tool set to off.

:: apcurs
cursor tool set to on.

pi{b}ti{} :: 

athenaCL writes files. Some of these files are audio file formats, some are event list formats (scores, MIDI files), and some are image files. In most cases, athenaCL will write a file in a user specified "scratch" directory with an automatically-generated file name. This is convenient and fast. To set the scratch directory, enter the APdir command, for AthenaPreferences directory. (Replace "/Volumes/xdisc/_scratch" with a complete file path to a suitable directory.)

Setting the scratch directory with APdir

pi{b}ti{} :: apdir
select directory to set: scratch or audio. (x or a): x
/Users/ariza/_x/src/athenaCL
................................................................................
.cvsignore      .DS_Store       __init__.py     __init__.pyc    __init__.pyo    
athenacl.py     athenacl.pyc    athenaObj.py    athenaObj.pyc   athenaObj.pyo   
CVS             demo            docs            libATH          setup.py        
tools     
select a scratch directory:
to change directory enter name, path, or ".."
cancel or select? (c or s): /Volumes/xdisc/_scratch
/Volumes/xdisc/_scratch
................................................................................
.DS_Store       a.mid           
select a scratch directory:
to change directory enter name, path, or ".."
cancel or select? (c or s): s
user scratch directory set to /Volumes/xdisc/_scratch.

The command PIh, for PathInstance hear, allows the creation of a MIDI file from a single Path specification. In this case, athenaCL writes the MIDI file in the user-specified scratch directory. After the file is written, athenaCL opens the file with the operating system. Depending on how the operating system is configured, the MIDI file should open in an appropriate player. The athenaCL system frequently works in this manner with the operating system and external programs and resources.

Creating a MIDI file with PIh

pi{b}ti{} :: pih
command.py: temporary file: /Volumes/xdisc/_scratch/ath2010.07.01.16.12.52.xml 
PI b hear with TM LineGroove complete.
(/Volumes/xdisc/_scratch/ath2010.07.01.16.12.52.mid)

Numerous types of graphical aids are provided by athenaCL to assist in the representation of musical materials. Depending on the user's Python installation, numerous formats of graphic files are available. Formats include text (within the Interpreter display), Encapsulated PostScript (convertible to PDF), Tk GUI Windows, JPEG, and PNG. Tk requires the Python TkInter GUI installation; JPEG and PNG require the Python Imaging Library (PIL) installation.

The user can set an active graphic format with the APgfx command. For example:

Setting the active graphics format with APgfx

pi{b}ti{} :: apgfx
active graphics format: png.
select text, eps, tk, jpg, png. (t, e, k, j, or p): p
graphics format changed to png.

To test the production of graphic output, the TPmap command, for TextureParameter map, can be used:

Producing a graphical diagram with TPmap

pi{b}ti{} :: tpmap 100 ru
randomUniform, (constant, 0), (constant, 1)
TPmap display complete.

Tutorial 2: AthenaObjects and EventModes

This tutorial provides essential information concerning saving and opening an athenaCL session, as well as basic information for creating and configuring EventLists and EventModes.

Introduction to AthenaObjects

The AthenaObject stores the collection of user-created PathInstances and TextureInstances, as well as the names of the active objects and other settings relevant to the active athenaCL session (and not stored in the user preference file). The AthenaObject, when saved, is stored as an XML file. When athenaCL creates an XML AthenaObject file, the resulting file contains the complete state of the active AthenaObject.

Loading and Removing an AthenaObject

The command AOl, for AthenaObject load, permits the user to load an AthenaObject XML file. Numerous small demonstration files are included within athenaCL. In the following example, the user loads the file "demo01.xml".

The following display demonstrates use of the text-based file-dialogs. When using the text-based interface, the user must select a directory before selecting a file. In the example below, the user enters "demo" to enter the "demo" directory in the athenaCL directory. The user then enter "s" to select this directory. Next, the user has the option the select a file from this directory, change the directory, or cancel. The user chooses to select a file with "f". After entering the name of the file ("demo01.xml") and confirming, the AthenaObject is loaded:

Loading an AthenaObject with text-based file selection

pi{}ti{} :: aol
select an AthenaObject file:
name file, change directory, or cancel? (f, cd, c): cd
/Volumes/xdisc/_sync/_x/src/athenacl/athenaCL/demo/legacy
................................................................................
.svn            __init__.py     demo01.xml      demo03.xml      demo05.xml      
spectrum01.txt  tutorial02.xml  tutorial03.xml  tutorial04.xml  tutorial05.xml  
tutorial06.xml  tutorial07.xml  tutorial09.xml  
to change directory enter name, path, or ".."
cancel or select? (c or s): s
select an AthenaObject file:
name file, change directory, or cancel? (f, cd, c): f
name file? demo01.xml
      1.3.1 xml AthenaObject loaded (00:01):
/Volumes/xdisc/_sync/_x/src/athenacl/athenaCL/demo/legacy/demo01.xml

To confirm that the AthenaObject has been loaded, the user may enter TIls to display a list of all TextureInstances. (For more information concerning Textures, see ).

Listing TextureInstances with Tils

pi{y0}ti{a2} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   _space           + MonophonicOrnament x0          62  39.0--40.0   0
   a0               + MonophonicOrnament y0          50  01.0--41.0   0
   a1               + MonophonicOrnament y0          50  01.0--41.0   0
 + a2               + MonophonicOrnament y0          50  01.0--41.0   0

The entire AthenaObject can be erased and set to its initial state without restarting the athenaCL program. The following example uses AOrm, for AthenaObject remove, to re-initialize the AthenaObject. Note: the AOrm will permanently remove all objects within athenaCL and cannot be un-done.

Reinitializing the AthenaObject with AOrm

pi{y0}ti{a2} :: aorm
destroy the current AthenaObject? (y or n): y
reinitializing AthenaObject.

pi{}ti{} :: 

If the AthenaObject file is located in the athenaCL "demo" directory, or a directory from which a file was opened or saved-to by the user within the current session, athenaCL can find the file by giving the AOl command with the file's name as a command-line argument. To reload "demo01.xml", the user may enter the following arguments:

Loading an AthenaObject from the command-line

pi{}ti{} :: aol demo01.xml
      1.3.1 xml AthenaObject loaded (00:01):
/Volumes/xdisc/_sync/_x/src/athenacl/athenaCL/demo/legacy/demo01.xml

EventModes and EventOutputs

After loading a demonstration file containing TextureInstances, athenaCL can be used to create an EventList. As a poly-paradigm system with integrated instrument models, athenaCL supports numerous formats of EventLists and can work with a wide variety of sound sources, including Csound and MIDI. What types of EventLists are created depends on two settings within athenaCL: the EventMode and the EventOutput.

The EventModes configure athenaCL for working with a particular sound source and Orchestra model, such as the internal Csound orchestra (csoundNative), external Csound orchestras (csoundExternal), various types of MIDI files (generalMidi an generalMidiPercussion), and others. The EventMode determines what instruments are available for Texture creation (see , as well as the operation of some EventList commands. In some cases, the EventMode forces certain EventOutput formats to be written as well.

The EventOutputs select what file formats will be created when a new EventList is generated. athenaCL permits the user to create an EventList in numerous formats simultaneously. For example, a Csound score and orchestra, a MIDI file, and tab-delimited table can all be produced from one call to the EventList new command. Some EventOutput formats are created only if the AthenaObject contains Textures created in the appropriate EventMode. Other EventOutput formats can be created with any Texture in any EventMode. Such conflicts, however, are never a problem: athenaCL simply creates whatever EventOutput formats are appropriate based on the user-specified request.

To view the current EventMode, enter EMls. To view the current list of selected EventOutputs, enter EOls. The following example demonstrates these commands:

Viewing EventMode and EventOutputs

pi{y0}ti{a2} :: emls
EventMode modes available:
{name}
   csoundExternal      
 + csoundNative        
   csoundSilence       
   midi                
   midiPercussion      
   superColliderNative 

pi{y0}ti{a2} :: eols
EventOutput active:
{name}
   acToolbox         
   audioFile         
   csoundBatch       
 + csoundData        
   csoundOrchestra   
   csoundScore       
 + midiFile          
   pureDataArray     
   superColliderTask 
   textSpace         
   textTab           
 + xmlAthenaObject  

To select an additional EventOutput to be requested when a new EventList is created, enter the command EOo, for EventOutput select. To remove an EventOutput, enter the command EOrm, for EventOutput remove. In the following example, the user adds a tab-delimited table output ("textTab") and a specialized output file for the AC Toolbox ("acToolbox"). After viewing the EventOutput list, these EventOutputs are removed. Note: EventOutputs, like many selection in athenaCL, can be designated using automatic acronym expansion (AAE), the user providing only the leading character and capitals.

Adding and Removing EventOutputs

pi{y0}ti{a2} :: eoo tt at
EventOutput formats: midiFile, xmlAthenaObject, csoundData, textTab, acToolbox.

pi{y0}ti{a2} :: eols
EventOutput active:
{name}
 + acToolbox         
   audioFile         
   csoundBatch       
 + csoundData        
   csoundOrchestra   
   csoundScore       
 + midiFile          
   pureDataArray     
   superColliderTask 
   textSpace         
 + textTab           
 + xmlAthenaObject  

pi{y0}ti{a2} :: eorm tt at
EventOutput formats: midiFile, xmlAthenaObject, csoundData.

Creating an EventList

To create an EventList, the command ELn, for EventList new, must be used. This command generates a new EventList for each Texture and Clone, and writes necessary EventOutput formats. Each time the ELn command is called, a new musical variant (depending on Texture, Clone, and ParameterObject specification) is produced. It is possible, even likely, that two EventLists, generated from the same AthenaObject file, will not be identical. EventLists, further, are never stored within an AthenaObject. For this reason, users should be careful to save and preserve produced EventList files.

When using the ELn command alone, temporary files are created, either in a system-location, or in the scratch directory selected by the user. The user may also, optionally, name the EventList. The EventList name is given as a file name (or a complete file path) ending with an ".xml" extension. Although the ELn command may produce many files, only one file path needs to be provided: all other EventOutput format file names are derived from this source .xml file path. If EventOutput xmlAthenaObject is active, an XML AthenaObject file will be written along with whatever user-specified or EventMode-mandated EventOutput formats are created.

In the example above, the user's EventOutput format specification indicates that midiFile and xmlAthenaObject are active outputs. The current EventMode, however, is set to csoundNative, and the Textures of "demo01.xml", upon examination, were created with csoundNative instruments. For these reasons, the ELn command, in this case, will produce an .xml AthenaObject file, a Csound .csd file, a MIDI file (.mid), and a script file for processing the Csound orchestra and score (.bat). For example:

Creating a new EventList with Eln

pi{y0}ti{a2} :: eln
      EventList ath2010.07.02.13.22.35 complete:
/Volumes/xdisc/_scratch/ath2010.07.02.13.22.35.bat
/Volumes/xdisc/_scratch/ath2010.07.02.13.22.35.csd
/Volumes/xdisc/_scratch/ath2010.07.02.13.22.35.mid
/Volumes/xdisc/_scratch/ath2010.07.02.13.22.35.xml

Csound files require additional processing to hear audio from the results: this will be demonstrated below. The MIDI file, however, can be listened to immediately with any MIDI file player, such as QuickTime. To hear the file produced by ELn, enter the command ELh, for EventList hear:

Opening an EventList with Elh

pi{y0}ti{a2} :: elh
EventList hear initiated: /Volumes/xdisc/_scratch/ath2010.07.02.13.22.35.mid

Depending on operating system configuration, the ELh command should open the newly-created MIDI file in a MIDI-file player. Alternatively, the MIDI file can be opened in an application that supports MIDI files, such as a notation program or sequencer.

The ELn command, as all athenaCL commands, can be used with command-line arguments. To create an EventList in a specific directory, simply provide a complete file path following the the ELn command. (Replace "/Volumes/xdisc/_scratch/" with a complete file path to a suitable directory.)

Creating a new EventList with Eln and command-line arguments

pi{y0}ti{a2} :: eln /Volumes/xdisc/_scratch/test02.xml
      EventList test02 complete:
/Volumes/xdisc/_scratch/test02.bat
/Volumes/xdisc/_scratch/test02.csd
/Volumes/xdisc/_scratch/test02.mid
/Volumes/xdisc/_scratch/test02.xml

Using the ELh command to listen to this EventList, the user should identify that although "test01" and "test02" are closely related, each musical fragment, due to algorithmic variation, has differences.

Configuring and Using Csound

Although Csound files were created in the above examples, only the resulting MIDI files were auditioned. To produce audio files with Csound, some additional configuration may be necessary.

To create an audio file with Csound, two files are required: a score (.sco) and an orchestra (.orc); alternatively, both files can be combined into a single XML file called (within athenaCL) a csoundData file (.csd). With the csoundNative instruments and EventMode, all necessary Csound files are created by athenaCL. To activate csoundData file production, the EventOutput csoundData must be selected. Alternatively, users can create only a Csound score (with EventModes csoundExternal or csoundSilence), and apply this score to any desired external Csound orchestra.

The Csound audio rendering software must be installed separately. Csound is an open source, free, cross platform program available for all major operating systems.

Once configured properly, athenaCL provides commands to control Csound rendering. The user may be required to provide the location of (file path to) the Csound program; the location of the Csound program is set with the APea command, or Athena Preferences external applications command. Each platform has a different default Csound application specified. Unix: default position is /usr/local/bin/csound; MacOS X: default Csound is the same as Unix; Windows: users must select the Csound executable, "winsound.exe," with the APea command. The user can select a different Csound with the APea command; this selection is stored in the user preferences and is maintained between athenaCL sessions.

Assuming that the necessary Csound files were created with ELn as demonstrated above, the user may view the Csound score file created with the command ELv, or EventList view. Depending on operating system configuration, this command will open the score file with a platform-specific text reader. Alternatively, the .sco file can be manually selected and opened by the user. Whenever athenaCL creates Csound files under EventMode csoundNative, a script file (.bat) is created to automate rendering of the audio file from the Csound score and orchestra (or .csd file). The script instructs Csound to create an audio file with the same name as the score in the same directory as the score, orchestra, and batch file.

Prior to writing files with the ELn command, the desired audio file format can be specified from within athenaCL using the command APa. The user will be prompted to select a file format from the options given. Note: the user must set Csound options before executing ELn; otherwise, they will have no effect until a new EventList is created.

Changing the Csound audio file format with CPff

pi{y0}ti{a2} :: apa
select format, channels, or rate. (f,c,r): f
current audio file format: aif.
select aif, wav, or sd2. (a, w, or s): a
audio format set to 'aif'.

Assuming correct Csound installation and configuration within athenaCL, the user can enter ELr to automatically initiate Csound rendering of the last Csound score created with ELn. ELr, using the operating system, calls the athenaCL-created script. For ELr to function, and thus the ELn-created script to function, the Csound score and orchestra files (or .csd file) must remain in their original locations.

Rendering a Csound score

pi{y0}ti{a2} :: elr
audio rendering initiated: /Volumes/xdisc/_scratch/test02.bat

Alternatively, users can render Csound files created in athenaCL within any Csound application, just as they would for any other Csound score and orchestra, manually setting file Paths, file formats, and Csound option flags. See Csound documentation for more information on using Csound.

As demonstrated above with MIDI files, the user can open the Csound-rendered audio file with the ELh command. This command opens the audio file with a platform-specific media player.

Opening Csound-generated audio files with ELh

pi{y0}ti{a2} :: elh
EventList hear initiated: /Volumes/xdisc/_scratch/test02.aif
EventList hear initiated: /Volumes/xdisc/_scratch/test02.mid

To summarize, there are three athenaCL commands needed to create, render, and hear a Csound score, and they must be executed in order: ELn, ELr, ELh. To link these three commands, the user can set a automation preference with the ELauto command. When this option is toggled, the single command ELn will create an EventList, render it in Csound, and open the Csound-created audio file with a platform-specific media player.

Saving and Merging AthenaObjects

Loading a new AthenaObject will completely replace the current AthenaObject contents. For this reason, users should always save their work before loading a new AthenaObject. The user can, alternatively, merge AthenaObjects. Merging is a powerful tool: the user can combine many AthenaObjects that have been saved separately, or combine an AthenaObject numerous times with itself. In the example below, the user merges "demo01.xml", loaded above, with another of the same AthenaObject "demo01.xml". The file paths for athenaCL demonstration files are known to athenaCL, and thus the user can simply provide the name of the demonstration file as a command-line argument.

Merging AthenaObjects with AOmg

pi{y0}ti{a2} :: aomg demo01.xml
      1.3.1 xml AthenaObject merged (00:01):
/Volumes/xdisc/_sync/_x/src/athenacl/athenaCL/demo/legacy/demo01.xml

pi{y0}ti{a2} :: 

The command TIls can be used to confirm that the AthenaObjects have been merged. The AOmg command, in the case that two Paths or Textures have the same name, automatically alters the name by appending an underscore ("_"). In the case where an AthenaObject is merged with itself as in this example, each Texture and Path is duplicated.

Listing TextureInstances

pi{y0}ti{a2} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   _space           + MonophonicOrnament x0          62  39.0--40.0   0
   _space_          + MonophonicOrnament x0_         62  39.0--40.0   0
   a0               + MonophonicOrnament y0          50  01.0--41.0   0
   a0_              + MonophonicOrnament y0_         50  01.0--41.0   0
   a1               + MonophonicOrnament y0          50  01.0--41.0   0
   a1_              + MonophonicOrnament y0_         50  01.0--41.0   0
 + a2               + MonophonicOrnament y0          50  01.0--41.0   0
   a2_              + MonophonicOrnament y0_         50  01.0--41.0   0

As shown above, the user may create a new MIDI or Csound EventList of this new AthenaObject and audition the results. As should be clear, the resulting musical structure will sound more dense due to the additional Textures. Due to algorithmic variation, each Texture will remain relatively independent.

To save the current AthenaObject, the user may create an XML AthenaObject file. Although AthenaObject files may be created with the proper EventOutput selection and by use of the ELn command, in same cases the user my want to create the XML AthenaObject file alone. The command AOw, for AthenaObject Write, provides this functionality. The user must name the AthenaObject with a ".xml" extension. In the example below the user saves the merged files as a new AthenaObject named "merged.xml" using a command-line argument. If desired, the AOw command can be used without command-line arguments to select the location of the file with an interactive file dialog. (Replace "/Volumes/xdisc/_scratch/" with a complete file path to a suitable directory.)

Creating a new AthenaObject with AOw

pi{y0}ti{a2} :: aow /Volumes/xdisc/_scratch/merged.xml
      AthenaObject saved:
/Volumes/xdisc/_scratch/merged.xml

Saving your work in athenaCL is very important, and should be done often. The athenaCL system can not reconstruct an AthenaObject from an EventList or an audio file; an athenaCL session can only be reconstructed by loading an AthenaObject XML file.

Tutorial 3: Creating and Editing Paths

This tutorial demonstrates the basic features of the Path, including creating, storing, examining, and editing Paths.

Introduction to Paths

A PathInstance (or a Path or PI) is an ordered collection of pitch groups. A pitch group, or a Multiset, is the simultaneous representation of pitch-space, pitch-class space, and set-class information for a collection of microtonally-specified pitches. This collection can be treated as an ordered or unordered collection, can be edited by transposition, replacement, or serial re-ordering, and can be used by one or more Textures to provide pitch materials that are then independently transposed and interpreted by the Texture and its ParameterObjects.

A PathInstance allows the representation of ordered content groups, and presents this representation as a multifaceted object. Paths can be of any length, from one to many Multisets long. A Multiset can be specified in terms of pitch class (excluding octave information with integers from 0 to 11), or in terms of pitch-space (including octave information with integers below 0 or above 11, or with register-specific note names such as C3 and G#12). A Multiset can also be specified as a group, set, or scale sequence such as a Forte set-class (Forte 1973 [AN#161]) or a Xenakis sieve (Ariza 2005 [AN#613]). Finally, Multisets can be derived from spectrums and frequency analysis information provided from the cross-platform audio editor Audacity (enter "help audacity" for more information).

A Path can be developed as a network of intervallic and motivic associations. The interpretation of a Path by a Texture provides access to diverse pitch representations for a variety of musical contexts, and permits numerous Textures to share identical or related pitch information. The use of a Path in a Texture, however, is optional: a Path can function, at a minimum, simply as a referential point in Pitch space from which subsequent Texture transpositions are referenced.

Creating, Selecting, and Viewing PathInstances

To create a PathInstance, enter PIn (for PathInstance new) at the athenaCL prompt. You must name the new Path, and then supply a pitch group, Forte-number, Xenakis sieve, or alternative pitch representation (enter "help pitch" for more information on pitch representations).

Creating a new PathInstance with PIn

pi{}ti{} :: pin
name this PathInstance: pathA
enter a pitch set, sieve, spectrum, or set-class: e$, e, c#
      SC 3-2B as (D#4,E4,C#4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): y
enter a pitch set, sieve, spectrum, or set-class: 0,1,6,7
      SC 4-9 as (C4,C#4,F#4,G4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): y
enter a pitch set, sieve, spectrum, or set-class: 3-11
      SC 3-11A as (C4,D#4,G4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): y
enter a pitch set, sieve, spectrum, or set-class: 7@3|6@4, g2, c4
      SC 4-6 as (A#2,B2,F3,B3,C4)? (y, n, or cancel): y
      add another set? (y, n, or cancel): n
PI pathA added to PathInstances.

pi{pathA}ti{} :: 

Note that after successfully creating a Path, the athenaCL cursor tool changes to reflect the active Path: the name in parenthesis following "pi" designates the active Path ("pathA"). The same information is provided for a TextureInstance following the "ti" prefix. To view the active PI, enter PIv at the athenaCL prompt:

Viewing a Path with PIv

pi{pathA}ti{} :: piv
PI: pathA
psPath              3,4,1       0,1,6,7        0,3,7      -14,-13,-7,-1,0  
                    D#4,E4,C#4  C4,C#4,F#4,G4  C4,D#4,G4  A#2,B2,F3,B3,C4  
pcsPath             3,4,1       0,1,6,7        0,3,7      10,11,5,11,0     
scPath              3-2B        4-9            3-11A      4-6              
durFraction         1(25%)      1(25%)         1(25%)     1(25%)           
TI References: none.

This display provides all essential information about a Path. The header contains the name of the Path ("pathA"). The parallel presentation of psPath, pcsPath, and scPath illustrates the simultaneous availability of pitch space, pitch class space, and set class representations. The label "TI references", when needed, provides information on which TextureInstances link to this PathInstance.

In order to hear a possible interpretation of this Path, the command PIh generates a MIDI file based on a simple interpretation of the Path with the active TextureModule. The resulting musical structure is only provided to audition the Path, and uses default values for all musical parameters. The MIDI file is written in the user-specified scratch directory (see ) and is opened via the operating system.

Creating a MIDI file with PIh

pi{pathA}ti{} :: pih
PI pathA hear with TM LineGroove complete.
(/Volumes/xdisc/_scratch/ath2010.07.02.16.29.39.mid)

A second Path can be created exclusively with Forte set class numbers. In this example, all arguments are provided via the command line:

Creating a Path with Forte numbers

pi{pathA}ti{} :: pin pathB 5-3 6-4 7-34 4-14
PI pathB added to PathInstances.

A newly-created Path always becomes the active Path. Entering PIv will display the details of the newly created Path:

Displaying a Path

pi{pathB}ti{} :: piv
PI: pathB
psPath              0,1,2,4,5        0,1,2,4,5,6          0,1,3,4,6,8,10        
                    C4,C#4,D4,E4,F4  C4,C#4,D4,E4,F4,F#4  C4,C#4,D#4,E4,F#4,G#4,
pcsPath             0,1,2,4,5        0,1,2,4,5,6          0,1,3,4,6,8,10        
scPath              5-3A             6-4                  7-34                  
durFraction         1(25%)           1(25%)               1(25%)                
                    ............................................................
                         0,2,3,7       
                    A#4  C4,D4,D#4,G4  
                         0,2,3,7       
                         4-14A         
                         1(25%)        
TI References: none.

As is clear from the PIv display above, when a Multiset in a Path is entered as a Set class, a pitch space and a pitch class space representation (psPath, pcsPath) are created from the normal-form of the desired SetClass.

In order to display the complete collection of Paths available in the AthenaObject, the user enters PIls, for PathInstance list:

Listing Paths

pi{pathB}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
   pathA            0  3-2B,4-9,3-11A,4-6  
 + pathB            0  5-3A,6-4,7-34,4-14A 

Many displays provided by athenaCL are given in columns of data. After whatever header information is give, a key, in braces ("{}"), is provided to define the data provided in each column. In the example above, the key shows that each row contains the name of the PI, the number of TI references, the number of PathVoices, and an scPath representation of the Path. The "+" next to "pathB" illustrates that this PI is currently active. All "ls" commands use a similar designation.

Many commands in athenaCL function by using an "active" object. The active PI defines which Path is used in many different commands. For example, the PIv command, when used without an argument for which Path to display, displays the active Path.

To select a different PI as the active PI, simply enter PIo. The user is prompted to either enter the name of the Path to select, or its order number from the "ls" view (where 1 is pathA, 2 is pathB). Displaying the list of all PathInstances will confirm that pathA is now the selected PI.

Selecting Paths

pi{pathB}ti{} :: pio
select a path to activate: (name or number 1-2): pathA
PI pathA now active.

pi{pathA}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
 + pathA            0  3-2B,4-9,3-11A,4-6  
   pathB            0  5-3A,6-4,7-34,4-14A 

Alternatively the user can enter the name of the Path to be selected as a command-line argument with the PIo command. After making pathA active, the user can make pathB active again by entering the following:

Selecting a Path with an argument

pi{pathA}ti{} :: pio pathB
PI pathB now active.

Copying and Removing PathInstances

In order to manage the collection of Paths in the AthenaObject, the user can copy and remove Paths. In all cases of copying and removing user-defined objects in athenaCL, the active object is never assumed to be the object that the command should be performed upon. Said another way, the user must always specify which object(s) to copy or remove.

To copy a Path instance, enter PIcp and select a Path to copy:

Copying a Path with PIcp

pi{pathB}ti{} :: picp
select a path to copy: (name or number 1-2): pathB
name the copy of path pathB: pathC
PI pathC added to PathInstances.

pi{pathC}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
   pathA            0  3-2B,4-9,3-11A,4-6  
   pathB            0  5-3A,6-4,7-34,4-14A 
 + pathC            0  5-3A,6-4,7-34,4-14A 

To delete a Path, enter PIrm and select a Path to delete as above. In the example below, the Path to delete is given with a command line argument:

Removing a Path with PIrm

pi{pathC}ti{} :: pirm pathB
PI pathB destroyed.

Editing PathInstances

A Path can be edited as a serial succession of Multisets with the standard assortment of serial operations: retrograde, rotation, and slice. Additionally, each Multiset in a Path can be changed, either by transposition or replacement.

Whenever a serial edit is performed on a Path, the edited Path becomes a new, distinct Path and the original Path is left unchanged. For example, to create the retrograde of the active Path, enter PIret. The user must provide the name of the new Path:

Creating a retrograde of a Path with PIret

pi{pathC}ti{} :: piret
name this PathInstance: pathCret
retrograde PI pathCret added to PathInstances.

pi{pathCret}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
   pathA            0  3-2B,4-9,3-11A,4-6  
   pathC            0  5-3A,6-4,7-34,4-14A 
 + pathCret         0  4-14A,7-34,6-4,5-3A 

To create a rotation, the user, after entering PIrot, must enter the number of the Multiset to occupy the new first position. If the new first position is to be the second Multiset, the user would enter 2:

Creating a rotation of a Path with PIrot

pi{pathCret}ti{} :: pirot
name this PathInstance: pathCretRot
which chord should start the rotation? (positions 2-4): 2
rotation PI pathCretRot added to PathInstances.

pi{pathCretRot}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
   pathA            0  3-2B,4-9,3-11A,4-6  
   pathC            0  5-3A,6-4,7-34,4-14A 
   pathCret         0  4-14A,7-34,6-4,5-3A 
 + pathCretRot      0  7-34,6-4,5-3A,4-14A 

A slice will extract a segment from a Path. To create a slice, enter PIslc. The user is prompted for the name of the new Path, and the start and end Multiset positions. If the slice is to only contain the last two chords of a four chord Path, for example, the start and end positions would be 3,4:

Creating a slice of a Path with PIslc

pi{pathCretRot}ti{} :: pislc
name this slice of path pathCretRot: pathD
which chords should bound the slice? (positions 1 - 4): 3,4
slice PI pathD added to PathInstances.

pi{pathD}ti{} :: pils
PathInstances available:
{name,TIrefs,scPath}
   pathA            0  3-2B,4-9,3-11A,4-6  
   pathC            0  5-3A,6-4,7-34,4-14A 
   pathCret         0  4-14A,7-34,6-4,5-3A 
   pathCretRot      0  7-34,6-4,5-3A,4-14A 
 + pathD            0  5-3A,4-14A      

There are three ways to edit a single Multiset within a Path using the PIe command: by replacement, by transposition, or by inversion. In all cases, the number of elements in the Multiset must be maintained.

To edit a single Multiset in a Path enter PIe:

Transposing a set within a Path

pi{pathD}ti{} :: pie
edit PI pathD
enter position to edit (positions 1-2): 2
replace, transpose, or invert set (0,2,3,7): (r, t, or i): t
enter a transposition method: literal or modulus? (l or m): l
enter a positive or negative transposition: 8
PI pathD edited.

pi{pathD}ti{} :: piv
PI: pathD
psPath              0,1,2,4,5        8,10,11,15      
                    C4,C#4,D4,E4,F4  G#4,A#4,B4,D#5  
pcsPath             0,1,2,4,5        8,10,11,3       
scPath              5-3A             4-14A           
durFraction         1(50%)           1(50%)          
TI References: none.

Here the user has selected the Multiset in position "2" of PI "pathD" to edit. The user next selects to edit the set by transposition, entering "t". There are two methods of transposition available: a "literal" transposition is done in pitch space, creating a new set in the range of all positive and negative integers; a "modulus" transposition is done in pitch-class space, creating a new set in the range of pitch-classes 0 through 11. In the example above the user has selected a literal ("l") transposition and enters "8" as the transposition value. This shifts each pitch in the Multiset up 8 half-steps. Since this is a literal and not a modulus transposition, pitch 5 becomes pitch 15, or D#5.

Any Multiset in a Path can be replaced with a Multiset of equal size. For example, the same Multiset edited above can be replaced with any four-element Multiset:

Replacing a Multiset with a new Multiset

pi{pathD}ti{} :: pie
edit PI pathD
enter position to edit (positions 1-2): 2
replace, transpose, or invert set (8,10,11,15): (r, t, or i): r
enter a pitch set, sieve, spectrum, or set-class: 2,2,4,4
      SC 2-2 as (D4,D4,E4,E4)? (y, n, or cancel): y
PI pathD edited.

pi{pathD}ti{} :: piv
PI: pathD
psPath              0,1,2,4,5        2,2,4,4      
                    C4,C#4,D4,E4,F4  D4,D4,E4,E4  
pcsPath             0,1,2,4,5        2,2,4,4      
scPath              5-3A             2-2          
durFraction         1(50%)           1(50%)       
TI References: none.

Tutorial 4: Creating and Editing Textures

This tutorial demonstrates basic Texture creation, configuration, and deployment in musical structures. This chapter is essential for using athenaCL for algorithmic music production.

Introduction to Textures and ParameterObjects

A TextureInstance (or a Texture or TI) is an algorithmic music layer. Like a track or a part, a Texture represents a single musical line somewhat analogous to the role of a single instrument in an ensemble. The music of a Texture need not be a single monophonic line: it may consist of chords and melody, multiple independent lines, or any combination or mixture. The general generative shape and potential of a Texture is defined by the TextureModule. A Texture is an instance of a TextureModule: a single TextureModule type can be used to create many independent instances of that type; each of these instances can be customized and edited independently. Collections of TextureInstances are used to create an EventList, or the musical output of all Textures.

A TextureInstance consists of many configurable slots, or attributes. These attributes allow the user to customize each Texture. Attributes include such properties as timbre (instrument and parametric timbre specifications), rhythm (duration and tempo), frequency materials (Path, transposition, and octave position), and mixing (amplitude and panning). Other attributes may control particular features of the Texture, like the number of voices, position of chords, or formal properties.

Most attributes of a TextureInstance are not fixed values. Unlike a track or a part, a Texture often does not have a fixed sequence of values for attributes like amplitude, or even fixed note-sequences. Rather, attributes of a Texture are algorithmic objects, or ParameterObjects. Rather than enter a value for amplitude, the user chooses a ParameterObject to produce values for the desired attribute, and enters settings to specialize the ParameterObject's behavior. Rather than enter note-sequences, the Texture selects and combines pitches from a Path, or a user-supplied sequence of pitch groups. In this way each attribute of a Texture can be given a range of motion and a degree of indeterminacy within user-composed boundaries.

A TextureInstance is not a fixed entity: it is a collection of instructions on how to create events for a certain duration. Every time an EventList is created, each Texture is "performed," or called into motion to produce events. Depending on the TextureModule and the Texture's configuration, the events produced may be different each time the EventList is created.

athenaCL is designed to allow users work with broad outlines of musical parameters and materials, and from this higher level organize and control combinations of Textures. This should not be confused with a much higher level of algorithmic composition, where an algorithm is responsible for creating an entire composition: its style, form, parts, and surface. athenaCL is unlikely to produce such "complete" musical structures. Rather, athenaCL is designed to produce complex, detailed, and diverse musical structures and surfaces. Combinations of parts and construction of form are left to the user, and can be composed either in athenaCL or in a Digital Audio Workstation where athenaCL EventOutput formats, such as MIDI files or Csound-rendered audio files, can be mixed, processed, and combined in whatever desired fashion. Alternatively, MIDI files produced with athenaCL can be modified or combined in traditional sequencers and notation editors.

Introduction Instrument Models

athenaCL features numerous integrated instrument models. In some cases these instrument models are references to external specifications; in other cases these instrument models contain complete source code necessary for instantiating synthesis systems. Textures are assigned an instrument from an Orchestra upon creation, and are able to control a wide variety of instrument-specific parameters.

athenaCL features an integrated library of Csound instruments, providing automated control of both Csound score and orchestra generation and control. For details on installing and using Csound within athenaCL, see . Csound instruments are signal processing and synthesis instructions. These instructions designates a certain number of parameters to expose to the user of the instrument. These parameters allow events in the score to communicate information and settings to the instrument. athenaCL's integrated library of Csound instruments permits dynamically constructed orchestra files to be used with athenaCL-generated Csound scores. Alternatively, users can use external, custom orchestras with athenaCL-written score files. EventModes csoundNative, csoundExternal, and csoundSilence support diverse ways of working with Csound within athenaCL.

athenaCL provides instrument collections (Orchestras) for working with other EventOutput formats. For working with MIDI systems, General MIDI (GM) instrument definitions are provided with the generalMidi and generalMidiPercussion EventModes.

Whenever a Texture is created, an instrument must be specified by number. This is necessary because the Texture must be configured with additional ParameterObjects for instrument-specific parameter control. Instruments are always identified by a number, though within athenaCL descriptive names are provided when available.

The instruments available during Texture creation are dependent on the active EventMode: that is, for any active EventMode, one Orchestra is available from which a Texture's instrument must be selected. In the following example, the user lists available EventModes to check that csoundNative is active, and then views the available instruments with the EMi command.

Listing available Instruments with EMi

pi{}ti{} :: emls
EventMode modes available:
{name}
   csoundExternal      
 + csoundNative        
   csoundSilence       
   midi                
   midiPercussion      
   superColliderNative 

pi{}ti{} :: emi
csoundNative instruments:
{number,name}
   3      sineDrone                        
   4      sineUnitEnvelope                 
   5      sawDrone                         
   6      sawUnitEnvelope                  
   11     noiseWhite                       
   12     noisePitched                     
   13     noiseUnitEnvelope                
   14     noiseTambourine                  
   15     noiseUnitEnvelopeBandpass        
   16     noiseSahNoiseUnitEnvelope        
   17     noiseSahNoiseUnitEnvelopeDistort 
   20     fmBasic                          
   21     fmClarinet                       
   22     fmWoodDrum                       
   23     fmString                         
   30     samplerReverb                    
   31     samplerRaw                       
   32     samplerUnitEnvelope              
   33     samplerUnitEnvelopeBandpass      
   34     samplerUnitEnvelopeDistort       
   35     samplerUnitEnvelopeParametric    
   36     samplerSahNoiseUnitEnvelope      
   40     vocodeNoiseSingle                
   41     vocodeNoiseSingleGlissando       
   42     vocodeNoiseQuadRemap             
   43     vocodeNoiseQuadScale             
   44     vocodeNoiseQuadScaleRemap        
   45     vocodeNoiseOctScale              
   46     vocodeNoiseOctScaleRemap         
   47     vocodeNoiseBiOctScale            
   48     vocodeNoiseTriOctScale           
   50     guitarNylonNormal                
   51     guitarNylonLegato                
   52     guitarNylonHarmonic              
   60     additiveBellBright               
   61     additiveBellDark                 
   62     additiveBellClear                
   70     synthRezzy                       
   71     synthWaveformVibrato             
   72     synthVcoAudioEnvelopeSineQuad    
   73     synthVcoAudioEnvelopeSquareQuad  
   74     synthVcoDistort                  
   80     pluckTamHats                     
   81     pluckFormant                     
   82     pluckUnitEnvelope                
   110    noiseAudioEnvelopeSineQuad       
   111    noiseAudioEnvelopeSquareQuad     
   130    samplerAudioEnvelopeSineQuad     
   131    samplerAudioEnvelopeSquareQuad   
   132    samplerAudioFileEnvelopeFilter   
   133    samplerAudioFileEnvelopeFollow   
   140    vocodeSineOctScale               
   141    vocodeSineOctScaleRemap          
   142    vocodeSineBiOctScale             
   143    vocodeSineTriOctScale            
   144    vocodeSineQuadOctScale           
   145    vocodeSinePentOctScale           
   146    vocodeSineHexOctScale            
   230    samplerVarispeed                 
   231    samplerVarispeedAudioSine        
   232    samplerVarispeedReverb           
   233    samplerVarispeedDistort          
   234    samplerVarispeedSahNoiseDistort  
   240    vocodeVcoOctScale                
   241    vocodeVcoOctScaleRemap    

Other EventModes provide other Orchestras for use in Textures. In the example below, the user selects the EventMode midiPercussion with the EMo command and examines the available instruments with the EMi command:

Examining additional Instruments with EMi

pi{}ti{} :: emo mp
EventMode mode set to: midiPercussion.

pi{}ti{} :: emi
generalMidiPercussion instruments:
{number,name}
   35     acousticBassDrum 
   36     bassDrum1        
   37     sideStick        
   38     acousticSnare    
   39     handClap         
   40     electricSnare    
   41     lowFloorTom      
   42     closedHiHat      
   43     highFloorTom     
   44     pedalHiHat       
   45     lowTom           
   46     openHiHat        
   47     lowMidTom        
   48     hiMidTom         
   49     crashCymbal1     
   50     highTom          
   51     rideCymbal1      
   52     chineseCymbal    
   53     rideBell         
   54     tambourine       
   55     splashCymbal     
   56     cowBell          
   57     crashCymbal2     
   58     vibraSlap        
   59     rideCymbal2      
   60     hiBongo          
   61     lowBongo         
   62     muteHiConga      
   63     openHiConga      
   64     lowConga         
   65     highTimbale      
   66     lowTimbale       
   67     highAgogo        
   68     lowAgogo         
   69     cabasa           
   70     maracas          
   71     shortWhistle     
   72     longWhistle      
   73     shortGuiro       
   74     longGuiro        
   75     claves           
   76     hiWoodBlock      
   77     lowWoodBlock     
   78     muteCuica        
   79     openCuica        
   80     muteTriangle     
   81     openTriangle    

Selecting and Viewing TextureModules

A Texture is an instance of a TextureModule. Every time a Texture is created, athenaCL creates an independent instance of the active TextureModule. To display a complete list of all available TextureModules, enter the command TMls:

Listing TextureModules with TMls

pi{}ti{} :: tmls
TextureModules available:
{name,TIreferences}
   DroneArticulate    0
   DroneSustain       0
   HarmonicAssembly   0
   HarmonicShuffle    0
   InterpolateFill    0
   InterpolateLine    0
   IntervalExpansion  0
   LineCluster        0
 + LineGroove         0
   LiteralHorizontal  0
   LiteralVertical    0
   MonophonicOrnament 0
   TimeFill           0
   TimeSegment        0

As in other athenaCL displays, the first line of the display is a key, telling the user that the list consists of a name followed by the number of TI references. This number displays the count of TextureInstances referenced from a parent TextureModule. The "+" designates the active TextureModule. When creating a new TextureInstance, athenaCL uses the active TextureModule.

To select a different TextureModule, the user enters TMo. The user is prompted to enter the name or number (as represented in the list order) of the desired TextureModule. The TMls command can be used to confirm the change.

Selecting the active TextureModule with TMo

pi{}ti{} :: tmo 
which TextureModule to activate? (name or number 1-14): da
TextureModule DroneArticulate now active.

pi{}ti{} :: tmls
TextureModules available:
{name,TIreferences}
 + DroneArticulate    0
   DroneSustain       0
   HarmonicAssembly   0
   HarmonicShuffle    0
   InterpolateFill    0
   InterpolateLine    0
   IntervalExpansion  0
   LineCluster        0
   LineGroove         0
   LiteralHorizontal  0
   LiteralVertical    0
   MonophonicOrnament 0
   TimeFill           0
   TimeSegment        0

Here the user has entered "da", to select the TextureModule DroneArticulate. Whenever selecting objects in athenaCL the user may enter the acronym (formed from the leading character and all following capitals), the literal name ("dronearticulate"), or the ordinal number as displayed in the corresponding list display.

To learn what a particular TextureModule does, as well what types of Texture options are available, enter the command TMv, for TextureModule View. In this example, the user, with TIo, selects the TextureModule "LineGroove" (with a command-line argument) before entering the TMv command.

Viewing details of the active TextureModule

pi{}ti{} :: tmo linegroove
TextureModule LineGroove now active.

pi{}ti{} :: tmv
TextureModule: LineGroove; author: athenaCL native
This TextureModule performs each set of a Path as a simple monophonic line;
pitches are chosen from sets in the Path based on the pitch selector control.
texture (s)tatic
parallelMotionList    Description: List is a collection of transpositions
                      created above every Texture-generated base note. The
                      timeDelay value determines the amount of time in seconds
                      between each successive transposition in the
                      transpositionList. Arguments: (1) name, (2)
                      transpositionList, (3) timeDelay
pitchSelectorControl  Description: Define the selector method of Path pitch
                      selection used by a Texture. Arguments: (1) name, (2)
                      selectionString {'randomChoice', 'randomWalk',
                      'randomPermutate', 'orderedCyclic',
                      'orderedCyclicRetrograde', 'orderedOscillate'}
levelFieldMonophonic  Description: Toggle between selection of local field
                      (transposition) values per set of the Texture Path, or per
                      event. Arguments: (1) name, (2) level {'set', 'event'}
levelOctaveMonophonic Description: Toggle between selection of local octave
                      (transposition) values per set of the Texture Path, or per
                      event. Arguments: (1) name, (2) level {'set', 'event'}
texture (d)ynamic

The TMv command displays the name of the TextureModule along with the author of its code. Following the author designation is a description of how the module performs. Following this is documentation for all TextureStatic parameter objects, or Texture-specific options and user-configurable settings pertinent to the particular TextureModule's algorithmic design.

Creating, Selecting, and Viewing TextureInstances

A TextureInstance is always linked to a Path. If no Paths exists when the Texture is created, a default Path is automatically created consisting of a single Multiset with a single pitch (middle C, or C4). If Paths exists when the Texture is created, the active PathInstance is assigned to the Texture. A TextureInstance's Path can be later edited. For a complete introduction to Paths see .

A new TextureInstance is always created from the active TextureModule; the user must then always select the desired TextureModule before creating a Texture of the desired type. A TextureInstance's type, or TextureModule, cannot be changed after the Texture is created.

A new Texture is created with the TIn command, for TextureInstance New. The user is prompted to name the new Texture and select an instrument by number. If the number of the desired instrument is not known, a "?" can be entered to display a list of instruments. In the example below the user selects TextureMode LineGroove, EventMode midiPercussion, and then creates a texture named "a1" with instrument 64 ("lowConga").

Creating a new TextureInstance with TIn

pi{}ti{} :: tmo linegroove
TextureModule LineGroove now active.

pi{}ti{} :: emo mp
EventMode mode set to: midiPercussion.

pi{}ti{} :: tin
name this texture: a1
enter instrument number:
(35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,6
1,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81)
or "?" for instrument help: 64
TI a1 created.

To hear the resulting musical structure, enter the command ELn. (For more information on using ELn, see . The resulting MIDI file may be opened with the ELh command.

Creating a new EventList with ELn

pi{auto-lowConga}ti{a1} :: eln
command.py: temporary file: /Volumes/xdisc/_scratch/ath2010.07.02.17.51.42.xml 
      EventList ath2010.07.02.17.51.42 complete:
/Volumes/xdisc/_scratch/ath2010.07.02.17.51.42.mid
/Volumes/xdisc/_scratch/ath2010.07.02.17.51.42.xml

After creating a Texture, the TIv command can be used to view the active Texture:

Viewing a TextureInstance

pi{auto-lowConga}ti{a1} :: tiv
TI: a1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 000.0--20.06
(i)nstrument        64 (generalMidiPercussion: lowConga)
(t)ime range        00.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              auto-lowConga
                    (E4)
                    20.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.5
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

The TIv command displays all essential attributes of a Texture. Each label in the display corresponds to an attribute in the TextureInstance. The TIv display is in two-blocks. The first block gives parameters that are constant. The first line displays the name of the TextureInstance (a1), the name of the parent TextureModule (LineGroove), the number of TextureClones (0), and the active TextureTemperament (TwelveEqual). The second line displays the PitchMode (pitchSpace), the silenceMode (off), and the postMapMode (on). The third line provides the GM MIDI program name (piano1). The fourth, indented line displays the TextureInstance's mute status (where a "o" is muted and a "+" is non-muted) and the absolute duration the Texture's events.

The second block lists the primary algorithmic controls of the Texture. The names of these attributes use parenthesis to designate a single-letter abbreviation. The instrument attribute is displayed first, with the value following the label: instrument number (64), the name of the orchestra (generalMidiPercussion) and the name of the instrument (lowConga). The next attribute is time-range, the start and end time in seconds from the beginning of the EventList. A new Texture is given a default time-range of twenty seconds (00.0--20.0). New Textures, when created, get their time-range from the active Texture.

The bpm attribute is the tempo in beats per minute. The value is set with the ParameterObject "constant" to produce a tempo of 120 BPM. In most cases, the bpm control is used to calculate the duration of rhythms and pulses used in a Texture.

The rhythm attribute designates a Rhythm ParameterObject to control the generation of event durations. Rhythm ParameterObjects often notate rhythms as lists of Pulses. A Pulse is designated as a list of three elements: (divisor, multiplier, accent). The duration of a rhythm is calculated by dividing the time of a beat (from the bpm parameter) by the Pulse divisor, then multiplying the result by the Pulse multiplier. The value of the "accent" determines if a duration is a note or a rest, where 1 or a "+" designates a note, 0 or a "o" designates a rest. Thus an eighth note is given as (2,1,1), a dotted-quarter note as (2,3,1), and dotted-eighth rest as (4,3,0). In the example above, the ParameterObject "loop" is used with three Pulses: two sixteenth notes (4,1,1) and a duration equal to a quarter-note tied to a sixteenth note (4,5,1).

The Path attribute gives the name of the PathInstance used by this Texture, followed on the next line by the Multiset pitches that will be used. PathInstances are linked to the Texture. Thus, if a change is made to a Path (with PIe, for example), all Textures that use that Path will reflect the change. Each TextureInstance, however, can control the interpretation of a Path in numerous ways. The Texture PitchMode setting, for example, determines if pitches are derived from a Path in pitchSpace, pitchClassSpace, or as a setClass. The local field and local octave attributes permit each Texture to transpose pitches from the Path independently.

The attribute "local field" stores a ParameterObject that controls local transposition of Path pitches. Values are given in semitones, and can include microtonal transpositions as floating-point values following the semitone integer. Thus, a transposition of five half-steps and a quarter-tone would be equal to 5.5. A transposition of a major tenth would be 16. In the example above the attribute value instructs the Texture to use a ParameterObject called "constant." Note: some EventOutput formats do not support microtonal pitch specification. In such cases microtones are rounded to the nearest semitone. The attribute "local octave," similar to local field, controls the octave position of Path pitches. Each integer represents an octave shift, where 0 is no octave shift, each Path pitch retaining its original octave register.

The amplitude attribute designates a ParameterObject to control the amplitude of the Texture, measured in a symbolic range from 0 to 1. The panning attribute designates the ParameterObject used to control spatial location in stereo or quadraphonic space. Values are along the unit interval, from 0 to 1.

The attributes that make up the "auxiliary" listing provide any number of additional ParameterObjects to control instrument specific parameter fields. The number of parameter fields is determined by the instrument definition.

The last attributes, "texture static" and "texture dynamic," designate controls specific to particular TextureModules. The values here can be edited like other attributes.

A second Texture will be created with TIn named "b1" and using instrument 62. The Texture, after creation, is displayed with the TIv command.

Creating and viewing a TextureInstance

pi{auto-lowConga}ti{a1} :: tin
name this texture: b1
enter instrument number:
(35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,6
1,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81)
or "?" for instrument help: 62
TI b1 created.

pi{auto-muteHiConga}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 000.0--20.06
(i)nstrument        62 (generalMidiPercussion: muteHiConga)
(t)ime range        00.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              auto-muteHiConga
                    (D4)
                    20.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.5
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

This new Texture, though created with the same TextureModule, is a completely autonomous object. No changes to "a1" will have any effect on "b1".

During an athenaCL session a user can create any number of TextureInstances and save this collection in an AthenaObject file for latter use. For more information on saving, loading, and merging AthenaObjects see . To view a list of all current Textures, enter the command TIls, for TextureInstance List.

Listing all TextureInstances

pi{auto-muteHiConga}ti{b1} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   a1               + LineGroove  auto-lowConga    64  00.0--20.0   0
 + b1               + LineGroove  auto-muteHiConga 62  00.0--20.0   0

This display shows a list of all Textures, each Texture on a single line. The information given, in order from left to right, is the name, the mute-status, the parent TM, the PathInstance, the instrument number, the time-range, and the number of TextureClones. Notice the "+" in front of Texture "b1": this designates that this Texture is active. To change the active Texture, enter the command TIo either with a command-line argument or alone:

Selecting the active TextureInstance

pi{auto-muteHiConga}ti{b1} :: tio a1
TI a1 now active.

pi{auto-muteHiConga}ti{a1} :: 

In order to compare a single attribute of all Textures, the user can enter the command TEv, for TextureEnsemble View. TextureEnsemble refers to the collection of all Textures, and all TE commands process all Textures simultaneously. The user will be prompted to enter an abbreviation for the desired attribute. Attribute abbreviations are notated in the TIv display labels. Thus the attribute abbreviation for "(a)mplitude" is "a"; the attribute abbreviation for "pan(n)ing" is "n." As with other commands, use of command-line arguments provides flexible control:

Viewing parameter values for all Textures

pi{auto-muteHiConga}ti{a1} :: tev
compare texture parameters: which parameter? a
compare parameters: amplitude
{name,value,}
a1                  randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)  
b1                  randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9) 

pi{auto-muteHiConga}ti{a1} :: tev i
compare parameters: instrument
{name,value,}
a1                  64 (generalMidiPercussion: lowConga)     
b1                  62 (generalMidiPercussion: muteHiConga)  

Copying and Removing Texture Instances

TextureInstances can be duplicated with the command TIcp. The user is prompted to enter the name of the Texture to be copied, and then the name of the copy. The copy can be confirmed by listing all Textures with the command TIls.

Copying a TextureInstance

pi{auto-muteHiConga}ti{a1} :: ticp
which TextureInstnace to copy? (name or number 1-2): b1
name this copy of TI 'b1': b2
TextureInstance b2 created.

pi{auto-muteHiConga}ti{b2} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   a1               + LineGroove  auto-lowConga    64  00.0--20.0   0
   b1               + LineGroove  auto-muteHiConga 62  00.0--20.0   0
 + b2               + LineGroove  auto-muteHiConga 62  00.0--20.0   0

Textures can be deleted with the command TIrm, for TextureInstance Remove. The user is prompted to enter the name of the Texture to be deleted. The removal can be confirmed by listing all Textures with the command TIls.

Removing a TextureInstance

pi{auto-muteHiConga}ti{b2} :: tirm
which TextureInstnace to delete? (name or number 1-3): b2
are you sure you want to delete texture b2? (y, n, or cancel): y
TI b2 destroyed.

pi{auto-muteHiConga}ti{b1} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   a1               + LineGroove  auto-lowConga    64  00.0--20.0   0
 + b1               + LineGroove  auto-muteHiConga 62  00.0--20.0   0   

pi{auto-muteHiConga}ti{b1} :: 

When the active Texture is deleted, as it is above, athenaCL chooses a new Texture to activate, here choosing "b1." To select a different Texture, use the command TIo.

Editing TextureInstance Attributes

Each attribute of a Texture can be edited to specialize its performance. Some attributes such as instrument, time-range, and Path are static: they do not change over the duration of a Texture. Other attributes are dynamic, such as bpm, rhythm, local field, local octave, amplitude and panning, and can be configured with a wide range of ParameterObjects.

Texture attributes are edited with the TIe command. The command first prompts the user to select which attribute to edit. Attributes are named by a single-letter abbreviation, as notated in the TIv display with parenthesis. Next, the current value of the attribute is displayed, followed by a prompt for the new value. In the following example the time range of Texture "a1" is edited:

Editing a TextureInstance

pi{auto-muteHiConga}ti{b1} :: tie
edit TI b1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): t
current time range: 0.0, 20.0
new value: 5, 20
TI b1: parameter time range updated.

pi{auto-muteHiConga}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 005.0--19.97
(i)nstrument        62 (generalMidiPercussion: muteHiConga)
(t)ime range        05.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              auto-muteHiConga
                    (D4)
                    15.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.5
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

In the example above the user select "t" to edit the active Texture's time-range attribute. In general, new values for attributes must be entered with the same syntax with which they are displayed. In this example, time-range values are given as two numbers separated by a comma. Deviation from this syntax will return an error. The user enters 5, 20 to set the time-range attribute to the duration from 5 to 20 seconds.

The command TEe, for TextureEnsemble Edit can be used to edit the entire collection of Textures with one command. In the following example the user selects the amplitude attribute with "a" and then enters a new ParameterObject: randomUniform. The randomUniform parameterObject produces random values with a uniform distribution between the required arguments for minimum and maximum. After this edit, TEv, with the command-line argument "a", can be used to view the amplitude for all Textures and confirm the edit.

Editing a single parameter of all Textures with TEe


pi{auto-muteHiConga}ti{b1} :: tee
edit all TextureInstances
which parameter? (i,t,b,r,p,f,o,a,n,x): a
sample amplitude: randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
new value: ru, .6, 1
TI a1: parameter amplitude updated.
TI b1: parameter amplitude updated.

pi{auto-muteHiConga}ti{b1} :: tev a
compare parameters: amplitude
{name,value,}
a1                  randomUniform, (constant, 0.6), (constant, 1)  
b1                  randomUniform, (constant, 0.6), (constant, 1)

Using ELn, the current collection of Textures can be used to create an EventList, and ELh may be used to audition the results. (For more information on using ELn, see .) The random fluctuation of amplitude values should provide a variety of accent patterns to the fixed rhythmic loop.

The collection of Textures can be displayed in a graphical and textual diagram produced by the TEmap command. This command lists each Texture and Clone within the current AthenaObject and provides a proportional representation of their respective start and end times.

Generating a graphical display of Texture position with TEmap

pi{auto-muteHiConga}ti{b1} :: temap
TextureEnsemble Map:
19.97s              |      .       |      .       |      .      |       .      |
a1                  ____________________________________________________________
b1                                 _____________________________________________

Muting Textures

Textures can be muted to disable the inclusion of their events in all EventOutputs. Textures and their Clones (see ) can be muted independently. The command TImute, if no arguments are given, toggles the current Texture's mute status. The following example demonstrates muting Texture a1, listing all Textures with with TIls, and then displaying the collection of Textures with the TEmap command. Notice that in the TIls display, the "status" of Texture a1 is set to "o", meaning that it is muted.

Muting a Texture with TImute


pi{auto-muteHiConga}ti{b1} :: timute
TI b1 is now muted.

pi{auto-muteHiConga}ti{b1} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   a1               + LineGroove  auto-lowConga    64  00.0--20.0   0
 + b1               o LineGroove  auto-muteHiConga 62  05.0--20.0   0

pi{auto-muteHiConga}ti{b1} :: temap
TextureEnsemble Map:
19.97s              |      .       |      .       |      .      |       .      |
a1                  ____________________________________________________________
b1                                 _____________________________________________

By providing the name of one or more Textures as command-line arguments, numerous Texture's mute status can be toggled. In the following example, Texture a1 is given as an argument to the TImute command. The TIls command shows that the Texture is no longer muted.

Removing mute status with TImute

pi{auto-muteHiConga}ti{b1} :: timute a1
TI a1 is now muted.

pi{auto-muteHiConga}ti{b1} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
   a1               o LineGroove  auto-lowConga    64  00.0--20.0   0
 + b1               o LineGroove  auto-muteHiConga 62  05.0--20.0   0

pi{auto-muteHiConga}ti{b1} :: timute a1
TI a1 is no longer muted.

pi{auto-muteHiConga}ti{b1} :: timute b1
TI b1 is no longer muted.

Viewing and Searching ParameterObjects

For each dynamic attribute of a TextureInstance, a ParameterObject can be assigned to produce values over the duration of the Texture. Complete documentation for all ParameterObjects can be found in . Texture attributes for bpm, local field, local octave, amplitude, panning, and all auxiliary parameters (if required by the instrument) can have independent ParameterObjects.

ParameterObjects are applied to a Texture attribute with an argument list. athenaCL accepts lists in the same comma-separated format of Python list data structures. A list can consist of elements like strings, numbers, and other lists, each separated by a comma. Within athenaCL, text strings need not be in quotes, and sub-lists can be given with either parenthesis or brackets. Each entry in the ParameterObject argument list corresponds, by ordered-position, to an internal setting within the ParameterObject. The first entry in the argument list is always the name of the ParameterObject. ParameterObject names, as well as all ParameterObject configuration strings, can always be accessed with acronyms.

To display a list if all available ParameterObjects, enter the command TPls, for TextureParameter list:

Displaying all ParameterObjects with TPls

pi{auto-muteHiConga}ti{b1} :: tpls
Generator ParameterObject
{name}
   accumulator                
   basketFill                 
   basketFillSelect           
   basketGen                  
   basketSelect               
   breakGraphFlat             
   breakGraphHalfCosine       
   breakGraphLinear           
   breakGraphPower            
   breakPointFlat             
   breakPointHalfCosine       
   breakPointLinear           
   breakPointPower            
   caList                     
   caValue                    
   constant                   
   constantFile               
   cyclicGen                  
   directorySelect            
   envelopeGeneratorAdsr      
   envelopeGeneratorTrapezoid 
   envelopeGeneratorUnit      
   feedbackModelLibrary       
   fibonacciSeries            
   funnelBinary               
   grammarTerminus            
   henonBasket                
   iterateCross               
   iterateGroup               
   iterateHold                
   iterateSelect              
   iterateWindow              
   lineSegment                
   listPrime                  
   logisticMap                
   lorenzBasket               
   markovGeneratorAnalysis    
   markovValue                
   mask                       
   maskReject                 
   maskScale                  
   noise                      
   oneOver                    
   operatorAdd                
   operatorCongruence         
   operatorDivide             
   operatorMultiply           
   operatorPower              
   operatorSubtract           
   pathRead                   
   quantize                   
   randomBeta                 
   randomBilateralExponential 
   randomCauchy               
   randomExponential          
   randomGauss                
   randomInverseExponential   
   randomInverseLinear        
   randomInverseTriangular    
   randomLinear               
   randomTriangular           
   randomUniform              
   randomWeibull              
   sampleAndHold              
   sampleSelect               
   sieveFunnel                
   sieveList                  
   staticInst                 
   staticRange                
   typeFormat                 
   valuePrime                 
   valueSieve                 
   waveCosine                 
   waveHalfPeriodCosine       
   waveHalfPeriodPulse        
   waveHalfPeriodSine         
   waveHalfPeriodTriangle     
   wavePowerDown              
   wavePowerUp                
   wavePulse                  
   waveSawDown                
   waveSawUp                  
   waveSine                   
   waveTriangle               

Rhythm Generator ParameterObject
{name}
   binaryAccent         
   convertSecond        
   convertSecondTriple  
   gaRhythm             
   iterateRhythmGroup   
   iterateRhythmHold    
   iterateRhythmWindow  
   loop                 
   markovPulse          
   markovRhythmAnalysis 
   pulseSieve           
   pulseTriple          
   rhythmSieve          

Filter ParameterObject
{name}
   bypass               
   filterAdd            
   filterDivide         
   filterDivideAnchor   
   filterFunnelBinary   
   filterMultiply       
   filterMultiplyAnchor 
   filterPower          
   filterQuantize       
   maskFilter           
   maskScaleFilter      
   orderBackward        
   orderRotate          
   pipeLine             
   replace              

To display detailed documentation for a ParameterObject, enter the command TPv, for Texture Parameter view. In the following example the user views the ParameterObjects "wavePowerDown" and "noise" by providing command-line arguments for the desired ParameterObject name:

Viewing ParameterObject reference information

pi{auto-muteHiConga}ti{b1} :: tpv wpd
Generator ParameterObject
{name,documentation}
WavePowerDown       wavePowerDown, stepString, parameterObject, phase, exponent,
                    min, max
                    Description: Provides a power down wave between 0 and 1 at a
                    rate given in either time or events per period. Depending on
                    the stepString argument, the period rate (frequency) may be
                    specified in spc (seconds per cycle) or eps (events per
                    cycle). This value is scaled within the range designated by
                    min and max; min and max may be specified with
                    ParameterObjects. The phase argument is specified as a value
                    between 0 and 1. Note: conventional cycles per second (cps
                    or Hz) are not used for frequency. Arguments: (1) name, (2)
                    stepString {'event', 'time'}, (3) parameterObject
                    {secPerCycle}, (4) phase, (5) exponent, (6) min, (7) max

pi{auto-muteHiConga}ti{b1} :: tpv noise
Generator ParameterObject
{name,documentation}
Noise               noise, resolution, parameterObject, min, max
                    Description: Fractional noise (1/fn) Generator, capable of
                    producing states and transitions between 1/f white, pink,
                    brown, and black noise. Resolution is an integer that
                    describes how many generators are used. The gamma argument
                    determines what type of noise is created. All gamma values
                    are treated as negative. A gamma of 0 is white noise; a
                    gamma of 1 is pink noise; a gamma of 2 is brown noise; and
                    anything greater is black noise. Gamma can be controlled by
                    a dynamic ParameterObject. The value produced by the noise
                    generator is scaled within the unit interval. This
                    normalized value is then scaled within the range designated
                    by min and max; min and max may be specified by
                    ParameterObjects. Arguments: (1) name, (2) resolution, (3)
                    parameterObject {gamma value as string or number}, (4) min,
                    (5) max

The command TPmap provides graphical displays of ParameterObject-generated values. (To configure athenaCL graphics output, see .) The user must supply the name of the ParamaterObject library (Generator, Rhythm, or Filter), the number of events to generate, and the ParameterObject argument list.

ParameterObject Map display with TPmap

pi{auto-muteHiConga}ti{b1} :: tpmap
select a library: Generator, Rhythm, or Filter. (g, r, f): g
number of events: 120
enter a Generator ParameterObject argument: wpd, e, 30, 0, 2

wavePowerDown, event, (constant, 30), 0, 2, (constant, 0), (constant, 1)
TPmap display complete.

The TPmap, like other athenaCL commands, can be used with command-line arguments. In the following example, the user produces a TPmap display of the noise ParameterObject, generating "brown" fractional noise:

ParameterObject Map display with TPmap

pi{auto-muteHiConga}ti{b1} :: tpmap 120 n,50,(c,2),0,1

noise, 50, (constant, 2), (constant, 0), (constant, 1)
TPmap display complete.

Editing ParameterObjects

To edit an attribute of Texture, a user enters a new ParameterObject argument list. The command TIe, as before, first prompts the user to select which attribute to edit. Next, the current value of the attribute is displayed, followed by a prompt for the new value. TIv can be used to confirm the changed value. In the following example, the panning of Texture "a1" is assigned a fractional noise (1/f) ParameterObject:

Editing the panning of a TextureInstance

pi{auto-muteHiConga}ti{b1} :: tie
edit TI b1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): n
current panning: constant, 0.5
new value: n, 50, (cg, ud, 1, 3, .2), .5, 1
TI b1: parameter panning updated.

pi{auto-muteHiConga}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: o, duration: 005.0--19.97
(i)nstrument        62 (generalMidiPercussion: muteHiConga)
(t)ime range        05.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              auto-muteHiConga
                    (D4)
                    15.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomUniform, (constant, 0.6), (constant, 1)
pan(n)ing           noise, 50, (cyclicGen, upDown, 1, 3, 0.2), (constant, 0.5),
                    (constant, 1)
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

The noise ParameterObject has been given an embedded ParameterObject to control the gamma argument. Notice that instead of entering "noise", "cyclicGen" or "upDown" the user can enter the acronyms "n", "cg", and "ud". All ParameterObjects support automatic acronym expansion of argument strings. This is an important and time-saving shortcut.

The previous example edited the panning of Texture "a1" such that it produces values within the range of .5 to 1. This limits the spatial location of the sound to the upper half of the range (the middle to right stereo position). To limit the spatial location of "b1" in a complementary fashion, the Texture is edited to produce values within the range 0 to .5, corresponding to the lower half of the range (the middle to left stereo position). In the example below, TIo is used to select "b1" before entering the TIe command. TEv is then used to compare panning values for all Textures.

Editing the panning of a TextureInstance

pi{auto-muteHiConga}ti{b1} :: tio b1
TI b1 now active.

pi{auto-muteHiConga}ti{b1} :: tie n wpd,e,15,.25,2.5,0,.5
TI b1: parameter panning updated.

pi{auto-muteHiConga}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: o, duration: 005.0--20.06
(i)nstrument        62 (generalMidiPercussion: muteHiConga)
(t)ime range        05.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              auto-muteHiConga
                    (D4)
                    15.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomUniform, (constant, 0.6), (constant, 1)
pan(n)ing           wavePowerDown, event, (constant, 15), 0.25, 2.5, (constant,
                    0), (constant, 0.5)
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

pi{auto-muteHiConga}ti{b1} :: tev n
compare parameters: panning
{name,value,}
a1                  constant, 0.5
b1                  wavePowerDown, event, (constant, 15), 0.25, 2.5, (constant,
                    0), (constant, 0.5)

Notice that, in the above example, the user provided complete command-line arguments for the TIe command. When entering a ParameterObject from the command-line, no spaces, and only commas, can be used between ParameterObject arguments. As command-line arguments are space delimited (and ParameterObject arguments are comma delimited), a ParameterObject on the command line must be given without spaces between arguments. When providing a ParameterObject to a TIe prompt, however, spaces may be provided.

Editing Rhythm ParameterObjects

Rhythm ParameterObjects are ParameterObjects specialized for generating time and rhythm information. Many Rhythm ParameterObjects use Pulse object notations to define proportional rhythms and reference a Texture's dynamic bpm attribute. Other ParameterObjects are independent of bpm and can use raw timing information provided by one or more Generator ParameterObjects.

When using proportional rhythms, athenaCL uses Pulse objects. Pulses represent a ratio of duration in relation to the duration of beat (specified in BPM and obtained from the Texture). For details on Pulse notation, enter "help pulse":

View Pulse and Rhythm help

pi{auto-muteHiConga}ti{b1} :: help pulse
{topic,documentation}
Pulse and Rhythm    Pulses represent a duration value derived from ratio and a
                    beat-duration. Beat duration is always obtained from a
                    Texture. Pulses are noted as a list of three values: a
                    divisor, a multiplier, and an accent. The divisor and
                    multiplier must be positive integers greater than zero.
                    Accent values must be between 0 and 1, where 0 is a measured
                    silence and 1 is a fully sounding event. Accent values my
                    alternatively be notated as + (for 1) and o (for 0). If a
                    beat of a given duration is equal to a quarter note, a Pulse
                    of (1,1,1) is a quarter note, equal in duration to a beat. A
                    Pulse of (2,1,0) is an eighth-note rest: the beat is divided
                    by two and then multiplied by one; the final zero designates
                    a rest. A Pulse of (4,3,1) is a dotted eight note: the beat
                    is divided by four (a sixteenth note) and then multiplied by
                    three; the final one designates a sounding event. A Rhythm
                    is designated as list of Pulses. For example: ((4,2,1),
                    (4,2,1), (4,3,1)).

To edit the rhythms used by Texture b1, enter TIe followed by an "r" to access the rhythm attribute. As before, the user is presented with the current value, then prompted for a new value. In the following example, the ParameterObject "loop" is examined first with the TPv, then the active Texture is edited by providing an random walk over an expanded rhythm. Finally, the rhythm attribute of all Textures is viewed with TEv.

Editing Rhythm ParameterObjects with TIe

pi{auto-muteHiConga}ti{b1} :: tpv loop
Rhythm Generator ParameterObject
{name,documentation}
Loop                loop, pulseList, selectionString
                    Description: Deploys a fixed list of rhythms. Pulses are
                    chosen from this list using the selector specified by the
                    selectionString argument. Arguments: (1) name, (2) pulseList
                    {a list of Pulse notations}, (3) selectionString
                    {'randomChoice', 'randomWalk', 'randomPermutate',
                    'orderedCyclic', 'orderedCyclicRetrograde',
                    'orderedOscillate'}

pi{auto-muteHiConga}ti{b1} :: tie
command.py: raw args  
edit TI b1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): r
current rhythm: pulseTriple, (constant, 4), (basketGen, randomPermutate,
(1,1,2,3)), (constant, 1), (constant, 0.75)
new value: l, ((4,1,1),(4,1,1),(4,2,1),(4,3,1),(4,5,1),(4,3,1)), rw
TI b1: parameter rhythm updated.

pi{auto-muteHiConga}ti{b1} :: tev r
compare parameters: rhythm
{name,value,}
a1                  pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
b1                  loop, ((4,1,+),(4,1,+),(4,2,+),(4,3,+),(4,5,+),(4,3,+)),
                    randomWalk

Notice that, as with all ParameterObjects, abbreviations can be used for argument strings. The user need only enter the string "l" to select the "loop" RhythmObject, and "rw" to select the randomWalk selection method.

To edit Texture a1, the user must first make a1 the active texture with TIo. In the following example, the user applies a zero-order Markov chain to generate pulses. The user fist consults the documentation for ParameterObject markovPulse. For more information about Markov transition strings (Ariza 2006 [AN#1343]), enter "help markov". After selecting and editing the Texture, the Rhythms are compared with TEv:

Editing Rhythm ParameterObjects with TIe

pi{auto-muteHiConga}ti{b1} :: tpv markovp
Rhythm Generator ParameterObject
{name,documentation}
markovPulse         markovPulse, transitionString, parameterObject
                    Description: Produces Pulse sequences by means of a Markov
                    transition string specification and a dynamic transition
                    order generator. The Markov transition string must define
                    symbols that specify valid Pulses. Markov transition order
                    is specified by a ParameterObject that produces values
                    between 0 and the maximum order available in the Markov
                    transition string. If generated-orders are greater than
                    those available, the largest available transition order will
                    be used. Floating-point order values are treated as
                    probabilistic weightings: for example, a transition of 1.5
                    offers equal probability of first or second order selection.
                    Arguments: (1) name, (2) transitionString, (3)
                    parameterObject {order value}

pi{auto-muteHiConga}ti{b1} :: tio a1
TI a1 now active.

pi{auto-muteHiConga}ti{a1} :: tie
edit TI a1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): r
current rhythm: pulseTriple, (constant, 4), (basketGen, randomPermutate,
(1,1,2,3)), (constant, 1), (constant, 0.75)
new value: mp, a{8,1,1}b{4,3,1}c{4,2,1}d{4,5,1}:{a=1|b=3|c=4|d=7}, (c,0)
TI a1: parameter rhythm updated.

pi{auto-muteHiConga}ti{a1} :: tev r
compare parameters: rhythm
{name,value,}
a1                  markovPulse,
                    a{8,1,1}b{4,3,1}c{4,2,1}d{4,5,1}:{a=1|b=3|c=4|d=7},
                    (constant, 0)
b1                  loop, ((4,1,+),(4,1,+),(4,2,+),(4,3,+),(4,5,+),(4,3,+)),
                    randomWalk
                    

In the previous example, the user supplies four Pulses; each pulses is weighted such that the shortest, (8,1,1), is the least frequent (weight of 1), and the longest, (4,5,1), is the most frequent (weight of 7).

Using ELn, the current collection of Textures can be used to create an EventList, and ELh may be used to audition the results. (For more information on using ELn, see .) Each time an EventList is created, different sequences of rhythms will be generated: for Texture a1, these rhythms will be the result of a zero-order Markov chain; for Texture b1, these rhythms will be the result of a random walk on an ordered list of Pulses.

A final alternation can be made to the metric performance of these Textures. Using the TEe command, both Texture's bpm attribute can be altered to cause a gradual accelerando from 120 BPM to 300 BPM. In the following example, the user applies a wavePowerUp ParameterObject to the bpm attribute of both Textures by using the TEe command with complete command-line arguments:

Editing BPM with TEe

pi{auto-muteHiConga}ti{a1} :: tee b wpu,t,20,0,2,120,300
TI a1: parameter bpm updated.
TI b1: parameter bpm updated.

Editing Instruments and Altering EventMode

A Texture's instrument can be edited like other Texture attributes. The instruments available for editing, just as when creating a Texture, are dependent on the active EventMode. To use instruments from another EventMode, the active EventMode must first be changed, and then the Texture may be assigned an instrument.

In the following example, the user changes the EventMode to csoundNative with EMo, examines the available instruments with EMi, and then assigns each Texture instrument 80:

Changing EventMode and editing Texture instrument

pi{auto-muteHiConga}ti{a1} :: emo cn
EventMode mode set to: csoundNative.

pi{auto-muteHiConga}ti{a1} :: emi
csoundNative instruments:
{number,name}
   3      sineDrone                        
   4      sineUnitEnvelope                 
   5      sawDrone                         
   6      sawUnitEnvelope                  
   11     noiseWhite                       
   12     noisePitched                     
   13     noiseUnitEnvelope                
   14     noiseTambourine                  
   15     noiseUnitEnvelopeBandpass        
   16     noiseSahNoiseUnitEnvelope        
   17     noiseSahNoiseUnitEnvelopeDistort 
   20     fmBasic                          
   21     fmClarinet                       
   22     fmWoodDrum                       
   23     fmString                         
   30     samplerReverb                    
   31     samplerRaw                       
   32     samplerUnitEnvelope              
   33     samplerUnitEnvelopeBandpass      
   34     samplerUnitEnvelopeDistort       
   35     samplerUnitEnvelopeParametric    
   36     samplerSahNoiseUnitEnvelope      
   40     vocodeNoiseSingle                
   41     vocodeNoiseSingleGlissando       
   42     vocodeNoiseQuadRemap             
   43     vocodeNoiseQuadScale             
   44     vocodeNoiseQuadScaleRemap        
   45     vocodeNoiseOctScale              
   46     vocodeNoiseOctScaleRemap         
   47     vocodeNoiseBiOctScale            
   48     vocodeNoiseTriOctScale           
   50     guitarNylonNormal                
   51     guitarNylonLegato                
   52     guitarNylonHarmonic              
   60     additiveBellBright               
   61     additiveBellDark                 
   62     additiveBellClear                
   70     synthRezzy                       
   71     synthWaveformVibrato             
   72     synthVcoAudioEnvelopeSineQuad    
   73     synthVcoAudioEnvelopeSquareQuad  
   74     synthVcoDistort                  
   80     pluckTamHats                     
   81     pluckFormant                     
   82     pluckUnitEnvelope                
   110    noiseAudioEnvelopeSineQuad       
   111    noiseAudioEnvelopeSquareQuad     
   130    samplerAudioEnvelopeSineQuad     
   131    samplerAudioEnvelopeSquareQuad   
   132    samplerAudioFileEnvelopeFilter   
   133    samplerAudioFileEnvelopeFollow   
   140    vocodeSineOctScale               
   141    vocodeSineOctScaleRemap          
   142    vocodeSineBiOctScale             
   143    vocodeSineTriOctScale            
   144    vocodeSineQuadOctScale           
   145    vocodeSinePentOctScale           
   146    vocodeSineHexOctScale            
   230    samplerVarispeed                 
   231    samplerVarispeedAudioSine        
   232    samplerVarispeedReverb           
   233    samplerVarispeedDistort          
   234    samplerVarispeedSahNoiseDistort  
   240    vocodeVcoOctScale                
   241    vocodeVcoOctScaleRemap              

pi{auto-muteHiConga}ti{a1} :: tie i 80
baseTexture.py: WARNING: new Texture auxiliary value 2 
TI a1: parameter instrument updated.

pi{auto-muteHiConga}ti{a1} :: tio b1
TI b1 now active.

pi{auto-muteHiConga}ti{b1} :: tie i 80
baseTexture.py: WARNING: new Texture auxiliary value 2 
TI b1: parameter instrument updated.

pi{auto-muteHiConga}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: o, duration: 005.0--20.12
(i)nstrument        80 (csoundNative: pluckTamHats)
(t)ime range        05.0--20.0
(b)pm               wavePowerUp, time, (constant, 20), 0, 2, (constant, 120),
                    (constant, 300)
(r)hythm            loop, ((4,1,+),(4,1,+),(4,2,+),(4,3,+),(4,5,+),(4,3,+)),
                    randomWalk
(p)ath              auto-muteHiConga
                    (D4)
                    15.00(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomUniform, (constant, 0.6), (constant, 1)
pan(n)ing           wavePowerDown, event, (constant, 15), 0.25, 2.5, (constant,
                    0), (constant, 0.5)
au(x)iliary
      x0            cyclicGen, up, 0.1, 0.9, 0.1
      x1            cyclicGen, down, 800, 16000, 200
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

Notice that, after editing the Texture, a warning is issued. This warning tells the user that additional auxiliary ParameterObjects have been added. As a Csound-based instrument, each event of instrument 80 can accept two additional synthesis parameters. When viewing a Texture with this instrument, as shown above, the auxiliary display shows two additional ParameterObjects, x0 and x1. To learn what these auxiliary ParameterObjects control, the command TIdoc ma be used:

Examining Texture documentation with TIdoc

pi{auto-muteHiConga}ti{b1} :: tidoc
TI: b1, TM: LineGroove
(i)nstrument        80 (csoundNative: pluckTamHats)
(b)pm               (1) name, (2) stepString {'event', 'time'}, (3)
                    parameterObject {secPerCycle}, (4) phase, (5) exponent, (6)
                    min, (7) max
(r)hythm            (1) name, (2) pulseList {a list of Pulse notations}, (3)
                    selectionString {'randomChoice', 'randomWalk',
                    'randomPermutate', 'orderedCyclic',
                    'orderedCyclicRetrograde', 'orderedOscillate'}
local (f)ield       (1) name, (2) value
local (o)ctave      (1) name, (2) value
(a)mplitude         (1) name, (2) min, (3) max
pan(n)ing           (1) name, (2) stepString {'event', 'time'}, (3)
                    parameterObject {secPerCycle}, (4) phase, (5) exponent, (6)
                    min, (7) max
au(x)iliary
      x0            iparm (0-1)
                    (1) name, (2) directionString {'upDown', 'downUp', 'up',
                    'down'}, (3) min, (4) max, (5) increment
      x1            low-pass filter frequency
                    (1) name, (2) directionString {'upDown', 'downUp', 'up',
                    'down'}, (3) min, (4) max, (5) increment
texture (s)tatic
      s0            (1) name, (2) transpositionList, (3) timeDelay
      s1            (1) name, (2) selectionString {'randomChoice', 'randomWalk',
                    'randomPermutate', 'orderedCyclic',
                    'orderedCyclicRetrograde', 'orderedOscillate'}
      s2            (1) name, (2) level {'set', 'event'}
      s3            (1) name, (2) level {'set', 'event'}
texture (d)ynamic   none

Assuming that Csound is properly configured, a new set of EventLists can be created. As the user is now in EventMode csoundNative and has csoundNative textures, both a Csound score and a MIDI file are created. (See for more information on working with Csound in athenaCL.) The user may render the Csound score with ELr, and then audition the results with the ELh command.

Creating a new EventList with ELn

pi{auto-muteHiConga}ti{b1} :: eln
      EventList ath2010.07.03.18.40.11 complete:
/Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.bat
/Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.csd
/Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.mid
/Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.xml
audio rendering initiated: /Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.bat
EventList hear initiated: /Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.aif
EventList hear initiated: /Volumes/xdisc/_scratch/ath2010.07.03.18.40.11.mid

Displaying Texture Parameter Values

It is often useful to view the values produced by a Texture with a graphical diagram. The command TImap provides a multi-parameter display of all raw values input from ParameterObjects into the Texture. The values displayed by TImap are pre-TextureModule, meaning that they are the raw values produced by the ParameterObjects; the final parametric event values may be altered or completely changed by the Texture's internal processing (its TextureModule) to produce different arrangements of events. The TImap command thus only provides a partial representation of what a Texture produces.

To view a TImap display, the user's graphic preferences must be properly set (see for more information). The command TImap displays the active Texture:

Viewing a Texture with TImap

pi{auto-muteHiConga}ti{b1} :: timap
TImap (event-base, pre-TM) display complete.

Tutorial 5: Textures and Paths

This tutorial demonstrates basic use of Paths within Textures. This chapter is essential for understanding the use of Paths in algorithmic music production.

Path Linking and Pitch Formation Redundancy

Textures link to Paths. Said another way, a Texture contains a reference to a Path object stored in the AthenaObject. Numerous Textures can thus share the same Path; further, if a change is made to this Path, all Textures will reference the newly updated version of the Path.

Events generated by a Texture can derive pitch values from a sequence of many transformations. These transformations allow the user to work with Pitch materials in a wide variety of orientations and parametric specifications. One or more Textures may share a single Path to derive pitch class or pitch space pitch values. Each Texture has independent ParameterObject control of a local transposition (local field) and a local register position (local octave), and with most TextureModules this control can be configured to be applied once per event or once per Path set. Finally, each Texture has a modular Temperament object to provide microtonal and dynamic final pitch tuning. Ultimately, the TextureModule is responsible for interpreting this final pitch value into a linear, horizontal, or other event arrangement.

For example, a Texture may be linked to simple Path consisting of a single pitch. This pitch will serve as a referential pitch value for all pitch generation and transformation within the Texture. The Texture's local field and local octave controls could then be used to produce a diverse collection of Pitch values. Changing the single pitch of the Path would then provide global transposition of Texture-based pitch processes. Alternatively, a Path may specify a complex sequence of chord changes. Numerous Textures, linked to this single Path, could each apply different local octave settings to distinguish register, and could each apply different microtonal tunings with local field and Temperament settings.

Creating a Path with a Duration Fraction

First, the user creates a path consisting of three Multisets. As demonstrated in , there are many ways to create and edit a Path. In the following example, the user creates a new path named q1 by simply providing pitch space values using conventional note names. The path is the then viewed with the PIv command, and auditioned with the PIh command.

Creating a Path with PIn

pi{}ti{} :: pin
name this PathInstance: q1
enter a pitch set, sieve, spectrum, or set-class: D2,G#3,A3,D3,E2,B2,A2
      SC 5-29A as (D2,G#3,A3,D3,E2,B2,A2)? (y, n, or cancel): y
      add another set? (y, n, or cancel): y
enter a pitch set, sieve, spectrum, or set-class: C4,C#4,F#3,G4,A3
      SC 5-19A as (C4,C#4,F#3,G4,A3)? (y, n, or cancel): y
      add another set? (y, n, or cancel): y
enter a pitch set, sieve, spectrum, or set-class: G#5,A4,D#4,E5
      SC 4-8 as (G#5,A4,D#4,E5)? (y, n, or cancel): y
      add another set? (y, n, or cancel): n
PI q1 added to PathInstances.

pi{q1}ti{} :: piv
PI: q1
psPath              -22,-4,-3,-10,-20,-13,-15  0,1,-6,7,-3       20,9,3,16      
                    D2,G#3,A3,D3,E2,B2,A2      C4,C#4,F#3,G4,A3  G#5,A4,D#4,E5  
pcsPath             2,8,9,2,4,11,9             0,1,6,7,9         8,9,3,4        
scPath              5-29A                      5-19A             4-8            
durFraction         1(33%)                     1(33%)            1(33%)         
TI References: none.

pi{q1}ti{} :: pih
PI q1 hear with TM LineGroove complete.
(/Volumes/xdisc/_scratch/ath2010.07.03.19.05.21.mid)

As should be clear from the psPath display or the auditioned MIDI file, Path q1 covers a wide pitch range, from E2 to G#5. Notice also that the "durFraction" specifies that each Multiset in the Path has an equal duration weighting (1, or 33%). The durFraction of a Path is a means of providing a proportional temporal weighting to each Multiset in the Path. When a Texture interprets a Path, it partitions its duration into as many segments as there are Path Multisets, and each segment is given a duration proportional to the Path durFraction. The command PIdf can be used to alter a Path's duration weighting. The user must supply a list of values, either as percentages (floating point or integer) or simply as numeric weightings. In the following example, after calling PIdf, the command PIh is used to audition the results of an altered durFraction:

Altering a Path's durFraction with PIdf

pi{q1}ti{} :: pidf
edit PI q1
enter a list of duration fractions: 8,5,3
PI q1 edited.

pi{q1}ti{} :: piv
PI: q1
psPath              -22,-4,-3,-10,-20,-13,-15  0,1,-6,7,-3       20,9,3,16      
                    D2,G#3,A3,D3,E2,B2,A2      C4,C#4,F#3,G4,A3  G#5,A4,D#4,E5  
pcsPath             2,8,9,2,4,11,9             0,1,6,7,9         8,9,3,4        
scPath              5-29A                      5-19A             4-8            
durFraction         8(50%)                     5(31%)            3(19%)         
TI References: none.

pi{q1}ti{} :: pih
PI q1 hear with TM LineGroove complete.
(/Volumes/xdisc/_scratch/ath2010.07.03.19.08.09.mid)

The PIv display shows that the Multisets are weighted such that the first is given 50%, the second 31%, and the last 19%. The MIDI file created with PIh should confirm this distribution.

Setting EventMode and Creating a Texture

As explained in , the athenaCL EventMode determines what instruments are available for Texture creation. In the following example, the EventMode is set to midi, the TextureModule LiteralVertical is selected, a new Texture is created with instrument 0, and the Texture is displayed with TIv.

Creating a Texture with TM LiteralVertical

pi{q1}ti{} :: emo midi
EventMode mode set to: midi.

pi{q1}ti{} :: tmls
TextureModules available:
{name,TIreferences}
   DroneArticulate    0
   DroneSustain       0
   HarmonicAssembly   0
   HarmonicShuffle    0
   InterpolateFill    0
   InterpolateLine    0
   IntervalExpansion  0
   LineCluster        0
 + LineGroove         0
   LiteralHorizontal  0
   LiteralVertical    0
   MonophonicOrnament 0
   TimeFill           0
   TimeSegment        0

pi{q1}ti{} :: tmo lv
TextureModule LiteralVertical now active.

pi{q1}ti{} :: tin a1 0
TI a1 created.

pi{q1}ti{a1} :: tiv
TI: a1, TM: LiteralVertical, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 000.0--19.94
(i)nstrument        0 (generalMidi: piano1)
(t)ime range        00.0--20.0
(b)pm               constant, 120
(r)hythm            pulseTriple, (constant, 4), (basketGen, randomPermutate,
                    (1,1,2,3)), (constant, 1), (constant, 0.75)
(p)ath              q1
                    (D2,G#3,A3,D3,E2,B2,A2),(C4,C#4,F#3,G4,A3),(G#5,A4,D#4,E5)
                    10.00(s), 6.25(s), 3.75(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.5
au(x)iliary         none
texture (s)tatic
      s0            loopWithinSet, on
      s1            maxTimeOffset, 0.03
      s2            levelFieldPolyphonic, event
      s3            levelOctavePolyphonic, event
      s4            pathDurationFraction, on
texture (d)ynamic   none     

Notice that the Texture's Path attribute is set to q1. In all cases, a Texture, when created, links to the active Path. The Path a Texture links to can be edited later if necessary. Notice also that the Path listing in the TIv display shows the pitches of the Path, as well as timings for each set: 10, 6.25, and 3.74 seconds respectively. These times are the result of the duration fraction applied to the Texture's duration.

To hear this Texture, create an EventList as explained in . After using the ELn command, the ELh command can be used to open the MIDI file. Notice that each chord lasts the appropriate duration fraction of the total twenty-second duration of the Texture.

A few small edits to this Texture will make it more interesting. In the following example, both the rhythm and amplitude are edited: the rhythm is given more Pulses and made to oscillate back and forth along the specified series; the amplitude randomly selects from a list of four amplitudes.

Editing a Texture

pi{q1}ti{a1} :: tie r l, ((4,1,1), (4,1,1), (4,3,0), (2,3,1), (3,2,1), (3,2,1)), oo
TI a1: parameter rhythm updated.

pi{q1}ti{a1} :: tie a bg, rc, (.5,.6,.8,1) 
TI a1: parameter amplitude updated.

Again, ELn and ELh can be used to create and audition the resulting musical structure.

PitchMode

PitchMode is a Texture attribute that controls the interpretation of the Path from inside a TextureInstance.

PitchMode determines if a Path is represented to the Texture as a pitch space set, a pitch class set, or set class. As a pitch space set, a Texture performs register information included in a Path. The set (1,11,24), performed as a pitch space set, would consist of a C-sharp, a B-natural a minor seventh above the lowest pitch, and C-natural an octave and major-seventh above the lowest pitch. The set (1,11,24) performed as a pitch-class set, would be interpreted as the set (1,11,0): register information is removed, while pitch class is retained. The set (1,11,24), performed as a set-class, would be interpreted as the set (0,1,2): register and pitch-class are removed, while the normal-form of the set-class is retained.

In the following example, a new Texture is created from TextureModule LineGroove. First, the TM must be selected with the TMo command. Next, a new Texture named b1 is created with the TIn command. The TImode command can be used to edit many Texture options. In this example, pitchMode is selected and "pcs," for pitch class space, is selected. Finally, the Texture is given a more interesting rhythm, by use of the Rhythm ParameterObject markovPulse, and is panned to the right with a constant value:

Editing PitchMode of a TextureInstance

pi{q1}ti{a1} :: tmo lg
TextureModule LineGroove now active.

pi{q1}ti{a1} :: tin b1 0
TI b1 created.

pi{q1}ti{b1} :: timode
edit TI b1: Pitch, Polyphony, Silence, or PostMap Mode? (p, y, s, m): p
      current Pitch Mode: pitchSpace. enter new mode (sc, pcs, ps): pcs
Pitch Mode changed to pitchClass

pi{q1}ti{b1} :: tie
edit TI b1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): r
current rhythm: pulseTriple, (constant, 4), (basketGen, randomPermutate,
(1,1,2,3)), (constant, 1), (constant, 0.75)
new value: mp, a{6,1,1}b{3,2,0}c{3,5,1}:{a=5|b=3|c=2}, (c,0)
TI b1: parameter rhythm updated.

pi{q1}ti{b1} :: tie n c,.9
TI b1: parameter panning updated.

pi{q1}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchClass, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 000.0--19.83
(i)nstrument        0 (generalMidi: piano1)
(t)ime range        00.0--20.0
(b)pm               constant, 120
(r)hythm            markovPulse, a{6,1,1}b{3,2,0}c{3,5,1}:{a=5|b=3|c=2},
                    (constant, 0)
(p)ath              q1
                    (D2,G#3,A3,D3,E2,B2,A2),(C4,C#4,F#3,G4,A3),(G#5,A4,D#4,E5)
                    10.00(s), 6.25(s), 3.75(s)
local (f)ield       constant, 0
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.9
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

Because Path q1 is still active, this new Texture is assigned the same Path as Texture a1. After setting the Texture's pitchMode to pitchClassSpace, however, Texture b1 will receive only pitch class values from Path q1: all register information, as performed in Texture a1, is stripped. By creating a new EventList with ELn and auditioning the results, it should be clear that both Textures share the same pitch information and duration weighting. Notice that the faster-moving single-note line Texture b1, however, stays within a single register. When a Texture is in pitchClassSpace Pitch mode, all pitches from a Path are interpreted within the octave from C4 to C5.

Editing Local Octave

With a Texture's local field and local octave controls, ParameterObjects can be used to alter the pitches derived from a Path. In most TextureModules, the transformation offered by field and octave control can be applied either once per Multiset, or once per event. This is set by editing the TextureStatic options levelField and levelOctave.

In the following example, the local octave attribute of Texture b1 is edited such that octaves are chosen in order from a list of possibilities, creating a sequence of octave transpositions. An octave value of 0 means no transposition; an octave of -2 means a transposition two octaves down.

Editing Local Octave

pi{q1}ti{b1} :: tie
command.py: raw args  
edit TI b1
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): o
current local octave: constant, 0
new value: bg, oc, [-3,-2,2,-1]
TI b1: parameter local octave updated.

pi{q1}ti{b1} :: tiv
TI: b1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchClass, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 000.0--19.83
(i)nstrument        0 (generalMidi: piano1)
(t)ime range        00.0--20.0
(b)pm               constant, 120
(r)hythm            markovPulse, a{6,1,1}b{3,2,0}c{3,5,1}:{a=5|b=3|c=2},
                    (constant, 0)
(p)ath              q1
                    (D2,G#3,A3,D3,E2,B2,A2),(C4,C#4,F#3,G4,A3),(G#5,A4,D#4,E5)
                    10.00(s), 6.25(s), 3.75(s)
local (f)ield       constant, 0
local (o)ctave      basketGen, orderedCyclic, (-3,-2,2,-1)
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.9
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

Listening to the results of the previous edit (with ELn and ELh), it should be clear that a new octave is applied to each event of Texture b1, creating an regular oscillation of register independent of Path Multiset.

Alternatively, the user may desire local octave and field controls to only be applied once per Multiset. This option can be set for TextureModule LineGroove by editing the TextureStatic parameter "levelOctaveMonophonic." In the following example, the user examines the documentation of ParameterObject levelOctaveMonophonic, and a copy of Texture b1 is created named b2. Next, this Texture's panning is edited, and then the TextureStatic option levelOctaveMonophonic is changed from "event" to "set":

Editing TextureStatic

pi{q1}ti{b1} :: tpv leveloctave
Texture Static ParameterObject
{name,documentation}
levelOctaveMonophonic levelOctaveMonophonic, level
                      Description: Toggle between selection of local octave
                      (transposition) values per set of the Texture Path, or per
                      event. Arguments: (1) name, (2) level {'set', 'event'}
levelOctavePolyphonic levelOctavePolyphonic, level
                      Description: Toggle between selection of local octave
                      (transposition) values per set of the Texture Path, per
                      event, or per polyphonic voice event. Arguments: (1) name,
                      (2) level {'set', 'event', 'voice'}

pi{q1}ti{b1} :: ticp b1 b2
TextureInstance b2 created.

pi{q1}ti{b2} :: tie 
edit TI b2
which parameter? (i,t,b,r,p,f,o,a,n,x,s,d): s
select a texture static parameter to edit, from s0 to s3: 3
current value for s3: event
new value: set
TI b2: parameter texture static updated.

pi{q1}ti{b2} :: tie n c,.1
TI b2: parameter panning updated.

Listening to a new EventList created with these three Textures (with ELn and ELh), it should be clear that all pitch information is synchronized by use of a common Path. In the case of Texture a1, the pitches are taken directly from the Path with register. In the case of Texture b1 (right channel), the Path pitches, without register, are transposed into various registers for each event. In the case of Texture b2 (left channel), the Path pitches, also without register, are transposed into various registers only once per Multiset.

Editing Local Field and Temperament

Within athenaCL, any pitch can be tuned to microtonal specifications, allowing the user to apply non-equal tempered frequencies to each pitch in either a fixed relationship or a dynamic, algorithmically generated manner. Within athenaCL Textures there are two ways to provide microtonal tunings. First, pitches can be transposed and tuned with any ParameterObject by using the Texture local field attribute. Each integer represents a half-step transposition, and floating point values can provide any detail of microtonal specification. Second, each Texture can have a different Temperament, or tuning system based on either pitch class, pitch space, or algorithmic specification. The command TTls allows the user to list the available TextureTemperaments.

Listing all TextureTemperaments

pi{q1}ti{b2} :: ttls
TextureTemperaments available for TI b2:
{name,tunning}
 + TwelveEqual       
   Pythagorean       
   Just              
   MeanTone          
   Split24Upper      
   Split24Lower      
   Interleave24Even  
   Interleave24Odd   
   NoiseLight        
   NoiseMedium       
   NoiseHeavy        

The temperament "TwelveEqual" is the active Temperament for current Texture b2. This temperament produces equal-tempered frequencies. To select a different temperament for the active Texture, enter the command TTo. In the example below the user selects the temperament NoiseLight for Textures b2 and Texture b1, and then selects the temperament NoiseMedium for Texture a1. In the last case, two command are given on the some command line. As is the UNIX convention, the commands and arguments are separated by a semicolon:

Selecting Texture Temperament with TTo

pi{q1}ti{b2} :: tto
select a TextureTemperament for TI b2: (name or number 1-11): nl
TT NoiseLight now active for TI b2.

pi{q1}ti{b2} :: tio b1
TI b1 now active.

pi{q1}ti{b1} :: tto nl
TT NoiseLight now active for TI b1.

pi{q1}ti{b1} :: tio a1; tto nm
TI a1 now active.

TT NoiseMedium now active for TI a1.

Not all EventOutputs can perform microtones. MIDI files, for example, cannot store microtonal specifications of pitch. Though such pitches will be generated within athenaCL, they will be rounded when written to the MIDI file. EventOutputs for Csound, however, can handle microtones.

Tutorial 6: Textures and Clones

This tutorial demonstrates basic Clone creation, configuration, and deployment in musical structures. Clones provide an additional layer of algorithmic music production, processing the literal output of Textures.

Introduction to Clones

A TextureClone (or a Clone or TC) is a musical part made from transformations of the exact events produced by a single Texture. Said another way, a Clone is not a copy of a Texture, but a transformed copy of the events produced by a Texture. Textures are not static entities, but algorithmic instructions that are "performed" each time an EventList is created. In order to capture and process the events of a single Texture, one or more Clones can be created in association with a single Texture.

Clones use Filter ParameterObjects to parametrically modify events produced from the parent Texture. Clones can be used to achieve a variety of musical structures. An echo is a simple example: by shifting the start time of events, a Clone can be used to create a time-shifted duplicate of a Texture's events. Clones can be used with a Texture to produce transformed motivic quotations of events, or can be used to thicken or harmonize a Texture with itself, for instance by filtering event pitch values.

Clones are also capable of non-parametric transformations that use CloneStatic ParameterObjects. For example a Clone, using a retrograde transformation, can reverse the events of a Texture.

Creating and Editing Clones

First, using EventMode midi and instrument 0, a Texture with a descending melodic arc will be created. The Texture's time range is set from 0 to 6. The Texture's rhythm employs the ParameterObject convertSecond and uses a standard Generator ParameterObject to create raw duration values in seconds. Finally, This Texture, using a Path only as a reference pitch, employs the Texture's local field to provide harmonic shape.

Creating a Texture

pi{}ti{} :: emo m
EventMode mode set to: midi.

pi{}ti{} :: tin a1 0
TI a1 created.

pi{auto}ti{a1} :: tie t 0,6
TI a1: parameter time range updated.

pi{auto}ti{a1} :: tie r cs,(wpd,e,16,2,0,.6,.02)
TI a1: parameter rhythm updated.

pi{auto}ti{a1} :: tie f wpd,e,16,2,0,12,-24
TI a1: parameter local field updated.

pi{auto}ti{a1} :: tiv
TI: a1, TM: LineGroove, TC: 0, TT: TwelveEqual
pitchMode: pitchSpace, silenceMode: off, postMapMode: on
midiProgram: piano1
      status: +, duration: 00.0--6.41
(i)nstrument        0 (generalMidi: piano1)
(t)ime range        0.0--6.0
(b)pm               constant, 120
(r)hythm            convertSecond, (wavePowerDown, event, (constant, 16), 2, 0,
                    (constant, 0.6), (constant, 0.02))
(p)ath              auto
                    (C4)
                    6.00(s)
local (f)ield       wavePowerDown, event, (constant, 16), 2, 0, (constant, 12),
                    (constant, -24)
local (o)ctave      constant, 0
(a)mplitude         randomBeta, 0.4, 0.4, (constant, 0.7), (constant, 0.9)
pan(n)ing           constant, 0.5
au(x)iliary         none
texture (s)tatic
      s0            parallelMotionList, (), 0.0
      s1            pitchSelectorControl, randomPermutate
      s2            levelFieldMonophonic, event
      s3            levelOctaveMonophonic, event
texture (d)ynamic   none

After creating a Texture, a Clone can be created with the command TCn, for TextureClone New. The user is prompted to enter the name of the new Clone. By default, the Filter ParameterObject filterAdd is applied to the start time of all events with a duration equal to one Pulse. A Clone can be displayed with the TCv command. After displaying the Clone, the user examines the documentation for ParameterObject filterAdd:

Creating and Viewing a Clone with TCn and TCv

pi{auto}ti{a1} :: tcn
name this TextureClone: w1
TC w1 created.

pi{auto}ti{a1} :: tcv
TC: w1, TI: a1
      status: +, duration: 00.5--6.91
(t)ime              filterAdd, (loop, ((1,1,+)), orderedCyclic) 
s(u)stain           bypass                                      
a(c)cent            bypass                                      
local (f)ield       bypass                                      
local (o)ctave      bypass                                      
(a)mplitude         bypass                                      
pan(n)ing           bypass                                      
au(x)iliary         none                                        
clone (s)tatic                                                  
      s0            timeReferenceSource, textureTime            
      s1            retrogradeMethodToggle, off 

The Filter ParameterObject bypass is the default for most Clone attributes. This ParameterObject simply passes values through to the Clone unaltered.

Upon creating a new EventList and auditioning the results (with ELn and ELh, see for more information), the descending melodic line of a1 can be heard echoed by Clone w1. In the following example, another Clone is created called w2. This Clone is then edited to have a time value that, rather than shifted by a constant, is scaled by a value that oscillates between 1 and 2. The Clone's local field filter is also set to transpose the Texture's pitches seven half-steps down. The procedure for editing Clone ParameterObjects is similar to that for editing Textures, except for that only Filter ParameterObjects can be provided.

Editing a Clone with TCe

pi{auto}ti{a1} :: tcn w2
TC w2 created.

pi{auto}ti{a1} :: tpv fma
Filter ParameterObject
{name,documentation}
FilterMultiplyAnchor filterMultiplyAnchor, anchorString, parameterObject
                     Description: All input values are first shifted so that the
                     position specified by anchor is zero; then each value is
                     multiplied by the value produced by the parameterObject.
                     All values are then re-shifted so that zero returns to its
                     former position. Arguments: (1) name, (2) anchorString
                     {'lower', 'upper', 'average', 'median'}, (3)
                     parameterObject {operator value generator}

pi{auto}ti{a1} :: tce t fma, l, (ws, e, 8, 0, 1, 2)
TC w2: parameter time updated.

pi{auto}ti{a1} :: tce f fa,(c,-7)
TC w2: parameter local field updated.

pi{auto}ti{a1} :: tcv
TC: w2, TI: a1
      status: +, duration: 000.0--11.41
(t)ime              filterMultiplyAnchor, lower, (waveSine, event, (constant,
                    8), 0, (constant, 1), (constant, 2))
s(u)stain           bypass
a(c)cent            bypass
local (f)ield       filterAdd, (constant, -7)
local (o)ctave      bypass
(a)mplitude         bypass
pan(n)ing           bypass
au(x)iliary         none
clone (s)tatic
      s0            timeReferenceSource, textureTime
      s1            retrogradeMethodToggle, off

As with Textures and other objects in athenaCL, Clones can be listed with the TCls command, and the active Clone can be selected with the TCo command. Further, upon examining the parent Texture with TIls, notice that two Clones are now displayed under the TC heading:

Listing and Selecting Clones with TCls and TCo

pi{auto}ti{a1} :: tcls
TextureClones of TI a1
{name,status,duration}
   w1               + 00.5--6.91      
 + w2               + 000.0--11.41 

pi{auto}ti{a1} :: tco w1
TC w1 of TI a1 now active.

pi{auto}ti{a1} :: tils
TextureInstances available:
{name,status,TM,PI,instrument,time,TC}
 + a1               + LineGroove  auto        0   0.0--6.0   2

Clones features special transformations selected by CloneStatic ParameterObjects. In the following example, a new Clone is created named w3. The CloneStatic ParameterObject retrogradeMethodToggle is set to timeInverse, causing the Clone to create a retrograde presentation of the Texture's events. Additionally, the Clone's time attribute is set with a filterMultuplyAnchor ParameterObject and the Clone's field attributes is set with a filterAdd ParameterObject:

Creating and Editing Clones

pi{auto}ti{a1} :: tpv retrograde
Clone Static ParameterObject
{name,documentation}
retrogradeMethodToggle retrogradeMethodToggle, name
                       Description: Selects type of retrograde transformation
                       applied to Texture events. Arguments: (1) name, (2) name
                       {'timeInverse', 'eventInverse', 'off'}

pi{auto}ti{a1} :: tcn w3
TC w3 created.

pi{auto}ti{a1} :: tce 
edit TC a1
which parameter? (t,u,c,f,o,a,n,x,s): s
select a clone static parameter to edit, from s0 to s1: 1
current value for c1: off
new value: timeinverse
TC w3: parameter clone static updated.

pi{auto}ti{a1} :: tce t fma,l,(c,2.5)
TC w3: parameter time updated.

pi{auto}ti{a1} :: tce f fa,(c,7)
TC w3: parameter local field updated.

The TEmap command displays all Textures as well as all Texture Clones. Texture Clones appear under their parent Texture. Textures and Clones, further, can be muted independently.

Viewing Textures and Clones with TEmap

pi{auto}ti{a1} :: temap
TextureEnsemble Map:
15.22s              |      .       |      .       |      .      |       .      |
a1                  _________________________                                   
      w3            ............................................................
      w2               .............................................
      w1                 .........................

Tutorial 7: Scripting athenaCL in Python

This tutorial demonstrates some of the ways the athenaCL system can be automated, scripted, and used from within the Python programming language.

Creating an athenaCL Interpreter within Python

Within a Python interpreter or a Python script on any platform, one or more instances of the athenaCL Interpreter can be created and programmatically controlled. Programming a sequence of athenaCL commands via a Python script provides maximal control and flexibility in using athenaCL. Loops, external procedures, and a variety of programming designs can be combined with the high-level syntax of the athenaCL command line. Furthermore, command sequences can be stored, edited, and developed.

The cmd() method of the athenaCL Interpreter can be used to be pass strings or Python data structures. The cmd() method will raise an exception on error. The following example creates an athenaCL Interpter instance named ath and sends it a number of commands to generate a drum beat.

An athenaCL Interpreter in Python

from athenaCL.libATH import athenaObj
ath = athenaObj.Interpreter()
ath.cmd('emo mp')
ath.cmd('tmo lg')

ath.cmd('tin a1 36')
ath.cmd('tie r l,((4,3,1),(4,3,0),(4,2,1)),rc')

ath.cmd('tin b1 37')
ath.cmd('tie r l,((4,6,1),(4,1,1),(4,3,1)),rc')

ath.cmd('tin c1 53')
ath.cmd('tie r l,((4,1,1),(4,1,1),(4,6,0)),rw')

ath.cmd('tee a bg,rc,(.5,.7,.75,.8,1)')
ath.cmd('tee b ws,t,4,0,122,118')

ath.cmd('eln; elh')

For advanced and/or extended work with athenaCL, automating command string execution is highly recommended. Included with the athenaCL distribution is over 30 Python files demonstrating fundamental concepts of working with the system. These files can be found in the demo directory and also in .

Creating athenaCL Generator ParameterObjects within Python

Components of the athenaCL system can be used in isolation as resources within Python. Generator ParameterObjects offer particularly useful resources for a range of generative activities.

To create a Generator ParameterObject, a Python list of ParameterObject arguments must be passed to the factory() function of the parameter module. This list of arguments must provide proper data objects for each argument.

The returned ParameterObject instance has many useful attributes and methods. The doc attribute provides the ParameterObject documentation string. The str method, accessed with the built-in str() function, returns the complete formatted argument string. The call method, accessed by calling the instance name, takes a single argument and returns the next value, or the value at the specified argument time value.

Creating a Generator ParameterObject

>>>  po = parameter.factory(['ws','t',6,0,-1,1])
>>> str(po)
'waveSine, time, (constant, 6), 0, (constant, -1), (constant, 1)'
>>> po.doc
'Provides sinusoid oscillation between 0 and 1 at a rate given in either time or events per period. This value is scaled within the range designated by min and max; min and max may be specified with ParameterObjects. Depending on the stepString argument, the period rate (frequency) may be specified in spc (seconds per cycle) or eps (events per cycle). The phase argument is specified as a value between 0 and 1. Note: conventional cycles per second (cps or Hz) are not used for frequency.' 
>>> po(1)
0.8660254037844386
>>> po(5)
-0.86602540378443904

Creating athenaCL Generator ParameterObjects within Csound

Within Csound 5.0 orchestras, Python scripts can be written and objects from Python libraries can be instantiated and processed. Numerous Generator ParameterObjects and other athenaCL objects can be created, modified, and called from within Csound instruments. For complete examples, see the detailed articles on the topic (Ariza [AN#1824], [AN#1990]).