protected bool FinishImport()
        {
            foreach (var s in project.Samples)
            {
                s.Process();
            }

            foreach (var s in project.Songs)
            {
                foreach (var c in s.Channels)
                {
                    c.ColorizePatterns();

                    for (int p = 0; p < s.Length; p++)
                    {
                        var pattern = c.PatternInstances[p];
                        if (pattern != null && patternLengths.TryGetValue(pattern, out var instLength))
                        {
                            if (instLength < s.GetPatternLength(p))
                            {
                                s.SetPatternCustomSettings(p, instLength, s.BeatLength);
                            }
                        }
                    }
                }

                // FamiTracker always assumes 4 rows per beat for BPM calculation, but let's assume
                // the artists properly set first row highlight to that.
                if (barLength == -1)
                {
                    s.SetSensibleBeatLength();
                }
                else
                {
                    s.SetBeatLength(barLength);
                }

                ApplyHaltEffect(s, patternFxData);

                s.DeleteNotesPastMaxInstanceLength();
                s.UpdatePatternStartNotes();

                CreateArpeggios(s, patternFxData);
                CreateSlideNotes(s, patternFxData);

                s.DeleteEmptyPatterns();
            }

            project.ConvertToCompoundNotes();
            project.InvalidateCumulativePatternCache();
            project.SortEverything(false);
            project.Validate();

            PrintAdditionalWarnings();

            return(true);
        }