<instrument type='blue.orchestra.BlueSynthBuilder' editEnabled='true'>
  <name>Pluck</name>
  <comment>This is a basic instrument using the pluck opcode.

The pluck opcode is in a UDO called mvpPluck, that adjusts
the parameters if necessary, so you can twiddle around with
the parameters without caring about the restrictions.
It does not allow you to choose a custom table.

You can specify a release time, which is necessary if the note
ends before the signal dies out by itself.

I added an experimental feature: you can silence the begin
of the instrument, which takes away the transients at the very
beginning, producing a more monotonous but often still
beautiful sound. Of course you have to take into account in
your score that if you use this feature, the signal will start a
little later.

Usage:
p4: pitch or frequency
p5: in decibels below 0dbfs if 0 or negative, otherwise amplitude as fraction of 0dbfs (0-1)
</comment>
  <globalOrc>gi_cosine	ftgen	0, 0, 65536,	11,	1, 1
</globalOrc>
  <globalSco/>
  <instrumentText>ifreq = cpspch(p4)
iamp = ((p5 &gt; 0) ? 0dbfs*p5 : ampdbfs(p5))*1.4

asig mvpPluck iamp, ifreq, &lt;method&gt;, i(&lt;par1&gt;)&lt;par1_mod&gt;, i(&lt;par2&gt;)&lt;par2_mod&gt;, ifreq/(i(&lt;buffer_size&gt;)&lt;buffer_size_mod&gt;)

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

if (&lt;silence_begin&gt;!=0) then
	isilence_length = i(&lt;silence_length&gt;)&lt;silence_length_mod&gt;
	istart = isilence_length + i(&lt;attack_after_silence&gt;)
	kenv linseg 0, isilence_length, 0, i(&lt;attack_after_silence&gt;), 1, p3-istart-&lt;release&gt;, 1, &lt;release&gt;, 0
else
	kenv linseg 1, p3-&lt;release&gt;, 1, &lt;release&gt;, 0
endif

kleft = kleft*kenv
kright = kright*kenv

blueMixerOut asig*kleft, asig*kright
</instrumentText>
  <graphicInterface editEnabled='false'>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown'>
      <objectName>method</objectName>
      <x>18</x>
      <y>90</y>
      <bsbDropdownItemList>
        <bsbDropdownItem>
          <name>Simple averaging</name>
          <value>1</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Stretched averaging</name>
          <value>2</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Simple drum (par 1)</name>
          <value>3</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Stretched drum (par 1, 2)</name>
          <value>4</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Weighted averaging  (par 1, 2)</name>
          <value>5</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>1st order recursive filter</name>
          <value>6</value>
        </bsbDropdownItem>
      </bsbDropdownItemList>
      <selectedIndex>0</selectedIndex>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>par1</objectName>
      <x>19</x>
      <y>145</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1.0</maximum>
      <value>0.081290476</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>par2</objectName>
      <x>99</x>
      <y>145</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1.0</maximum>
      <value>0.09501993</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>buffer_size</objectName>
      <x>188</x>
      <y>145</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>4.0</maximum>
      <value>1.3687252</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>190</x>
      <y>126</y>
      <label>buffer size</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>115</x>
      <y>126</y>
      <label>par 2</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>35</x>
      <y>126</y>
      <label>par 1</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>pan</objectName>
      <x>459</x>
      <y>137</y>
      <automationAllowed>true</automationAllowed>
      <minimum>-1.0</minimum>
      <maximum>1.0</maximum>
      <value>0.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>478</x>
      <y>111</y>
      <label>Pan</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>pan_mod</objectName>
      <x>459</x>
      <y>218</y>
      <value></value>
      <textFieldWidth>60</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBCheckBox'>
      <objectName>silence_begin</objectName>
      <x>23</x>
      <y>295</y>
      <label>Silence begin</label>
      <selected>false</selected>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>131</x>
      <y>329</y>
      <label>Attack</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>attack_after_silence</objectName>
      <x>120</x>
      <y>348</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>0.3</maximum>
      <value>0.15186237</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>48</x>
      <y>330</y>
      <label>Length</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>silence_length</objectName>
      <x>37</x>
      <y>349</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>0.3</maximum>
      <value>0.04797499</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>silence_length_mod</objectName>
      <x>37</x>
      <y>428</y>
      <value></value>
      <textFieldWidth>60</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>24</x>
      <y>17</y>
      <label>&lt;html&gt;&lt;font size=&quot;+3&quot;&gt;Pluck&lt;/font&gt;&lt;/html&gt;</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>par1_mod</objectName>
      <x>19</x>
      <y>225</y>
      <value></value>
      <textFieldWidth>60</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>par2_mod</objectName>
      <x>99</x>
      <y>225</y>
      <value></value>
      <textFieldWidth>60</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBTextField'>
      <objectName>buffer_size_mod</objectName>
      <x>188</x>
      <y>225</y>
      <value></value>
      <textFieldWidth>60</textFieldWidth>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>release</objectName>
      <x>288</x>
      <y>145</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>0.5</maximum>
      <value>0.12290563</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>297</x>
      <y>126</y>
      <label>release</label>
    </bsbObject>
  </graphicInterface>
  <bsbParameterList>
    <parameter uniqueId='2062578363' name='attack_after_silence' label='' min='0.0' max='0.3' resolution='-1.0' automationEnabled='false' value='0.15186237'>
      <line name='' version='2' max='0.3' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.15186237'/>
      </line>
    </parameter>
    <parameter uniqueId='2062578359' name='buffer_size' label='' min='0.0' max='4.0' resolution='-1.0' automationEnabled='false' value='1.3687252'>
      <line name='' version='2' max='4.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='1.3687252'/>
      </line>
    </parameter>
    <parameter uniqueId='2062578361' name='pan' label='' min='-1.0' max='1.0' resolution='-1.0' automationEnabled='false' value='0.0'>
      <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.0'/>
      </line>
    </parameter>
    <parameter uniqueId='2062578355' name='par1' label='' min='0.0' max='1.0' resolution='-1.0' automationEnabled='false' value='0.081290476'>
      <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.081290476'/>
      </line>
    </parameter>
    <parameter uniqueId='2062578357' name='par2' label='' min='0.0' max='1.0' resolution='-1.0' automationEnabled='false' value='0.09501993'>
      <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.09501993'/>
      </line>
    </parameter>
    <parameter uniqueId='2062578365' name='silence_length' label='' min='0.0' max='0.3' resolution='-1.0' automationEnabled='false' value='0.04797499'>
      <line name='' version='2' max='0.3' min='0.0' resolution='-1.0' color='-8355712' rightBound='false' endPointsLinked='false'>
        <linePoint x='0.0' y='0.04797499'/>
      </line>
    </parameter>
  </bsbParameterList>
  <presetGroup name='Presets'/>
  <opcodeList>
    <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>mvpPluck</opcodeName>
      <outTypes>a</outTypes>
      <inTypes>ikiiii</inTypes>
      <codeBody>iamp, kfreq, imethod, ipar1, ipar2, ibufsize xin

if (imethod==2) then
	ipar1 = 1
	ipar2 = 0
elseif (imethod==4) then
	ipar2 = 1
elseif (imethod==5) then
	isum = ipar1+ipar2
	if ((isum)&gt;1) then
		ipar1 = ipar1 / (isum*1.0001)
		ipar2 = ipar2 / (isum*1.0001)
	endif
endif

asig pluck iamp, kfreq, ibufsize, 0, imethod, ipar1, ipar2

xout asig
</codeBody>
      <comments></comments>
    </udo>
  </opcodeList>
</instrument>