pile- a language for sound synthesis

13
The MIT Press is collaborating with JSTOR to digitize, preserve and extend access to Computer Music Journal. http://www.jstor.org PILE: A Language for Sound Synthesis Author(s): Paul Berg Source: Computer Music Journal, Vol. 3, No. 1 (Mar., 1979), pp. 30-41 Published by: The MIT Press Stable URL: http://www.jstor.org/stable/3679754 Accessed: 02-03-2015 16:48 UTC Your use of the JSTOR archive indicates your acceptance of the Terms & Conditions of Use, available at http://www.jstor.org/page/info/about/policies/terms.jsp JSTOR is a not-for-profit service that helps scholars, researchers, and students discover, use, and build upon a wide range of content in a trusted digital archive. We use information technology and tools to increase productivity and facilitate new forms of scholarship. For more information about JSTOR, please contact [email protected]. This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTC All use subject to JSTOR Terms and Conditions

Upload: samuel-van-ransbeeck

Post on 20-Nov-2015

236 views

Category:

Documents


0 download

DESCRIPTION

PILEis a computerlanguagefor directsoundsynthesis. A programwrittenin PILEoperatesin real-timeonce it has been compiled. Thereis no externaldata storage.Up to four channelsof soundmay be produced.Groupsof machine operationsform the basisfor PILEinstructions.It is possible to programdistinctsoundsanda structurefor them. It is also possible to programa structurewhich producessound. The PILEcompileris presentlyavailableon the PDP-15 computer at the Instituteof Sonologyin Utrecht.

