public override ChartFormat DecodeChart(FormatData data, ProgressIndicator progress) { IList <Stream> streams = GetChartStreams(data); float bpm = 0; NoteChart chart = new NoteChart(); chart.BPM.Add(new Midi.TempoEvent(0, (uint)(Mid.MicrosecondsPerMinute / bpm))); chart.Signature.Add(new Midi.TimeSignatureEvent(0, 4, 2, 24, 8)); Mub mub = null; // TODO: Determine charts by filenames or some shit chart.PartGuitar = new NoteChart.Guitar(chart); NoteChart.Instrument instrument = chart.PartGuitar; NoteChart.IGems gems = instrument as NoteChart.IGems; NoteChart.IForcedHopo hopo = instrument as NoteChart.IForcedHopo; NoteChart.Difficulty difficulty = NoteChart.Difficulty.Expert; int fadeposition = 0; foreach (Mub.Node node in mub.Nodes) { ulong time = (ulong)(node.Time * chart.Division.TicksPerBeat / 4); ulong duration = (ulong)(node.Duration * chart.Division.TicksPerBeat / 4); NoteChart.Note fullnote = new NoteChart.Note(time, duration); NoteChart.Note note = new NoteChart.Note(time, chart.Division.TicksPerBeat / 4U); NoteChart.Note prevnote = new NoteChart.Note(time - chart.Division.TicksPerBeat / 2U, chart.Division.TicksPerBeat / 4U); int greennote = fadeposition < 0 ? 0 : 1; int bluenote = fadeposition > 0 ? 4 : 3; switch (node.Type) { case 0x00: // Green dot gems.Gems[difficulty][greennote].Add(note); hopo.ForceHammeron[difficulty].Add(note); break; case 0x01: // Blue dot gems.Gems[difficulty][bluenote].Add(note); hopo.ForceHammeron[difficulty].Add(note); break; case 0x02: // Red dot gems.Gems[difficulty][2].Add(note); hopo.ForceHammeron[difficulty].Add(note); break; case 0x09: // Blue Crossfade right fadeposition = 1; gems.Gems[difficulty][4].Add(note); gems.Gems[difficulty][fadeposition < 0 ? 0 : 3].Add(prevnote); hopo.ForceHammeron[difficulty].Add(note); break; case 0x0A: // Green Crossfade left (revert to rightish normal) fadeposition = 0; break; case 0x0B: // Green Crossfade left fadeposition = -1; gems.Gems[difficulty][0].Add(note); gems.Gems[difficulty][fadeposition > 0 ? 4 : 1].Add(prevnote); hopo.ForceHammeron[difficulty].Add(note); break; case 0x0C: // Weird whammy thing on left green gems.Gems[difficulty][greennote].Add(fullnote); hopo.ForceHammeron[difficulty].Add(note); break; case 0x0D: // ?? Not sure, Weird whammy thing on right blue maybe gems.Gems[difficulty][bluenote].Add(fullnote); hopo.ForceHammeron[difficulty].Add(note); break; default: break; } } return(new ChartFormat(chart)); }
public override void EncodeAudio(AudioFormat data, FormatData destination, ProgressIndicator progress) { throw new NotImplementedException(); }
public override bool AddSong(PlatformData data, SongData song, ProgressIndicator progress) { string albumname = null; switch (song.ID) { case "dontholdback": albumname = "TheSleepingQuestionsAndAnswers"; break; case "minuscelsius": albumname = "BackyardBabiesStockholmSyndrome"; break; case "thrufireandflames": albumname = "DragonforceInhumanRampage"; break; case "fcpremix": albumname = "FallofTroyDoppelganger"; break; case "avalancha": albumname = "HeroesDelSilencioAvalancha"; break; case "takethislife": albumname = "InFlamesComeClarity"; break; case "ruby": albumname = "KaiserChiefsYoursTrulyAngry_Mob"; break; case "mycurse": albumname = "KillswitchEngageAsDaylightDies"; break; case "closer": albumname = "LacunaCoilKarmaCode"; break; case "metalheavylady": albumname = "LionsLions"; break; case "mauvaisgarcon": albumname = "NaastAntichambre"; break; case "generationrock": albumname = "RevolverheldRevolverheld"; break; case "prayeroftherefugee": albumname = "RiseAgainstTheSuffererAndTheWitness"; break; case "cantbesaved": albumname = "SensesFailStillSearching"; break; case "shebangsadrum": albumname = "StoneRosesStoneRoses"; break; case "radiosong": albumname = "SuperbusPopnGum"; break; case "bellyofashark": albumname = "TheGallowsOrchestraofWoles"; break; case "gothatfar": albumname = "BretMichealsBandGoThatFar"; break; case "impulse": albumname = "endlesssporadic"; break; case "thewayitends": albumname = "prototype_continuum_cover"; break; case "nothingformehere": albumname = "Dope_PosterCover_edsel"; break; case "inlove": albumname = "store_song_ScoutsStSebastian"; break; } if (albumname != null) { if (data.Session.ContainsKey("albumpak")) { Pak albumpak = data.Session["albumpak"] as Pak; Pak.Node node = albumpak.Nodes.Find(n => n.FilenamePakKey == QbKey.Create(albumname).Crc); if (node != null) { song.AlbumArt = NgcImage.Create(new EndianReader(node.Data, Endianness.BigEndian)).Bitmap; } } } DirectoryNode dir = data.Session["rootdir"] as DirectoryNode; Pak qb = data.Session["rootqb"] as Pak; FileNode chartpak = dir.Navigate("songs/" + song.ID + ".pak.ngc", false, true) as FileNode; if (chartpak == null) { return(false); } chartpak.Data.Position = 0; Pak chartqb = new Pak(new EndianReader(chartpak.Data, Endianness.BigEndian)); FileNode sectionfile = chartqb.Root.Find(song.ID + ".mid_text.qb.ngc", SearchOption.AllDirectories, true) as FileNode; if (sectionfile == null) // GHA stores it elsewhere { sectionfile = qb.Root.Find(song.ID + ".mid_text.qb.ngc", SearchOption.AllDirectories, true) as FileNode; } if (sectionfile == null) // Last resort, check for it raw on the disc partition { sectionfile = dir.Find(song.ID + ".mid_text.qb.ngc", SearchOption.AllDirectories, true) as FileNode; } for (int coop = 0; coop < 2; coop++) { if (coop == 1) { song = new SongData(song); song.ID += "_coop"; song.Name += " [coop]"; } FormatData formatdata = new TemporaryFormatData(song, data); FileNode datfile = dir.Navigate("music/" + song.ID + ".dat.ngc", false, true) as FileNode; FileNode wadfile = dir.Navigate("music/" + song.ID + ".wad.ngc", false, true) as FileNode; if (datfile == null || wadfile == null) { continue; } AudioFormatGH3WiiFSB.Instance.Create(formatdata, datfile.Data, wadfile.Data); ChartFormatGH3.Instance.Create(formatdata, chartpak.Data, sectionfile.Data, coop == 1); data.AddSong(formatdata); } chartpak.Data.Close(); return(true); }
public static void Transcode(IFormat format, FormatData data, IFormat target, FormatData destination, ProgressIndicator progress) { if (target.CanRemux(format)) { target.Remux(format, data, destination, progress); } else if (target.Writable && format.Readable) { TranscodeOnly(format, data, target, destination, progress); } else { throw new NotSupportedException(); } }
public static void Transfer(IFormat format, FormatData data, FormatData destination, ProgressIndicator progress) { string[] streams = data.GetStreamNames(); progress.NewTask(streams.Length); foreach (string fullname in streams) { if (fullname.StartsWith(format.ID + ".")) { string name = fullname.Split(new char[] { '.' }, 2)[1]; Stream ostream = destination.AddStream(format, name); Stream istream = data.GetStream(format, name); Util.StreamCopy(ostream, istream); destination.CloseStream(ostream); data.CloseStream(istream); progress.Progress(); } } progress.EndTask(); }
public abstract bool AddSong(PlatformData data, SongData song, ProgressIndicator progress);
public virtual void DeleteSong(PlatformData data, FormatData formatdata, ProgressIndicator progress) { data.Mutex.WaitOne(); formatdata.Dispose(); data.RemoveSong(formatdata); data.Mutex.ReleaseMutex(); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); DirectoryNode maindir = DirectoryNode.FromPath(path, data.Cache, FileAccess.Read); char[] regions = new char[] { 'E', 'P' }; DirectoryNode dir = maindir.Navigate("private/wii/data", false, true) as DirectoryNode; if (dir == null) dir = maindir; for (char letter = 'A'; letter <= 'Z'; letter++) { foreach (char region in regions) { DirectoryNode subdir = dir.Find("SZ" + letter + region, true) as DirectoryNode; if (subdir == null) continue; foreach (FileNode file in subdir.Files) { if (String.Compare(Path.GetExtension(file.Name), ".bin", true) != 0) continue; try { file.Data.Position = 0; DlcBin bin = new DlcBin(file.Data); U8 u8; try { u8 = new U8(bin.Data); } catch (FormatException) { file.Data.Close(); continue; } FileNode songsdta = u8.Root.Find("songs.dta", SearchOption.AllDirectories) as FileNode; if (songsdta == null) { file.Data.Close(); continue; } DTB.NodeTree dtb = DTA.Create(songsdta.Data); SongsDTA dta = SongsDTA.Create(dtb); file.Data.Close(); SongData song = HarmonixMetadata.GetSongData(data, dtb); string contentbin = dta.Song.Name.Substring(9, 3); // Example, "dlc/sZAE/023/content/songs/simpleman/simpleman" FileNode contentfile = subdir.Find(contentbin + ".bin", true) as FileNode; if (contentfile == null) continue; FormatData formatdata = new TemporaryFormatData(song, data); Create(formatdata, file.Data, contentfile.Data); data.AddSong(formatdata); contentfile.Data.Close(); } catch (FormatException) { } // Not a DLC bin we care about } } } return data; }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); Ark ark = data.GetHarmonixArk(path); data.Game = Platform.DetermineGame(data); if (data.Game == Game.RockBand2 || data.Game == Game.RockBandBeatles) { Exceptions.Error("Unable to parse song list from Rock Band Wii disc."); } data.Session["songdir"] = ark.Root; string[] songdirs = new string[] { "songs", "songs_regional/na", "songs_regional/eu" }; progress.NewTask(songdirs.Length); foreach (string songdirname in songdirs) { DirectoryNode songdir = ark.Root.Navigate(songdirname) as DirectoryNode; if (songdir == null) { continue; } FileNode songsdtbfile = songdir.Navigate("gen/songs.dtb") as FileNode; if (songsdtbfile == null) { continue; } try { List <SongsDTA> dtas = new List <SongsDTA>(); DTB.NodeTree dtb = DTB.Create(new EndianReader(new CryptedDtbStream(new EndianReader(songsdtbfile.Data, Endianness.LittleEndian)), Endianness.LittleEndian)); progress.NewTask(dtb.Nodes.Count); foreach (DTB.Node node in dtb.Nodes) { DTB.NodeTree tree = node as DTB.NodeTree; if (tree == null || tree.Nodes[0].Type != 0x00000005 || songdir.Find((tree.Nodes[0] as DTB.NodeString).Text) == null) { progress.Progress(); continue; } SongsDTA dta = SongsDTA.Create(tree); if (dtas.Find(d => d.BaseName == dta.BaseName) != null) { progress.Progress(); continue; // Don't import songs twice } dtas.Add(dta); try { SongData song = HarmonixMetadata.GetSongData(data, tree); AddSong(data, song, progress); } catch (Exception exception) { Exceptions.Warning(exception, "Could not import " + dta.Name + " from the Rock Band Wii disc."); } progress.Progress(); } } catch (Exception exception) { Exceptions.Warning(exception, "Unable to parse song list from Rock Band Wii disc: " + songdirname); } progress.EndTask(); progress.Progress(); } progress.EndTask(); return(data); }
public object Decode(FormatData data, ProgressIndicator progress) { throw new NotImplementedException(); }
public void Encode(object data, FormatData destination, ProgressIndicator progress) { throw new NotImplementedException(); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); DirectoryNode dir = data.GetDirectoryStructure(path); data.Game = Platform.DetermineGame(data); try { FileNode qbpak = dir.Navigate("pak/qb.pak.ngc") as FileNode; if (qbpak == null) { throw new FormatException("Couldn't find qb.pak on Guitar Hero Wii disc."); } FileNode qspak = dir.Navigate("pak/qs.pak.ngc") as FileNode; if (qspak == null) { throw new FormatException("Couldn't find qs.pak on Guitar Hero Wii disc."); } Pak qs = new Pak(new EndianReader(qspak.Data, Endianness.BigEndian)); StringList strings = new StringList(); foreach (Pak.Node node in qs.Nodes) { strings.ParseFromStream(node.Data); } Pak qb = new Pak(new EndianReader(qbpak.Data, Endianness.BigEndian)); FileNode songlistfile = qb.FindFile(@"scripts\guitar\songlist.qb.ngc"); if (songlistfile == null) { songlistfile = qb.FindFile(@"scripts\guitar\songlist.qb"); } if (songlistfile == null) { throw new FormatException("Couldn't find the songlist on the Guitar Hero Wii disc pak."); } QbFile songlist = new QbFile(songlistfile.Data, PakFormat); data.Session["rootdir"] = dir; List <QbKey> listkeys = new List <QbKey>(); foreach (uint songlistkey in NeversoftMetadata.SonglistKeys) { QbKey key = QbKey.Create(songlistkey); QbItemStruct list = songlist.FindItem(key, true) as QbItemStruct; if (list != null && list.Items.Count > 0) { listkeys.Add(key); } } progress.NewTask(listkeys.Count); List <string> songsadded = new List <string>(); foreach (QbKey songlistkey in listkeys) { QbItemStruct list = songlist.FindItem(songlistkey, true) as QbItemStruct; progress.NewTask(list.Items.Count); foreach (QbItemArray item in list.Items.OfType <QbItemArray>()) { item.Items[0].ItemQbKey = item.ItemQbKey; SongData song = NeversoftMetadata.GetSongData(data, item.Items[0] as QbItemStruct, strings); progress.Progress(); if (songsadded.Contains(song.ID)) { continue; } try { if (AddSong(data, song, progress)) { songsadded.Add(song.ID); } } catch (Exception exception) { Exceptions.Warning(exception, "Unable to properly parse " + song.Name); } } progress.EndTask(); progress.Progress(); } progress.EndTask(); qbpak.Data.Close(); qspak.Data.Close(); } catch (Exception exception) { Exceptions.Error(exception, "An error occurred while parsing the Guitar Hero Wii disc."); } return(data); }
public override void SaveSong(PlatformData data, FormatData formatdata, ProgressIndicator progress) { data.AddSong(formatdata); }
public override void Remux(IFormat format, FormatData data, FormatData destination, ProgressIndicator progress) { if (!(format is AudioFormatOgg)) { throw new FormatException(); } bool musttranscode = AudioFormatOgg.Instance.GetAudioStreams(data).Count > 1; if (musttranscode) // Remuxing isn't possible with more than one audio stream { Platform.TranscodeOnly(format, data, AudioFormatMogg.Instance, destination, progress); return; } Util.StreamCopy(destination.AddStream(this, FormatName), AudioFormatOgg.Instance.GetFormatStream(data)); CryptedMoggStream audio = new CryptedMoggStream(destination.AddStream(this, AudioName)); audio.WriteHeader(); Util.StreamCopy(audio, AudioFormatOgg.Instance.GetAudioStream(data)); destination.CloseStream(this, AudioName); destination.CloseStream(this, FormatName); }
public virtual void Remux(IFormat format, FormatData data, FormatData destination, ProgressIndicator progress) { throw new NotSupportedException(); }
public override bool AddSong(PlatformData data, SongData song, ProgressIndicator progress) { FormatData formatdata = new TemporaryFormatData(song, data); DirectoryNode songdir = data.Session["songdir"] as DirectoryNode; SongsDTA dta = HarmonixMetadata.GetSongsDTA(song); if (dta == null) // LRB's <addsong /> { dta = HarmonixMetadata.GetSongData(song); dta.Song.Cores = new List <int>() { -1, -1, -1, -1, -1, 1, 1, -1, -1 }; dta.Song.Vols = new List <float>() { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; dta.Song.Pans = new List <float>() { 0, 0, -1, 1, 0, -1, 1, 0, 0 }; dta.Song.Tracks.Find(t => t.Name == "drum").Tracks.AddRange(new int[] { 0, 1, 2, 3 }); dta.Song.Tracks.Find(t => t.Name == "bass").Tracks.AddRange(new int[] { 4 }); dta.Song.Tracks.Find(t => t.Name == "guitar").Tracks.AddRange(new int[] { 5, 6 }); dta.Song.Tracks.Find(t => t.Name == "vocals").Tracks.AddRange(new int[] { 7 }); dta.Song.Name = "songs/" + song.ID + "/" + song.ID; HarmonixMetadata.SetSongsDTA(song, dta.ToDTB()); } string dtaname = dta.Song.Name; if (dtaname.StartsWith("dlc")) { dtaname = dtaname.Split(new char[] { '/' }, 4)[3]; } int lastslash = dtaname.LastIndexOf('/'); string basename = dtaname.Substring(lastslash + 1); dtaname = dtaname.Substring(0, lastslash); DirectoryNode songnode = songdir.Navigate(dtaname) as DirectoryNode; if (songnode == null) { return(false); } FileNode songaudiofile = songnode.Navigate(basename + ".bik", false, true) as FileNode; AudioFormat audio = null; if (songaudiofile == null) { songaudiofile = songnode.Navigate(basename + ".mogg", false, true) as FileNode; if (songaudiofile == null) { return(false); } if (HarmonixMetadata.IsRockBand1(data.Game)) { audio = HarmonixMetadata.GetAudioFormat(song); audio.InitialOffset = 3000; } AudioFormatMogg.Instance.Create(formatdata, songaudiofile.Data, audio); } else { AudioFormatRB2Bink.Instance.Create(formatdata, songaudiofile.Data, null); } // TODO: SongInfo // TODO: Preview FileNode chartfile = songnode.Find(basename + ".mid") as FileNode; FileNode panfile = songnode.Find(basename + ".pan") as FileNode; FileNode weightsfile = songnode.Navigate("gen/" + basename + "_weights.bin") as FileNode; FileNode milofile = songnode.Navigate("gen/" + basename + ".milo_wii") as FileNode; FileNode albumfile = songnode.Navigate("gen/" + basename + "_keep.png_wii") as FileNode; if (chartfile == null) { return(false); } if (albumfile == null) { albumfile = songnode.Navigate("gen/" + basename + "_nomip_keep.bmp_wii") as FileNode; } if (albumfile != null) { song.AlbumArt = WiiImage.Create(new EndianReader(albumfile.Data, Endianness.LittleEndian)).Bitmap; albumfile.Data.Close(); } ChartFormatRB.Instance.Create(formatdata, chartfile == null ? null : chartfile.Data, panfile == null ? null : panfile.Data, weightsfile == null ? null : weightsfile.Data, milofile == null ? null : milofile.Data, false, false, data.Game); data.AddSong(formatdata); return(true); }
public abstract PlatformData Create(string path, Game game, ProgressIndicator progress);
public override bool AddSong(PlatformData data, SongData song, ProgressIndicator progress) { throw new NotImplementedException(); }
public virtual void SaveSong(PlatformData data, FormatData formatdata, ProgressIndicator progress) { throw new NotImplementedException(); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { throw new NotImplementedException(); }
public static void Transcode(FormatType type, FormatData data, IList <IFormat> targets, FormatData destination, ProgressIndicator progress) { foreach (IFormat format in targets) { if (format.HasFormat(data)) { Transfer(format, data, destination, progress); return; } } IList <IFormat> formats = FindTranscodePath(data.GetFormats(type), targets); if (formats.Count == 0) { throw new UnsupportedTranscodeException("Could not find a supported transcode path."); } if (formats.Count == 1) { if (formats[0].CanTransfer(data)) { Transfer(formats[0], data, destination, progress); return; } else { formats.Add(formats[0]); } } FormatData tempdata = null; if (formats.Count > 2) { tempdata = new TemporaryFormatData(); } progress.NewTask(formats.Count - 1); for (int i = 1; i < formats.Count; i++) { FormatData dest = i < formats.Count - 1 ? tempdata : destination; Transcode(formats[i - 1], data, formats[i], dest, progress); data = dest; progress.Progress(); } progress.EndTask(); }
public abstract AudioFormat DecodeAudio(FormatData data, ProgressIndicator progress);
public static void TranscodeOnly(IFormat format, FormatData data, IFormat target, FormatData destination, ProgressIndicator progress) { object decode = format.Decode(data, progress); target.Encode(decode, destination, progress); if (decode is IDisposable) { (decode as IDisposable).Dispose(); } }
public abstract void EncodeAudio(AudioFormat data, FormatData destination, ProgressIndicator progress);
public virtual object Decode(FormatData data, ProgressIndicator progress) { return(DecodeAudio(data, progress)); }
public abstract ChartFormat DecodeChart(FormatData data, ProgressIndicator progress);
public override void Remux(IFormat format, FormatData data, FormatData destination, ProgressIndicator progress) { throw new NotImplementedException(); }
public abstract void EncodeChart(ChartFormat data, FormatData destination, ProgressIndicator progress);
public override void SaveSong(PlatformData data, FormatData formatdata, ProgressIndicator progress) { string path = data.Session["path"] as string; SongData song = formatdata.Song; progress.NewTask(8); int i; string songpath = null; for (i = 0; i < 0x1000; i++) { songpath = Path.Combine(path, song.ID + (i == 0 ? "" : i.ToString())); if (!Directory.Exists(songpath)) { break; } } Directory.CreateDirectory(songpath); AudioFormat audio = (formatdata.GetFormat(FormatType.Audio) as IAudioFormat).DecodeAudio(formatdata, progress); progress.Progress(); ChartFormat chart = (formatdata.GetFormat(FormatType.Chart) as IChartFormat).DecodeChart(formatdata, progress); progress.Progress(); Stream chartstream = new FileStream(Path.Combine(songpath, "notes.mid"), FileMode.Create, FileAccess.Write); chart.Save(chartstream); chartstream.Close(); Ini ini = new Ini(); ini.SetValue("song", "name", song.Name); ini.SetValue("song", "artist", song.Artist); ini.SetValue("song", "album", song.Album); ini.SetValue("song", "genre", song.Genre); ini.SetValue("song", "year", song.Year.ToString()); ini.SetValue("song", "diff_band", ImportMap.GetBaseTier(Instrument.Ambient, song.Difficulty[Instrument.Ambient]).ToString()); ini.SetValue("song", "diff_guitar", ImportMap.GetBaseTier(Instrument.Guitar, song.Difficulty[Instrument.Guitar]).ToString()); ini.SetValue("song", "diff_bass", ImportMap.GetBaseTier(Instrument.Bass, song.Difficulty[Instrument.Bass]).ToString()); ini.SetValue("song", "diff_drums", ImportMap.GetBaseTier(Instrument.Drums, song.Difficulty[Instrument.Drums]).ToString()); Stream inistream = new FileStream(Path.Combine(songpath, "song.ini"), FileMode.Create, FileAccess.Write); ini.Save(inistream); inistream.Close(); if (song.AlbumArt != null) { Stream albumart = new FileStream(Path.Combine(songpath, "album.png"), FileMode.Create, FileAccess.Write); song.AlbumArt.Save(albumart, ImageFormat.Png); albumart.Close(); } JaggedShortArray encoderdata; var instruments = audio.Mappings.GroupBy(m => m.Instrument == Instrument.Vocals ? Instrument.Ambient : m.Instrument); encoderdata = new JaggedShortArray(2, RawkAudio.Decoder.BufferSize); int count = instruments.Count(); Stream[] streams = new Stream[count]; IEncoder[] encoders = new IEncoder[count]; ushort[][] masks = new ushort[count][]; i = 0; foreach (var item in instruments) { string filename = null; switch (item.Key) { case Instrument.Guitar: filename = "guitar.ogg"; break; case Instrument.Bass: filename = "rhythm.ogg"; break; case Instrument.Drums: filename = "drums.ogg"; break; case Instrument.Ambient: filename = "song.ogg"; break; case Instrument.Preview: filename = "preview.ogg"; break; } streams[i] = new FileStream(Path.Combine(songpath, filename), FileMode.Create, FileAccess.Write); masks[i] = new ushort[2]; foreach (var map in item) { int index = audio.Mappings.IndexOf(map); if (map.Balance <= 0) { masks[i][0] |= (ushort)(1 << index); } if (map.Balance >= 0) { masks[i][1] |= (ushort)(1 << index); } } encoders[i] = new RawkAudio.Encoder(streams[i], 2, audio.Decoder.SampleRate, 44100); i++; } if (audio.InitialOffset > 0) { AudioFormat.ProcessOffset(audio.Decoder, encoders[0], audio.InitialOffset); } else { for (i = 0; i < encoders.Length; i++) { AudioFormat.ProcessOffset(audio.Decoder, encoders[i], audio.InitialOffset); } } long samples = audio.Decoder.Samples; progress.NewTask("Transcoding Audio", samples, 6); while (samples > 0) { int read = audio.Decoder.Read(); if (read <= 0) { break; } // TODO: Apply volumes to each channel for (i = 0; i < count; i++) { audio.Decoder.AudioBuffer.DownmixTo(encoderdata, masks[i], read, false); encoders[i].Write(encoderdata, read); } samples -= read; progress.Progress(read); } for (i = 0; i < count; i++) { encoders[i].Dispose(); streams[i].Close(); } progress.EndTask(); progress.Progress(6); progress.EndTask(); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); DirectoryNode dir = data.GetDirectoryStructure(path); FileNode binfile = dir.Navigate("001.bin") as FileNode; if (binfile == null) { Exceptions.Error("Unable to open Guitar Hero World Tour DLC because 001.bin is missing."); } data.Session["rootdir"] = dir; try { DlcBin bin = new DlcBin(binfile.Data); U8 u8 = new U8(bin.Data); FileNode listfile = u8.Root.Navigate("DLC1.pak.ngc") as FileNode; Pak qb = new Pak(new EndianReader(listfile.Data, Endianness.BigEndian)); FileNode songlistfile = qb.Root.Find("catalog_info.qb.ngc", SearchOption.AllDirectories) as FileNode; QbFile songlist = new QbFile(songlistfile.Data, PakFormat); StringList strings = new StringList(); foreach (Pak.Node node in qb.Nodes) { if (!node.Filename.HasValue()) { strings.ParseFromStream(node.Data); } } List <QbKey> listkeys = new List <QbKey>(); foreach (uint songlistkey in NeversoftMetadata.SonglistKeys) { QbKey key = QbKey.Create(songlistkey); QbItemStruct list = songlist.FindItem(key, true) as QbItemStruct; if (list != null && list.Items.Count > 0) { listkeys.Add(key); } } Stream str = new FileStream(@"C:\ghwt.xml", FileMode.Create); StreamWriter writer = new StreamWriter(str); progress.NewTask(listkeys.Count); foreach (QbKey songlistkey in listkeys) { QbItemStruct list = songlist.FindItem(songlistkey, true) as QbItemStruct; progress.NewTask(list.Items.Count); foreach (QbItemArray item in list.Items.OfType <QbItemArray>()) { item.Items[0].ItemQbKey = item.ItemQbKey; SongData song = NeversoftMetadata.GetSongData(data, item.Items[0] as QbItemStruct, strings); writer.WriteLine("\t<song id=\"" + song.ID + "\">"); writer.WriteLine("\t\t<pack>Guitar Hero World Tour DLC</pack>"); writer.WriteLine("\t\t<nameprefix>[GHWT DLC]</nameprefix>"); writer.WriteLine("\t\t<name>" + song.Name + "</name>"); writer.WriteLine("\t\t<artist>" + song.Artist + "</artist>"); writer.WriteLine("\t\t<album>" + song.Album + "</album>"); writer.WriteLine("\t\t<genre>" + song.Genre + "</genre>"); writer.WriteLine("\t\t<track>" + song.AlbumTrack.ToString() + "</track>"); writer.WriteLine("\t\t<difficulty instrument=\"band\" rank=\"1\" />"); writer.WriteLine("\t\t<difficulty instrument=\"guitar\" rank=\"1\" />"); writer.WriteLine("\t\t<difficulty instrument=\"bass\" rank=\"1\" />"); writer.WriteLine("\t\t<difficulty instrument=\"drum\" rank=\"1\" />"); writer.WriteLine("\t\t<difficulty instrument=\"vocals\" rank=\"1\" />"); writer.WriteLine("\t</song>"); try { AddSong(data, song, progress); } catch (Exception exception) { Exceptions.Warning(exception, "Unable to properly parse " + song.Name); } progress.Progress(); } progress.EndTask(); progress.Progress(); } progress.EndTask(); writer.Close(); binfile.Data.Close(); } catch (Exception exception) { Exceptions.Error(exception, "An error occurred while parsing the Guitar Hero World Tour DLC list."); } return(data); }