<snapdata remixID="9346137"><project name="Oscillators" app="Snap! 5.4, http://snap.berkeley.edu" version="1"><notes>Oscillator blocks, much like my Composer Blocks project, but offers a direct interface into JS Oscillators</notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAABxklEQVR4nO3XsY0aURhG0e2KhAAiCCelsEE0wEwj0wdNEJE8p7YsNlr5yrvnSC//giv9eh8DQh/1AH42AZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZIS4BvLsozb7TYej0c95VsT4BvP53NcLpcxTdPY7XZjnucxz/N4vV71tG9FgJ/Ytm0cj8cxTdMf73Q6jXVdx7qu9cT/ngA/sW3bOBwOfwV4Pp/HsiwC/AICfOP3E7zf78c8z+N6vTrBX0yAb9zvd5+Qf0CApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkBEhKgKQESEqApARISoCkfgFv9q+PXBsquwAAAABJRU5ErkJggg==</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="120" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAACtUlEQVR4nO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bo3+AAF/RMkcAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="44" y="10"><block s="receiveInteraction"><l><option>stopped</option></l></block><custom-block s="stop all oscillators"></custom-block></script><script x="72" y="169"><block s="receiveGo"></block><block s="doSetGlobalFlag"><l><option>turbo mode</option></l><l><bool>true</bool></l></block><block s="doSetTempo"><l>120</l></block><custom-block s="let %upvar be %s"><l>MIDI</l><custom-block s="MIDI data"></custom-block></custom-block><custom-block s="MIDI data $set $track %br $- data %l %br $- track #: %n %br $- instrument: %n"><block var="MIDI"/><l>1</l><l>3</l></custom-block><custom-block s="MIDI data $set $track %br $- data %l %br $- track #: %n %br $- instrument: %n"><block var="MIDI"/><l>2</l><l>3</l></custom-block><custom-block s="let %upvar be %s"><l>base</l><custom-block s="MIDI repeat %n times events %mult%obj"><l>2</l><list><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>2</l><custom-block s="shift %n by %n octaves"><l>48</l><l>-1</l></custom-block><l>0</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>60</l><l>0</l></custom-block><custom-block s="MIDI event $pitch $bend %br $- track #: %n %br $- note: %n %br $- to: %n %br $- time: %n beats %br $- delay: %n beats"><l>1</l><l>60</l><l>64</l><l>0.25</l><l>1</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>60</l><l>1</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>60</l><l>1</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>55</l><l>0</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>55</l><l>1</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>2</l><custom-block s="shift %n by %n octaves"><l>48</l><l>-1</l></custom-block><l>0</l></custom-block></list></custom-block></custom-block><custom-block s="MIDI data $add $events %br $- data: %l %br $- events: %mult%obj"><block var="MIDI"/><block var="base"/></custom-block><custom-block s="MIDI data $add $events %br $- data: %l %br $- events: %mult%obj"><block var="MIDI"/><custom-block s="MIDI repeat %n times events %mult%obj"><l>2</l><list><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>2</l><custom-block s="shift %n by %n octaves"><l>50</l><l>-1</l></custom-block><l>0</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>62</l><l>0</l></custom-block><custom-block s="MIDI event $pitch $bend %br $- track #: %n %br $- note: %n %br $- to: %n %br $- time: %n beats %br $- delay: %n beats"><l>1</l><l>62</l><l>67</l><l>0.25</l><l>1</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>62</l><l>1</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>65</l><l>1</l></custom-block><custom-block s="MIDI event $note $on %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>55</l><l>0</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>1</l><l>55</l><l>1</l></custom-block><custom-block s="MIDI event $note $off %br $- track #: %n %br $- note: %n %br $- delay: %n beats"><l>2</l><custom-block s="shift %n by %n octaves"><l>50</l><l>-1</l></custom-block><l>0</l></custom-block></list></custom-block></custom-block><custom-block s="play MIDI data %l and wait"><block var="MIDI"/></custom-block></script></scripts></sprite></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="oscillator %&apos;instrument&apos;" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%n">1<options>(1) sine=1&#xD;(2) square=2&#xD;(3) sawtooth=3&#xD;(4) triangle=4</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>inst</l></list><l>const context = this.parentThatIsA(StageMorph).audioContext();&#xD;&#xD;const gain = context.createGain();&#xD;gain.connect(context.destination);&#xD;gain.gain.value = 1/8;&#xD;&#xD;const osci = context.createOscillator();&#xD;osci.frequency.value = 440;&#xD;switch (inst) {&#xD;  case 2:&#xD;    osci.type = "square";&#xD;    break;&#xD;  case 3:&#xD;    osci.type = "sawtooth";&#xD;    break;&#xD;  case 4:&#xD;    osci.type = "triangle";&#xD;    break;&#xD;  default:&#xD;    osci.type = "sine";&#xD;    break;&#xD;}&#xD;osci.context = context;&#xD;osci.gain = gain;&#xD;osci.start();&#xD;&#xD;return osci;</l></block><list><block var="instrument"/></list></block></block></script></block-definition><block-definition s="play oscillator %&apos;osci&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%obj"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>osci</l></list><l>if (!this.hasOwnProperty("oscillators"))&#xD;  this.oscillators = [];&#xD;this.oscillators.push(osci);&#xD;if (!osci.playing)&#xD;  osci.connect(osci.gain);&#xD;osci.playing = true;</l></block><list><block var="osci"/></list></block></script></block-definition><block-definition s="stop oscillator %&apos;osci&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%obj"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>osci</l></list><l>if (this.hasOwnProperty("oscillators")) {&#xD;  let index = this.oscillators.indexOf(osci);&#xD;  if (index !== -1)&#xD;    this.oscillators.splice(index, 1);&#xD;}&#xD;if (osci.playing)&#xD;  osci.disconnect(osci.gain);&#xD;osci.playing = false;</l></block><list><block var="osci"/></list></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;val&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s">0</input></inputs><script><block s="doSetVar"><l>var</l><block var="val"/></block></script></block-definition><block-definition s="stop all oscillators" type="command" category="sound"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>if (this.hasOwnProperty("oscillators")) {&#xD;  for (osci of this.oscillators) {&#xD;    try {&#xD;      osci.playing = false;&#xD;      osci.disconnect(osci.gain);&#xD;    }catch(e){};&#xD;  }&#xD;  this.oscillators = [];&#xD;}</l></block><list></list></block></script></block-definition><block-definition s="set %&apos;data&apos; of oscillator %&apos;osci&apos; to %&apos;val&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">pitch<options>pitch&#xD;frequency&#xD;volume&#xD;instrument</options></input><input type="%obj"></input><input type="%n">0</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>data</l><l>osci</l><l>val</l></list><l>switch (data) {&#xD;  case "frequency":&#xD;    osci.frequency.setValueAtTime(val, osci.context.currentTime);&#xD;    break;&#xD;  case "volume":&#xD;    osci.gain.gain.setValueAtTime(val / 8, osci.context.currentTime);&#xD;    break;&#xD;  case "instrument":&#xD;    switch (val) {&#xD;      case 2:&#xD;        osci.type = "square";&#xD;        break;&#xD;      case 3:&#xD;        osci.type = "sawtooth";&#xD;        break;&#xD;      case 4:&#xD;        osci.type = "triangle";&#xD;        break;&#xD;      default:&#xD;        osci.type = "sine";&#xD;        break;&#xD;    }&#xD;    break;&#xD;  default:&#xD;    osci.frequency.setValueAtTime(440 * Math.pow(2, val / 12), osci.context.currentTime);&#xD;    break;&#xD;}</l></block><list><block var="data"/><block var="osci"/><block var="val"/></list></block></script></block-definition><block-definition s="bend %&apos;data&apos; of oscillator %&apos;osci&apos; to %&apos;val&apos; over %&apos;beats&apos; beats" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">pitch<options>pitch&#xD;frequency&#xD;volume</options></input><input type="%obj"></input><input type="%n">0</input><input type="%n">0.5</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>data</l><l>osci</l><l>val</l><l>beats</l></list><l>const tempo = this.parentThatIsA(StageMorph).tempo;&#xD;const seconds = beats * 60 / tempo;&#xD;switch (data) {&#xD;  case "frequency":&#xD;    osci.frequency.setValueAtTime(osci.frequency.value, osci.context.currentTime);&#xD;    osci.frequency.exponentialRampToValueAtTime(val, osci.context.currentTime + seconds);&#xD;    break;&#xD;  case "volume":&#xD;    osci.gain.gain.setValueAtTime(osci.gain.gain.value, osci.context.currentTime);&#xD;    osci.gain.gain.linearRampToValueAtTime(val / 8, osci.context.currentTime + seconds);&#xD;    break;&#xD;  default:&#xD;    osci.frequency.setValueAtTime(osci.frequency.value, osci.context.currentTime);&#xD;    osci.frequency.exponentialRampToValueAtTime(440 * Math.pow(2, val / 12), osci.context.currentTime + seconds);&#xD;    break;&#xD;}</l></block><list><block var="data"/><block var="osci"/><block var="val"/><block var="beats"/></list></block></script></block-definition><block-definition s="play oscillator %&apos;osci&apos; for %&apos;beats&apos; beats and wait" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">0.5</input></inputs><script><custom-block s="play oscillator %obj"><block var="osci"/></custom-block><block s="doRest"><block var="beats"/></block><custom-block s="stop oscillator %obj"><block var="osci"/></custom-block></script></block-definition><block-definition s="play oscillator %&apos;osci&apos; for %&apos;beats&apos; beats" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">0.5</input></inputs><script><block s="fork"><block s="reifyScript"><script><custom-block s="play oscillator %obj"><block var="osci"/></custom-block><block s="doRest"><block var="beats"/></block><custom-block s="stop oscillator %obj"><block var="osci"/></custom-block></script><list></list></block><list></list></block></script></block-definition><block-definition s="play oscillators %&apos;oscis&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mult%obj"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>osci</l><block var="oscis"/><script><custom-block s="play oscillator %obj"><block var="osci"/></custom-block></script></block></script></block></script></block-definition><block-definition s="stop oscillators %&apos;oscis&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mult%obj"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>osci</l><block var="oscis"/><script><custom-block s="stop oscillator %obj"><block var="osci"/></custom-block></script></block></script></block></script></block-definition><block-definition s="%&apos;data&apos; of note %&apos;note&apos;" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">pitch<options>pitch&#xD;frequency</options></input><input type="%n">60<options>§_pianoKeyboardMenu</options></input></inputs><script><block s="doIfElse"><block s="reportEquals"><block var="data"/><l>frequency</l></block><script><block s="doReport"><block s="reportProduct"><l>440</l><block s="reportPower"><l>2</l><block s="reportQuotient"><block s="reportDifference"><block var="note"/><l>57</l></block><l>12</l></block></block></block></block></script><script><block s="doReport"><block s="reportDifference"><block var="note"/><l>57</l></block></block></script></block></script></block-definition><block-definition s="shift %&apos;note&apos; by %&apos;oct&apos; octaves" type="reporter" category="sound"><header></header><code></code><translations></translations><inputs><input type="%n">60<options>§_pianoKeyboardMenu</options></input><input type="%n">1</input></inputs><script><block s="doReport"><block s="reportSum"><block var="note"/><block s="reportProduct"><block var="oct"/><l>12</l></block></block></block></script></block-definition><block-definition s="do %&apos;blocks&apos; in order %&apos;seq&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%mult%cmdRing"></input><input type="%mult%n"></input></inputs><script><block s="doForEach"><l>index</l><block var="seq"/><script><block s="doRun"><block s="reportListItem"><block var="index"/><block var="blocks"/></block><list></list></block></script></block></script></block-definition><block-definition s="bend %&apos;data&apos; of oscillator %&apos;osci&apos; to %&apos;val&apos; over %&apos;beats&apos; beats and wait" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">pitch<options>pitch&#xD;frequency&#xD;volume</options></input><input type="%obj"></input><input type="%n">0</input><input type="%n">0.5</input></inputs><script><custom-block s="bend %mlt of oscillator %obj to %n over %n beats"><block var="data"/><block var="osci"/><block var="val"/><block var="beats"/></custom-block><block s="doRest"><block var="beats"/></block></script></block-definition><block-definition s="tremollo on oscillator %&apos;osci&apos; by pitch %&apos;pitch&apos; at rate %&apos;rate&apos; for %&apos;beats&apos; beats and wait" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">0.5</input><input type="%n">2</input><input type="%n">1</input></inputs><script><custom-block s="let %upvar be %s"><l>original</l><block s="evaluate"><block s="reportJSFunction"><list><l>osci</l></list><l>return osci.frequency.value;</l></block><list><block var="osci"/></list></block></custom-block><custom-block s="let %upvar be %s"><l>ctime</l><block s="evaluate"><block s="reportJSFunction"><list><l>osci</l></list><l>return osci.context.currentTime;</l></block><list><block var="osci"/></list></block></custom-block><custom-block s="let %upvar be %s"><l>etime</l><block s="reportProduct"><block var="beats"/><block s="reportQuotient"><l>60</l><block s="getTempo"></block></block></block></custom-block><block s="doWaitUntil"><block s="reportGreaterThan"><block s="evaluate"><block s="reportJSFunction"><list><l>osci</l><l>orig</l><l>pitch</l><l>ctime</l><l>rate</l></list><l>const tempo = this.parentThatIsA(StageMorph).tempo;&#xD;const passedTime = osci.context.currentTime - ctime; &#xD;const seconds = tempo * rate / 60;&#xD;const effect = Math.sin(2 * passedTime * seconds * Math.PI);&#xD;const multiplier = Math.pow(2, effect * pitch/12);&#xD;osci.frequency.setValueAtTime(orig * multiplier, osci.context.currentTime);&#xD;return passedTime;</l></block><list><block var="osci"/><block var="original"/><block var="pitch"/><block var="ctime"/><block var="rate"/></list></block><block var="etime"/></block></block><custom-block s="set %mlt of oscillator %obj to %n"><l>frequency</l><block var="osci"/><block var="original"/></custom-block></script></block-definition><block-definition s="MIDI data" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reportNewList"><list></list></block><block s="reportNewList"><list></list></block></list></block></block></script></block-definition><block-definition s="MIDI event $note $on $nl $- track #: %&apos;track&apos; $nl $- note: %&apos;note&apos; $nl $- delay: %&apos;delay&apos; beats" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n">60<options>§_pianoKeyboardMenu</options></input><input type="%n">0.5</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="delay"/><l>note on</l><block var="track"/><block var="note"/></list></block></block></script></block-definition><block-definition s="MIDI event $note $off $nl $- track #: %&apos;track&apos; $nl $- note: %&apos;note&apos; $nl $- delay: %&apos;delay&apos; beats" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n">60<options>§_pianoKeyboardMenu</options></input><input type="%n">0.5</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="delay"/><l>note off</l><block var="track"/><block var="note"/></list></block></block></script></block-definition><block-definition s="MIDI event %&apos;type&apos; %&apos;event&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">type<options>type&#xD;delay</options></input><input type="%obj"></input></inputs><script><block s="doReport"><block s="reportListItem"><block s="reportIfElse"><block s="reportEquals"><block var="type"/><l>delay</l></block><l>1</l><l>2</l></block><block var="event"/></block></block></script></block-definition><block-definition s="MIDI event %&apos;event&apos; data at %&apos;index&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%n">1</input></inputs><script><block s="doReport"><block s="reportListItem"><block s="reportSum"><block var="index"/><l>2</l></block><block var="event"/></block></block></script></block-definition><block-definition s="MIDI event $rest $nl $- delay: %&apos;delay&apos; beats" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">0.5</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="delay"/><l>rest</l></list></block></block></script></block-definition><block-definition s="MIDI event $tempo $nl $- tempo: %&apos;tempo&apos; bpm $nl $- delay: %&apos;delay&apos; beats" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">60</input><input type="%n">0.5</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="delay"/><l>tempo</l><block var="tempo"/></list></block></block></script></block-definition><block-definition s="MIDI data $add $events $nl $- data: %&apos;data&apos; $nl $- events: %&apos;events&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%mult%obj"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>event</l><block var="events"/><script><block s="doAddToList"><block var="event"/><custom-block s="%mlt of MIDI data %l"><l>events</l><block var="data"/></custom-block></block></script></block></script></block></script></block-definition><block-definition s="%&apos;item&apos; of MIDI data %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%mlt" readonly="true">tracks<options>tracks&#xD;events</options></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><block s="reportIfElse"><block s="reportEquals"><block var="item"/><l>events</l></block><l>2</l><l>1</l></block><block var="data"/></block></block></script></block-definition><block-definition s="MIDI data $set $track $nl $- data %&apos;data&apos; $nl $- track #: %&apos;track&apos; $nl $- instrument: %&apos;inst&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%n">1</input><input type="%n">1<options>(1) sine=1&#xD;(2) square=2&#xD;(3) sawtooth=3&#xD;(4) triangle=4</options></input></inputs><script><block s="doReplaceInList"><block var="track"/><custom-block s="%mlt of MIDI data %l"><l>tracks</l><block var="data"/></custom-block><block var="inst"/></block></script></block-definition><block-definition s="play MIDI data %&apos;data&apos; and wait" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doDeclareVariables"><list><l>curMode</l><l>curTrack</l><l>curOsc</l><l>curNote</l></list></block><custom-block s="let %upvar be %s"><l>onNotes</l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportNewList"><list></list></block></autolambda><list></list></block><custom-block s="%mlt of MIDI data %l"><l>tracks</l><block var="data"/></custom-block></block></custom-block><block s="doForEach"><l>event</l><custom-block s="%mlt of MIDI data %l"><l>events</l><block var="data"/></custom-block><script><block s="doRest"><custom-block s="MIDI event %mlt %obj"><l>delay</l><block var="event"/></custom-block></block><block s="doWarp"><script><block s="doSetVar"><l>curMode</l><custom-block s="MIDI event %mlt %obj"><l>type</l><block var="event"/></custom-block></block><block s="doIfElse"><block s="reportOr"><block s="reportEquals"><block var="curMode"/><l>note on</l></block><block s="reportEquals"><block var="curMode"/><l>note off</l></block></block><script><block s="doSetVar"><l>curTrack</l><block s="reportListItem"><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>1</l></custom-block><block var="onNotes"/></block></block><block s="doSetVar"><l>curNote</l><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>2</l></custom-block></block><block s="doIf"><block s="reportListItem"><block var="curNote"/><block var="curTrack"/></block><script><custom-block s="stop oscillator %obj"><block s="reportListItem"><block var="curNote"/><block var="curTrack"/></block></custom-block><block s="doReplaceInList"><block var="curNote"/><block var="curTrack"/><l></l></block></script></block><block s="doIf"><block s="reportEquals"><block var="curMode"/><l>note on</l></block><script><block s="doSetVar"><l>curOsc</l><custom-block s="oscillator %n"><block s="reportListItem"><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>1</l></custom-block><custom-block s="%mlt of MIDI data %l"><l>tracks</l><block var="data"/></custom-block></block></custom-block></block><custom-block s="set %mlt of oscillator %obj to %n"><l>pitch</l><block var="curOsc"/><custom-block s="%mlt of note %n"><l>pitch</l><block var="curNote"/></custom-block></custom-block><custom-block s="play oscillator %obj"><block var="curOsc"/></custom-block><block s="doReplaceInList"><block var="curNote"/><block var="curTrack"/><block var="curOsc"/></block></script></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="curMode"/><l>tempo</l></block><script><block s="doSetTempo"><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>1</l></custom-block></block></script><script><block s="doIfElse"><block s="reportEquals"><block var="curMode"/><l>pitch bend</l></block><script><block s="doSetVar"><l>curTrack</l><block s="reportListItem"><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>1</l></custom-block><block var="onNotes"/></block></block><block s="doSetVar"><l>curNote</l><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>2</l></custom-block></block><block s="doIf"><block s="reportListItem"><block var="curNote"/><block var="curTrack"/></block><script><custom-block s="bend %mlt of oscillator %obj to %n over %n beats"><l>pitch</l><block s="reportListItem"><block var="curNote"/><block var="curTrack"/></block><custom-block s="%mlt of note %n"><l>pitch</l><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>3</l></custom-block></custom-block><custom-block s="MIDI event %obj data at %n"><block var="event"/><l>4</l></custom-block></custom-block></script></block></script><script></script></block></script></block></script></block></script></block></script></block></script></block-definition><block-definition s="play MIDI data %&apos;data&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="fork"><block s="reifyScript"><script><custom-block s="play MIDI data %l and wait"><block var="data"/></custom-block></script><list></list></block><list></list></block></script></block-definition><block-definition s="MIDI event $pitch $bend $nl $- track #: %&apos;track&apos; $nl $- note: %&apos;note&apos; $nl $- to: %&apos;to&apos; $nl $- time: %&apos;time&apos; beats $nl $- delay: %&apos;delay&apos; beats" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">1</input><input type="%n">60<options>§_pianoKeyboardMenu</options></input><input type="%n">64<options>§_pianoKeyboardMenu</options></input><input type="%n">1</input><input type="%n">0.5</input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="delay"/><l>pitch bend</l><block var="track"/><block var="note"/><block var="to"/><block var="time"/></list></block></block></script></block-definition><block-definition s="MIDI repeat %&apos;n&apos; times events %&apos;events&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%n">2</input><input type="%mult%obj"></input></inputs><script><block s="doIfElse"><block s="reportGreaterThan"><block var="n"/><l>1</l></block><script><block s="doWarp"><script><custom-block s="let %upvar be %s"><l>list</l><block s="reportNewList"><list></list></block></custom-block><block s="doFor"><l>i</l><l>1</l><block var="n"/><script><block s="doForEach"><l>event</l><block var="events"/><script><block s="doAddToList"><block var="event"/><block var="list"/></block></script></block></script></block><block s="doReport"><block var="list"/></block></script></block></script><script><block s="doReport"><block var="events"/></block></script></block></script></block-definition></blocks><variables></variables></project><media name="Oscillators" app="Snap! 5.4, http://snap.berkeley.edu" version="1"></media></snapdata>