<instrument type='blue.orchestra.BlueSynthBuilder' editEnabled='true'>
  <name>Shepard tone - v1.0</name>
  <comment>This instrument creates a Shepard tone.
See http://en.wikipedia.org/wiki/Shepard_tone for more info on what a Shepard tone is.


p-fields:

  p4 is the pitch or frequency

  p5 is the amplitude


BSB widgets:

  speed is how fast each component varies

  envelope shape determines when the amplitude of a component is the highest,
    more to the beginning or to the end; use 0.5 for regular Shepard tone

  pulse width is used for the vco2 opcode if the waveform is square or triangle,
    values are limited to the stable range

  speed, envelope shape, pulse width and panning have an extra text field
    which in the code is appended to the value of the knob;
    use e.g. *p6 to change the value from the score


For a regular Shepard tone, use a sine wave. The other waveforms have strange
artefacts, which can be nice.</comment>
  <globalOrc>gi_sine ftgen 0, 0, 65536, 10, 1
</globalOrc>
  <globalSco/>
  <instrumentText>ifreq getFrequency p4
iamp = ampdb(p5)

kenv adsr  &lt;attack&gt;, &lt;decay&gt;, &lt;sustain&gt;, &lt;release&gt;

asig mvpShepardComponent ifreq, &lt;freq_dir&gt;, &lt;envelope_shape&gt;&lt;env_shape_mod&gt;, (&lt;speed&gt;&lt;speed_mod&gt;)/&lt;nr_tones&gt;, 0, &lt;nr_tones&gt;, &lt;wave&gt;, &lt;pw&gt;&lt;pw_mod&gt;
asig = asig*kenv*iamp/&lt;nr_tones&gt;

kleft, kright panner &lt;pan&gt;&lt;pan_mod&gt;

blueMixerOut asig*kleft, asig*kright
</instrumentText>
  <graphicInterface editEnabled='false'>
    <uniqueNameManager nameIndex='0' defaultPrefix='bsbObj'/>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBHSlider'>
      <objectName>nr_tones</objectName>
      <x>126</x>
      <y>70</y>
      <automationAllowed>true</automationAllowed>
      <minimum>2.0</minimum>
      <maximum>20.0</maximum>
      <resolution>1.0</resolution>
      <value>6.0</value>
      <sliderWidth>150</sliderWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown'>
      <objectName>freq_dir</objectName>
      <x>130</x>
      <y>115</y>
      <bsbDropdownItemList>
        <bsbDropdownItem>
          <name>Up</name>
          <value>1</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Down</name>
          <value>-1</value>
        </bsbDropdownItem>
      </bsbDropdownItemList>
      <selectedIndex>1</selectedIndex>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>14</x>
      <y>118</y>
      <label>Frequency moves</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown'>
      <objectName>wave</objectName>
      <x>23</x>
      <y>263</y>
      <bsbDropdownItemList>
        <bsbDropdownItem>
          <name>Sine</name>
          <value>-1</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Sawtooth</name>
          <value>0</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Triangle</name>
          <value>4</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Square</name>
          <value>2</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Paraboles</name>
          <value>8</value>
        </bsbDropdownItem>
      </bsbDropdownItemList>
      <selectedIndex>0</selectedIndex>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>pw</objectName>
      <x>131</x>
      <y>285</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.15</minimum>
      <maximum>0.85</maximum>
      <value>0.2209673</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>speed</objectName>
      <x>497</x>
      <y>95</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>10.0</maximum>
      <value>3.2168531</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>497</x>
      <y>73</y>
      <label>Speed (Hz)</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>13</x>
      <y>77</y>
      <label>Nr of components</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>25</x>
      <y>229</y>
      <label>&lt;html&gt;&lt;font size=&quot;+1&quot;&gt;Waveform&lt;/font&gt;&lt;/html&gt;</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>129</x>
      <y>264</y>
      <label>Pulse width</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>377</x>
      <y>73</y>
      <label>Envelope shape</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>envelope_shape</objectName>
      <x>391</x>
      <y>95</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1.0</maximum>
      <value>0.5064934</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>pan</objectName>
      <x>647</x>
      <y>95</y>
      <automationAllowed>true</automationAllowed>
      <minimum>-1.0</minimum>
      <maximum>1.0</maximum>
      <value>0.005028963</value>
      <knobWidth>60</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>654</x>
      <y>73</y>
      <label>Panning</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>env_shape_mod</objectName>
      <x>396</x>
      <y>173</y>
      <value></value>
      <textFieldWidth>50</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>speed_mod</objectName>
      <x>502</x>
      <y>173</y>
      <value></value>
      <textFieldWidth>50</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>pan_mod</objectName>
      <x>652</x>
      <y>173</y>
      <value></value>
      <textFieldWidth>50</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>pw_mod</objectName>
      <x>136</x>
      <y>365</y>
      <value></value>
      <textFieldWidth>50</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>decay</objectName>
      <x>427</x>
      <y>273</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1.0</maximum>
      <value>0.21426898</value>
      <knobWidth>50</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>sustain</objectName>
      <x>480</x>
      <y>273</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1.0</maximum>
      <value>0.8715427</value>
      <knobWidth>50</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>release</objectName>
      <x>533</x>
      <y>273</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>10.0</maximum>
      <value>1.6481674</value>
      <knobWidth>50</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>attack</objectName>
      <x>374</x>
      <y>273</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>10.0</maximum>
      <value>0.19239195</value>
      <knobWidth>50</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>378</x>
      <y>254</y>
      <label>Attack</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>431</x>
      <y>254</y>
      <label>Decay</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>481</x>
      <y>254</y>
      <label>Sustain</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>534</x>
      <y>254</y>
      <label>Release</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>377</x>
      <y>224</y>
      <label>&lt;html&gt;&lt;font size=&quot;+1&quot;&gt;Amp Env&lt;/font&gt;&lt;/html&gt;</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>15</x>
      <y>8</y>
      <label>&lt;html&gt;&lt;font size=&quot;+3&quot;&gt;Shepard tone&lt;/font&gt;&lt;/html&gt;</label>
    </bsbObject>
  </graphicInterface>
  <bsbParameterList>
    <parameter uniqueId='16948486' name='attack' label='' min='0.0' max='10.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='10.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.19239195'/>
      </line>
    </parameter>
    <parameter uniqueId='16948480' name='decay' label='' min='0.0' max='1.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='1.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.21426898'/>
      </line>
    </parameter>
    <parameter uniqueId='16948476' name='envelope_shape' label='' min='0.0' max='1.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='1.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.5064934'/>
      </line>
    </parameter>
    <parameter uniqueId='16948470' name='nr_tones' label='' min='2.0' max='20.0' resolution='1.0' automationEnabled='false'>
      <line name='' version='2' max='20.0' min='2.0' resolution='1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='6.0'/>
      </line>
    </parameter>
    <parameter uniqueId='16948478' name='pan' label='' min='-1.0' max='1.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='1.0' min='-1.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.005028963'/>
      </line>
    </parameter>
    <parameter uniqueId='16948472' name='pw' label='' min='0.15' max='0.85' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='0.85' min='0.15' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.2209673'/>
      </line>
    </parameter>
    <parameter uniqueId='16948484' name='release' label='' min='0.0' max='10.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='10.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='1.6481674'/>
      </line>
    </parameter>
    <parameter uniqueId='16948474' name='speed' label='' min='0.0' max='10.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='10.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='3.2168531'/>
      </line>
    </parameter>
    <parameter uniqueId='16948482' name='sustain' label='' min='0.0' max='1.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='1.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.8715427'/>
      </line>
    </parameter>
  </bsbParameterList>
  <presetGroup name='Presets'/>
  <opcodeList>
    <udo>
      <opcodeName>mvpShepardComponent</opcodeName>
      <outTypes>a</outTypes>
      <inTypes>kikkiiik</inTypes>
      <codeBody>kfreq, ifreq_dir, kenv, kspeed, icomp, inr_components, iwave, kpw xin

