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="reportIsFastTracking"></block></block><blocks="doSetFastTracking"><l><bool>true</bool></l></block><blocks="doRun"><blockvar="action"/><list></list></block><blocks="doSetFastTracking"><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.
for demo purposes this block also fast-plots the samples on the stage</comment><header></header><code></code><translations></translations><inputs><inputtype="%l"></input><inputtype="%n">44100<options>22.05 kHz=22050
96 kHz=96000</options></input></inputs><script><blocks="doDeclareVariables"><list><l>output</l><l>sample period</l><l>duration in samples</l><l>time</l></list></block><blocks="doSetVar"><l>sample period</l><blocks="reportQuotient"><l>1</l><blockvar="sample rate"/></block></block><blocks="doSetVar"><l>duration in samples</l><blocks="reportMonadic"><l><option>ceiling</option></l><blocks="reportProduct"><blockvar="duration"/><blockvar="sample rate"/></block></block></block><blocks="doSetVar"><l>time</l><l>0</l></block><blocks="doSetVar"><l>output</l><blocks="reportNewList"><list></list></block></block><blocks="doWarp"><script><blocks="doRepeat"><blockvar="duration in samples"/><script><blocks="doAddToList"><blocks="reportMonadic"><l><option>sin</option></l><custom-blocks="degrees %n"><blocks="reportProduct"><l>2</l><blocks="reportProduct"><custom-blocks="PI"></custom-block><blocks="reportProduct"><blockvar="frequency"/><blockvar="time"/></block></block></block></custom-block></block><blockvar="output"/></block><blocks="doChangeVar"><l>time</l><blockvar="sample period"/></block></script></block></script></block><blocks="doReport"><blockvar="output"/></block></script></block-definition><block-definitions="for each %'item' of %'data' %'action'"type="command"category="lists"><header></header><code></code><translations></translations><inputs><inputtype="%upvar"></input><inputtype="%l"></input><inputtype="%cs"></input></inputs><script><blocks="doUntil"><blocks="reportEquals"><blockvar="data"/><blocks="reportNewList"><list></list></block></block><script><blocks="doSetVar"><l>item</l><blocks="reportListItem"><l>1</l><blockvar="data"/></block></block><blocks="doRun"><blockvar="action"/><list><blocks="reportListItem"><l>1</l><blockvar="data"/></block></list></block><blocks="doSetVar"><l>data</l><blocks="reportCDR"><blockvar="data"/></block></block></script></block></script></block-definition><block-definitions="PI"type="reporter"category="operators"><header></header><code></code><translations></translations><inputs></inputs><script><blocks="doReport"><l>3.141592653589793</l></block></script></block-definition><block-definitions="degrees %'radians'"type="reporter"category="operators"><header></header><code></code><translations></translations><inputs><inputtype="%n">0.5</input></inputs><script><blocks="doReport"><blocks="reportQuotient"><blocks="reportProduct"><blockvar="radians"/><l>180</l></block><custom-blocks="PI"></custom-block></block></block></script></block-definition><block-definitions="find first in %'list' such that %'test'"type="reporter"category="lists"><header></header><code></code><translations></translations><inputs><inputtype="%l"></input><inputtype="%predRing"></input></inputs><script><blocks="doIf"><blocks="reportEquals"><blockvar="list"/><blocks="reportNewList"><list></list></block></block><script><custom-blocks="error %s"><l>item not found in list</l></custom-block></script></block><blocks="doIf"><blocks="evaluate"><blockvar="test"/><list><blocks="reportListItem"><l>1</l><blockvar="list"/></block></list></block><script><blocks="doReport"><blocks="reportListItem"><l>1</l><blockvar="list"/></block></block></script></block><blocks="doReport"><custom-blocks="find first in %l such that %predRing"><blocks="reportCDR"><blockvar="list"/></block><blockvar="test"/></custom-block></block></script></block-definition><block-definitions="error %'msg'"type="command"category="control"><header></header><code></code><translations></translations><inputs><inputtype="%s"></input></inputs><script><blocks="doRun"><blocks="reportJSFunction"><list><l>msg</l></list><l>throw new Error(msg)</l></block><list><blockvar="msg"/></list></block></script></block-definition><block-definitions="sound named %'name'"type="reporter"category="sensing"><header></header><code></code><translations></translations><inputs><inputtype="%s"></input></inputs><script><blocks="doReport"><cus