<instrument type='blue.orchestra.BlueSynthBuilder' editEnabled='true'>
  <name>PrePiano</name>
  <comment>A simple wrapper around the prepiano opcode.
Widgets suffixed with a (p) are added to their respective parameter values.

Example Usage: i1 0 2 8.0 80 .09 2</comment>
  <globalOrc>gitbrat_&lt;INSTR_ID&gt;	ftgen	0, 0, 8, 2, 1, 0.6, 10, 100, 0.001
gitbrub_&lt;INSTR_ID&gt;	ftgen	0, 0, 8, 2, 1, 0.7, 50, 500, 1000
</globalOrc>
  <globalSco/>
  <instrumentText>; p3 - duration
; p4 - frequency (pch)
; p5 - strike velocity (0-100)
; p6 - strike position (-.1-?)
; p7 - decay time

;;; Begin Boilerplate ;;;

ipitch	getFrequency	p4
idur	=	abs(p3)

;;; End Boilerplate ;;;

kgain	=	&lt;gain&gt;
iNS	=	&lt;numStrings&gt;
iD	=	&lt;detune&gt;
iK	=	&lt;stiffness&gt;
iT30	=	&lt;decay&gt; + p7
iB	=	&lt;HFLoss&gt;
kbcl	=	&lt;boundaryL&gt;
kbcr	=	&lt;boundaryR&gt;
imass	=	&lt;hammerMass&gt;
ihfreq	=	&lt;vibFreq&gt;
iinit	=	&lt;initHammerPos&gt;
ipos	=	&lt;strikePos&gt; + p6
ivel	=	&lt;strikeVel&gt; + p5
isfreq	=	&lt;scanFreq&gt;
isspread =	&lt;scanFSpread&gt;

aL, aR	prepiano	ipitch, iNS, iD, iK, iT30, iB, kbcl, kbcr, imass, ihfreq, iinit, ipos, ivel, isfreq, isspread, gitbrat_&lt;INSTR_ID&gt;, gitbrub_&lt;INSTR_ID&gt;
aL	=	aL*kgain
aR	=	aR*kgain

