/// <summary>
        /// Returns the size of the period for genConfigInfo in samples
        /// </summary>
        /// <remarks>
        /// Preconditions: sample rate must be initialized in hostInfoOutputPort. If
        /// genConfigInfo is for a beat synced generator then the time signature must also be
        /// initialized in hostInfoOutputPort.
        /// </remarks>
        protected int GetPeriodSizeInSamples(GenEntryConfigInfo genConfigInfo)
        {
            if (genConfigInfo.PeriodType == GenPeriodType.BeatSynced ||
                genConfigInfo.PeriodType == GenPeriodType.Bars)
            {
                Debug.Assert(hostInfoOutputPort.TimeSignatureIsInitialized == true);
                Debug.Assert(hostInfoOutputPort.SampleRateIsInitialized == true);

                double periodSizeInBars =
                    genConfigInfo.GetSizeOfBarsPeriod(hostInfoOutputPort.TimeSignatureNumerator,
                                                      hostInfoOutputPort.TimeSignatureDenominator);

                double timeSig = (double)hostInfoOutputPort.TimeSignatureNumerator /
                                 hostInfoOutputPort.TimeSignatureDenominator;
                double beatsPerBar   = timeSig / (1 / 4d);
                double secondsPerBar = (beatsPerBar / hostInfoOutputPort.Tempo) * 60;
                return((int)System.Math.Round(
                           secondsPerBar * periodSizeInBars * hostInfoOutputPort.SampleRate));
            }
            else if (genConfigInfo.PeriodType == GenPeriodType.Time)
            {
                Debug.Assert(hostInfoOutputPort.SampleRateIsInitialized == true);

                return((int)System.Math.Round(
                           (genConfigInfo.TimePeriodInMs / 1000d) * hostInfoOutputPort.SampleRate));
            }
            else
            {
                //Unexpected GenPeriodType
                Debug.Assert(false);
                return(1000);
            }
        }
        /// <summary>
        /// Get the relative position into the beat synced period for genInfo at sampleTime
        /// </summary>
        /// <remarks>
        /// Preconditions: genInfo refers to a beat synced generator. CalculatedBarZero and
        /// TimeSignature have been initialized in hostInfoOutputPort.
        /// </remarks>
        protected double GetRelPosInBeatSyncedPeriod(GenEntryConfigInfo genInfo,
                                                     long sampleTime)
        {
            Debug.Assert(genInfo.PeriodType == GenPeriodType.BeatSynced);
            Debug.Assert(hostInfoOutputPort.CalculatedBarZeroIsInitialized == true);
            Debug.Assert(hostInfoOutputPort.TimeSignatureIsInitialized == true);


            //TODO: Need to rethink notion of beat synced gen. Maybe it should just by like a time based gen
            //that can adjust to a changing tempo instead of jumping to a particular part of the bar.
            //Need to cover two use cases
            //LFO that runs on off time quarter note
            //LFO that is looped and enabled so it should start at bar 0 and always keep in time.

            double barPos           = hostInfoOutputPort.GetBarPosAtSampleTime(sampleTime);
            double periodSizeInBars =
                genInfo.GetSizeOfBarsPeriod(hostInfoOutputPort.TimeSignatureNumerator,
                                            hostInfoOutputPort.TimeSignatureDenominator);

            return(barPos % periodSizeInBars / periodSizeInBars);
        }
        /// <summary>
        /// Get the relative position into the beat synced period for genInfo at sampleTime
        /// </summary>
        /// <remarks>
        /// Preconditions: genInfo refers to a beat synced generator. CalculatedBarZero and 
        /// TimeSignature have been initialized in hostInfoOutputPort.
        /// </remarks>
        protected double GetRelPosInBeatSyncedPeriod(GenEntryConfigInfo genInfo, 
            long sampleTime)
        {
            Debug.Assert(genInfo.PeriodType == GenPeriodType.BeatSynced);
            Debug.Assert(hostInfoOutputPort.CalculatedBarZeroIsInitialized == true);
            Debug.Assert(hostInfoOutputPort.TimeSignatureIsInitialized == true);

            //TODO: Need to rethink notion of beat synced gen. Maybe it should just by like a time based gen
            //that can adjust to a changing tempo instead of jumping to a particular part of the bar.
            //Need to cover two use cases
            //LFO that runs on off time quarter note
            //LFO that is looped and enabled so it should start at bar 0 and always keep in time.

            double barPos = hostInfoOutputPort.GetBarPosAtSampleTime(sampleTime);
            double periodSizeInBars =
                genInfo.GetSizeOfBarsPeriod(hostInfoOutputPort.TimeSignatureNumerator,
                                            hostInfoOutputPort.TimeSignatureDenominator);
            return barPos % periodSizeInBars / periodSizeInBars;
        }
        /// <summary>
        /// Returns the size of the period for genConfigInfo in samples
        /// </summary>
        /// <remarks>
        /// Preconditions: sample rate must be initialized in hostInfoOutputPort. If
        /// genConfigInfo is for a beat synced generator then the time signature must also be
        /// initialized in hostInfoOutputPort.
        /// </remarks>
        protected int GetPeriodSizeInSamples(GenEntryConfigInfo genConfigInfo)
        {
            if (genConfigInfo.PeriodType == GenPeriodType.BeatSynced ||
                genConfigInfo.PeriodType == GenPeriodType.Bars)
            {
                Debug.Assert(hostInfoOutputPort.TimeSignatureIsInitialized == true);
                Debug.Assert(hostInfoOutputPort.SampleRateIsInitialized == true);

                double periodSizeInBars =
                    genConfigInfo.GetSizeOfBarsPeriod(hostInfoOutputPort.TimeSignatureNumerator,
                                                      hostInfoOutputPort.TimeSignatureDenominator);

                double timeSig = (double)hostInfoOutputPort.TimeSignatureNumerator /
                                 hostInfoOutputPort.TimeSignatureDenominator;
                double beatsPerBar = timeSig / (1/4d);
                double secondsPerBar = (beatsPerBar / hostInfoOutputPort.Tempo) * 60;
                return (int)System.Math.Round(
                    secondsPerBar * periodSizeInBars * hostInfoOutputPort.SampleRate);
            }
            else if (genConfigInfo.PeriodType == GenPeriodType.Time)
            {
                Debug.Assert(hostInfoOutputPort.SampleRateIsInitialized == true);

                return (int)System.Math.Round(
                    (genConfigInfo.TimePeriodInMs / 1000d) * hostInfoOutputPort.SampleRate);
            }
            else
            {
                //Unexpected GenPeriodType
                Debug.Assert(false);
                return 1000;
            }
        }