예제 #1
0
 private void FinishApply(Action callback)
 {
     song.DeleteNotesPastMaxInstanceLength();
     song.InvalidateCumulativePatternCache();
     song.Project.ValidateIntegrity();
     callback();
 }
예제 #2
0
        private void TruncateLongPatterns(Song song)
        {
            if (song.PatternLength > 256)
            {
                song.SetDefaultPatternLength(256);
            }

            // FamiTracker can only shorten patterns using skips.
            // We allow patterns to be longer than the default, so we will truncate those.
            for (int i = 0; i < song.Length; i++)
            {
                if (song.GetPatternLength(i) > song.PatternLength)
                {
                    song.ClearPatternCustomSettings(i);
                }
            }

            song.DeleteNotesPastMaxInstanceLength();
        }
예제 #3
0
        public void Apply(bool custom = false)
        {
            if (song.UsesFamiTrackerTempo)
            {
                if (patternIdx == -1)
                {
                    if (famitrackerTempoPropIdx >= 0)
                    {
                        song.FamitrackerTempo = props.GetPropertyValue <int>(famitrackerTempoPropIdx);
                        song.FamitrackerSpeed = props.GetPropertyValue <int>(famitrackerSpeedPropIdx);
                    }

                    song.SetBeatLength(props.GetPropertyValue <int>(notesPerBeatPropIdx));
                    song.SetDefaultPatternLength(props.GetPropertyValue <int>(notesPerPatternPropIdx));
                }
                else
                {
                    for (int i = minPatternIdx; i <= maxPatternIdx; i++)
                    {
                        var beatLength    = props.GetPropertyValue <int>(notesPerBeatPropIdx);
                        var patternLength = props.GetPropertyValue <int>(notesPerPatternPropIdx);

                        if (custom)
                        {
                            song.SetPatternCustomSettings(i, patternLength, beatLength);
                        }
                        else
                        {
                            song.ClearPatternCustomSettings(i);
                        }
                    }
                }
            }
            else
            {
                var tempoIndex = Array.IndexOf(tempoStrings, props.GetPropertyValue <string>(famistudioBpmPropIdx));
                var tempoInfo  = tempoList[tempoIndex];

                var beatLength    = props.GetPropertyValue <int>(notesPerBeatPropIdx);
                var patternLength = props.GetPropertyValue <int>(notesPerPatternPropIdx);
                var noteLength    = Utils.Min(tempoInfo.groove);

                var grooveIndex   = Array.IndexOf(grooveStrings, props.GetPropertyValue <string>(groovePropIdx));
                var groovePadMode = GroovePaddingType.GetValueForName(props.GetPropertyValue <string>(groovePadPropIdx));
                var grooveList    = FamiStudioTempoUtils.GetAvailableGrooves(tempoInfo.groove);
                var groove        = grooveList[grooveIndex];

                props.UpdateIntegerRange(notesPerPatternPropIdx, 1, Pattern.MaxLength / noteLength);
                props.SetLabelText(framesPerNotePropIdx, noteLength.ToString());

                if (patternIdx == -1)
                {
                    var convertTempo = false;

                    if (noteLength != originalNoteLength)
                    {
                        convertTempo = ShowConvertTempoDialog();
                    }

                    song.ChangeFamiStudioTempoGroove(groove, convertTempo);
                    song.SetBeatLength(beatLength * song.NoteLength);
                    song.SetDefaultPatternLength(patternLength * song.NoteLength);
                    song.SetGroovePaddingMode(groovePadMode);
                }
                else
                {
                    var actualNoteLength    = song.NoteLength;
                    var actualPatternLength = song.PatternLength;
                    var actualBeatLength    = song.BeatLength;

                    if (custom)
                    {
                        actualNoteLength    = noteLength;
                        actualBeatLength    = beatLength * noteLength;
                        actualPatternLength = patternLength * noteLength;
                    }

                    var patternsToResize = new List <int>();
                    for (int i = minPatternIdx; i <= maxPatternIdx; i++)
                    {
                        if (actualNoteLength != song.GetPatternNoteLength(patternIdx))
                        {
                            patternsToResize.Add(i);
                        }
                    }

                    if (patternsToResize.Count > 0)
                    {
                        if (ShowConvertTempoDialog())
                        {
                            foreach (var p in patternsToResize)
                            {
                                song.ResizePatternNotes(p, actualNoteLength);
                            }
                        }
                    }

                    for (int i = minPatternIdx; i <= maxPatternIdx; i++)
                    {
                        if (custom)
                        {
                            song.SetPatternCustomSettings(i, actualPatternLength, actualBeatLength, groove, groovePadMode);
                        }
                        else
                        {
                            song.ClearPatternCustomSettings(i);
                        }
                    }
                }
            }

            song.DeleteNotesPastMaxInstanceLength();
            song.InvalidateCumulativePatternCache();
            song.Project.ValidateIntegrity();
        }