Sample Loader seems fine.
Piezo Trigger is indeed broken: it should update gReadPtr only once per frame, something like this:
for(unsigned int channel = 0; channel < context->audioOutChannels; channel++) {
// If triggered...
if(gReadPtr != -1)
out = gSampleData[channel % gSampleData.size()][gReadPtr]; // ...read each sample...
audioWrite(context, n, channel, out);
}
if(gReadPtr != -1) {
gReadPtr++;
if(gReadPtr >= (int)gSampleData[0].size())
gReadPtr = -1;
}