kph phasor kspeed, icomp/inr_components

; kenv allows you to put more emphasis on the first or the last part,
; so the high frequencies or the low frequencies are emphasized
kamp loopsegp kph, 0, kenv, 1, 1-kenv, 0

; vary the frequency such that two consecutive components are one octave apart
; note that this is accomplished by the phase difference in kph
k1 = (kph-0.5)*inr_components*log(2)*ifreq_dir
kfreq1 = kfreq*exp(k1)

if (iwave==-1) then
	asig oscili kamp, kfreq1, gi_sine
else
	asig vco2 kamp, kfreq1, iwave, kpw
endif

; this UDO is used recursively:
if (icomp&lt;(inr_components-1)) then
	asig_rec mvpShepardComponent kfreq, ifreq_dir, kenv, kspeed, icomp+1, inr_components, iwave, kpw
	asig = asig + asig_rec
endif

xout asig</codeBody>
      <comments></comments>
    </udo>
    <udo>
      <opcodeName>panner</opcodeName>
      <outTypes>kk</outTypes>
      <inTypes>k</inTypes>
      <codeBody>; sin/cos taper, constant power.
kPanpos xin
kPanpos = kPanpos/2

kPanpos	= kPanpos * 3.14159265359 * .5
kLeft     	= sqrt(2) / 2 * (cos(kPanpos) - sin(kPanpos)) 
kRight    	= sqrt(2) / 2 * (cos(kPanpos) + sin(kPanpos))
xout kLeft,kRight</codeBody>
      <comments></comments>
    </udo>
    <udo>
      <opcodeName>getFrequency</opcodeName>
      <outTypes>i</outTypes>
      <inTypes>i</inTypes>
      <codeBody>ipch 	xin

iout	= (ipch &lt; 15 ? cpspch(ipch) : ipch)
	
	xout	iout
</codeBody>
      <comments></comments>
    </udo>
  </opcodeList>
</instrument>