<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<?xml-stylesheet href="./_c74_ref.xsl" type="text/xsl"?>

<!--This is an automatically generated file. DO NOT EDIT THIS FILE DIRECTLY. Rather, use the _ref.xml files found in the 'edits' folder.-->
<c74object name="2d.wave~" module="msp" category="MSP Sampling">
	<digest>
		Two-dimensional wavetable
	</digest>
	<description>
		<o>2d.wave~</o> is similar to <o>wave~</o>, but with an additional axis. A given ms range of an audio file will be divided into n rows. Y phase input will determine which row(s) will be used for playback.
	</description>
	<!--METADATA-->
	<metadatalist>
		<metadata name="author">
			Cycling '74
		</metadata>
		<metadata name="tag">
			MSP
		</metadata>
		<metadata name="tag">
			oscillator
		</metadata>
		<metadata name="tag">
			MSP Sampling
		</metadata>
	</metadatalist>
	<!--INLETS-->
	<inletlist>
		<inlet id="0" type="signal">
			<digest>
				(signal) X Table Position (from 0 to 1)
			</digest>
			<description>
				TEXT_HERE
			</description>
		</inlet>
		<inlet id="1" type="signal">
			<digest>
				(signal) Y Table Position (from 0 to 1)
			</digest>
			<description>
				TEXT_HERE
			</description>
		</inlet>
		<inlet id="2" type="signal/float">
			<digest>
				(signal/float) Starting Table Location in ms
			</digest>
			<description>
				TEXT_HERE
			</description>
		</inlet>
		<inlet id="3" type="signal/float">
			<digest>
				(signal/float) Ending Table Location in ms
			</digest>
			<description>
				TEXT_HERE
			</description>
		</inlet>
	</inletlist>
	<!--OUTLETS-->
	<outletlist>
		<outlet id="0" type="signal">
			<digest>
				(signal) Channel 1 Output
			</digest>
			<description>
				TEXT_HERE
			</description>
		</outlet>
	</outletlist>
	<!--ARGUMENTS-->
	<objarglist>
		<objarg name="buffer-name" optional="0" type="symbol">
			<digest>
				Buffer name
			</digest>
			<description>
				Obligatory. Names the <o>buffer~</o> object whose sample memory is used by <o>2d.wave~</o> for its stored waveform. Note that if the underlying data in a <o>buffer~</o> changes, the signal output of <o>2d.wave~</o> will change, since it does not copy the sample data in a <o>buffer~</o>. <o>2d.wave~</o> always uses the first n channels of a multi-channel <o>buffer~</o>, where n is the number of the <o>2d.wave~</o> object's output channels. The default number of channels, set by the third argument to the <o>2d.wave~</o> object, is <m>1</m>.
			</description>
		</objarg>
		<objarg name="start and end-points" optional="1" type="number">
			<digest>
				Waveform start/end points
			</digest>
			<description>
				After the <o>buffer~</o> name argument, you can type in values for the start and end points of the waveform, as millisecond offsets from the beginning of a <o>buffer~</o> object's sample memory. By default the start point is 0 and the end point is the end of the sample. If you want to set a non-zero start point but retain the sample end as the waveform end point, use only a single typed-in argument after the <o>buffer~</o> name. If a <m>signal</m> is connected to the start point (middle) inlet, the initial waveform start point argument is ignored. If a <m>signal</m> is connected to the end point (right) inlet, the initial waveform end point is ignored. The number of channels in the buffer~ file and the number of rows to be used may also be specified.
			</description>
		</objarg>
		<objarg name="number-of-output-channels" optional="1" type="int">
			<digest>
				Number of output channels
			</digest>
			<description>
				Sets the number of output channels, which determines the number of outlets that the <o>2d.wave~</o> object will have. The maximum number of channels is 8. The default is 1. If the audio file being played has more output channels than the <o>2d.wave~</o> object, higher-numbered channels will not be played. If the audio file has fewer channels, the signals coming from the extra outlets of <o>2d.wave~</o> will be 0.
			</description>
		</objarg>
	</objarglist>
	<!--MESSAGES-->
	<methodlist>
		<method name="int">
			<arglist>
				<arg name="start and end-points" optional="0" type="int" />
			</arglist>
			<digest>
				Function depends on inlet
			</digest>
			<description>
				In 3rd or 4th inlets: Numbers can be used instead of signal objects to control the start and end points of the waveform, provided a signal is not connected to the inlet that receives the number.
			</description>
		</method>
		<method name="float">
			<arglist>
				<arg name="start and end-points" optional="0" type="float" />
			</arglist>
			<digest>
				Function depends on inlet
			</digest>
			<description>
				In 3rd or 4th inlets: Numbers can be used instead of signal objects to control the start and end points of the waveform, provided a signal is not connected to the inlet that receives the number.
			</description>
		</method>
		<method name="(mouse)">
			<digest>
				Open file buffer display window
			</digest>
			<description>
				Double-clicking on the <o>2d.wave~</o> object will open a window that displays the audio file loaded in the buffer associated with the object.
			</description>
		</method>
		<method name="rows">
			<arglist>
				<arg name="number-of-divisions" optional="0" type="int" />
			</arglist>
			<digest>
				Set the number of sections to divide the file into
			</digest>
			<description>
				The word <m>rows</m>, followed by an int, sets the number of rows a given range of an audio file will be divided into. The phase input signal value received in the 2nd inlet of <o>2d.wave~</o> determines which row(s) are used for playback. The default value is 0.
			</description>
		</method>
		<method name="set">
			<arglist>
				<arg name="buffer-name" optional="0" type="symbol" />
				<arg name="start-point" optional="1" type="float" />
				<arg name="end-point" optional="1" type="float" />
			</arglist>
			<digest>
				Set the <o>buffer~</o> used by <o>2d.wave~</o> 
			</digest>
			<description>
				The word <m>set</m>, followed by a symbol, sets the <o>buffer~</o> used by <o>2d.wave~</o> for its stored waveform. The symbol can optionally be followed by two values setting new waveform start and end points. If the values are not present, the default start and end points (the start and end of the sample) are used. If signal objects are connected to the start and/or end point inlets, the start and/or end point values are ignored.
			</description>
		</method>
		<method name="signal">
			<arglist />
			<digest>
				Function depends on inlet
			</digest>
			<description>
				In left inlet: Input signal values progressing from 0 to 1 are used to scan a specified range of samples in a <o>buffer~</o> object. The output of a <o>phasor~</o> can be used to control <o>2d.wave~</o> as an oscillator, treating the range of samples in the <o>buffer~</o> as a repeating waveform. However, note that when changing the frequency of a <o>phasor~</o> connected to the left inlet of <o>2d.wave~</o>, the perceived pitch of the signal coming out of 2d.wave~ may not correspond exactly to the frequency of <o>phasor~</o> itself if the stored waveform contains multiple or partial repetitions of a waveform. You can invert the <o>phasor~</o> to play the waveform backwards.
				<br />
				<br />
				In 2nd inlet: Input signal values progressing from 0 to 1 are used to determine which of the row(s) specified by the <m>rows</m> message will be used for playback. You can invert the <o>phasor~</o> to reverse the order in which rows are played.
				<br />
				<br />
				In 3rd inlet: The start of the waveform as a millisecond offset from the beginning of a <o>buffer~</o> object's sample memory.
				<br />
				<br />
				In 4th inlet: The end of the waveform as a millisecond offset from the beginning of a <o>buffer~</o> object's sample memory.
			</description>
		</method>
	</methodlist>
	<!--ATTRIBUTES-->
	<!--EXAMPLE-->
	<examplelist>
		<example img="2d.wave~.png" caption="Loop through part of a sample, treating it as a variable-size wavetable" />
	</examplelist>
	<!--SEEALSO-->
	<seealsolist>
		<seealso name="buffer~" />
		<seealso name="groove~" />
		<seealso name="phasor~" />
		<seealso name="play~" />
		<seealso name="wave~" />
		<seealso name="07_samplingchapter04" module="msp" type="tutorial" />
	</seealsolist>
	<discussion>
		Try loading a 16-bar loop and setting your rows to be 16 (or 7 for that matter). Try also using a short (150 ms or so) section of an audio file as a 2-d wave table. Set the phasor of one axis to be very fast, and one to be very slow.
	</discussion>
	<misc name="Output">
		<entry name="signal">
			<description>
				The portion of the <o>buffer~</o> specified by the <o>2d.wave~</o> object's start and end points is scanned by signal values ranging from 0 to 1 in the <o>2d.wave~</o> object's inlet, and the corresponding sample value from the <o>buffer~</o> is sent out the <o>2d.wave~</o> object's outlet. If the signal received in the object's inlet is a repeating signal such as a sawtooth wave from a <o>phasor~</o>, the resulting output will be a waveform (excerpted from the <o>buffer~</o>) repeating at the frequency corresponding to the repetition of the input signal.
			</description>
		</entry>
	</misc>
</c74object>
