protected void PrintAdditionalWarnings()
        {
            foreach (var s in project.Songs)
            {
                for (int p = 0; p < s.Length; p++)
                {
                    for (int c = 0; c < s.Channels.Length; c++)
                    {
                        var pattern = s.Channels[c].PatternInstances[p];
                        if (pattern != null)
                        {
                            for (var it = pattern.GetDenseNoteIterator(0, s.GetPatternLength(p)); !it.Done; it.Next())
                            {
                                if (it.CurrentNote != null && it.CurrentNote.HasNoteDelay && it.CurrentNote.HasSpeed)
                                {
                                    Log.LogMessage(LogSeverity.Warning, $"Speed changes (Fxx) cannot be combined with note delays (Gxx). Speed changes will always be applied immediately and will ignore the delay. {GetPatternString(pattern, it.CurrentTime)}");
                                }
                            }
                        }
                    }
                }
            }

            if (project.ExpansionAudio == ExpansionType.Vrc6)
            {
                Log.LogMessage(LogSeverity.Warning, $"VRC6 Saw volumes in FamiStudio is not affected by the duty cycle and is instead controlled by a 'Saw Master Volume' on this instrument. You will likely have to adjust this to get the correct volume.");
            }

            var mappedSamplesSize = project.GetTotalMappedSampleSize();

            if (mappedSamplesSize > Project.MaxMappedSampleSize)
            {
                Log.LogMessage(LogSeverity.Warning, $"Project uses {mappedSamplesSize} bytes of sample data. The limit is {Project.MaxMappedSampleSize} bytes. Some samples will not play correctly or at all.");
            }
        }
        protected void PrintAdditionalWarnings()
        {
            foreach (var s in project.Songs)
            {
                for (int p = 0; p < s.Length; p++)
                {
                    for (int c = 0; c < s.Channels.Length; c++)
                    {
                        var pattern = s.Channels[c].PatternInstances[p];
                        if (pattern != null)
                        {
                            for (var it = pattern.GetNoteIterator(0, s.GetPatternLength(p)); !it.Done; it.Next())
                            {
                                if (it.CurrentNote != null && it.CurrentNote.HasNoteDelay && it.CurrentNote.HasSpeed)
                                {
                                    Log.LogMessage(LogSeverity.Warning, $"Speed changes (Fxx) cannot be combined with note delays (Gxx). Speed changes will always be applied immediately and will ignore the delay. {GetPatternString(pattern, it.CurrentTime)}");
                                }
                            }
                        }
                    }
                }
            }

            if (project.ExpansionAudio == ExpansionType.Vrc6)
            {
                Log.LogMessage(LogSeverity.Warning, $"VRC6 Saw volumes in FamiStudio uses the full volume range and ignores the duty cycle, they will need to the adjusted manually to sound the same. In most cases, this mean reducing the volume by half using either the volume track or volume envelopes.");
            }

            var mappedSamplesSize = project.GetTotalMappedSampleSize();

            if (mappedSamplesSize > Project.MaxMappedSampleSize)
            {
                Log.LogMessage(LogSeverity.Warning, $"Project uses {mappedSamplesSize} bytes of sample data. The limit is {Project.MaxMappedSampleSize} bytes. Some samples will not play correctly or at all.");
            }
        }