public void begin( long total_samples, WorkerState state )
{
is_running_ = true;
total_samples_ = total_samples;
int buffer_length = sample_rate_ / 10;
double[] left = new double[buffer_length];
double[] right = new double[buffer_length];
if ( driver_.getUi( null ) == null ) {
throw new InvalidOperationException("plugin ui を main view のスレッドで作成した後、このメソッドを呼ばなくてはならない。");
}
var eventQueue = generateMidiEvent( sequence_, track_index_ );
foreach ( var sequence_item in eventQueue.getSequence() ) {
var clock = sequence_item.Key;
var queue = sequence_item.Value;
long to_sample = (long)(sequence_.getSecFromClock( clock ) * sample_rate_);
if ( to_sample >= total_samples_ ) {
to_sample = total_samples_;
}
doSynthesis( to_sample, left, right, state );
if ( position_ >= total_samples_ ) break;
// noteOff, noteOn の順に分けて send する方法も考えられるが、正しく動作しない。
// このため、いったん一つの配列にまとめてから send する必要がある。
var events = new List<MidiEvent>();
events.AddRange( queue.pit );
events.AddRange( queue.noteoff );
events.AddRange( queue.noteon );
driver_.send( events.ToArray() );
//TODO: のこりのイベント送る処理
}
doSynthesis( total_samples, left, right, state );
receiver_.end();
is_running_ = false;
state.reportComplete();
}