public static SongsDTA Create(Stream stream) { SongsDTA dta = new SongsDTA(); StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(28591)); while (!reader.EndOfStream) { string line = reader.ReadLine(); line = line.Trim(); if (line.StartsWith("(name \"")) { dta.Name = Regex.Match(line, Regex.Escape("(name \"") + "(?'name'.*?)\"").Groups["name"].Value; } else if (line.StartsWith("(artist")) { dta.Artist = Regex.Match(line, Regex.Escape("(artist \"") + "(?'artist'.*?)\"").Groups["artist"].Value; } else if (line.StartsWith("(master")) { dta.Master = Regex.Match(line, @"\(master (?'master'.*?)\)").Groups["master"].Value == "TRUE"; } else if (line.StartsWith("(genre")) { dta.Genre = Regex.Match(line, @"\(genre (?'genre'.*?)\)").Groups["genre"].Value; } else if (line.StartsWith("(vocal_gender")) { dta.Vocalist = Regex.Match(line, @"\(vocal_gender (?'gender'.*?)\)").Groups["gender"].Value; } else if (line.StartsWith("(year_released")) { dta.Year = ushort.Parse(Regex.Match(line, @"\(year_released (?'year'.*?)\)").Groups["year"].Value); } else if (line.StartsWith("(album_name")) { dta.Album = Regex.Match(line, Regex.Escape("(album_name \"") + "(?'album'.*?)\"").Groups["album"].Value; } else if (line.StartsWith("(album_track_number")) { dta.Track = ushort.Parse(Regex.Match(line, @"\(album_track_number (?'track'.*?)\)").Groups["track"].Value); } else if (line.StartsWith("(pack_name")) { dta.Pack = Regex.Match(line, Regex.Escape("(pack_name \"") + "(?'pack'.*?)\"").Groups["pack"].Value; } } return(dta); }
public static SongsDTA Create(DTB.NodeTree tree) { SongsDTA dta = new SongsDTA(); dta.BaseName = (tree.Nodes[0] as DTB.NodeString).Text; dta.Preview.Clear(); //dta.Song.Tracks.Clear(); dta.Song.DrumSolo.Clear(); dta.Song.DrumFreestyle.Clear(); dta.Song.Pans.Clear(); dta.Song.Vols.Clear(); dta.Song.Cores.Clear(); dta.Song.TracksCount.Clear(); List <DTB.Node> subtrees = tree.Nodes.FindAll(n => n is DTB.NodeTree); foreach (DTB.NodeTree subtree in subtrees) { switch ((subtree.Nodes[0] as DTB.NodeString).Text) { case "name": dta.Name = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "artist": dta.Artist = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "master": if (subtree.Nodes[1] is DTB.NodeString) { dta.Master = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE"; } else { dta.Master = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1; } break; case "context": dta.Context = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "song": case "song_coop": SongsDTA.SongInfo song = (subtree.Nodes[0] as DTB.NodeString).Text == "song" ? dta.Song : (dta.SongCoop = new SongInfo()); foreach (DTB.NodeTree n in subtree.Nodes.FindAll(n => n is DTB.NodeTree)) { switch ((n.Nodes[0] as DTB.NodeString).Text) { case "name": song.Name = (n.Nodes[1] as DTB.NodeString).Text; break; case "tracks_count": foreach (DTB.NodeInt32 i in (n.Nodes[1] as DTB.NodeTree).Nodes) { song.TracksCount.Add(i.Number); } break; case "tracks": if (n.Nodes[1] is DTB.NodeTree) { foreach (DTB.NodeTree t in (n.Nodes[1] as DTB.NodeTree).Nodes) { string name = (t.Nodes[0] as DTB.NodeString).Text; if (name == "rhythm") // GH2 hack { name = "bass"; } if (t.Nodes[1] is DTB.NodeInt32) { song.Tracks.Find(t2 => t2.Name == name).Tracks = new List <int>() { (t.Nodes[1] as DTB.NodeInt32).Number } } ; //dta.Song.Tracks.Add(new SongsDTA.SongTracks() { Name = name, Tracks = new List<int>() { (t.Nodes[1] as DTB.NodeInt32).Number } }); else { SongsDTA.SongTracks songtrack = song.Tracks.Find(t2 => t2.Name == name); //SongsDTA.SongTracks songtrack = new SongsDTA.SongTracks() { Name = name, Tracks = new List<int>() }; (t.Nodes[1] as DTB.NodeTree).Nodes.ForEach(l => { songtrack.Tracks.Add((l as DTB.NodeInt32).Number); }); //dta.Song.Tracks.Add(songtrack); } } } break; case "pans": foreach (DTB.Node nd in (n.Nodes[1] as DTB.NodeTree).Nodes) { if (nd is DTB.NodeFloat32) { song.Pans.Add((nd as DTB.NodeFloat32).Number); } else { song.Pans.Add((nd as DTB.NodeInt32).Number); } } break; case "vols": foreach (DTB.NodeFloat32 f in (n.Nodes[1] as DTB.NodeTree).Nodes) { song.Vols.Add(f.Number); } break; case "cores": foreach (DTB.NodeInt32 i in (n.Nodes[1] as DTB.NodeTree).Nodes) { song.Cores.Add(i.Number); } break; case "drum_solo": foreach (DTB.NodeString s in ((n.Nodes[1] as DTB.NodeTree).Nodes[1] as DTB.NodeTree).Nodes) { song.DrumSolo.Add(s.Text); } break; case "drum_freestyle": foreach (DTB.NodeString s in ((n.Nodes[1] as DTB.NodeTree).Nodes[1] as DTB.NodeTree).Nodes) { song.DrumFreestyle.Add(s.Text); } break; case "midi_file": song.MidiFile = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeString).Text; break; case "hopo_threshold": song.HopoThreshold = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number; break; } } ; break; case "tuning_offset": dta.TuningOffset = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "tuning_offset_cents": if (subtree.Nodes[1] is DTB.NodeInt32) { dta.TuningOffsetCents = (float)(subtree.Nodes[1] as DTB.NodeInt32).Number; } else { dta.TuningOffsetCents = (subtree.Nodes[1] as DTB.NodeFloat32).Number; } break; case "song_scroll_speed": dta.SongScrollSpeed = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "bank": dta.Bank = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "anim_tempo": if (subtree.Nodes[1] is DTB.NodeString) { //dta.AnimTempo = (subtree.Nodes[1] as DTB.NodeString).Text; dta.AnimTempo = 0x20; } else { dta.AnimTempo = (subtree.Nodes[1] as DTB.NodeInt32).Number; } break; case "preview": dta.Preview.Add((subtree.Nodes[1] as DTB.NodeInt32).Number); dta.Preview.Add((subtree.Nodes[2] as DTB.NodeInt32).Number); break; case "preview_clip": //dta.PreviewClip = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "rank": subtree.Nodes.FindAll(n => n is DTB.NodeTree).ForEach(n => { dta.Rank.Find(r => r.Name == ((n as DTB.NodeTree).Nodes[0] as DTB.NodeString).Text).Rank = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number; //dta.Rank.Add(new SongsDTA.Rankings() { // Name = ((n as DTB.NodeTree).Nodes[0] as DTB.NodeString).Text, // Rank = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number //}); }); break; case "genre": dta.Genre = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "decade": dta.Decade = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "vocal_gender": dta.Vocalist = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "video_venues": (subtree.Nodes[1] as DTB.NodeTree).Nodes.ForEach(n => { dta.VideoVenues.Add((n as DTB.NodeString).Text); }); break; case "song_practice_1": break; case "version": dta.Version = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "format": dta.Format = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "album_art": if (subtree.Nodes[1] is DTB.NodeInt32) { dta.AlbumArt = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1; } else { dta.AlbumArt = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE"; } break; case "downloaded": if (subtree.Nodes[1] is DTB.NodeInt32) { dta.Downloaded = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1; } else { dta.Downloaded = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE"; } break; case "exported": if (subtree.Nodes[1] is DTB.NodeInt32) { dta.Exported = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1; } else { dta.Exported = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE"; } break; case "year_released": dta.Year = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "album_name": dta.Album = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "album_track_number": dta.Track = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "pack_name": dta.Pack = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "base_points": dta.BasePoints = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "rating": dta.Rating = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "sub_genre": dta.SubGenre = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "song_id": dta.SongID = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "game_origin": dta.Origin = (subtree.Nodes[1] as DTB.NodeString).Text; break; case "ugc": dta.Ugc = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; case "song_length": dta.SongLength = (subtree.Nodes[1] as DTB.NodeInt32).Number; break; } } if (dta.SongScrollSpeed == 0) { dta.SongScrollSpeed = 2300; } if (dta.Song.HopoThreshold.HasValue && dta.Song.HopoThreshold == 0) { dta.Song.HopoThreshold = null; } return(dta); }