Dictionary and array inside patterns

Thank you @loopier for you reply

It doesn’t seems to work for me and I think the problem is that elements in my array are not buffers but dictionaries in this form:

Dictionary[ (buffer -> Buffer(3, 121654, 2, 44100, /path/to/Sonatina Symphonic Orchestra/Samples/Bass Clarinet/bass_clarinet-d2.wav)), (note -> d2), (midi -> 38) ]

However I’ve tried another way that is working, see below (basically I’m creating two arrays, one for indices and the other one for buffers). The code sounds quite redundant to me but it works.

Was wondering if it exist a pattern to select keys from a dictionary the same Pindex do for arrays.

(
var tmp_buffers;
var tmp_array;

tmp_buffers = SoundFile.collectIntoBuffers("/path/to/Sonatina Symphonic Orchestra/Samples/Bass Clarinet/bass_clarinet-*.wav", s);

tmp_array = Array.newClear();

tmp_buffers.do{
  |item, index|
  var d = Dictionary.new;
  var string = PathName(item.path).fileNameWithoutExtension;
  var output = string.findRegexp("[abcdefgABCDEFG]#?[0123456789]");
  var noteNameAll = output[0][1];
  var octNumber = noteNameAll.rotate(1)[0].asString.asInteger;
  var noteName = noteNameAll[0].asString;
  var isSharp = noteNameAll.contains("#"); // boolean
  //[noteNameAll, noteName, octNumber, isSharp].postln;
  var midiNumber = (octNumber +1) * 12;
  switch( noteName,
    "c", { midiNumber = midiNumber+0; },
    "d", { midiNumber = midiNumber+2; },
    "e", { midiNumber = midiNumber+4; },
    "f", { midiNumber = midiNumber+5; },
    "g", { midiNumber = midiNumber+7; },
    "a", { midiNumber = midiNumber+9; },
    "b", { midiNumber = midiNumber+11; },
  );
  if(isSharp, {midiNumber = midiNumber + 1;});
  [noteNameAll, noteName, isSharp, octNumber, midiNumber].postln;
  d.add(\midi -> midiNumber.asInteger);
  d.add(\note -> noteNameAll);
  d.add(\buffer -> item);
  tmp_array = tmp_array.add(d);
};

tmp_array.sortBy(\midi);

~bass_clarinet_lowest_note = tmp_array[0][\midi];
~bass_clarinet_buffers = Array.newClear();
~bass_clarinet_midinotes = Array.newClear();

tmp_array.do{
  |item, index|
  [index, item.values].postln;
  ~bass_clarinet_buffers = ~bass_clarinet_buffers.add(item[\buffer]);
  ~bass_clarinet_midinotes = ~bass_clarinet_midinotes.add(item[\midi]);
};

SynthDef(\playbuf, {
  |buf, rate=1, amp=0.5, gate=1|
  var sig, env;
	env = EnvGen.ar(Env.asr(0.01, 1, 0.5), gate, doneAction:2);
  sig = PlayBuf.ar(2, buf, BufRateScale.ir(buf)*rate, 1, doneAction:0);
  sig = sig * amp * env;
  Out.ar(0, sig!2);
}).add;

a = Pbind(
	\instrument, \playbuf,
	\midinote, Pseq((37..75), inf).trace,
	\index, ((Pkey(\midinote) - (~bass_clarinet_lowest_note-1))/3).floor,
	\buf, Pindex(~bass_clarinet_buffers, Pkey(\index)).trace,
	\rate, (Pkey(\midinote) - Pindex(~bass_clarinet_midinotes, Pkey(\index))).midiratio,
	\amp, 0.2,
	\dur, 0.25
).asEventStreamPlayer;
)

a.play;
a.stop;