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
)