I think this partly depends upon how many values you want to store per step....
a sequence might have, gate, velocity, pitch, per step....
now there are many ways to store this
lets consider a 16 step sequencer...
you could then have 3 tables each of 16 length (i.e. a value represent a step) is the most obvious,
but the way Ive done it, as i found a bit more flexible is to store in one table
e.g. in this case a table of 16 elements, and 3 'attributes', is a table of 48 length
what you do then is store as gate, pitch, velocity
GPVGPVGPV etc.
so the index is
i = STEP * (number of attributes) + attribute
e.g.
so for this example where we have 3 'attributes' (gate (0) ,pitch (1),velocity (2)) ,
if we want to access step 5 pitch it is
i = STEP * (3) + 1
the reason I use this approach is it expands easily to many attributes, and you can also add extra dimensions, e.g. you can store multiple voices...
(this is what I did in the challenge a few months back , sequencing multiple attributes for multiple voices)
this works well if you want the same resolution for the attributes... multiple tables work better where the size of the attributes differ. (e.g. some 8b, some 16b some 32b)
oh, and use the appropriate table type (8,16,32b) depending upon the resolution you need, as each is double the size of the next.
Note: those will a C background, will be familiar with this approach... as you can switch better allocating/allocating multidimensional arrays, and pointers using a linear syntax.