private void GenerateNote(Note note, int beatStart, int beatDuration, int[] brushInfo)
{
var track = note.Beat.Voice.Bar.Staff.Track;
var noteKey = note.RealValue;
var brushOffset = note.IsStringed && note.String <= brushInfo.Length ? brushInfo[note.String - 1] : 0;
var noteStart = beatStart + brushOffset;
var noteDuration = GetNoteDuration(note, beatDuration) - brushOffset;
var dynamicValue = GetDynamicValue(note);
// TODO: enable second condition after whammy generation is implemented
if (!note.HasBend /* && !note.Beat.HasWhammyBar */)
{
// reset bend
_handler.AddBend(track.Index, noteStart, (byte)track.PlaybackInfo.PrimaryChannel, DefaultBend);
}
//
// Fade in
if (note.Beat.FadeIn)
{
GenerateFadeIn(note, noteStart, noteDuration, noteKey, dynamicValue);
}
// TODO: grace notes?
//
// Trill
if (note.IsTrill && !track.IsPercussion)
{
GenerateTrill(note, noteStart, noteDuration, noteKey, dynamicValue);
// no further generation needed
return;
}
//
// Tremolo Picking
if (note.Beat.IsTremolo)
{
GenerateTremoloPicking(note, noteStart, noteDuration, noteKey, dynamicValue);
// no further generation needed
return;
}
//
// All String Bending/Variation effects
if (note.HasBend)
{
GenerateBend(note, noteStart, noteDuration, noteKey, dynamicValue);
}
else if (note.Beat.HasWhammyBar)
{
GenerateWhammyBar(note, noteStart, noteDuration, noteKey, dynamicValue);
}
else if (note.SlideType != SlideType.None)
{
GenerateSlide(note, noteStart, noteDuration, noteKey, dynamicValue);
}
else if (note.Vibrato != VibratoType.None)
{
GenerateVibrato(note, noteStart, noteDuration, noteKey, dynamicValue);
}
//
// Harmonics
if (note.HarmonicType != HarmonicType.None)
{
GenerateHarmonic(note, noteStart, noteDuration, noteKey, dynamicValue);
}
if (!note.IsTieDestination)
{
_handler.AddNote(track.Index, noteStart, noteDuration, (byte)noteKey, dynamicValue, (byte)track.PlaybackInfo.PrimaryChannel);
}
}