Arrays


SuperCollider has lots of collection classes, but for simple tasks you can often just define arrays of data within square brackets:


a= [5,6,7,8,9,10];  


Sometimes we need to be more explicit about how to build the list of data, and we can write our own functions to generate data:


a= Array.fill(6, {arg i;  i+5});  



You'll gradually pick up the use of the Collection classes like Array, but I'll show you a few more tricks right now as a taster. 















Some different ways of making Arrays (try each in turn):


Array.series(10,1,1) //arguments to series are number of elements, start element, and add


(1..10) //this is a shortcut for the same thing


Array.series(10,1,2) 


(1,3..20) //again a shortcut



Array.geom(10, 1, 1.1); //geometric rather than arithmetic series: arguments number of elements, start element, grow ratio


Array.geom(10, 1, 10); //be careful, the law of compound interest can make these numbers expand very fast! 




Array.rand(10, 0.7,2.4); //make 10 random numbers drawn from a linear distribution between 0.7 and 2.4



















Some different ways of manipulating arrays: just try each line out in turn and see what gets posted to the post window!



a = [1,3,5,6];


a+5


a*8


a**2 //take to power of 2


a.squared //same thing


a.sqrt


a.scramble //run me multiple times!


a.rotate(1)


a.rotate(-1)


a-10


(a-10).abs


a>4


a.reverse




















Indexing elements in arrays


b=[2,3,4,7]


b.at(3) //get the element at index 3 (meaning the fourth element)


b.at(4) //won't return anything because the array isn't big enough! nil is a placeholder for 'no response possible' and will lead to trouble when it crops up


b.put(2,50) //put 50 into the slot at index 2 (replace third element)


b //note that b itself has been changed


b.put(14,90) //crash- won't work, no space to put the 90 in, array only has four element slots


You can also use Java array notation


b[0] //get first element


b[0]= 74 //set first element


b //was changed















There are further types of Collection class we may deal with later. 

you may wish to explore the various class help files: be warned that there is a class hierarchy in operation here so a method won't necessarily be in the Array class itself


[Collections]

[SequenceableCollection]

[ArrayedCollection]

[Array]

























A note about efficiency


You will occasionally see 


#[1,2,3] //makes a totally fixed (non-dynamic) Array and is slightly cheaper, especially where you're not going to change the Array once you make it


rather than 


[1,2,3] //a dynamic array 


To show the difference


a= #[1,2,3];


a[0] //works


a[0] = 8 //fails, because it can't be changed



















More about Mix and Arrays



Let's now look at using an Array with fill to help prepare a UGen network- for this case it's easy to use the automatic channel expansion method we saw already, but you'll find this alternative helpful in more complex cases, say where you're mixing a hundred varied voices at once!  


( //you'll only hear the first two of four frequencies if you have just a stereo output

{

var freqs,array;


freqs= [440,443,447,455.7];

 

array=Array.fill(4, //4 elements will go into this array

{arg i; //this function is the recipe to make each element

SinOsc.ar(freqs.at(i), 0, 0.1)

});


array

}.scope

)





















//We can use Mix to make this one channel


(

{

var freqs,array;


freqs= [440,443,447,455.7];

 

array=Array.fill(4, //4 elements will go into this array

{arg i; //this function is the recipe to make each element

SinOsc.ar(freqs.at(i), 0, 0.1)

});


Mix(array)

}.scope

)




















//There is a shortcut using Mix.fill


( //you'll hear the first two of four frequencies if you only have a stereo output

{

var freqs,array;


freqs= [440,443,447,455.7];

 

Mix.fill(4, //4 elements will go into this array

{arg i; //this function is the recipe to make each element

SinOsc.ar(freqs.at(i), 0, 0.1)

});


}.scope

)