TRANSCRIPT

  • The MIT Press is collaborating with JSTOR to digitize, preserve and extend access to Computer Music Journal.

    http://www.jstor.org

    PILE: A Language for Sound Synthesis Author(s): Paul Berg Source: Computer Music Journal, Vol. 3, No. 1 (Mar., 1979), pp. 30-41Published by: The MIT PressStable URL: http://www.jstor.org/stable/3679754Accessed: 02-03-2015 16:48 UTC

    Your use of the JSTOR archive indicates your acceptance of the Terms & Conditions of Use, available at http://www.jstor.org/page/info/about/policies/terms.jsp

    JSTOR is a not-for-profit service that helps scholars, researchers, and students discover, use, and build upon a wide range of contentin a trusted digital archive. We use information technology and tools to increase productivity and facilitate new forms of scholarship.For more information about JSTOR, please contact [email protected].

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.orghttp://www.jstor.org/action/showPublisher?publisherCode=mitpresshttp://www.jstor.org/stable/3679754http://www.jstor.org/page/info/about/policies/terms.jsphttp://www.jstor.org/page/info/about/policies/terms.jsp

  • PILE-

    A Language for Sound Synthesis

    Paul Berg Institute of Sonology

    Utrecht, The Netherlands

    Introduction

    PILE is a computer language for direct sound synthesis. A program written in PILE operates in real-time once it has been compiled. There is no external data storage. Up to four channels of sound may be produced. Groups of machine operations form the basis for PILE instructions. It is possible to program distinct sounds and a structure for them. It is also possible to program a structure which produces sound. The PILE compiler is presently available on the PDP-15 computer at the Institute of Sonology in Utrecht.

    The above statements indicate certain aspects of PILE which are uncommon among the work being done in computer sound synthesis. It is a language and not a program. It actually operates in real-time: calculations, decisions, and bookkeeping all occur as the sound is produced. This means that this language is also suitable for use with a limited hardware configuration. A large computer system is unnecessary. In contrast to other more or less real-time systems, PILE can simultaneously produce several sounds or layers of sounds. It is not limited to mono-linear strings of sounds.

    PILE instructions are based on groups of machine operations, not on a particular acoustical model. Parameters such as frequency, timbre, envelope, and duration are not specifically referenced. Rather, the available instructions fall into the following categories:

    (1) manipulation of the accumulator (2) manipulation of external devices (3) manipulation of variables (4) manipulation of lists (5) manipulation of program flow

    Given this basis, PILE is used to produce music, musical structures, and musical sounds. Because PILE works in real- time, the structures can be tested immediately. In one program, separate sounds can be described and ordered in a structure. A different possibility is to describe a structure in a program without referring to what could be distinct sound events and then listening to the result of that structure. Probably the most uncommon aspect of PILE is that one can work with it in both of these ways.

    Background

    A myriad of sound synthesis programs exist based on models related to instrumental music or to the design of a traditional analog electronic studio. Some work in real-time. Some work with extreme accuracy. Some provide for con- venient man-machine interaction. They all require the use of a computer because of the magnitude of the task. For many, this is perhaps the only reason why they require the use of a computer. It is a valid reason, but it is certainly not the most interesting one. More interesting ones are:

    to hear that which without the computer could not be heard; to think that which without the computer would not be thought; to learn that which without the computer would not be learned.

    To ask what a computer can do for a composer or what you can learn from a computer is obviously within the realm of music. After all, a composer may certainly ask what a clarinet can do, or what the sound properties are of any other instru- ment or object used as an instrument. A performer often tries to learn something about a type of music by playing on various types of instruments. Playing "old" music on "old" instruments is a common example of this practice.

    Computers produce and manipulate numbers and other symbolic data very quickly. This could be considered the idiom of the computer and used as a basis for musical work with the computer. In 1974-1975 I made a series of experiments with the production and output of numbers to a digital-to-analog converter within the framework of sound synthesis. These experiments led to the ASP programs (Auto- mated Sound Programs), a collection of 22 programs written in MACRO-15 (the assembler language for the PDP-15). These programs are fairly simple models of number manipu- lation and temporal distribution systems. Counting, calculating, comparing, choosing, and repeating are common procedures in the programs. Structures were described using strings of LACs (load accumulator), ANDs (logical and), XORs (exclusive or), TADs (two's complement addition), SRRANs (shift random number generator and read into the accumu-

    Page 30 Computer Music Journal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • lator), etc. The programs are self-contained and automatic - given a start number for the random number generator, the programs will continue until externally halted. The output is variable-if begun with a different start number, a different output results, and yet, the ouput can be repeated by beginning the program with the same start number.

    START

    GENERATE

    A

    SAVE ATC

    GENERATE

    B

    NEWB

    CHOOSE & DO LOGIC

    I

    SAVE

    C

    LOAD

    CLOCK

    CONVERT

    WAIT

    0 NEWPUL

    GENERATE PULSE,

    to0 NEWHSK

    0 ?

    GENERATE

    REPMSK

    yesEPEAT

    no

    GENERATE

    REP FCTR

    00 NEWB

    0 RPATC

    O

    Example 1

    The most accurate statement of the relationships which occur in a program is found in the program text itself. This is because the structural relationships are defined in terms of the programming language. Since MACRO-15 is not a particularly widely used language, an example (ASP 11), will be described using a flowchart (Example 1) and a verbal description:

    A number series with repetitions is output. This series is calculated using randomly selected logical operations. The clock is varied using values derived from variable A. Six logical functions are defined as macros - conjunction, antivalence, dis- junction, equivalence, implication, and exclusion. A 12-bit random value is chosen as A. Its two's-complement is stored to use later in determining when a new A should be calculated. A 12-bit random value is chosen for B. The five right-hand bits are two 's-complemented and used later to determine when to calculate a new value for B. Depending on the number read from the HRG (Hardware Random number Generator), the program performs one of the six logical operations between A and B. The result, C, is trimmed to 12 bits and sent to the converter when a clock flag is detected. A check is made if a new value for the number of clock pulses should be calculated. If yes, the two 's-complement of the right-hand six bits of A become the new value. The count for a new repetition mask is incremented. If zero, the count is reset to the two's-comple- ment of C. The repetition mask is this complement masked by the octal value of 4137. The value of the repetition mask has great influence on the sonic output. Next, the repetition factor is checked. If the value of C just sent to the converter is to be repeated, the program jumps to SOUND, where the clock is loaded, enabled, and C is output. Otherwise a new value for the number of repetitions of the next C is calculated. The new repetition value is the antivalence of A and B, which is masked by the repetition mask, and two 's-complemented. The previously-derived value for NEWB is incremented. If it equals zero, the program jumps to calculate a new B and from there continues the program. Otherwise, the check for a new A is performed. The program continues then either from the calculation of a new A value, or from the switch point where the logical operation was chosen. (1)

    As can be seen in this example, each sample produced neces- sarily results from all the program parts and all the program calculations. The program is an explicit description of what must happen and what has happened.

    The twenty-two ASP programs demonstrated that it was possible to construct a number of programs with a variety of ideas and output. It also became clear that several groups of MACRO-15 instructions were frequently used in various programs. These groups of instructions could be considered valuable concepts in writing this type of synthesis program. One could generalize these groups of instructions and use them as a basis for a language. This was the basis for PILE. A fre- quently recurring group of instructions was generalized to one PILE instruction. The usefulness of the instructions had already been demonstrated in the ASP programs. The generali- zation to one instruction made the groups easier to use, easier to oversee, and gave more insight into the processes of this type of sound synthesis. PILE instructions are not limited to groups used in ASP. The need for additional instructions became apparent with use. But the ASP groups did provide the starting point for the PILE instructions. The PILE lan- guage and the compiler for it were designed and written in 1976-77.

    Paul Berg: PILE - A Language for Sound Synthesis Page 31

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • A Short Description of the Language

    The available instructions are described in the Appendix. An instruction in PILE contains the name of an operation on the first line and further information on the following lines. This may involve several applications of the operation stated on the first line. The last line of an instruction is terminated with a semicolon, e.g.,

    CONVERT SEND:VAR CHANNEL:O;

    An instruction may be given a label (address). If a label is used, it must be the first symbol(s) of the first line of an in- struction. The first symbol of an instruction must be a tab or space. After that, any number of tabs and/or spaces may be used to align the instruction as desired.

    Some Programming Examples

    The available instructions are combined in programs which are compiled and then executed. Sample values are sent directly to a D/A converter with the CONVERT instruction. Important considerations when programming are: (1) the suc- cession of operations, and (2) the amount of time they take. A given combination of instructions could work too slowly to result in an audible output.

    TOP RANDOM; CONVERT

    SEND:- CHANNEL:1;

    BRANCH TO:TOP;

    Example 2

    A difficulty in describing programming examples is that the sound is not heard by the person reading this description. This limitation is less serious when working from a known model. Therefore the first example will be of a known sound: noise (Example 2). The idea is to produce noise by sending random values to the converter. TOP is the label for the instruction RANDOM. That instruction reads a random num- ber into the accumulator. The following instruction sends the contents of the accumulator to converter channel zero. The hyphen after SEND indicates a default condition, in this case the contents of the accumulator instead of a particular variablk or constant. Program control branches to the instruction labelled TOP, i.e. it returns to the first instruction. The speed at which this program operates is the speed of the assembled machine instructions.

    Example 3a contains a program text in PILE and ex- ample 3b a flow chart for that program. A value A is incre- mented with INCR (see arrow). The result is sent to the con- verter. This happens CNT number of times. If A becomes greater than 4095, the sign of INCR is changed and A is set to 4095. If A becomes less than zero, the sign of INCR is changed, and A is set to zero. If CNT and INCR are large, more or less regular triangle patterns are formed. If that is not the case, various other forms occur. After A has been incremented CNT times, several conditions are CHECKed to determine which variable should receive a new value.

    SEED

    7; STORE

    SAVE; START INIT

    REF:1 NEW3:-1 NEW2: -1 NEWl1:-1;

    CHANGE CHECK NEW2 NCNT, - NEW3 MSEL, -;

    SEL N B:12-15 ST:NEW3;

    CAL REF:REF*2 PIASK3 :REF-1 COMP:4096-REF;

    ZERO? Y:END;

    MSEL SEL M:MASK3 ST:MASK2;

    SEL N B:12-17 ST : NEW2;

    NCNT SEL N B :MASK2 ST : CNT;

    CHECK NEW1 NINC,-;

    SEL B:8-17 ST:MASKI;

    SEL N B:15-17 ST:NEW1;

    NINC SEL M:MASK1 ST: INCR;

    TURN CAL A:A+INCR MAX :4095-A;

    NEGATIVE? MAX -,GOON;

    INIT A:4095 INCR:-INCR;

    BRANCH TO:GOON2;

    GOON NEG? A

    -,GOON2; INIT

    A:O INCR:-INCR;

    GOON2 CONVERT SEND: A CHANNEL:O;

    CHECK CNT TURN,CHANGE;

    END FINISH? EXT:SAVE;

    DECLARE NEW1 ,NEW2,IASK2 ,CNT, MASK1, INCR ,A,IAX ,REF,COP, SAVE, NEW3, MASK3;

    Example 3a

    In must cases the values for variables are produced with SELECT (SEL) which assigns a non-zero random value to a variable. This random value is limited in size by bits which can be specified, e.g., if bits 15-17 are used, the random value will be between one and seven. A variable can be used as a mask instead of specifying the bits. In that case a logical AND is performed between the variable and the tentative random number. The result, if non-zero, is stored in the variable. The boundaries for a random number therefore change every time the variable used as a mask changes its

    Page 32 Computer Music Joumal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • START

    INIT

    VAR

    no NEW

    MASK2

    ye

    NEW no

    MASK3

    yes

    CAL

    MASK3

    L MAXyes

    <

    no

    STOP

    SELECT

    MASK2

    SELECT

    CNT

    no NEW

    MASK1

    yes

    SELECT

    MASK1

    SELECT

    INCR

    A:A+INCR

    CONVERT

    A no

    A EXCEEDS

    LIMITS

    -RETURN es

    ?

    RESET A

    INCR yes

    Example 3b

    value. Thus describing how mask values change in a program can be an important structural aspect. The values for INCR are determined with a variable, MASKI. A new value for this variable is occasionally chosen with a bit specification. CNT also has a variable mask, MASK2. Values for MASK2 are occasionally chosen, masked by MASK3. In the course of the program MASK3 gets larger and larger. MASK3 has an initial value of one. When it reaches 4095, the program halts.

    The result of selecting values for MASK2 from MASK3 is that CNT tends to become larger. But this is not a linear

    change. This results in a more interesting structure and a more interesting development in the sound. Since a large CNT usually implies a larger regularity and since CNT tends to get larger as the program progresses, the following results: the relatively complex sounds in the beginning gradually tend to become more regular and less complex.

    An obvious way to expand this program would be to describe a more directed change of MASK1 which relates to INCR. This was realized in Tape 1 from my composition Locks and Dams. (2) The program for Tape 1 simultaneously produced 2 channels of sounds. One channel is similar to the example given here. In the second channel the mask for INCR tends to increase while the mask for CNT is selected with an unchanging bit specification.

    In Examples 4a and 4b, the results of arithmetic calcula- tions are sent to the converter. This is followed by a waiting loop. The length of this waiting loop varies in the course of the program. Three groups of these calculations are found in the sample. One of the groups is chosen. Control stays with the chosen group until it returns to the top of the program. Another choice of group is then made. The way in which the waiting time changes is important to the sound changes which are heard. The fourth group produces silence by sending zeros to the converter.

    SEED 41;

    INIT A:1 B:37;

    SEL N B:6-16 ST:NUTIME B:14-17 ST:TIPME;

    CHO FINISH? EXT:O;

    SEL N B:8-17 ST: RETURN;

    CHOOSE GROUP1, GROUP2, GROUP3, GROUP4;

    GROUP1 CAL A:A+1 B: B+7 C: A*B/3 D:C/67;

    CONVERT S:C CH:O S:D CH:1;

    INIT WAIT TIME;

    DELAY CHECK WAIT DELAY,-

    NUTIME TEST, -;

    SEL N B:13-17 ST:TIHE

    B:5-16 ST;NUTIME;

    TEST CHECK RETURN GROUP1, CHO;

    GROUP2 CAL A:A-5 B:B+16 C:A*B;

    CONVERT SEND:C CHANNEL: 1;

    INIT WAIT:TIME;

    Example 4a continued on next page

    Paul Berg: PILE - A Language for Sound Synthesis Page 33

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • DELAY2 CHECK WAIT DELAY2,- NUTIME TEST2,-; SEL N

    B:13-17 ST: TIME B:6-12 ST:NUTIME;

    TEST2 CHECK RETURN GROUP2, CHO;

    GROUP3 CAL A: A+A-267 B:B+7 C:A*B/4;

    CONVERT S:C CH:O; INITIALIZE

    WAIT:TIME; DELAY3 CHECK

    WAIT DELAY3, -

    NUTIME

    TEST3, -; SEL N

    B:14-17 ST : TIME B:6-16 ST:NUTIME;

    TEST3 CHECK RETURN GROUP3, CHO;

    GROUP4 CONVERT S:O CH:O S:0 CH:1;

    INIT WAIT:TIIE ;

    DELAY4 CHECK WAIT

    DELAY4,- NUTIME TEST4,-;

    SEL N B: 11-17 ST:TINME B:6-12 ST:NUTIME;

    TEST4 CHECK RETURN GROUP4,CHO;

    DECLARE A,B,C,D,NUTIME,TIME,RETURN,WAIT;

    Example 4a continued from previous page

    This example has a rather simple hierarchical structure. But given the basic concept of this example, it is clear that more extended and varied hierarachical decision-making could be programmed. An example of an extended version of the basic idea in Example 4 can be found in Tape 2 from Locks and Dams.

    Examples 3 and 4 contain simple illustrations of often used techniques in describing structures in PILE programs:

    (1) shifting of masks (2) timing the variation of variables using CHECKs (3) hierarchical changing of masks (4) controlling program flow with CHOOSE (and SWITCH) (5) representation of sound as calculations and delays

    START

    INIT

    FINISH yes

    no]s OP RESET

    cAL GROUP 1

    war CNGROUP 2 GROUP 3 GROUP 4 WAIT

    no NEW TIME

    yes SELECT TIM

    e REaTUR

    no

    Example 4b

    Examples 3 and 4 illustrate the use of PILE to program a structure and then listen to how it sounds. As already mentioned, one could instead program distinct sounds and a structure using them. This should be clear from the instruction set and the examples already given. The instructions CREATE LIST and INSERT LIST are very useful for this. Less obvious is the possibility to simulate fixed waveform synthesis with amplitude modulation and FM synthesis. It has even been possible to-program the Internationale in PILE. I do not claim that PILE is the ideal tool for FM synthesis or for producing melodies. This is mentioned only to demonstrate the versatil- ity of PILE.

    Hardware Comments

    The PILE compiler is implemented on a PDP-15 at the Institute of Sonology in Utrecht. The compiler produces code in MACRO- 15. PILE instructions with random aspects use the hardware pseudo-random number generator built by Jo Scherpenisse. (3) This generator, linked to the computer's I/O bus, generates a random number in 3 to 4 js. The clock instructions assume a variable programmable clock as designed by Jo Scherpenisse. This clock allows the frequency as well as the number of steps before a flag to be programmed. The clock instructions in PILE are however seldom used. It is very conceivable that a version of PILE would be made without any clock instructions. The D/A converters presently used are 12-bit without a buffer.

    Page 34 Computer Music Journal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • APPENDIX

    Pile Instruction Set (4)

    Conventions used in this description:

    CON indicates that a constant is to be inserted by the pro- grammer VAR indicates that a variable is to be inserted by the pro- grammer. LAB indicates that a label is to be inserted by the programmer VAL indicates that either a constant or a variable may be inserted arith indicates arithmetic expression + or - or * or / log indicates operations antivalence, conjunction, disjunction, equivalence, implication, or exclusion

    Manipulation of Program Flow

    1) BRANCH TO: LAB;

    LAB is a label found in the program. The next instruction executed in the program will be the instruction marked with LAB. Execution will continue from that instruction.

    2) CHOOSE LAB1, LAB2,... LAB8;

    Randomly choose to branch to the instruction marked with one of the given labels (LABI, LAB2,...).

    3) ZERO? YES:LAB;

    If the contents of the accumulator are zero, the program continues execution from the instruction marked with LAB.

    4) CHECK VAR LAB1, LAB2;

    or CHECK VAR LAB1, -;

    or CHECK VAR -, LAB2;

    Increase the value of VAR by one. If it is not zero, the pro- gram branches to the instruction marked with LAB1. If it is zero, the program branches to the instruction marked with LAB2. A dash may be used instead of LAB1 or LAB2. In that case the program continues to the next instruction if that branch is chosen.

    5) FINISH? EXTERNAL: VAL;

    or FINISH? INTERNAL: VAL;

    The program terminates if the number set on the console ac- cumulator switches (external) or if a number supplied by the hardware random number generator (internal) is the same as VAL.

    6) NEGATIVE? VAR LABi, LAB2;

    or NEGATIVE? VAR -, LAB2;

    or NEGATIVE? VAR LABl, -;

    Variable VAR is tested. If it contains a negative value, the pro- gram goes to LAB 1. Otherwise it goes to LAB2. Either LAB1 or LAB2 can be replaced with a dash which indicates that the program continues to the next instruction. The instruction may be applied several times in succession.

    7) SWITCH VAR LAB1, LAB2,..., LAB9;

    The program switches to LAB1, LAB2, etc., depending on the value of VAR. (If VAR is 1, the program switches to LAB1, etc.). A maximum of nine labels may be used.

    Manipulation of variables

    8) INITIALIZE VAR:VAL;

    VAL can be positive or negative. VAL is assigned to VAR.

    9) GET VAL;

    The value is placed in the accumulator.

    10) STORE VAR;

    or STORE NEGATIVE VAR;

    The number currently in the accumulator is stored in VAR. If STORE NEGATIVE is indicated, the sign of the number is changed before it is stored.

    11) READ SWITCHES STORE:VAR;

    The number set on the console switches is read and stored in VAR.

    12) CALCULATE VAR1 : VALlarithVAL2... ;

    or CALCULATE VAR1 : log,VAL1,VAL2;

    The possible arithmetic operations are: +, -, *, i/. No more than eight arithmetic operations may occur in one line. Opera- tions are performed left-to-right. The result of the performed operations is stored in VARI. Multiplication and division of negative numbers is not possible. The possible logical opera- tions are: equivalence, disjunction, conjunction, implication, antivalence, exclusion. Only one logical operation may occur in a line. The result of the performed operation is stored in VAR1. Logical and arithmetic operations may not occur in the same line, but they may occur in consecutive lines.

    Paul Berg: PILE - A Language for Sound Synthesis Page 35

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • 13) SELECT BITS : CON1,CON2,CON3 - CON4... STORE : VAR;

    or SELECT MASK: VAR STORE : VAR1;

    or SELECT NEGATIVE BITS : CON1,CON2,CON3... STORE : VAR;

    or SELECT NEGATIVE MASK: VAR STORE : VAR1;

    A random number is selected, limited (masked), and if then not equal to zero, stored in VAR. The process is repeated until a non -zero value can be stored in VAR. In the case of SELECT NEGATIVE the sign of the number is changed before it is stored. The number may be limited in two ways: 1) the bits may be specified either separately or between two limits, e.g., BITS:3-10 (both ways may be combined), 2) a mask may be specified. A logical AND (conjunction) is performed with the random number and the mask. The use of the mask limits the range of the random number.

    14) DECLARE VAR1, VAR2, VAR3...;

    All variables used in the instructions may be declared so that storage can be saved for them. The names of lists should not be declared.

    Manipulation of lists

    15) CREATE LIST NAME:VAR SIZE:CON;

    VAR is the name to be given to the list. CON is the size of the list. In general, the total size of all lists should not exceed 2500. After this instruction other instructions should be given to formulate values which would be used in creating the list. Instructions may be chosen from most of the other available instructions, e.g., CALCULATE, RANDOM, SELECT, etc. This group of instructions should end with the instruction END LIST.

    16) END LIST SAVE:VAR;

    This instruction indicates the end of the group of instructions used to create a list. The value of VAR is stored in the created list. The instructions after CREATE LIST are again executed, the next value for VAR is found, etc. until the list has been filled.

    17) SAMPLE LIST NAME:VAR SIZE:VAL1 INCREMENT:VAL2;

    VAR is the name of a list previously made using CREATE LIST or INSERT LIST. VAL1 is the size of the list. VAL1 must be less than or equal to the size declared in CREATE LIST or INSERT LIST. VAL2 is the increment. SAMPLE LIST places one value from the list into the accumulator. The

    first time SAMPLE LIST is executed, the first value will be placed in the accumulator. With each succeeding execution of SAMPLE LIST the number VAL2 positions further in the list will be placed in the accumulator, e.g., if VAL2 is 5, every fifth number in the list will be sampled. The current value for size will be maintained for the rest of the program after the first execution of SAMPLE LIST.

    18) INSERT LIST NAME : VAR SIZE : CON CON1,CON2,..., ..., CON3;

    VAR is the name of the list. CON is the size of the list. CON1, CON2, etc., are constants which are the list. The list containing CONi through CON3 is inserted in the program. The maximum size of a list depends on how many lists are used and how long the program is. In general, the total size of all lists should not exceed 2500. INSERT LIST may occur at any point in a program.

    Manipulation of the accumulator

    19) RANDOM; This is the only instruction which is complete on one line. A random number (18 bits) from the hardware random number generator is placed into the accumulator.

    20) KEEP BITS ; CON 1,CON2 - CON3,CON4 ... ;

    Certain bits of the number in the accumulator may be kept. The accumulator contains 18 bits, numbered 0-17 from left to right. CON1, CON2, etc., represent the numbers of the bits which have been selected. The bits may be expressed separately, e.g., BITS : 1,5; or between limits, e.g., BITS: 3-10; both ways may be combined.

    Manipulation of external devices

    21) CONVERT SEND : VAL CHANNEL : CON;

    or CONVERT SEND: - CHANNEL : CON;

    VAL is sent to converter channel CON. VAL should be between 0 and 4095. CON may be 0,1,2, or 3. If the accumulator contents are to be sent, a dash is used instead of VAL.

    22) SEED VAL;

    or SEED -;

    A seed (start number) is specified for the hardware random number generator. Each time the same number is specified, the same number (series) is produced by the hardware random number generator. If VAL is a variable, it must be assigned a value before this instruction is used. VAL may not be zero. If one wished to insert the start value from the console switches, use a minus sign instead of VAL.

    Page 36 Computer Music Journal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • 23) CLOCK CON FREQ : VAL;

    Two clocks are available. CON should be either 1 or 2. VAL should be positive and is expressed in microseconds. The minimum value is 10. This instruction sets the speed at which the clock will count, i.e., not how long it will count, but how fast.

    24) CLOCK CON COUNT :VAL;

    CON should be either 1 or 2 for Clock 1 or Clock 2. VAL should be positive. It indicates how high the clock should count (at the speed specified in instruction 23).

    25) CLOCK CON START;

    CON should be either 1 or 2. The corresponding clock is started. This means it will begin counting.

    26) CLOCK CON WAIT;

    CON should be either 1 or 2. The program waits for the clock to finish counting (if it is not already finished) before continuing.

    27) CLOCK CON STOP;

    CON should be either 1 or 2. The clock is stopped. The clock should be turned off after WAIT.

    Note: Some instructions fall into more than one of the above categories.

    Additional Comments Concerning The Instruction Set

    (1) example of the use of CALCULATE

    CALCULATE A: A+ 10 B : A/C- 1 D: B* A STX1 : ANTIV,B,3 VAR2: IMPLIC,B,D E : A*B+C/D-STX1 *VAR2/5 +79;

    (2) example of the use of CREATE LIST

    CREATE LIST NAME: HERMAN SIZE : 500;

    CALCULATE C : EQUIV,25,D D: D+D;

    END LIST SAVE :C;

    (3) use of abbreviations

    Operations in the first line of an instruction can be abbreviated to the first three letters of the operation. In an instruction which could change sign (SELECT, STORE) NEGATIVE may be shortened to N. In all instructions except the clock instructions abbreviations of only one letter are tolerated before the colon, e.g.,

    CONVERT SEND: ALL CHANNEL :0;

    could be

    CON S: ALL TO :0;

    Except for the clock instructions, different words could be inserted before the colon. This can not be done in instructions where variables occur left of the colon (INITIALIZE, CALCULATE).

    References

    1. Berg, P., ASPReport. Institute of Sonology, Utrecht, 1975. 2. Berg, P. Locks and Dams, a composition for 2-track tape,

    trombone, and 2-track tape. Score available from the composer.

    3. Scherpenisse, J., "A Pseudo Random Number Generator," Interface 3, p 187-190, 1974.

    4. Excerpted from Berg, P., PILE2-A Description of the Language, Institute of Sonology, Utrecht, 1978.

    Paul Berg: PILE - A Language for Sound Synthesis Page 37

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • paul berg

    i never knew

    you cared

    a composition for computer synthesized sounds

    I Never Knew You Cared is a 13 minute stereo piece for computer synthesized sounds. It has been recorded on tape. The entire composition is described in the program for it. No external mixing, reverberation, or editing occurred. One performance possibility for the piece is via tape playback. It also can be performed "live" with any computer equipped with a PILE compiler and two channels of digital-to-analog conversion.

    PILE is a language for sound synthesis. The score for I Never Knew You Cared is expressed in this language. The score consists of the instructions a computer received to produce this piece. This score was realized on the PDP-15 computer at the Institute of Sonology, Utrecht, the Nether- lands and recorded on tape. Because of the length of the score it was divided into two sections for realization: section 1 parts 1-4, section 2 parts 5-8.

    Paul Berg March 1978 Utrecht

    (Editor's note: Sections 7 and 8 of the score are reproduced below.)

    & Section 7

    &-------------------------------------------------------------

    & PART7

    PART7 INIT CNTRIO: -17

    PEAK: 40 CNT: - I

    ENVNO :0 M: I

    C:2 A:O;

    BRA T:GI 2;

    GI SEL B:9-11

    ST: SWEEP B:13-17

    ST:CFREQ B:11-16

    S: PEAKA; CALCULATE

    PEAKA:PEAKA+PEAK; SEL N

    B: 12-15 ST:DUR;

    CAL MFREQ :CFREQ*M/2/C;

    G2 INITIALIZE CNT:DUR;

    SAMPLE LIST N:MODAMP

    S:80 I:1;

    STORE SWEAMP;

    CALCULATE SWEVAL:SWEEPtSWEAMP/PEAK;

    SAMPLE LIST N:CAMP

    S:80

    I:1; STORE

    AMP; ZERO? Y:G12;

    G3 SAMPLE N:MOD

    S:360 I:MFREQ;

    STORE MODSAM;

    CALCULATE INC:MODSAM*SWEVAL/1000+CFREQ;

    SAMPLE LIST NAME :CAR

    SIZE:720 INCREMENT: INC;

    STORE CARSAM;

    CAL OUT: CARSAMtAMP/PEAKA;

    SWITCH POSIT

    G4,G5,G6,G7,G8,G9,GIO; G4 CALCULATE

    OUT2: OUT/8 OUT3: OUT-OUT2;

    CONVERT S:OUT2

    CH:O S:OUT3

    CH: 1; BRA

    T:GII; G5 CAL

    OUT2:OUT/4

    OUT3/OUT-OUT2; CONVERT

    S:OUT2 CH:O S:OUT3

    CH: 1; BRA

    T:GI ; G6 CAL

    OUT2:OUT/8a3 OUT3:OUT-OUT2;

    CONVERT S:OUT2

    CH:0 S:OUT3

    CH: 1;

    Page 38 Computer Music Journal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • BRA T:GII;

    G7 CAL OUT2:0OUT/2; CON S:OUT2 CH:O S:OUT3 CH: 1; BRA T:GI l;

    G8 CAL OUT2:OUT/8*5

    OUT3:OUT-OUT2; CON

    S:OUT2 CH:O

    S:OUT3 CH: 1;

    BRA T:GI I;

    G9 CAL OUT3:OUT/4

    OUT2: OUT-OUT3; CONVERT

    S:OUT2 CH:0O

    S:OUT3 CH:41;

    BRA T:GI I;

    GI 0 CAL OUT3 :OUT/8

    OUT2:OUT-OUT3; CON

    S:OUT2 CH:O

    S:OUT3 CH:1;

    Gil CHE CNT

    G3, G2; G12 CON

    S:0. CH :0

    S:O CH:11;

    CHECK CNTRL -,DIV; INIT WHICH: ; SEL B:15-17 ST:POSIT;

    G 13 CALCULATE ENVNO:ENVNO+1 MAX: 5-ENVNO; NEGATIVE

    -,GI14; INIT ENVNO: I;

    G14 CREATE LIST N:ENVDAT S:8; SWITCH ENVNO G15,G16,Gl7,G18,G19;

    GI5 SAMPLE N:ENVI S:8 1:li; STORE

    E; BRANCH

    T:G20; G16 SAMPLE

    N:ENV2 S:8 1:1; STORE

    E; BRANCH

    T:G20; G17 SAMPLE

    N:ENV3 S:8

    STORE

    E; BRANCH

    T:G20; G18 SAMPLE

    N:ENV4 S:8 I:I; STORE

    E; BRANCH

    T:G20;

    G19 SAMPLE N:ENV5 S:8 I:1; STORE

    E; G20 END LIST

    SAVE :E; INIT

    A:O CNT:-1;

    SWITCH WHICH

    G21,G25; G21 CREATE LIST

    N: CAMP S:80; CHECK CNT G24,-; INIT SKIP:-2;

    G22 SAMPLE N:ENVDAT S:8

    I:1; CHECK SKIP -,G23; STORE N

    CNT; BRANCH T:G22;

    G23 STORE AINC;

    G24 CAL A:A+AINC; END LIST S:A;

    INIT WHICH: 2;

    BRANCH T:G13;

    G25 CREATE LIST N:MODAMP S:80; CHECK CNT

    G28,-; INIT

    SKIP:-2; G26 SAMPLE

    N:ENVDAT S:8 I:1; CHECK SKIP -,G27; STORE N CNT; BRANCH

    T:G26; G27 STORE

    AINC; G28 CAL

    A: A+AINC; END LIST SAVE :A;

    SEL N B:3-1 I

    ST: CNT; SEL N

    B:14-16 ST:CNT2;

    G29 CONVERT S:0

    CH:0 S:O

    CH:1; CHE

    CNT G29,-

    CNT2

    Paul Berg: PILE - A Language for Sound Synthesis Page 39

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • -,Gl; SEL N

    B:3-11 S:CNT;

    BRA T:G29;

    &

    & & Section 8 & & &------------------------------------------------------------------------ &

    & PART8 & & & PART8 INITIALIZE

    CNTRL:-2500 NEWAMP:-I

    DISCNT:-1 NEWMSK:-I

    NEWS:-I NEWCF:-I

    NEWM:- I NEWC:- I

    AMP:40 PEAK: 40

    CNT:-I A:O

    INC:I C:5

    M:2 CFREQ:40

    SWEEP: 100; SELECT NEGATIVE

    B:12-17 ST:CNT2;

    RANDOM; KEEP

    B:16-17; STORE

    INCR; INITIALIZE

    NEWVAL:-I; HI INITIALIZE

    CNT:-200; CHECK

    CNTRL

    H2,HI9; H2 CHECK

    NEWVAL H6,-;

    INITIALIZE NEWVAL:-I;

    CHECK NEWS

    H3,-; SELECT

    B:2,6,9-12 ST: SWEEP;

    SELECT NEGATIVE B:15-17

    ST:NEWS; H3 CHECK

    NEWCF H4,-;

    SELECT 8:11-17

    ST:CFREQ; SELECT NEGATIVE

    B:14-17 ST:NEWCF;

    H4 CHECK NEWC

    H5,-; SELECT

    B:14-17 ST:C;

    SELECT NEGATIVE B:14-17

    ST:NEWC; H5 CHECK

    NEWM H6,-;

    SELECT B:]5-17

    ST:M; SELECT NEGATIVE

    B:14-17 ST:NEWM;

    H6 CALCULATE A:A+INCR

    MAX:PEAK-A; NEGATIVE

    MAX H7,-

    A

    -,H8; INITIALIZE

    INCR: -INCR A:O;

    BRANCH TO: H8;

    H7 INITIALIZE INCR:-INCR

    A: PEAK; H8 CHECK

    CNT2

    Hi1,-; H9 SELECT NEGATIVE

    B:13-17 ST:CNT2;

    RANDOM; KEEP

    B:16-17; STORE

    INCR; CHOOSE

    Hl I,H10,H ,HO1,H10,HI 1; HIO INITIALIZE

    INCR:-INCR; H I INITIALIZE

    SWEAMP:A; CALCULATE

    SWEVAL: SWEEP*SWEAMP/ 1000; CHECK

    NEWAMP H13,-

    NEWMSK H12,-;

    SELECT B:13-17

    ST:AMPMSK; SELECT NEGATIVE

    B:12-17

    ST:NEWMSK; H12 SELECT

    M:AMPMSK ST:AMP;

    SELECT NEGATIVE B:15-17

    ST:NEWAMP; H13 CALCULATE

    MFREQ: CFREQtM/2/C MAX:360-MFREQ;

    GET MFREQ;

    ZERO? Y:HI4;

    NEGATIVE? MAX

    -,H15; INITIALIZE

    MFREQ:359; BRANCH

    T:H15; H14 INITIALIZE

    MFREQ: 1; HI5 SAMPLE LIST

    N:MOD S:360

    I:MFREQ; STORE

    MODSAM; CALCULATE

    INC :MODSAMNSWEVAL/1I 000+CFREQ MAX:720-INC;

    GET INC;

    ZERO?

    YES:H16; NEGATIVE?

    MAX

    -,H17; INITIALIZE

    INC:719; BRANCH

    TO:H17; H16 INITIALIZE

    Page 40 Computer Music Journal, Box E, Menlo Park, CA 94025 Volume III Number 1

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

  • INC: I; H17 SAMPLE LIST

    N:CAR S:720

    I:INC; STORE

    CARSAM; CALCULATE

    OUT:CARSAM*AMP/PEAK; CONVERT

    S:- CHANNEL: O;

    CHECK DISCNT

    H18,-; SELECT

    B:6-13

    ST:DIST; SELECT NEGATIVE

    B:3-17 ST:DISCNT;

    H18 CALCULATE OUT2:OUT*DIST/4095;

    CONVERT SEND:OUT2

    CHANNEL:I; CHECK

    CNT.

    H15,H1; HI19 CONVERT

    SEND:O CH:0

    S:0

    CHANNEL:I; BRANCH

    T:DIV;

    &------------------------------------------------------------------------

    END FINISH EXT:0;

    DECLARE NEWAMP,NEWMSK,AMPMSK,NEWS,NEWCF,NEWM,NEWC,DIST, OUT2,NEWVAL,DISCNT,CNT2,AMP,OUT,CARSAM,PEAK,A, C,M,CFREQ,SWEEP,MFREQ,MODSAM,INC,WHICH,PEAKA,ENVNO, E,MAX,DUR,SKIP,AINC,SWEAMP,SWEVAL,CNT,SWEMSK, CFMSK,MMSK,CMSK,CNTEND,OUT3,POSCNT,POSINC,POSMSK, REF,POSIT,REPEAT ,MASTER,CNTRL;

    INSERT LIST NAME:ENVI SIZE:8

    10,4,30,0,30,0,10,-4; INSERT LIST

    NAME:ENV2 SIZE:8

    20,2,10,-1,35,0,15,-2; INSERT LIST

    NAME:ENV3 SIZE:8

    20,1,20,1,20,-1,20,-1; INSERT LIST

    NAME:ENV4 SIZE:8

    10,4,20,-1,30,0,20,-1; INSERT LIST

    NAME :ENV5 SIZE:8

    20,1,20,1,30,0,10,-4; INSERT LIST

    NAME:MOD SIZE:360

    508, 517, 526, 534, 543, 552, 560, 569, 578, 586, 595, 603, 612, 620, 629, 637, 646, 654, 662, 671, 679, 687, 695, 703, 711, 719, 726, 734, 742, 750, 757, 764, 772, 779, 786, 793, 800, 807, 814, 821, 828, 834, 840, 847, 853, 859, 865, 871, 877, 883, 888, 894, 899, 904, 909, 914, 919, 924, 928, 933, 937, 941, 945, 949, 953, 956, 960, 963, 966, 969, 972, 975, 978, 980, 982, 985, 987, 989, 990, 992, 993, 995, 996, 997, 998, 998, 999, 999, 999,1000, 999, 999, 999, 998, 998, 997, 996, 995, 993, 992, 990, 989, 987, 985, 982, 980, 978, 975, 972, 969, 966, 963, 960, 956, 953, 949, 945, 941, 937, 933, 928, 924, 919, 914, 909, 904, 899, 894, 888, 883, 877, 871, 865, 859, 853, 847, 840, 834, 828, 821, 814, 807, 800, 793, 786, 779, 772, 764, 757, 750, 742, 734, 726, 719, 711, 703, 695, 687, 679, 671, 662, 654, 646, 637, 629, 620, 612, 603, 595, 586, 578, 569, 560, 552, 543, 534, 526, 517, 508, 500,

    491, 482, 473, 465, 456, 447, 439, 430, 421, 413, 404, 396, 387, 379, 370, 362, 353, 345, 337, 328, 320, 312, 304, 296, 288, 280, 273, 265, 257, 250, 242, 235, 227, 220, 213, 206, 199, 192, 185, 178, 171, 165, 159, 152, 146, 140, 134, 128, 122, 116, 111, 105, 100, 95, 90, 85, 80, 75, 71, 66, 62, 58, 54, 50, 46, 43, 39, 36, 33, 30, 27, 24, 21, 19, 17, 14, 12, 10, 9, 7, 6, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, I, 2, 3, 4, 6, 7, 9, 10, 12, 14, 17, 19, 21, 24, 27, 30, 33, 36, 39, 43, 46, 50, 54, 58, 62. 66, 71, 75, 80, 85, 90, 95, 100, 105, 111, 116 122, 128, 134, 140, 146, 152, 159, 165, 171, 178, 185, 192, 199, 206, 213, 220, 227, 235, 242, 249, 257, 265, 273, 280, 288, 296, 304, 312, 320, 328, 337, 345, 353, 362, 370, 379, 387, 396, 404, 413, 412, 430, 439, 447, 456, 465, 473, 482, 491, 500;

    INSERT LIST N:CAR S:720

    2064, 2082, 2100, 2118, 2136, 2154, 2171, 2189, 2207, 2225, 2243, 2260, 2278, 2296, 2314, 2331, 2349, 2367, 2384, 2402, 2420, 2437, 2455, 2472, 2490, 2507, 2524, 2542, 2559, 2576, 2594, 2611, 2628, 2645, 2662, 2679, 2696, 2713, 2730, 2747, 2763, 2780, 2797, 2813, 2830, 2846, 2863, 2879, 2895, 2912, 2928, 2944, 2960, 2976, 2992, 3008, 3023, 3039, 3054, 3070, 3085, 3101, 3116, 3131, 3146, 3161, 3176, 3191, 3206, 3221, 3235, 3250, 3264, 3278, 3293, 3307, 3321, 3335, 3349, 3362, 3376, 3389, 3403, 3416, 3429, 3443, 3456, 3468, 3481, 3494, 3507, 3519, 3531, 3544, 3556, 3568, 3580, 3591, 3603, 3615, 3626, 3637, 3648, 3660, 3670, 3681, 3692, 3703, 3713, 3723, 3733, 3744, 3753, 3763, 3773, 3782, 3792, 3801, 3810, 3819, 3828, 3837, 3845, 3854, 3862, 3870, 3878, 3886, 3894, 3902, 3909, 3917, 3924, 3931, 3938, 3944, 3951, 3958, 3964, 3970, 3976, 3982, 3988, 3993, 3999, 4004, 4009, 4014, 4019, 4024, 4028, 4033, 4037, 4041, 4045, 4049, 4052, 4056, 4059, 4062, 4065, 4068, 4071, 4074, 4076, 4078, 4080, 4082, 4084, 4086, 4087, 4089, 4090, 4091, 4092, 4092, 4093, 4093, 4093, 4094, 4093, 4093, 4093, 4092, 4092, 4091, 4090, 4989, 4087, 4086, 4084, 4082, 4080, 4078, 4076, 4074, 4071, 4068, 4065, 4062, 4059, 4056, 4052, 4049, 4045, 4041, 4037, 4033, 4028, 4024, 4019, 4014, 4009, 4004, 3999, 3993, 3988, 3982, 3976, 3970, 3964, 3958, 3951, 3944, 3938, 3931, 3924, 3917, 3909, 3902, 3894, 3886, 3878, 3870, 3862, 3854, 3845, 3837, 3828, 3819, 3810, 3801, 3792, 3782, 3773, 3763, 3753, 3744, 3733, 3723, 3713, 3703, 3692, 3681, 3670, 3660, 3648, 3637, 3626, 3615, 3603, 3591, 3580, 3568, 3556, 3544, 3531, 3519, 3507, 3494, 3481, 3468, 3456, 3443, 3429, 3416, 3403, 3389, 3376, 3362, 3349, 3335, 3321, 3307, 3293, 3278, 3264, 3250, 3235, 3221, 3206, 3191, 3176, 3161, 3146, 3131, 3116, 3101, 3085, 3070, 3054, 3039, 3023, 3008, 2992, 2976, 2960, 2944, 2928, 2912, 2895, 2879, 2863, 2846, 2830, 2813, 2797, 2780, 2763, 2747, 2730, 2713, 2696, 2679, 2662, 2645, 2628, 2611, 2594, 2576, 2559, 2542, 2524, 2507, 2490, 2472, 2455, 2437, 2420, 2402, 2384, 2367, 2349, 2331, 2314, 2296, 2278, 2260, 2243, 2225, 2207, 2189, 2171, 2154, 2136, 2118, 2100, 2082, 2064, 2047, 2029, 2011, 1993, 1975, 1957, 1939, 1922, 1904, 1886, 1868, 1850, 1833, 1815, 1797, 1779, 1762, 1744, 1726, 1709, 1691, 1673, 1656, 1638, 1621, 1603, 1586, 1569, 1551, 1534, 1517, 1499, 1482, 1465, 1448, 1431, 1414, 1397, 1380, 1363, 1346, 1330, 1313, 1296, 1280, 1263, 1247, 1230, 1214, 1198, 1181, 1165, 1149, 1133, 1117, 1101, 1085, 1070, 1054, 1039, 1023, 1008, 992, 977, 962, 947, 932, 917, 902, 887, 872, 858, 843, 829, 815, 800, 786, 772, 750, 744, 731, 717, 704, 690, 677, 664, 650, 637, 625, 612, 599, 586, 574, 562, 549, 537, 525, 513, 502, 490, 478,

    467, 456, 445, 433, 423, 412, 401, 390, 380, 370, 360, 349, 340, 330, 320, 311, 301, 292, 283, 274, 265, 256, 248, 239, 231, 223, 215, 207, 199, 191, 184, 176, 169, 162, 155, 149, 142, 135, 129, 123, 117, III, 105, 100, 94, 89, 84, 79, 74, 69, 65, 60, 56, 52, 48, 44, 41, 37, 34, 31, 28, 25, 22, 19, 17, 15, 13, 11, 9, 7, 6, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 6, 7, 9, 11, 13, 15, 17, 19, 22, 25, 28, 31, 34, 37, 41, 44, 48, 52, 56, 60, 65, 69, 74, 79, 84, 89, 94, 100, 105, 111, 117, 123, 129, 135, 142, 149, 155, 162, 169, 176, 184, 191, 199, 207, 215, 223, 231, 239, 248, 256, 265, 274, 283, 292, . 301, 311, 320, 330, 340, 349, 360, 370, 380, 390, 401, 412, 423, 433, 445, 456, 467, 478, 490, 502, 513, 525, 537, 549, 562, 574, 586, 599, 612, 625, 637, 650, 664, 677, 690, 704, 717, 731, 744, 758, 772., 786, 800, 815, 829, 843, 858, 872, 887, 902, 917, 932, 947, 962, 977, 992, 1008, 1023, 1039, 1054, 1070, 1085, 1101, 1117, 1133, 1149, 1165, 1181, 1198, 1214, 1230, 1247, 1263, 1280, 1296, 1313, 1330, 1346, 1363, 1380, 1397, 1414, 1431, 1448, 1465, 1482, 1499, 1517,

    .1534, 1551, 1569, 1586, 1603, 1621, 1638, 1656, 1673, 1691, 1709, 1726, 1744, 1762, 1779, 1797, 1815, 1833, 1850, 1868, 1886, 1904, 1922, 1939, 1957, 1975, 1993, 2011, 2029, 2047;

    Paul Berg: PI LE - A Language for Sound Synthesis Page 41

    This content downloaded from 193.170.190.253 on Mon, 02 Mar 2015 16:48:50 UTCAll use subject to JSTOR Terms and Conditions

    http://www.jstor.org/page/info/about/policies/terms.jsp

    Article Contentsp. 30p. 31p. 32p. 33p. 34p. 35p. 36p. 37p. 38p. 39p. 40p. 41

    Issue Table of ContentsComputer Music Journal, Vol. 3, No. 1 (Mar., 1979), pp. 1-61Front Matter [pp. 1-4]Letters to the Editor [p. 5]ReviewsReview: untitled [pp. 6-7]Review: untitled [pp. 7+17+56]

    Machine Tongues IV [pp. 8-13]Use of High-Speed Microprocessors for Digital Synthesis [pp. 14-16]Spectral Surfaces from Performed Music Part 1 [pp. 18-24]A Microcomputer-Controlled Synthesis System for Live Performance [pp. 25-29]PILE: A Language for Sound Synthesis [pp. 30-41]Microcomputer-Controlled Sound Processing Using Walsh Functions [pp. 42-47]Grammars as Representations for Music [pp. 48-55]Products of Interest [pp. 57-61]Back Matter