blueMixerOut	aL, aR
</instrumentText>
  <graphicInterface editEnabled='false'>
    <uniqueNameManager nameIndex='0' defaultPrefix='bsbObj'/>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBHSlider'>
      <objectName>numStrings</objectName>
      <x>18</x>
      <y>18</y>
      <automationAllowed>false</automationAllowed>
      <minimum>2.0</minimum>
      <maximum>20.0</maximum>
      <resolution>1.0</resolution>
      <value>3.0</value>
      <sliderWidth>150</sliderWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>68</x>
      <y>49</y>
      <label>Num. Strings</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>detune</objectName>
      <x>255</x>
      <y>13</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>40.0</maximum>
      <value>10.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>249</x>
      <y>90</y>
      <label>Amnt. Detune</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>stiffness</objectName>
      <x>341</x>
      <y>13</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>20.0</maximum>
      <value>2.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>348</x>
      <y>92</y>
      <label>Stiffness</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>decay</objectName>
      <x>20</x>
      <y>92</y>
      <automationAllowed>false</automationAllowed>
      <minimum>-10.0</minimum>
      <maximum>10.0</maximum>
      <value>0.0</value>
      <knobWidth>120</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>48</x>
      <y>230</y>
      <label>Decay Time (p)</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>HFLoss</objectName>
      <x>197</x>
      <y>135</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>0.1</maximum>
      <value>0.0020</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>172</x>
      <y>213</y>
      <label>High-Frequency Loss</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown'>
      <objectName>boundaryL</objectName>
      <x>425</x>
      <y>40</y>
      <bsbDropdownItemList>
        <bsbDropdownItem>
          <name>Clamped</name>
          <value>1</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Pivoting</name>
          <value>2</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Free</name>
          <value>3</value>
        </bsbDropdownItem>
      </bsbDropdownItemList>
      <selectedIndex>1</selectedIndex>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>411</x>
      <y>69</y>
      <label>String Boundary, Lft.</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBDropdown'>
      <objectName>boundaryR</objectName>
      <x>547</x>
      <y>39</y>
      <bsbDropdownItemList>
        <bsbDropdownItem>
          <name>Clamped</name>
          <value>1</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Pivoting</name>
          <value>2</value>
        </bsbDropdownItem>
        <bsbDropdownItem>
          <name>Free</name>
          <value>3</value>
        </bsbDropdownItem>
      </bsbDropdownItemList>
      <selectedIndex>1</selectedIndex>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>533</x>
      <y>68</y>
      <label>String Boundary, Rgt.</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>hammerMass</objectName>
      <x>313</x>
      <y>134</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>5.0</maximum>
      <value>1.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>304</x>
      <y>214</y>
      <label>Hammer Mass</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>vibFreq</objectName>
      <x>420</x>
      <y>99</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>12000.0</maximum>
      <value>5000.0</value>
      <knobWidth>120</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>422</x>
      <y>239</y>
      <label>Vibrations Frequency</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>initHammerPos</objectName>
      <x>575</x>
      <y>130</y>
      <automationAllowed>false</automationAllowed>
      <minimum>-0.5</minimum>
      <maximum>0.5</maximum>
      <value>-0.01</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>557</x>
      <y>207</y>
      <label>Initial Hammer Pos.</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>strikePos</objectName>
      <x>42</x>
      <y>260</y>
      <automationAllowed>false</automationAllowed>
      <minimum>-0.2</minimum>
      <maximum>0.5</maximum>
      <value>0.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>33</x>
      <y>339</y>
      <label>Strike Pos. (p)</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>strikeVel</objectName>
      <x>129</x>
      <y>239</y>
      <automationAllowed>false</automationAllowed>
      <minimum>-100.0</minimum>
      <maximum>100.0</maximum>
      <value>0.0</value>
      <knobWidth>80</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>123</x>
      <y>339</y>
      <label>Strike Velocity (p)</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>scanFreq</objectName>
      <x>233</x>
      <y>240</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>5000.0</maximum>
      <value>0.0</value>
      <knobWidth>80</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>229</x>
      <y>339</y>
      <label>Scanning Freq.</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>scanFSpread</objectName>
      <x>351</x>
      <y>261</y>
      <automationAllowed>false</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>1000.0</maximum>
      <value>0.1</value>
      <knobWidth>60</knobWidth>
      <randomizable>true</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>328</x>
      <y>338</y>
      <label>Scanning Freq. Spread</label>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBKnob' version='2'>
      <objectName>gain</objectName>
      <x>574</x>
      <y>260</y>
      <automationAllowed>true</automationAllowed>
      <minimum>0.0</minimum>
      <maximum>2.0</maximum>
      <value>1.0</value>
      <knobWidth>60</knobWidth>
      <randomizable>false</randomizable>
    </bsbObject>
    <bsbObject type='blue.orchestra.blueSynthBuilder.BSBLabel'>
      <objectName></objectName>
      <x>574</x>
      <y>337</y>
      <label>Final Gain</label>
    </bsbObject>
  </graphicInterface>
  <bsbParameterList>
    <parameter uniqueId='1424299948' name='gain' label='' min='0.0' max='2.0' resolution='-1.0' automationEnabled='false'>
      <line name='' version='2' max='2.0' min='0.0' resolution='-1.0' color='-8355712' rightBound='false'>
        <linePoint x='0.0' y='1.0'/>
      </line>
    </parameter>
  </bsbParameterList>
  <presetGroup name='Presets'/>
  <opcodeList>
    <udo>
      <opcodeName>getFrequency</opcodeName>
      <outTypes>i</outTypes>
      <inTypes>i</inTypes>
      <codeBody>
ipch 	xin
iout	= (ipch &lt; 15 ? cpspch(ipch) : ipch)	
	xout	iout

</codeBody>
      <comments>getFrequency - Returns frequency whether being passed in pch or frequency

DESCRIPTION
Returns frequency whether being passed in PCH notation or frequency.  This code is commonly found in instruments designed to take in either pch or frequency values. Assumes that values lower than 15 are pch, and those higher than that are frequency.

SYNTAX
ifreq    getFrequency ival

INITIALIZATION
ival - input value, either pch or frequency

ifreq - output frequency

PERFORMANCE
null

CREDITS
Steven Yi</comments>
    </udo>
  </opcodeList>
</instrument>