/// <summary>
        /// Creates summary info based on the <paramref name="plugin"/>.
        /// </summary>
        /// <param name="plugin">Must not be null.</param>
        /// <returns>Never returns null.</returns>
        /// <remarks>Override to add or change behavior.</remarks>
        protected virtual VstPluginInfo CreatePluginInfo(IVstPlugin plugin)
        {
            VstPluginInfo pluginInfo = new VstPluginInfo();

            var audioProcessor = plugin.GetInstance <IVstPluginAudioProcessor>();

            // determine flags
            if (plugin.Supports <IVstPluginEditor>())
            {
                pluginInfo.Flags |= VstPluginFlags.HasEditor;
            }
            if (audioProcessor != null)
            {
                pluginInfo.Flags |= VstPluginFlags.CanReplacing;
            }
            if (plugin.Supports <IVstPluginAudioPrecisionProcessor>())
            {
                pluginInfo.Flags |= VstPluginFlags.CanDoubleReplacing;
            }
            if (plugin.Supports <IVstPluginPersistence>())
            {
                pluginInfo.Flags |= VstPluginFlags.ProgramChunks;
            }
            if (audioProcessor != null && plugin.Supports <IVstMidiProcessor>())
            {
                pluginInfo.Flags |= VstPluginFlags.IsSynth;
            }
            if ((plugin.Capabilities & VstPluginCapabilities.NoSoundInStop) > 0)
            {
                pluginInfo.Flags |= VstPluginFlags.NoSoundInStop;
            }

            // basic plugin info
            pluginInfo.InitialDelay  = plugin.InitialDelay;
            pluginInfo.PluginID      = plugin.PluginID;
            pluginInfo.PluginVersion = plugin.ProductInfo.Version;

            // audio processing info
            if (audioProcessor != null)
            {
                pluginInfo.AudioInputCount  = audioProcessor.InputCount;
                pluginInfo.AudioOutputCount = audioProcessor.OutputCount;
            }

            // parameter info
            IVstPluginParameters?pluginParameters = plugin.GetInstance <IVstPluginParameters>();

            if (pluginParameters != null)
            {
                pluginInfo.ParameterCount = pluginParameters.Parameters.Count;
            }

            // program info
            IVstPluginPrograms?pluginPrograms = plugin.GetInstance <IVstPluginPrograms>();

            if (pluginPrograms != null)
            {
                pluginInfo.ProgramCount = pluginPrograms.Programs.Count;
            }

            return(pluginInfo);
        }
        /// <summary>
        /// Creates summary info based on the <paramref name="plugin"/>.
        /// </summary>
        /// <param name="plugin">Must not be null.</param>
        /// <returns>Never returns null.</returns>
        /// <remarks>Override to add or change behavior.</remarks>
        protected virtual VstPluginInfo CreatePluginInfo(IVstPlugin plugin)
        {
            VstPluginInfo pluginInfo = new VstPluginInfo();

            IVstPluginAudioProcessor audioProcessor = plugin.GetInstance<IVstPluginAudioProcessor>();

            // determine flags
            if (plugin.Supports<IVstPluginEditor>())
                pluginInfo.Flags |= VstPluginFlags.HasEditor;
            if (audioProcessor != null)
                pluginInfo.Flags |= VstPluginFlags.CanReplacing;
            if (plugin.Supports<IVstPluginAudioPrecisionProcessor>())
                pluginInfo.Flags |= VstPluginFlags.CanDoubleReplacing;
            if (plugin.Supports<IVstPluginPersistence>())
                pluginInfo.Flags |= VstPluginFlags.ProgramChunks;
            if (audioProcessor != null && plugin.Supports<IVstMidiProcessor>())
                pluginInfo.Flags |= VstPluginFlags.IsSynth;
            if ((plugin.Capabilities & VstPluginCapabilities.NoSoundInStop) > 0)
                pluginInfo.Flags |= VstPluginFlags.NoSoundInStop;

            // basic plugin info
            pluginInfo.InitialDelay = plugin.InitialDelay;
            pluginInfo.PluginID = plugin.PluginID;
            pluginInfo.PluginVersion = plugin.ProductInfo.Version;

            // audio processing info
            if (audioProcessor != null)
            {
                pluginInfo.AudioInputCount = audioProcessor.InputCount;
                pluginInfo.AudioOutputCount = audioProcessor.OutputCount;
            }

            // parameter info
            IVstPluginParameters pluginParameters = plugin.GetInstance<IVstPluginParameters>();
            if (pluginParameters != null)
                pluginInfo.ParameterCount = pluginParameters.Parameters.Count;

            // program info
            IVstPluginPrograms pluginPrograms = plugin.GetInstance<IVstPluginPrograms>();
            if (pluginPrograms != null)
                pluginInfo.ProgramCount = pluginPrograms.Programs.Count;

            return pluginInfo;
        }