<blocksapp="Snap! 5.0, http://snap.berkeley.edu"version="1"><block-definitions="%'attribute' of sound %'sound'"type="reporter"category="sound"><header></header><code></code><translations></translations><inputs><inputtype="%s"readonly="true">duration<options>name
duration
length
number of channels
sample rate
samples</options></input><inputtype="%obj"></input></inputs><script><blocks="doIf"><blocks="reportEquals"><blockvar="attribute"/><l>name</l></block><script><blocks="doReport"><blocks="evaluate"><blocks="reportJSFunction"><list><l>sound</l></list><l>return sound.name;</l></block><list><blockvar="sound"/></list></block></block></script></block><blocks="doIf"><blocks="reportEquals"><blockvar="attribute"/><l>samples</l></block><script><blocks="doReport"><blocks="evaluate"><blocks="reportJSFunction"><list><l>audioBuffer</l></list><l>var result, i;
if (audioBuffer.numberOfChannels > 1) {
 result = new List();
 for (i = 0; i < audioBuffer.numberOfChannels; i += 1) {
 result.add(new List(audioBuffer.getChannelData(i)));
 }
 return result;
}
return new List(audioBuffer.getChannelData(0));</l></block><list><custom-blocks="%s of sound %obj"><l></l><blockvar="sound"/></custom-block></list></block></block></script></block><blocks="doRun"><blocks="reportJSFunction"><list><l>sound</l></list><l>var base64, binaryString, len, bytes, i,
 arrayBuffer, audioCtx;
if (sound.audioBuffer) {
 return;
}
base64 = sound.audio.src.split(',')[1];
binaryString = window.atob(base64);
len = binaryString.length;
bytes = new Uint8Array(len);
for (i = 0; i < len; i += 1) {
 bytes[i] = binaryString.charCodeAt(i);
}
arrayBuffer = bytes.buffer;
Note.prototype.setupContext();
audioCtx = Note.prototype.audioContext;
audioCtx.decodeAudioData(arrayBuffer, function(buffer) {
 sound.audioBuffer = buffer;
});</l></block><list><blockvar="sound"/></list></block><blocks="doWaitUntil"><blocks="evaluate"><blocks="reportJSFunction"><list><l>sound</l></list><l>return !isNil(sound.audioBuffer);</l></block><list><blockvar="sound"/></list></block></block><blocks="doReport"><blocks="evaluate"><blocks="reportJSFunction"><list><l>sound</l><l>choice</l></list><l>switch (choice) {
case 'sample rate':
 return sound.audioBuffer.sampleRate;
case 'duration':
 return sound.audioBuffer.duration;
case 'length':
 return sound.audioBuffer.length;
case 'number of channels':
 return sound.audioBuffer.numberOfChannels;
default:
 return sound.audioBuffer;
}</l></block><list><blockvar="sound"/><blockvar="attribute"/></list></block></block></script></block-definition><block-definitions="turbo %'action'"type="command"category="other"><header></header><code></code><translations></translations><inputs><inputtype="%cs"></input></inputs><script><blocks="doDeclareVariables"><list><l>begin</l></list></block><blocks="doSetVar"><l>begin</l><blocks="reportGlobalFlag"><l><option>turbo mode</option></l></block></block><blocks="doSetGlobalFlag"><l><option>turbo mode</option></l><l><bool>true</bool></l></block><blocks="doRun"><blockvar="action"/><list></list></block><blocks="doSetGlobalFlag"><l><option>turbo mode</option></l><blockvar="begin"/></block></script></block-definition><block-definitions="play %'samples' at %'sampleRate' Hz"type="command"category="sound"><commentx="0"y="0"w="164"collapsed="false">play back a sound, a list of samples (single channel), or a list of lists (multiple channels) at the given sample rate.</comment><header></header><code></code><translations></translations><inputs><inputtype="%l"></input><inputtype="%n">44100<options>22.05 kHz=22050
44.1 kHz=44100
88.2 kHz=88200
96 kHz=96000</options></input></inputs><script><blocks="doIf"><blocks="reportIsA"><blockvar="samples"/><l><option>sound</o