private void UpdateWarnings() { var numFramesPerPattern = 0; if (song.UsesFamiStudioTempo) { var tempoIndex = Array.IndexOf(tempoStrings, props.GetPropertyValue <string>(famistudioBpmPropIdx)); var tempoInfo = tempoList[tempoIndex]; var notesPerBeat = props.GetPropertyValue <int>(notesPerBeatPropIdx); var notesPerPattern = props.GetPropertyValue <int>(notesPerPatternPropIdx); if (tempoInfo.groove.Length == 1) { props.SetPropertyWarning(famistudioBpmPropIdx, CommentType.Good, "Ideal tempo : notes will be perfectly evenly divided."); } else if ((tempoInfo.groove.Length % notesPerBeat) == 0 || (notesPerBeat % tempoInfo.groove.Length) == 0) { props.SetPropertyWarning(famistudioBpmPropIdx, CommentType.Warning, "Beat-aligned groove : notes will be slightly uneven, but well aligned with the beat."); } else { props.SetPropertyWarning(famistudioBpmPropIdx, CommentType.Error, "Unaligned groove : notes will be slightly uneven and not aligned to the beat."); } if (notesPerBeat != 4) { props.SetPropertyWarning(notesPerBeatPropIdx, CommentType.Error, "A value of 4 is strongly recommended as it gives the best range of available BPMs."); } else { props.SetPropertyWarning(notesPerBeatPropIdx, CommentType.Good, "4 is the recommended value."); } var groovePadMode = GroovePaddingType.GetValueForName(props.GetPropertyValue <string>(groovePadPropIdx)); numFramesPerPattern = FamiStudioTempoUtils.ComputeNumberOfFrameForGroove(notesPerPattern * Utils.Min(tempoInfo.groove), tempoInfo.groove, groovePadMode); } else if (famitrackerSpeedPropIdx >= 0) { var speed = props.GetPropertyValue <int>(famitrackerSpeedPropIdx); var tempo = props.GetPropertyValue <int>(famitrackerTempoPropIdx); if (speed == 1) { props.SetPropertyWarning(famitrackerSpeedPropIdx, CommentType.Warning, $"A speed of 1 will not produce the same BPM between platforms (PAL/NTSC)."); } else { props.SetPropertyWarning(famitrackerSpeedPropIdx, CommentType.Good, ""); } if (tempo != 150) { props.SetPropertyWarning(famitrackerTempoPropIdx, CommentType.Warning, "A tempo of 150 is strongly recommended as it produces even notes on all platforms (NTSC/PAL)."); } else { props.SetPropertyWarning(famitrackerTempoPropIdx, CommentType.Good, "150 is the recommended value."); } } if (patternIdx >= 0 && numFramesPerPattern > song.PatternLength) { props.SetPropertyWarning(notesPerPatternPropIdx, CommentType.Warning, $"Pattern is longer than the song pattern length and FamiTracker does not support this. Ignore this if you are not planning to export to FamiTracker."); } else if (numFramesPerPattern >= 256) { props.SetPropertyWarning(notesPerPatternPropIdx, CommentType.Warning, $"Pattern is longer than what FamiTracker supports. Ignore this if you are not planning to export to FamiTracker."); } else { props.SetPropertyWarning(notesPerPatternPropIdx, CommentType.Good, ""); } }