class:: OffsetOut
summary:: Write a signal to a bus with sample accurate timing.
related:: Classes/Out, Classes/ReplaceOut, Classes/XOut
categories::  UGens>InOut


Description::

Output signal to a bus,  the sample offset within the bus is kept
exactly; i.e. if the synth is scheduled to be started part way through a
control cycle, OffsetOut will maintain the correct offset by buffering
the output and delaying it until the exact time that the synth was
scheduled for.


For achieving subsample accuracy see  link::Classes/SubsampleOffset::

note::

Note that if you have an input to the synth, it will be coming in and
its normal time, then mixed in your synth, and then delayed with the
output. So you shouldn't use OffsetOut for effects or gating.

::

See the link::Reference/Server-Architecture:: and link::Classes/Bus:: helpfiles for more information on
buses and how they are used.


classmethods::

method::ar

argument::bus

The index of the bus to write out to. The lowest numbers are
written to the audio hardware.


argument::channelsArray

An Array of channels or single output to write out. You cannot
change the size of this once a SynthDef has been built.


Examples::

code::

(
SynthDef("help-OffsetOut",
	{ arg out=0, freq=440, dur=0.05;
		var env;
		env = EnvGen.kr(Env.perc(0.01, dur, 0.2), doneAction:2);
		OffsetOut.ar(out, SinOsc.ar(freq, 0, env))
}).send(s);

SynthDef("help-Out",
	{ arg out=0, freq=440, dur=0.05;
		var env;
		env = EnvGen.kr(Env.perc(0.01, dur, 0.2), doneAction:2);
		//compare to Out:
		Out.ar(out, SinOsc.ar(freq, 0, env))
}).send(s);
)


// these are in sync
(
Routine({
	loop {
		s.sendBundle(0.2, ["/s_new", "help-OffsetOut", -1]);
		0.01.wait;
	}
}).play;
)

// these are less reliably in sync and are placed at multiples of blocksize.
(
Routine({
	loop {
		s.sendBundle(0.2, ["/s_new", "help-Out", -1]);
		0.01.wait;
	}
}).play;
)



SynthDef("trig1",{
	var gate,tone;
	gate = Trig1.ar(1.0,t);
	tone = In.ar(10,1); // tone comes in normally
	// but is then delayed when by the OffsetOut
	OffsetOut.ar(0,
		tone * EnvGen.ar(
				Env([0,0.1,0.1,0],[0.01,1.0,0.01],[-4,4],2),
				gate,doneAction: 2
			)
	)
})

::

