<!-- Converted to DocBook/SGML by Kevin Conder -->
<refentry id="deltapi">
  <refmeta>
    <refentrytitle>deltapi</refentrytitle>
  </refmeta>
 
  <refnamediv>
    <refname>deltapi</refname>
    <refpurpose>
      Taps a delay line at variable offset times, uses interpolation.
      <indexterm id="IndexDeltapi"><primary>deltapi</primary></indexterm>
    </refpurpose>
  </refnamediv>
 
  <refsect1>
    <title>Description</title>
    <para>
      Taps a delay line at variable offset times, uses interpolation.
    </para>
  </refsect1>
 
  <refsect1>
    <title>Syntax</title>
    <synopsis>ar <command>deltapi</command> xdlt</synopsis>
  </refsect1>
 
  <refsect1>
    <title>Performance</title>
    <para>
      <emphasis>xdlt</emphasis> -- specifies the tapped delay time in seconds. Each can range from 1 control period to the full delay time of the read/write pair; however, since there is no internal check for adherence to this range, the user is wholly responsible. Each argument can be a constant, a variable, or a time-varying signal; the <emphasis>xdlt</emphasis> argument in <emphasis>deltapi</emphasis> implies that an audio-varying delay is permitted there.
    </para>

    <para>
      <emphasis>deltapi</emphasis> extracts sound by interpolated readout. By interpolating between adjacent stored samples <emphasis>deltapi</emphasis> represents a particular delay time with more accuracy, but it will take about twice as long to run.
    </para>


    <para>
      This opcode can tap into a <link linkend="delayr"><citetitle>delayr</citetitle></link>/<link linkend="delayw"><citetitle>delayw</citetitle></link> pair, extracting delayed audio from the <emphasis>idlt</emphasis> seconds of stored sound. There can be any number of <link linkend="deltap"><citetitle>deltap</citetitle></link> and/or <emphasis>deltapi</emphasis> units between a read/write pair. Each receives an audio tap with no change of original amplitude.
    </para>

    <para>
      This opcode can provide multiple delay taps for arbitrary delay path and feedback networks. They can deliver either constant-time or time-varying taps, and are useful for building chorus effects, harmonizers, and Doppler shifts. Constant-time delay taps (and some slowly changing ones) do not need interpolated readout; they are well served by <emphasis>deltap</emphasis>. Medium-paced or fast varying dlt's, however, will need the extra services of <emphasis>deltapi</emphasis>.
    </para>

    <para>
      <emphasis>delayr</emphasis>/<emphasis>delayw</emphasis> pairs may be interleaved. To associate a delay tap unit with a specific <emphasis>delayr</emphasis> unit, it not only has to be located between that <emphasis>delayr</emphasis> and the appropriate <emphasis>delayw</emphasis> unit, but must also precede any following <emphasis>delayr</emphasis> units. See Example 2. (This feature added in Csound version 3.57 by Jens Groh and &namejohn;).
    </para>

    <para>
      <emphasis>N.B.</emphasis> k-rate delay times are not internally interpolated, but rather lay down stepped time-shifts of audio samples; this will be found quite adequate for slowly changing tap times. For medium to fast-paced changes, however, one should provide a higher resolution audio-rate timeshift as input.
    </para>
  </refsect1>
 
  <refsect1>
    <title>Examples</title>
    <para>
      <example>
        <title>deltap example #1</title>
        <programlisting>
  asource  <emphasis>buzz</emphasis>      1, 440, 20, 1
  atime    <emphasis>linseg</emphasis>    1, p3/2,.01, p3/2,1   ; trace a distance in secs
  ampfac   <emphasis>=</emphasis>         1/atime/atime         ; and calc an amp factor
  adump    <emphasis>delayr</emphasis>    1                     ; set maximum distance
  amove    <emphasis>deltapi</emphasis>   atime                 ; move sound source past
           <emphasis>delayw</emphasis>    asource               ; the listener
           <emphasis>out</emphasis>       amove * ampfac
        </programlisting>
      </example>
    </para>

    <para>
      <example>
        <title>deltap example #2</title>
        <programlisting>
  ainput1 =	..... 
  ainput2 =	..... 
  kdlyt1  =	..... 
  kdlyt2  =	..... 

;Read delayed signal, first delayr instance:
  adump   <emphasis>delayr</emphasis>  4.0 
  adly1   <emphasis>deltap</emphasis>  kdlyt1       ;associated with first delayr instance 

;Read delayed signal, second delayr instance:
  adump   <emphasis>delayr</emphasis>  4.0 
  adly2   <emphasis>deltap</emphasis>  kdlyt2       ; associated with second delayr instance 

;Do some cross-coupled manipulation: 
  afdbk1  =       0.7 * adly1 + 0.7 * adly2 + ainput1 
  afdbk2  =       -0.7 * adly1 + 0.7 * adly2 + ainput2 

;Feed back signal, associated with first delayr instance: 
          <emphasis>delayw</emphasis>  afdbk1 

;Feed back signal, associated with second delayr instance: 
          <emphasis>delayw</emphasis>  afdbk2
          <emphasis>outs</emphasis>    adly1, adly2
        </programlisting>
      </example>
    </para>
  </refsect1>

  <refsect1>
    <title>See Also</title>
    <para>
      <link linkend="deltap"><citetitle>deltap</citetitle></link>,
      <link linkend="deltap3"><citetitle>deltap3</citetitle></link>,
      <link linkend="deltapn"><citetitle>deltapn</citetitle></link>
    </para>
  </refsect1>
</refentry>
