<snapdata remixID="9345870"><project name='Composer Blocks' app='Snap! 5.4, http://snap.berkeley.edu' version='1'>
  <notes>These blocks are designed for composers and musicians, who have tried using the existing audio blocks and found that they lacked some functionalities or did not sound proper. 

These oscillator blocks provide some fixes to the existing blocks as well as a few shortcut blocks. Keep in mind that the audio will not stop playing when using [stop all sounds] or stopping! (not implemented yet!) 

All of the blocks should have help text, and you can always reference the original project.
</notes>
  <thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAADOUlEQVR4Xu3XQUpjYRCF0V9RcOIW3I8bEHSgBtyJ28kmsh5x4iQEB6/BWQ+U5nLpAjkZp6rIeR88crZt27Z8CAwJnAlwSN7ZLwEBCmFUQICj/I4LUAOjAgIc5XdcgBoYFRDgKL/jAtTAqIAAR/kdF6AGRgUEOMrvuAA1MCogwFF+xwWogVEBAY7yOy5ADYwKCHCU33EBamBUQICj/I4LUAOjAgIc5XdcgBoYFRDgKL/jAtTAqIAAR/kdF6AGRgUEOMrvuAA1MCogwFF+xwWogVEBAY7yOy5ADYwKCHCU33EBamBUQICj/I4LUAOjAgIc5XdcgBoYFRDgKL/jAtTAqIAAR/kdF6AGRgUEOMrvuAA1MCogwFF+xwWogVEBAY7yOy5ADYwKCHCU33EBamBUQICj/I4LUAOjAgIc5XdcgBoYFRDgKL/jAtTAqIAAv+Hf7/fr/f193d7erpubm9GH9JuPC/Cbp/vx8bFeXl7W5+fnent7W/f39+vi4mI9PT2tq6ur39zEf/1tAvyB+3A4rNfX13V9ff3Xt47H43p+fl7btn2F6ZMLCDAI8HQ6rcfHx3V+fr7u7u5yfZNLgP/4Cn54ePh6Be92u3V5eSmdkoAA/QkppZStEWDmZqokIMASpDWZgAAzN1MlAQGWIK3JBASYuZkqCQiwBGlNJiDAzM1USUCAJUhrMgEBZm6mSgICLEFakwkIMHMzVRIQYAnSmkxAgJmbqZKAAEuQ1mQCAszcTJUEBFiCtCYTEGDmZqokIMASpDWZgAAzN1MlAQGWIK3JBASYuZkqCQiwBGlNJiDAzM1USUCAJUhrMgEBZm6mSgICLEFakwkIMHMzVRIQYAnSmkxAgJmbqZKAAEuQ1mQCAszcTJUEBFiCtCYTEGDmZqokIMASpDWZgAAzN1MlAQGWIK3JBASYuZkqCQiwBGlNJiDAzM1USUCAJUhrMgEBZm6mSgICLEFakwkIMHMzVRIQYAnSmkxAgJmbqZKAAEuQ1mQCAszcTJUEBFiCtCYTEGDmZqokIMASpDWZgAAzN1MlAQGWIK3JBASYuZkqCQiwBGlNJiDAzM1USUCAJUhrMgEBZm6mSgJ/AE38F7dMeMlrAAAAAElFTkSuQmCC</thumbnail>
  <stage inheritance='true' id='1' volume='100' height='360' tempo='180' lines='round' width='480' sublistIDs='false' name='Stage' threadsafe='false' codify='false' penlog='false' color='255,255,255,1' scheduled='false' pan='0' ternary='false' costume='0'>
    <pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails>
    <costumes>
      <list id='2' struct='atomic'/>
    </costumes>
    <sounds>
      <list id='3' struct='atomic'/>
    </sounds>
    <variables/>
    <blocks/>
    <scripts/>
    <sprites>
      <sprite draggable='true' x='0' pen='tip' id='8' y='0' name='Sprite' idx='1' volume='100' rotation='1' scale='1' color='80,80,80,1' heading='90' pan='0' instrument='1' costume='0'>
        <costumes>
          <list id='9' struct='atomic'/>
        </costumes>
        <sounds>
          <list id='10' struct='atomic'/>
        </sounds>
        <blocks/>
        <variables/>
        <scripts>
          <script x='10' y='10'>
            <block s='receiveGo'/>
            <block s='doSetGlobalFlag'>
              <l>
                <option>turbo mode</option>
              </l>
              <l>
                <bool>true</bool>
              </l>
            </block>
            <block s='doSetTempo'>
              <l>180</l>
            </block>
            <custom-block s='let %upvar be %s'>
              <l>arpeggio 1</l>
              <block s='reifyScript'>
                <script>
                  <block s='doFor'>
                    <l>i</l>
                    <l>1</l>
                    <block var='times'/>
                    <script>
                      <custom-block s='play arpeggio %mult%n Hz for %n beats'>
                        <list>
                          <custom-block s='frequency %n'>
                            <l>48</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>52</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>53</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>55</l>
                          </custom-block>
                        </list>
                        <l>0.5</l>
                      </custom-block>
                    </script>
                  </block>
                </script>
                <list>
                  <l>times</l>
                </list>
              </block>
            </custom-block>
            <custom-block s='let %upvar be %s'>
              <l>arpeggio 2</l>
              <block s='reifyScript'>
                <script>
                  <block s='doFor'>
                    <l>i</l>
                    <l>1</l>
                    <block var='times'/>
                    <script>
                      <custom-block s='play arpeggio %mult%n Hz for %n beats'>
                        <list>
                          <custom-block s='frequency %n'>
                            <l>47</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>50</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>52</l>
                          </custom-block>
                          <custom-block s='frequency %n'>
                            <l>55</l>
                          </custom-block>
                        </list>
                        <l>0.5</l>
                      </custom-block>
                    </script>
                  </block>
                </script>
                <list>
                  <l>times</l>
                </list>
              </block>
            </custom-block>
            <custom-block s='let %upvar be %s'>
              <l>intro</l>
              <block s='reifyScript'>
                <script>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>4</l>
                    </list>
                  </block>
                </script>
                <list/>
              </block>
            </custom-block>
            <custom-block s='let %upvar be %s'>
              <l>part A</l>
              <block s='reifyScript'>
                <script>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <l>72</l>
                    </custom-block>
                    <l>4</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>2</l>
                    </list>
                  </block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <l>71</l>
                    </custom-block>
                    <l>4</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>2</l>
                    </list>
                  </block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <custom-block s='octave %n %n'>
                        <l>65</l>
                        <l>-2</l>
                      </custom-block>
                    </custom-block>
                    <l>8</l>
                  </custom-block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <l>69</l>
                    </custom-block>
                    <l>7</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>3</l>
                    </list>
                  </block>
                  <custom-block s='play arpeggio %mult%n Hz for %n beats'>
                    <list>
                      <custom-block s='frequency %n'>
                        <l>48</l>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <l>52</l>
                      </custom-block>
                    </list>
                    <l>0.5</l>
                  </custom-block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <l>67</l>
                    </custom-block>
                    <l>1</l>
                  </custom-block>
                  <custom-block s='play arpeggio %mult%n Hz for %n beats'>
                    <list>
                      <custom-block s='frequency %n'>
                        <l>53</l>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <l>55</l>
                      </custom-block>
                    </list>
                    <l>0.5</l>
                  </custom-block>
                </script>
                <list/>
              </block>
            </custom-block>
            <custom-block s='let %upvar be %s'>
              <l>part B</l>
              <block s='reifyScript'>
                <script>
                  <custom-block s='play frequencies %mult%n Hz for %n beats without waiting'>
                    <list>
                      <custom-block s='frequency %n'>
                        <custom-block s='octave %n %n'>
                          <l>65</l>
                          <l>-2</l>
                        </custom-block>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <l>69</l>
                      </custom-block>
                    </list>
                    <l>4</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>2</l>
                    </list>
                  </block>
                  <custom-block s='play frequencies %mult%n Hz for %n beats without waiting'>
                    <list>
                      <custom-block s='frequency %n'>
                        <custom-block s='octave %n %n'>
                          <l>69</l>
                          <l>-2</l>
                        </custom-block>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <custom-block s='octave %n %n'>
                          <l>64</l>
                          <l>-1</l>
                        </custom-block>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <l>72</l>
                      </custom-block>
                    </list>
                    <l>4</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 1'/>
                    <list>
                      <l>2</l>
                    </list>
                  </block>
                  <custom-block s='play frequencies %mult%n Hz for %n beats without waiting'>
                    <list>
                      <custom-block s='frequency %n'>
                        <custom-block s='octave %n %n'>
                          <l>67</l>
                          <l>-2</l>
                        </custom-block>
                      </custom-block>
                      <custom-block s='frequency %n'>
                        <custom-block s='octave %n %n'>
                          <l>62</l>
                          <l>-1</l>
                        </custom-block>
                      </custom-block>
                    </list>
                    <l>8</l>
                  </custom-block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <l>71</l>
                    </custom-block>
                    <l>4</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 2'/>
                    <list>
                      <l>2</l>
                    </list>
                  </block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <custom-block s='octave %n %n'>
                        <l>67</l>
                        <l>1</l>
                      </custom-block>
                    </custom-block>
                    <l>2</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 2'/>
                    <list>
                      <l>1</l>
                    </list>
                  </block>
                  <custom-block s='play frequency %n Hz for %n beats without waiting'>
                    <custom-block s='frequency %n'>
                      <custom-block s='octave %n %n'>
                        <l>59</l>
                        <l>1</l>
                      </custom-block>
                    </custom-block>
                    <l>2</l>
                  </custom-block>
                  <block s='doRun'>
                    <block var='arpeggio 2'/>
                    <list>
                      <l>1</l>
                    </list>
                  </block>
                </script>
                <list/>
              </block>
            </custom-block>
            <block s='doForEach'>
              <l>instrument</l>
              <block s='reportNumbers'>
                <l>1</l>
                <l>4</l>
              </block>
              <script>
                <block s='doSetInstrument'>
                  <block var='instrument'/>
                </block>
                <custom-block s='do %mult%cmdRing in order %mult%n'>
                  <list>
                    <block var='intro'/>
                    <block var='part A'/>
                    <block var='part B'/>
                  </list>
                  <list>
                    <l>1</l>
                    <l>2</l>
                    <l>3</l>
                    <l>2</l>
                    <l>3</l>
                  </list>
                </custom-block>
              </script>
              <comment collapsed='false' w='100.000001'>For each instrument</comment>
            </block>
          </script>
        </scripts>
      </sprite>
    </sprites>
  </stage>
  <hidden/>
  <headers/>
  <code/>
  <blocks>
    <block-definition s='play frequency %&apos;freq&apos; Hz for %&apos;b&apos; beats' category='sound' type='command'>
      <comment collapsed='false' w='199'>Plays a specific note and waits for it to finish</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%n'>440</input>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <custom-block s='play frequency %n Hz for %n beats without waiting'>
          <block var='freq'/>
          <block var='b'/>
        </custom-block>
        <block s='doRest'>
          <block var='b'/>
        </block>
      </script>
    </block-definition>
    <block-definition s='play frequencies %&apos;freqs&apos; Hz for %&apos;b&apos; beats' category='sound' type='command'>
      <comment collapsed='false' w='180'>Plays a chord and waits for it to finish</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%mult%n'/>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <custom-block s='play frequencies %mult%n Hz for %n beats without waiting'>
          <block var='freqs'/>
          <block var='b'/>
        </custom-block>
        <block s='doRest'>
          <block var='b'/>
        </block>
      </script>
    </block-definition>
    <block-definition s='frequency %&apos;note&apos;' category='sound' type='reporter'>
      <comment collapsed='false' w='183'>Returns the frequency for a piano note</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%n'>60<options>§_pianoKeyboardMenu</options>
        </input>
      </inputs>
      <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>69</l>
                </block>
                <l>12</l>
              </block>
            </block>
          </block>
        </block>
      </script>
    </block-definition>
    <block-definition s='play arpeggio %&apos;freqs&apos; Hz for %&apos;b&apos; beats' category='sound' type='command'>
      <comment collapsed='false' w='257'>Plays all of the notes in order and waits for them to finish</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%mult%n'/>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <block s='doForEach'>
          <l>item</l>
          <block var='freqs'/>
          <script>
            <custom-block s='play frequency %n Hz for %n beats'>
              <block var='item'/>
              <block var='b'/>
            </custom-block>
          </script>
        </block>
      </script>
    </block-definition>
    <block-definition s='play frequency %&apos;freq&apos; Hz for %&apos;b&apos; beats without waiting' category='sound' type='command'>
      <comment collapsed='false' w='80'>Plays a note</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%n'>440</input>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <block s='doRun'>
          <block s='reportJSFunction'>
            <list>
              <l>freq</l>
              <l>b</l>
            </list>
            <l>const stage = this.parentThatIsA(StageMorph);let context = stage.audioContext();let gain = context.createGain();gain.connect(context.destination);gain.gain.value = stage.volume/800; const oscillator = context.createOscillator();oscillator.connect(gain);let inst;switch (this.instrument) {    default:        inst = "sine";        break;    case 2:        inst = "square";        break;    case 3:        inst = "sawtooth";        break;    case 4:        inst = "triangle";        break;}oscillator.type = inst;oscillator.frequency.value = freq;oscillator.start();oscillator.stop(context.currentTime + b * 60 / stage.tempo);</l>
          </block>
          <list>
            <block var='freq'/>
            <block var='b'/>
          </list>
        </block>
      </script>
    </block-definition>
    <block-definition s='octave %&apos;note&apos; %&apos;oct&apos;' category='sound' type='reporter'>
      <comment collapsed='false' w='291'>Outputs the note after it has been shifted by the octave</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%n'>60<options>§_pianoKeyboardMenu</options>
        </input>
        <input type='%n'>0</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;order&apos;' category='control' type='command'>
      <comment collapsed='false' w='167'>Do each block in the order specified</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%mult%cmdRing'/>
        <input type='%mult%n'/>
      </inputs>
      <script>
        <block s='doForEach'>
          <l>index</l>
          <block var='order'/>
          <script>
            <block s='doRun'>
              <block s='reportListItem'>
                <block var='index'/>
                <block var='blocks'/>
              </block>
              <list/>
            </block>
          </script>
        </block>
      </script>
    </block-definition>
    <block-definition s='let %&apos;var&apos; be %&apos;val&apos;' category='other' type='command'>
      <comment collapsed='false' w='200'>Creates a script variable with an initial value</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%upvar'/>
        <input type='%s'>0</input>
      </inputs>
      <script>
        <block s='doSetVar'>
          <l>var</l>
          <block var='val'/>
        </block>
      </script>
    </block-definition>
    <block-definition s='play frequencies %&apos;freqs&apos; Hz for %&apos;b&apos; beats without waiting' category='sound' type='command'>
      <comment collapsed='false' w='90'>Plays a chord</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%mult%n'/>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <block s='doRun'>
          <block s='reportJSFunction'>
            <list>
              <l>freqs</l>
              <l>b</l>
            </list>
            <l>const stage = this.parentThatIsA(StageMorph);let context = stage.audioContext();let gain = context.createGain();gain.connect(context.destination);gain.gain.value = stage.volume/800;let inst;switch (this.instrument) {    default:        inst = "sine";        break;    case 2:        inst = "square";        break;    case 3:        inst = "sawtooth";        break;    case 4:        inst = "triangle";        break;} for (freq of freqs.asArray()) {  let oscillator = context.createOscillator();  oscillator.connect(gain);  oscillator.type = inst;  oscillator.frequency.value = freq;  oscillator.start(context.currentTime);  oscillator.stop(context.currentTime + b * 60 / stage.tempo);}</l>
          </block>
          <list>
            <block var='freqs'/>
            <block var='b'/>
          </list>
        </block>
      </script>
    </block-definition>
    <block-definition s='play arpeggio %&apos;freqs&apos; Hz for %&apos;b&apos; beats without waiting' category='sound' type='command'>
      <comment collapsed='false' w='137'>Plays all of the notes in order</comment>
      <header/>
      <code/>
      <translations/>
      <inputs>
        <input type='%mult%n'/>
        <input type='%n'>0.5</input>
      </inputs>
      <script>
        <block s='fork'>
          <block s='reifyScript'>
            <script>
              <custom-block s='play arpeggio %mult%n Hz for %n beats'>
                <block var='freqs'/>
                <block var='b'/>
              </custom-block>
            </script>
            <list/>
          </block>
          <list/>
        </block>
      </script>
    </block-definition>
  </blocks>
  <variables/>
</project><media name="Composer Blocks" app="Snap! 5.4, http://snap.berkeley.edu" version="1"></media></snapdata>