Concepts On top of this first layer of representation, we build a hierarchy of concepts that represent the structural part of the programmer's expertise. As will be explained below, the concepts introduced here are used to define transformations. We divide these concepts into three categories: Abstract Concepts Built from Fundamental Concepts. These include partial descriptions of sounds, such as heldTimeFunction, defined as a TimeFunction whose sustainLevel value isConcepts Built from Fundamental Concepts. These include partial descriptions of sounds, such as heldTimeFunction, defined as a TimeFunction whose sustainLevel value is greater than or equal to 1. In synthesis terms, this allows us to describe, for instance, sounds whose loudness eventually stabilizes to a non-zero value. On the Korg 05R/W, this is obtained by setting the Time Variant Amplifier Envelope Generator's Sustain Level to a strictly positive value: timeFunction and the (sustainLevel, ge(1)) => heldTimeFunction. Similarly, we introduce abstract concepts that, as will be seen below, play a part in building up the brassy-able sound type's representation. Figure 3 Rolland and Pachet 53 This content downloaded from 207.46.13.131 on Sat, 15 Oct 2016 04:26:25 UTC All use subject to http://about.jstor.org/terms Figure 3. Example of code used for introducing abstract concepts. FilterEnveloppe and heldTimeFunction and the(attackTime, ge(17) and le(25)) and the(attackLevel, ge(85)) and the(decayTime, ge(60) and le(75)) and the(intermediateLevel, ge(25) and le(35)) and the(heldLevel, ge(25) and le(35)) => brassyAbleFilterEnv. filter and the(hasEnveloppe, brassyAbleFilterEnv) => brassyAbleFilter. brightTone and the(hasFilter, brassyAbleFilter) and the(hasAmp, brassyAbleAmp) => brassyAbleTone. voice and atleast (1, hasTone, brassyAbleTone) => brassyAbleVoice. shows the manner in which these interdependent, abstract concepts are introduced. Other examples of abstract concepts that reflect structural expert knowledge are those describing sounds. Contrary to the above abstract concepts, these concepts provide complete descriptions of sounds which do not afford any particular transformation, but which are used for describing transformable sounds: sound and no(hasVoice, voiceWithInharmonicTone) => harmonicSound. Note that since any sound type is subsumed by the transformable sound type soundInGeneral, even instances of non-transformable sounds types can undergo some general transformations, such as make bright or make dull. Concepts Describing Transformable Sounds. Figure 4 shows a few examples of such concepts. Concepts Representing Transformations Themselves. With each sound type we associate a list of transformations, represented as character strings, as illustrated in Figure 5. This list is materialized by a sub-concept of possibleTransformations, an extensional concept that lists all possible transformations for all existing sound types. The Object-Oriented Representation of Sounds Representing sounds as objects, in the sense of object-oriented programming, is particularly natuFigure 4. Examples of transformable sounds. harmonicSound and some (hasVoice, brassyAbleVoice) => brassyAbleSound sound and all(hasVoice, sustainAbleVoice) => sustainAbleVoice. sound => soundInGeneral. ral in our context, where the emphasis is put on transformations. Each transformation is represented by a Smalltalk method defined in class CurrentSound. This method modifies the values of terminal parameters, using a pre-defined set of modifiers. For instance, Figure 6 shows the Smalltalk method that makes a sound sustained.