public Attributes2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
            : base(arrangementFileName, arrangement, info, platform)
        {
            #region VARIABLES

            var dlcName = info.Name.ToLower();

            var xblockUrn    = String.Format(URN_TEMPLATE_SHORT, TagValue.EmergentWorld.GetDescription(), dlcName);
            var showlightUrn = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format("{0}_showlights", dlcName));
            var songXmlUrn   = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));
            var songSngUrn   = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.MusicgameSong.GetDescription(), String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));

            var manifestFunctions = new ManifestFunctions(platform.version);

            #endregion

            #region FILL ATTRIBUTES

            ArrangementSort = arrangement.ArrangementSort;
            BlockAsset      = xblockUrn;
            manifestFunctions.GenerateDynamicVisualDensity(this, song2014, arrangement, GameVersion.RS2014);//2.0 constant for vocs in RS2
            FullName           = String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, info.Name, arrangement.ArrangementName);
            MasterID_PS3       = (IsVocal) ? -1 : arrangement.MasterId;
            MasterID_XBox360   = (IsVocal) ? -1 : arrangement.MasterId;
            PreviewBankPath    = String.Format("song_{0}_preview.bnk", info.Name.ToLower());
            RelativeDifficulty = 0; //Always 0 in RS2014
            ShowlightsXML      = showlightUrn;
            SongAsset          = songSngUrn;
            SongBank           = String.Format("song_{0}.bnk", info.Name.ToLower());
            SongEvent          = String.Format("Play_{0}", info.Name);
            SongXml            = songXmlUrn;
            SongVolume         = info.Volume;
            PreviewVolume      = info.PreviewVolume ?? SongVolume;

            // Only for Vocal
            if (IsVocal)
            {
                InputEvent = "Play_Tone_Standard_Mic";
                return;
            }

            // Only for instruments
            ArrangementProperties            = song2014.ArrangementProperties;
            ArrangementProperties.BassPick   = (int)arrangement.PluckedType;
            ArrangementProperties.PathLead   = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Lead);
            ArrangementProperties.PathRhythm = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Rhythm);
            ArrangementProperties.PathBass   = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Bass);
            ArrangementProperties.RouteMask  = (int)arrangement.RouteMask;
            // Automatically set as two finger style if pick is not used
            ArrangementProperties.TwoFingerPicking = ArrangementProperties.PathBass == 1 && ArrangementProperties.BassPick == 0 ? 1 : 0;

            // TODO: monitor this change
            // EOF now properly sets the bonus/represent elements
            ArrangementProperties.Represent = Convert.ToInt32(arrangement.Represent);
            ArrangementProperties.BonusArr  = Convert.ToInt32(arrangement.BonusArr);

            // Metronome
            ArrangementProperties.Metronome = (int)arrangement.Metronome;

            if (arrangement.ArrangementName == Sng.ArrangementName.Combo)
            { //Exclusive condition
                if (arrangement.RouteMask == DLCPackage.RouteMask.Lead)
                {
                    ArrangementType = (int)Sng.ArrangementName.Lead;
                }
                else if (arrangement.RouteMask == DLCPackage.RouteMask.Rhythm)
                {
                    ArrangementType = (int)Sng.ArrangementName.Rhythm;
                }
                else
                {
                    ArrangementType = (int)arrangement.ArrangementName;
                }
            }
            else
            {
                ArrangementType = (int)arrangement.ArrangementName;
            }

            LastConversionDateTime = song2014.LastConversionDateTime;
            MaxPhraseDifficulty    = manifestFunctions.GetMaxDifficulty(song2014);

            TargetScore      = 100000;
            PhraseIterations = new List <PhraseIteration>();
            manifestFunctions.GeneratePhraseIterationsData(this, song2014, platform.version);
            //Score_MaxNotes -- Generated on function above
            //Score_PNV      -- Generated on function above

            Phrases = new List <Phrase>();
            manifestFunctions.GeneratePhraseData(this, song2014);

            Sections = new List <Section>();
            manifestFunctions.GenerateSectionData(this, song2014);

            SongAverageTempo = song2014.AverageTempo;
            SongOffset       = -song2014.StartBeat; //arrangement.Sng2014.Metadata.StartTime * -1;

            //SongPartition  -- Generated in DLCPackageCreator after this constructor

            ChordTemplates = new List <ChordTemplate>();
            manifestFunctions.GenerateChordTemplateData(this, song2014);

            //Chords TODO: create me
            try
            {
                // Commented out to check if this is cause of repeating chord display in game
                manifestFunctions.GenerateChords(this, song2014);
            }
            catch (Exception ex)
            {
                Console.WriteLine("GenerateChords: " + ex.Message);
            }

            //Techniques TODO: improve me
            // not source of 100% bug
            try
            {
                manifestFunctions.GenerateTechniques(this, song2014);
            }
            catch (Exception ex)
            {
                Console.WriteLine("GenerateTechniques: " + ex.Message);
            }

            //Fix for Dead tones
            var it = info.TonesRS2014;
            Tones            = new List <Tone2014>();
            Tone_A           = GetToneName(arrangement.ToneA, it);
            Tone_B           = GetToneName(arrangement.ToneB, it);
            Tone_Base        = GetToneName(arrangement.ToneBase, it);
            Tone_C           = GetToneName(arrangement.ToneC, it);
            Tone_D           = GetToneName(arrangement.ToneD, it);
            Tone_Multiplayer = GetToneName(arrangement.ToneMultiplayer, it);

            #endregion
        }
        public Attributes2014(string arrangementFileName, Arrangement arrangement, DLCPackageData info, Platform platform)
            : base(arrangementFileName, arrangement, info, platform)
        {
            #region VARIABLES

            var dlcName = info.Name.ToLower();

            var xblockUrn    = String.Format(URN_TEMPLATE_SHORT, TagValue.EmergentWorld.GetDescription(), dlcName);
            var showlightUrn = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format("{0}_showlights", dlcName));
            var songXmlUrn   = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.XML.GetDescription(), String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));
            var songSngUrn   = String.Format(URN_TEMPLATE, TagValue.Application.GetDescription(), TagValue.MusicgameSong.GetDescription(), String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, dlcName, arrangementFileName));

            var manifestFunctions = new ManifestFunctions(platform.version);

            #endregion

            #region FILL ATTRIBUTES

            ArrangementSort = arrangement.ArrangementSort;
            BlockAsset      = xblockUrn;
            manifestFunctions.GenerateDynamicVisualDensity(this, SongContent, arrangement, GameVersion.RS2014);//2.0 constant for vocs in RS2
            FullName           = String.Format(AggregateGraph2014.AggregateGraph2014.NAME_ARRANGEMENT, info.Name, arrangement.Name);
            MasterID_PS3       = (IsVocal) ? -1 : arrangement.MasterId;
            MasterID_XBox360   = (IsVocal) ? -1 : arrangement.MasterId;
            PreviewBankPath    = String.Format("song_{0}_preview.bnk", info.Name.ToLower());
            RelativeDifficulty = 0; //Always 0 in RS2014
            ShowlightsXML      = showlightUrn;
            SongAsset          = songSngUrn;
            SongBank           = String.Format("song_{0}.bnk", info.Name.ToLower());
            SongEvent          = String.Format("Play_{0}", info.Name);
            SongXml            = songXmlUrn;
            SongVolume         = info.Volume;
            PreviewVolume      = info.PreviewVolume ?? SongVolume;

            // Only for Vocal
            if (IsVocal)
            {
                InputEvent = "Play_Tone_Standard_Mic";
            }

            // Only for instruments
            if (!IsVocal)
            {
                ArrangementProperties            = SongContent.ArrangementProperties;
                ArrangementProperties.BassPick   = (int)arrangement.PluckedType;
                ArrangementProperties.PathLead   = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Lead);
                ArrangementProperties.PathRhythm = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Rhythm);
                ArrangementProperties.PathBass   = Convert.ToInt32(arrangement.RouteMask == DLCPackage.RouteMask.Bass);
                ArrangementProperties.RouteMask  = (int)arrangement.RouteMask;

                // BONUS ARRANGEMENT
                ArrangementProperties.BonusArr = Convert.ToInt32(arrangement.BonusArr);

                // Metronome
                ArrangementProperties.Metronome = (int)arrangement.Metronome;

                if (arrangement.Name == Sng.ArrangementName.Combo)
                { //Exclusive condition
                    if (arrangement.RouteMask == DLCPackage.RouteMask.Lead)
                    {
                        ArrangementType = (int)Sng.ArrangementName.Lead;
                    }
                    else if (arrangement.RouteMask == DLCPackage.RouteMask.Rhythm)
                    {
                        ArrangementType = (int)Sng.ArrangementName.Rhythm;
                    }
                    else
                    {
                        ArrangementType = (int)arrangement.Name;
                    }
                }
                else
                {
                    ArrangementType = (int)arrangement.Name;
                }

                //Chords        -- //TODO: MISSING GENERATE

                ChordTemplates = new List <ChordTemplate>();
                manifestFunctions.GenerateChordTemplateData(this, SongContent);

                LastConversionDateTime = SongContent.LastConversionDateTime;
                MaxPhraseDifficulty    = manifestFunctions.GetMaxDifficulty(SongContent);

                TargetScore      = 100000;
                PhraseIterations = new List <PhraseIteration>();
                manifestFunctions.GeneratePhraseIterationsData(this, SongContent, platform.version);
                //Score_MaxNotes -- Generated on function above
                //Score_PNV      -- Generated on function above

                Phrases = new List <Phrase>();
                manifestFunctions.GeneratePhraseData(this, SongContent);

                Sections = new List <Section>();
                manifestFunctions.GenerateSectionData(this, SongContent);

                SongAverageTempo = SongContent.AverageTempo;
                SongOffset       = arrangement.Sng2014.Metadata.StartTime * -1;

                //SongPartition  -- Generated in DLCPackageCreator after this constructor

                //Techniques TODO: improove me
                try
                {
                    manifestFunctions.GenerateTechniques(this, SongContent);
                }
                catch { }

                //Fix for Dead tones
                var it = info.TonesRS2014;
                Tones            = new List <Tone2014>();
                Tone_A           = GetToneName(arrangement.ToneA, it);
                Tone_B           = GetToneName(arrangement.ToneB, it);
                Tone_Base        = GetToneName(arrangement.ToneBase, it);
                Tone_C           = GetToneName(arrangement.ToneC, it);
                Tone_D           = GetToneName(arrangement.ToneD, it);
                Tone_Multiplayer = GetToneName(arrangement.ToneMultiplayer, it);
            }

            #endregion
        }