<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="./_c74_ref.xsl" type="text/xsl"?>
<c74object box='0' name='MC Wrapper Features' category='Unlisted' module='msp'>


  <digest> Messages and attributes common to MC wrapper objects</digest>
  <description>
      The MC wrapper defines common messages and attributes for all compatible objects.
  </description>


  <!--METADATA -->
  <metadatalist>
    <metadata name='author'>Cycling '74</metadata>
    <metadata name='tag'>Audio</metadata>
    <metadata name='tag'>MC</metadata>
  </metadatalist>


  <inletlist/>
  <outletlist/>
  <objarglist/>


  <!-- METHODS -->
  <methodlist>

      <method name='deviate'>
        <arglist>
          <arg name="range" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="center-value" optional="0" type="float" />
          <arg name="upper-range" optional="1" type="float" />
        </arglist>
        <digest>Generate a random value for each channel around a center value </digest>
        <description>
              Generate a random value for each channel around a center value. An optional number after the center value specifies the upper range size so it can be different from the lower range size.
              <br/>
              Example: <m>deviate 100 cutoff 1000</m> will generate random values for the <at>cutoff</at> attribute of the objects in the wrapper centered around 1000 Hz (between 900 and 1100 Hz). <m>deviate 100 1000 200</m> sends <m>float</m> messages to the objects in the wrapper with random values between 900 and 1200.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

<method name='exponential'>
    <arglist>
        <arg name="exponent" optional="0" type="float" />
        <arg name="message-name" optional="1" type="symbol" />
        <arg name="multiplier" optional="1" type="float" />
    </arglist>
    <digest>Generate an exponential series across all channels</digest>
    <description>
        The <m>exponential</m> message generates an exponential series. The first argument is <i>N</i> and the second
        (optional) argument is <i>K</i> in the following expression:
        <br/>
        <i>K * exp(-1 * N * channel)</i> where channel starts at 0 for the first channel.
        <br/>
        If the second argument is not present the default value is 1. Example: <m>exponential 1 10</m> would generate, for four channels, values of 10, 3.678, 1.353, and 0.498. <m>exponential -1 2</m> would generate 2, 5.437, 14.78, and 40.17.
        <br/>
        If no message name is provided, a <m>float</m> message is used by default.
    </description>
