Hi Kevin,
Was working on a solution to a different question and realized this solution might work for your case as well. Here's an example of a Tool that uses a 3d array. If you look in the InitialState onEntry response you'll see a code block definition:
UpdateSequencers := [
0 to: 4 do: [:i |
0 to: 4 do: [:j |
0 to: 4 do: [:k |
| eventValueName |
eventValueName := ('Gate' & i, '_'& j, '_' & k) asSymbol.
SignalProcessor postEventValueNamed: eventValueName dspValue: (Space at: i at: j at: k)]]]].
Each loop in the block creates the eventValueName algorithmically with string concatenation, changes it to a Symbol, and then asks the SignalProcessor to post a value from the array to that EventValue.
Since your EventValue names are quite systematic (!Scale1, !Scale2, etc), this might be a solution to the problem you ran into. Rather than keep an Array of EventValues, you could keep an Array of values in the Tool and loop through that Array to send values to the DSP (to EventValues you construct using string concatenation).
Just a thought...