private void UpgradeData()
    {
        if (_creator.groupTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled.");
            return;
        }

        if (_creator.variationTemplate == null)
        {
            DTGUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled");
            return;
        }


        for (var g = 0; g < _creator.soundGroupsToCreate.Count; g++)
        {
            var grp       = _creator.soundGroupsToCreate[g];
            var groupName = grp.groupName;

            var match = _groups.FindAll(delegate(DynamicSoundGroup obj) {
                return(obj.name == groupName);
            });
            if (match.Count > 0)
            {
                Debug.LogWarning("Dynamic Sound Group '" + groupName + "' already exists. Please rename one of them.");
            }

            var newGrp = (GameObject)GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity);
            newGrp.transform.name   = groupName;
            newGrp.transform.parent = _creator.transform;

            var groupScript = newGrp.GetComponent <DynamicSoundGroup>();

            if (grp.duckSound)
            {
                var duckMatch = _creator.musicDuckingSounds.FindAll(delegate(DuckGroupInfo obj) {
                    return(obj.soundType == groupName);
                });

                if (duckMatch.Count > 0)
                {
                    Debug.LogWarning("Dynamic Duck Setting for Sound Group '" + groupName + "' already exists. Skipping adding Duck Group.");
                }
                else
                {
                    var newDuck = new DuckGroupInfo()
                    {
                        soundType    = groupName,
                        riseVolStart = grp.riseVolStart
                    };
                    _creator.musicDuckingSounds.Add(newDuck);
                }
            }

            switch (grp.busMode)
            {
            case DynamicSoundGroupInfo.BusMode.NoBus:
                break;

            case DynamicSoundGroupInfo.BusMode.UseExisting:
                var matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                    return(obj.busName == grp.busName);
                });

                if (matchBusIndex < 0)                           // bus doesn't exist in Dynamic SGC
                {
                    var newBus = new GroupBus()
                    {
                        busName    = grp.busName,
                        isExisting = true
                    };
                    _creator.groupBuses.Add(newBus);

                    matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                        return(obj.busName == grp.busName);
                    });
                }

                groupScript.busIndex = matchBusIndex + DynamicSoundGroupCreator.HardCodedBusOptions;
                groupScript.busName  = grp.busName;

                break;

            case DynamicSoundGroupInfo.BusMode.CreateNew:
                break;
            }

            groupScript.groupMasterVolume           = grp.groupMasterVolume;
            groupScript.retriggerPercentage         = grp.retriggerPercentage;
            groupScript.curVariationSequence        = grp.curVariationSequence;
            groupScript.useInactivePeriodPoolRefill = grp.useInactivePeriodPoolRefill;
            groupScript.inactivePeriodSeconds       = grp.inactivePeriodSeconds;
            groupScript.curVariationMode            = grp.curVariationMode;
            groupScript.limitMode          = grp.limitMode;
            groupScript.limitPerXFrames    = grp.limitPerXFrames;
            groupScript.minimumTimeBetween = grp.minimumTimeBetween;
            groupScript.limitPolyphony     = grp.limitPolyphony;
            groupScript.voiceLimitCount    = grp.voiceLimitCount;

            // make variations!
            for (var v = 0; v < grp.variations.Count; v++)
            {
                var aVar = grp.variations[v];

                var newVar  = (GameObject)GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity);
                var varName = string.Empty;

                switch (aVar.audLocation)
                {
                case MasterAudio.AudioLocation.Clip:
                    varName = string.IsNullOrEmpty(aVar.clipName) ? aVar.clip.name : aVar.clipName;
                    break;

                case MasterAudio.AudioLocation.ResourceFile:
                    varName = aVar.resourceFileName;
                    break;
                }

                newVar.transform.name   = varName;
                newVar.transform.parent = newGrp.transform;

                var varScript = newVar.GetComponent <DynamicGroupVariation>();

                varScript.audLocation = aVar.audLocation;

                switch (aVar.audLocation)
                {
                case MasterAudio.AudioLocation.Clip:
                    varScript.audio.clip = aVar.clip;
                    break;

                case MasterAudio.AudioLocation.ResourceFile:
                    varScript.resourceFileName = aVar.resourceFileName;
                    break;
                }

                varScript.weight       = aVar.weight;
                varScript.audio.volume = aVar.volume;
                varScript.audio.pitch  = aVar.pitch;
                varScript.audio.loop   = aVar.loopClip;
                varScript.randomPitch  = aVar.randomPitch;
                varScript.randomVolume = aVar.randomVolume;
                varScript.useFades     = aVar.useFades;
                varScript.fadeInTime   = aVar.fadeInTime;
                varScript.fadeOutTime  = aVar.fadeOutTime;

                varScript.audio.rolloffMode  = aVar.audRollOffMode;
                varScript.audio.minDistance  = aVar.audMinDistance;
                varScript.audio.maxDistance  = aVar.audMaxDistance;
                varScript.audio.dopplerLevel = aVar.audDopplerLevel;
                varScript.audio.spread       = aVar.audSpread;
                varScript.audio.panLevel     = aVar.audPanLevel;
            }
        }

        _creator.soundGroupsToCreate.Clear();
        DTGUIHelper.ShowAlert("Dynamic Sound Group Creator data upgraded successfully!");
    }
    private void UpgradeData()
    {
        if (_creator.groupTemplate == null) {
            GUIHelper.ShowAlert("Your 'Group Template' field is empty, please assign it in debug mode. Drag the 'DynamicSoundGroup' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled.");
            return;
        }

        if (_creator.variationTemplate == null) {
            GUIHelper.ShowAlert("Your 'Variation Template' field is empty, please assign it in debug mode. Drag the 'DynamicGroupVariation' prefab from MasterAudio/Sources/Prefabs into that field, then switch back to normal mode. Upgrade data cancelled");
            return;
        }

        for (var g = 0; g < _creator.soundGroupsToCreate.Count; g++) {
            var grp = _creator.soundGroupsToCreate[g];
            var groupName = grp.groupName;

            var match = _groups.FindAll(delegate(DynamicSoundGroup obj) {
                return obj.name == groupName;
            });
            if (match.Count > 0) {
                Debug.LogWarning("Dynamic Sound Group '" + groupName + "' already exists. Please rename one of them.");
            }

            var newGrp = (GameObject) GameObject.Instantiate(_creator.groupTemplate, _creator.transform.position, Quaternion.identity);
            newGrp.transform.name = groupName;
            newGrp.transform.parent = _creator.transform;

            var groupScript = newGrp.GetComponent<DynamicSoundGroup>();

            if (grp.duckSound) {
                var duckMatch = _creator.musicDuckingSounds.FindAll(delegate(DuckGroupInfo obj) {
                    return obj.soundType == groupName;
                });

                if (duckMatch.Count > 0) {
                    Debug.LogWarning("Dynamic Duck Setting for Sound Group '" + groupName + "' already exists. Skipping adding Duck Group.");
                } else {
                    var newDuck = new DuckGroupInfo() {
                        soundType = groupName,
                        riseVolStart = grp.riseVolStart
                    };
                    _creator.musicDuckingSounds.Add(newDuck);
                }
            }

            switch (grp.busMode) {
                case DynamicSoundGroupInfo.BusMode.NoBus:
                    break;
                case DynamicSoundGroupInfo.BusMode.UseExisting:
                    var matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                        return obj.busName == grp.busName;
                    });

                    if (matchBusIndex < 0) { // bus doesn't exist in Dynamic SGC
                        var newBus = new GroupBus() {
                            busName = grp.busName,
                            isExisting = true
                        };
                        _creator.groupBuses.Add(newBus);

                        matchBusIndex = _creator.groupBuses.FindIndex(delegate(GroupBus obj) {
                            return obj.busName == grp.busName;
                        });
                    }

                    groupScript.busIndex = matchBusIndex + DynamicSoundGroupCreator.HardCodedBusOptions;
                    groupScript.busName = grp.busName;

                    break;
                case DynamicSoundGroupInfo.BusMode.CreateNew:
                    break;
            }

            groupScript.groupMasterVolume = grp.groupMasterVolume;
            groupScript.retriggerPercentage = grp.retriggerPercentage;
            groupScript.curVariationSequence = grp.curVariationSequence;
            groupScript.useInactivePeriodPoolRefill = grp.useInactivePeriodPoolRefill;
            groupScript.inactivePeriodSeconds = grp.inactivePeriodSeconds;
            groupScript.curVariationMode = grp.curVariationMode;
            groupScript.limitMode = grp.limitMode;
            groupScript.limitPerXFrames = grp.limitPerXFrames;
            groupScript.minimumTimeBetween = grp.minimumTimeBetween;
            groupScript.limitPolyphony = grp.limitPolyphony;
            groupScript.voiceLimitCount = grp.voiceLimitCount;

            // make variations!
            for (var v = 0; v < grp.variations.Count; v++) {
                var aVar = grp.variations[v];

                var newVar = (GameObject) GameObject.Instantiate(_creator.variationTemplate, _creator.transform.position, Quaternion.identity);
                var varName = string.Empty;

                switch (aVar.audLocation) {
                    case MasterAudio.AudioLocation.Clip:
                        varName = string.IsNullOrEmpty(aVar.clipName) ? aVar.clip.name : aVar.clipName;
                        break;
                    case MasterAudio.AudioLocation.ResourceFile:
                        varName = aVar.resourceFileName;
                        break;
                }

                newVar.transform.name = varName;
                newVar.transform.parent = newGrp.transform;

                var varScript = newVar.GetComponent<DynamicGroupVariation>();

                varScript.audLocation = aVar.audLocation;

                switch (aVar.audLocation) {
                    case MasterAudio.AudioLocation.Clip:
                        varScript.audio.clip = aVar.clip;
                        break;
                    case MasterAudio.AudioLocation.ResourceFile:
                        varScript.resourceFileName = aVar.resourceFileName;
                        break;
                }

                varScript.weight = aVar.weight;
                varScript.audio.volume = aVar.volume;
                varScript.audio.pitch = aVar.pitch;
                varScript.audio.loop = aVar.loopClip;
                varScript.randomPitch = aVar.randomPitch;
                varScript.randomVolume = aVar.randomVolume;
                varScript.useFades = aVar.useFades;
                varScript.fadeInTime = aVar.fadeInTime;
                varScript.fadeOutTime = aVar.fadeOutTime;

                varScript.audio.rolloffMode = aVar.audRollOffMode;
                varScript.audio.minDistance = aVar.audMinDistance;
                varScript.audio.maxDistance = aVar.audMaxDistance;
                varScript.audio.dopplerLevel = aVar.audDopplerLevel;
                varScript.audio.spread = aVar.audSpread;
                varScript.audio.panLevel = aVar.audPanLevel;
            }
        }

        _creator.soundGroupsToCreate.Clear();
        GUIHelper.ShowAlert("Dynamic Sound Group Creator data upgraded successfully!");
    }