</method>
<method name='scaledexponential'>
    <arglist>
        <arg name="exponent" optional="0" type="float" />
        <arg name="message-name" optional="1" type="symbol" />
        <arg name="base" optional="1" type="float" />
    </arglist>
    <digest>Generate a scaled exponential series across all channels</digest>
    <description>
        The <m>scaledexponential</m> message generates an exponential series with the exponent scaled by the total number of channels. The first argument is <i>N</i> and the second (optional) argument is <i>K</i> in the following expression:
        <br/>
        <i>K * exp(-1 * N * (channel / num_channels)</i> where channel starts at 0 for the first channel.
        <br/>
        If the second argument is not present the default value is 1. Example: <m>exponential -1 2</m> would generate, for six channels, values of 2, 2.363, 2.791, 3.297, 3.895, 4.602. <m>scaledexponential -1 2</m> for four channels would generate 2, 2.568, 3.297, 4.324. <m>scaledexponential</m> provides a way to keep the range of the exponential series roughly the same independent of the number of channels.
        <br/>
        If no message name is provided, a <m>float</m> message is used by default.
    </description>
</method>
      <method name='increment'>
        <arglist>
          <arg name="increment-amount" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="start-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a increasing value for each channel starting at a specified value</digest>
        <description>
              The <m>increment</m> message generates a range of increasing values for each channel. The range starts at the second argument and increments each channel's value by the first argument. If no message name is provided then a <m>float</m> message is used by default.
              <br/>
              Example: <m>increment 5 2</m> for four channels would generate 2, 7, 12, and 17.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

<method name='harmonic'>
    <arglist>
        <arg name="multiplier" optional="0" type="float" />
        <arg name="message-name" optional="1" type="symbol" />
        <arg name="fundamental" optional="1" type="float" />
    </arglist>
    <digest>Generate a harmonic series across all channels</digest>
    <description>
        The <m>harmonic</m> message generates a harmonic series using the second argument as the fundamental
        frequency (<i>F</i>) and the first argument as a multiplier (<i>N</i>) in the following expression:
        <br/>
        <i>F * (1 + N * channel)</i> where channel starts at 0 for the first channel.
        <br/>
        Example: <m>harmonic 1 440</m> for five channels would generate 440, 880, 1320, 1760, and 2200. <m>harmonic 0.5 440</m> for
        four channels would generate 440, 660, 880, and 1100.
        <br/>
        If no message name is provided, a <m>float</m> message is used by default.
    </description>
</method>
<method name='subharmonic'>
    <arglist>
        <arg name="multiplier" optional="0" type="float" />
        <arg name="message-name" optional="1" type="symbol" />
        <arg name="fundamental" optional="1" type="float" />
    </arglist>
    <digest>Generate a subharmonic series across all channels</digest>
    <description>
        The <m>subharmonic</m> message generates a subharmonic series using the second argument as the fundamental
        frequency (<i>F</i>) and the first argument as a multiplier (<i>N</i>) in the following expression:
        <br/>
        <i>F / (1 + N * channel)</i> where channel starts at 0 for the first channel.
        <br/>
        Example: <m>subharmonic 1 440</m> for five channels would generate 440, 220, 146.7, and 110.
        <br/>
        If no message name is provided, a <m>float</m> message is used by default.
    </description>
</method>

<method name='spread'>
        <arglist>
          <arg name="boundary-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="other-boundary-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of values distributed to each channel </digest>
        <description>
            The <m>spread</m> message generates a range of values distributed to each channel.
              The first boundary value is included in the range outputs, but the second boundary value is not (see <m>spreadinclusive</m>, <m>spreadexclusive</m>, and <m>spreadincludesecond</m> for other options).
              <br/>
              Example: <m>spread 0 10</m> for four channels would generate 0, 2.5, 5, and 7.5.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='spreadinclusive'>
        <arglist>
          <arg name="boundary-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="other-boundary-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of values distributed to each channel </digest>
        <description>
            The <m>spreadinclusive</m> message generates a range of values distributed to each channel.
              Both the first and second boundary values are included in the range outputs.
              <br/>
              Example: <m>spreadinclusive 0 10</m> for four channels would generate 0, 3.33, 6.66, and 10.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='spreadexclusive'>
        <arglist>
          <arg name="boundary-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="other-boundary-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of values distributed to each channel </digest>
        <description>
            The <m>spreadexclusive</m> message generates a range of values distributed to each channel.
              Neither the first and second boundary values are included in the range outputs.
              <br/>
              Example: <m>spreadexclusive 0 10</m> for four channels would generate 2, 4, 6, and 8.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='spreadincludefirst'>
        <arglist>
          <arg name="boundary-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="other-boundary-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of values distributed to each channel </digest>
        <description>
            The <m>spreadincludefirst</m> message generates a range of values distributed to each channel. It is the same as the <m>spread</m> message. The first boundary value is included in the range outputs, but the second boundary value is not.
              <br/>
              Example: <m>spreadincludefirst 0 10</m> for four channels would generate 0, 2.5, 5, and 7.5.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='spreadincludesecond'>
        <arglist>
          <arg name="boundary-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="other-boundary-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of values distributed to each channel </digest>
        <description>
            The <m>spreadincludefirst</m> message generates a range of values distributed to each channel. It is the same as the <m>spread</m> message. The first boundary value is not included in the range outputs, but the second boundary value is included.
              <br/>
              Example: <m>spreadincludesecond 0 10</m> for four channels would generate 2.5, 5, 7.5, and 10.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='decide'>
        <arglist>
          <arg name="probability" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="value" optional="1" type="float" />
        </arglist>
        <digest>Generate random on-off values for all channels</digest>
        <description>
            The <m>decide</m> message generates a uniformly distributed random value between 0 and 1 for each channel; if the value is less than the probability value set by the first argument, the second argument is assigned to the channel. If the random value is greater than the probability value, 0 is asigned to the channel. (If a second argument is not present, 1 is used by default.)
              <br/>
              Example: <m>decide 0 10</m> for four channels would generate 0, 0, 0, 0 because the probability of generating a 1 is zero. <m>decide 0.5 10</m> could generate 10, 0, 0, 10 if the randomly generated values exceeded 0.5 for the first and fourth channels.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='randomrange'>
        <arglist>
          <arg name="low-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="high-value" optional="0" type="float" />
        </arglist>
        <digest>Generate a range of random values</digest>
        <description>
            The <m>randomrange</m> message generates a uniformly distributed random range of values for all channels between the first argument and the second argument.
              <br/>
              If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='generate'>
        <arglist>
          <arg name="low-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="high-value" optional="0" type="float" />
        </arglist>
        <digest>Run a named generator function</digest>
        <description>
            The <m>generate</m> message runs the function whose name is stored in the <at>op</at> attribute. Arguments passed to <m>generate</m> will be given to the function that is called. Example: if <at>op</at> is set to <m>deviate</m>, <m>generate 50 440</m> is the same as sending the message <m>deviate 50 440</m>.
        </description>
      </method>

      <method name='ease.linear'>
        <arglist>
          <arg name="low-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="high-value" optional="0" type="float" />
          <arg name="mid-point" optional="1" type="float" />
        </arglist>
        <digest>Apply an easing function</digest>
        <description>
            The MC wrapper provides access to the easing functions found in the Ease Package. These are accessed with message names consisting of <m>ease.</m> concatenated with the easing function name. For example, to use the <i>in_out_circular</i> function, send the message <m>ease.in_out_circular</m>.
            <br/>
            The <m>ease</m> messages generate an non-linear and inclusive range of values across the space of channels. When you use two number arguments, the first value will be the low end of the range and the second will be the high end of the range. For <m>in_</m> and <m>in_out_</m> functions, this means the low end value will be set for the first channel and the high end will be set for the last channel. For <m>out_</m> function variants, the high end will be set for the first channel and the low end will be set for the last channel.
            <br />
            When the <m>ease</m> messages are supplied with three numerical arguments, the first two specify the range as in the two-argument case, but the third argument, which will be constrained between 0 and 1, defines a mid point. Between the first channel and the channel closest to the mid point, the entire range of the function is applied. Between the mid point and the last channel, the range of the function is applied with the values reversed, creating a mirror image. The mirror image is exact when the third argument is 0.5, otherwise it will be biased toward 0 or 1. With a mid point of 1, the result is the same as if the third argument was not supplied at all. With a mid point of 0, the result is the same as if it was entirely reversed. In other words, it's as if the <m>out_</m> version of the function were used instead of the <m>in_</m> version that was originally specified -- or vice versa.
            <br />
            Available messages are: <m>ease.linear</m>, <m>ease.in_back</m>, <m>ease.in_out_back</m>, <m>ease.out_back</m>, <m>ease.in_bounce</m>, <m>ease.in_out_bounce</m>, <m>ease.out_bounce</m>, <m>ease.in_circular</m>, <m>ease.in_out_circular</m>, <m>ease.out_circular</m>, <m>ease.in_cubic</m>, <m>ease.in_out_cubic</m>, <m>ease.out_cubic</m>, <m>ease.in_elastic</m>, <m>ease.in_out_elastic</m>, <m>ease.out_elastic</m>, <m>ease.in_exponential</m>, <m>ease.in_out_exponential</m>, <m>ease.out_exponential</m>, <m>ease.in_quadratic</m>, <m>ease.in_out_quadratic</m>, <m>ease.out_quadratic</m>, <m>ease.in_quartic</m>, <m>ease.in_out_quartic</m>, <m>ease.out_quartic</m>, <m>ease.in_quintic</m>, <m>ease.in_out_quintic</m>, <m>ease.out_quintic</m>, <m>ease.in_sine</m>, <m>ease.in_out_sine</m>, and <m>ease.out_sine</m>. Refer to the Ease Package documentation for details on these functions and demonstrations of their behavior.
            <br />
            If no message name is provided, a <m>float</m> message is used by default.
        </description>
      </method>

      <method name='smoothstep'>
        <arglist>
          <arg name="low-value" optional="0" type="float" />
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="high-value" optional="0" type="float" />
          <arg name="mid-point" optional="1" type="float" />
        </arglist>
        <digest>Apply a smoothstep function</digest>
        <description>
            The <m>smoothstep</m> function works analogously to the <m>ease</m> messages to generate an inclusive non-linear range of values, but uses the <i>smoothstep</i> function to generate a non-linear ramp. Refer to the documentation of the <m>ease</m> messages for more information.
            <br />
            If no message name is provided, a <m>float</m> message is used by default.
      </description>
    </method>

    <method name='setvalue'>
        <arglist>
            <arg name="channel" optional="0" type="int" />
            <arg name="message" optional="0" type="symbol" />
            <arg name="message arguments" optional="1" type="list" />
        </arglist>
        <digest>Direct a message to an individual channel</digest>
        <description>
            The word <m>setvalue</m>, followed by both a channel index (starting at 1) and any message that can be sent to the wrapped object, sends the message to an individual instance within the MC wrapper. <m>setvalue 0</m>, followed by a message, sends the message to all instances. The <m>setvalue</m> message can be used in any inlet.
            <br />
                Instead of a number, the <m>setvalue</m> message can also take a symbol indicating that the target channel index should be randomly chosen:
            <ul>
            <li><m>setvalue *</m> will choose a channel randomly but avoid duplicate choices until all channels have been chosen (similar to the Max <o>urn</o> object). Before chosing a channel, <m>*</m> will also decide whether to send the message according to the current value of the <at>voiceprob</at> attribute. If <at>voiceprob</at> is 0.1, there is a 10% chance of sending the message. If <at>voiceprob</at> is 0.9, there is a 90% chance of sending the message.
            </li>
            <li><m>setvalue +</m> will choose a channel randomly but avoid duplicate choices until all channels have been chosen (similar to the Max <o>urn</o> object). Unlike <m>*</m> it will always send the message.
            </li>
            <li><m>setvalue $</m> will choose a channel randomly (similar to the Max <o>random</o> object). Before chosing a channel, <m>$</m> will also decide whether to send the message according to the current value of the <at>voiceprob</at> attribute. If <at>voiceprob</at> is 0.1, there is a 10% chance of sending the message. If <at>voiceprob</at> is 0.9, there is a 90% chance of sending the message.
            </li>
            <li><m>setvalue #</m> will choose a channel randomly (similar to the Max <o>random</o> object). Unlike <m>$</m> it will always send the message.
            </li>
            </ul>
        </description>
    </method>

    <method name='setvaluerange'>
        <arglist>
            <arg name="low channel" optional="0" type="int" />
            <arg name="high channel" optional="0" type="int" />
            <arg name="message" optional="0" type="symbol" />
            <arg name="message arguments" optional="1" type="list" />
        </arglist>
        <digest>Send a message to a range of channels</digest>
        <description>
            The word <m>setvaluerange</m>, followed by a low and high channel index (starting at 1) and any message that can be sent to the wrapped object, sends the message to the specified range of channels.
            <br/>
            Example: <m>setvaluerange 1 4 50</m>, sends the message 50 to channels 1 - 4. If the second argument is -1, the message is sent to all subsequent channels. For example, <m>setvaluerange 2 -1 50</m> sends the message 50 to all channels between 2 and the current number of voices.
            <br/>
            Note: the random channel selection feature using <m>*</m>, <m>+</m>, <m>$</m>, and <m>#</m> does not work with the <m>setvaluerange</m> message.
        </description>
    </method>

      <method name='applymessages'>
        <arglist>
          <arg name="messages" optional="0" type="list" />
        </arglist>
          <digest>Send messages to multiple channels</digest>
          <description>
              The word <m>applymessages</m>, followed by one or more numbers and/or symbols, sends individual messages
              successively to instances in the MC wrapper, starting with the first instance. For example, the message
              <m>applymessages 0 bang</m> will send the '0' message to the first instance, and the 'bang' message to
              the second instance. If there are more instances than arguments to <m>applymessages</m>,
              the extra instances are unaffected.
          </description>
      </method>

      <method name='applyvalues'>
        <arglist>
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="values" optional="0" type="list" />
        </arglist>
          <digest>Set values for multiple channels</digest>
          <description>
              The word <m>applyvalues</m>, followed by an optional message name and one or more
              message arguments, sends individual values in the arguments successively to instances
              in the MC wrapper, starting with the first instance. For example, the message
              <m>applyvalues 4 5 6</m> will send 4 to the first instance, 5 to the second instance,
              and 6 to the third instance. If there are more instances than arguments to <m>applyvalues</m>,
              the extra instances are unaffected.
          </description>
      </method>

      <method name='replicatevalues'>
        <arglist>
          <arg name="message-name" optional="1" type="symbol" />
          <arg name="values" optional="0" type="list" />
        </arglist>
        <digest>Set values for all channels</digest>
        <description>
              The word <m>replicatevalues</m>, followed by an optional message name and one or more message
              arguments, sends individual values in the arguments successively to instances in the MC wrapper,
              starting with the first instance. Unlike <m>applyvalues</m>, the <m>replicatevalues</m> message
              continues sending values to successive instances, restarting with the first element, if it runs
              out of arguments to send. For example, <m>replicatevalues 4 5</m> to an MC wrapper object with
              three instances will send 4 to the first instance, 5 to the second instance, and 4 to the third
              instance.
         </description>
      </method>

      <method name='applynvalues'>
        <arglist>
          <arg name="message" optional="1" type="int" />
          <arg name="values" optional="0" type="list" />
        </arglist>
          <digest>Set multiple values for multiple channels</digest>
          <description>
              Whereas <m>applyvalues</m> can only set one value, the message <m>applynvalues</m> permits sending
              a message or setting an attribute with multiple values to instances in the MC wrapper, starting with
              the first instance. This is helpful for messages that require multiple values, such as the list
              message to <o>wave~</o> to set start/end points. The message syntax is [applynvalues N value1,
              value2 etc.] where N is the number of values to set for each instance. For example, the message
              <m>applynvalues 2 500 600 900 1000</m> will send 500 600 to the first instance and 900 1000 to
              the second instance. If there are more instances than specified in <m>applynvalues</m>,
              the extra instances are unaffected.
          </description>
      </method>

      <method name='replicatenvalues'>
        <arglist>
          <arg name="message" optional="1" type="int" />
          <arg name="values" optional="0" type="list" />
        </arglist>
        <digest>Set multiple values for all channels</digest>
        <description>
          Whereas <m>replicatevalues</m> can only set one value, the message <m>replicatenvalues</m> permits sending
          a message or setting an attribute with multiple values to instances in the MC wrapper, starting with
          the first instance. This is helpful for messages that require multiple values, such as the list
          message to <o>wave~</o> to set start/end points. The message syntax is [replicatenvalues N value1,
          value2 etc.] where N is the number of values to set for each instance. Unlike <m>applynvalues</m>,
          the <m>replicatenvalues</m> message continues sending values to successive instances, restarting with
          the first group, if it runs out of arguments to send. For example, <m>replicatenvalues 2 500 600 900 1000</m>
          to an MC wrapper object with three instances will send 500 600 to the first instance, 900 1000 to the
          second instance, and 500 600 to the third instance.
         </description>
      </method>

    </methodlist>


    <!-- ATTRIBUTES -->
    <attributelist>

        <attribute get='1' name='chans' size='1' set='1' type='int'>
            <digest>Number of channels </digest>
            <description>
                The <at>chans</at> attribute sets the number of channels and instances in the MC wrapper object. To define a fixed number of channels regardless of what is connected to the object, set <at>chans</at> via a typed-in argument, for example typing <m>mc.cycle~ @chans 100</m> would create 100 instances of a <o>cycle~</o> object inside the MC wrapper. If <at>chans</at> is 0, the wrapper object will auto-adapt to the number of channels in its input multichannel signals (using the maximum of all connected signals). If an object does not have any multichannel signals connected to its inlets, the <at>chans</at> attribute will need to have a non-zero value if you want more than one instance.<br/><br/>
                If <at>chans</at> is changed while the audio is on, the number of instances will not change until audio is restarted. However, if <at>chans</at> is reduced while the audio is on, any extra channels will no longer process audio and will output a zero signal.
            </description>
        </attribute>

        <attribute get='1' name='initialvalues' size='1' set='1' type='list'>
            <digest>Assign initial values (arguments) for each instance</digest>
            <description>
                The <at>initialvalues</at> attribute only applies to object creation time so it must be set via a typed-in argument. <at>initialvalues</at> sets the first (and only the first) initial argument for successive instances in the MC wrapper. For example, typing <m>mc.cycle~ @chans 4 @initialvalues 50 60 70 80</m> would assign an initial frequency to the <o>cycle~</o> instances inside the wrapper. The first instance would be assigned a frequency of 50, the second a frequency of 60, the third 70, and the fourth 80. Note that <at>initialvalues</at> does not determine the actual instance count; this can be done using the <at>chans</at> attribute. If there are more instances than elements for the <at>initialvalues</at> attribute, those instances are instantiated with the default value.<br/><br/>
                To set a default value of an argument for all instances, type it as an argument before any typed-in attributes. For example, modifying our example above: <m>mc.cycle~ 100 @chans 10 @initialvalues 50 60 70 80</m>. In this example, the first four instances are set as before, but the next six are created with a frequency argument of 100.<br/><br/>
                To change instance values or attributes after the wrapper object has been created, use the <m>setvalue</m>, <m>applyvalues</m>, or <m>replicatevalues</m> messages.
          </description>
        </attribute>
        <attribute get='1' name='values' size='1' set='1' type='list'>
            <digest>Assign initial values (arguments) for each instance</digest>
            <description>
                You can use <at>values</at> as an alternate name for the <at>initialvalues</at> attribute.
            </description>
        </attribute>

        <attribute get='1' name='replicate' size='1' set='1' type='int'>
            <digest> Replicate input channels to fill the content of all expected channels </digest>
            <description>
                When <at>replicate</at> is enabled, input single-channel or multichannel signals containing fewer channels than the number instances in the MC wrapper object are repeated to fill all input channels. For example, when <at>replicate</at> is enabled and you connect a two-channel multichannel signal to the input of an MC wrapper object with four instances, channel 1 of the input will be repeated to channel 3, and channel 2 of the input will be repeated to channel 4. If <at>replicate</at> were disabled, channels 3 and 4 of the input would be set to zero.
           </description>
        </attribute>

        <attribute get='1' name='target' size='1' set='1' type='int'>
            <digest>Set channel for incoming messages</digest>
            <description>
                The <at>target</at> attribute sets an index for targeting specific wrapper instances. Subsequent messages are directed to an individual instance instead of all instances. It is strongly recommended you use the more reliable <m>setvalue</m> message instead of the <at>target</at> attribute. The voice index of <m>setvalue</m> will override the current setting of <at>target</at>. When <at>target</at> is 0, incoming messages are sent to all instances. When <at>target</at> is -1, incoming messages do nothing. Note that <at>target</at> only affects messages, not setting attribute values.
            </description>
        </attribute>

        <attribute get='1' name='usebusymap' size='1' set='1' type='int'>
            <digest>Use busy map</digest>
            <description>
                When <at>usebusymap</at> is enabled, the MC wrapper controls whether individual instances process audio using a <i>busy map</i> maintained by either an <o>mc.noteallocator~</o> or <o>mc.voiceallocator~</o> object. When a channel in the busy map is marked as "free" or "released" no audio processing occurs by any instance on the channel corresponding to the voice index. When <at>usebusymap</at> is disabled, instances in the MC wrapper process audio at all times. This will also be true if <at>usebusymap</at> is enabled and there is no local or named busy map available. (See the <at>busymapname</at> attribute for a description of local and named busy maps). For brevity the name <at>bz</at> can also be used.

            </description>
        </attribute>
       <attribute get='1' name='zero' size='1' set='1' type='int'>
            <digest>Zero unused outputs</digest>
            <description>
                When the <at>zero</at> attribute is enabled, channels in the MC wrapper due to the use of a busy map output zero signals. To save a small amount of CPU at the risk of loud and unpleasant noises due to uncleared signal data, you can disable <at>zero</at>. In this case, disabled channels in the MC wrapper do nothing to their output channels. If <at>usebusymap</at> is disabled or there is no active local or named busy map available, the setting of the <at>zero</at> attribute has no effect.
                <br/><br/>
                Conveniently, when <at>usebusymap</at> is enabled in <o>mc.mixdown~</o> object,  disabled channels are not mixed to the output. When unused signals from wrapped objects with <at>zero</at> disabled feed into <o>mc.mixdown~</o>, they will be ignored, reducing the risk of unpleasantness getting past the mix output.
           </description>
        </attribute>

        <attribute get='1' name='busymapname' size='1' set='1' type='symbol'>
      <digest>
        Busy Map Name
      </digest>
      <description>
        When the <at>usebusymap</at> attribute is enabled, an MC wrapper object uses the local busy map of any <o>mc.voiceallocator~</o> or <o>mc.noteallocator~</o> in the same patcher by default. To use a named global busy map instead, set the <at>busymapname</at> attribute to the desired name. For brevity the name @bzname can also be used.
      </description>
        </attribute>

        <attribute get='1' name='op' size='1' set='1' type='symbol'>
      <digest>
        Generator Operator
      </digest>
      <description>
        Sets the function that will be used when the <m>generate</m> message is set. If you use <o>attrui</o> set to edit the <at>op</at> attribute, you can see a handy menu of the 40+ possible functions, so you don't have to memorize their names.
      </description>
        </attribute>
        <attribute get='1' name='voiceprob' size='1' set='1' type='float'>
             <digest>Assign setvalue probability for * and $</digest>
             <description>
                 The <at>voiceprob</at> attribute is used when employing the $ or * arguments to the <m>setvalue</m> message. It determines the probability that the <m>setvalue</m> message will be sent. For example, if <at>voiceprob</at> is 0.9, there is a 90% chance the setvalue message will be sent to a randomly chosen voice.

             </description>
         </attribute>

    </attributelist>


</c74object>
