public static DLCSong ConvertDLCSong(DataArray songDta, GameArchives.IDirectory songRoot) { var path = songDta.Array("song").Array("name").String(1); var hopoThreshold = songDta.Array("song").Array("hopo_threshold")?.Int(1) ?? 170; var shortname = path.Split('/').Last(); var midPath = shortname + ".mid"; var artPath = $"gen/{shortname}_keep.png_xbox"; var miloPath = $"gen/{shortname}.milo_xbox"; var songId = songDta.Array("song_id").Node(1); var name = songDta.Array("name").String(1); var artist = songDta.Array("artist").String(1); var mid = MidiCS.MidiFileReader.FromBytes(songRoot.GetFileAtPath(midPath).GetBytes()); // TODO: Catch possible conversion exceptions? i.e. Unsupported milo version var milo = MiloFile.ReadFromStream(songRoot.GetFileAtPath(miloPath).GetStream()); var songData = SongDataConverter.ToSongData(songDta); Texture.Texture artwork = null; if (songData.AlbumArt) { artwork = Texture.TextureConverter.MiloPngToTexture(songRoot.GetFileAtPath(artPath).GetStream()); } return(new DLCSong { SongData = songData, Lipsync = LipsyncConverter.FromMilo(milo), Mogg = songRoot.GetFile(shortname + ".mogg"), MoggDta = MakeMoggDta(songDta), MoggSong = DTX.FromDtaString($"(mogg_path \"{shortname}.mogg\")\r\n(midi_path \"{shortname}.rbmid\")\r\n"), RBMidi = RBMidConverter.ToRBMid(mid, hopoThreshold), Artwork = artwork, RBSong = MakeRBSong(songDta) }); }