public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); data.Session["path"] = path; if (Directory.Exists(path)) { Exceptions.Error("An RBN archive must be a file."); } if (File.Exists(path)) { try { RBA rba = new RBA(new EndianReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read), Endianness.LittleEndian)); data.Session["rba"] = rba; SongData song = HarmonixMetadata.GetSongData(data, DTA.Create(rba.Data)); song.ID = ImportMap.GetShortName(song.Name); AddSong(data, song, progress); } catch (Exception exception) { Exceptions.Error(exception, "An error occurred while opening the RBN archive."); } } return(data); }
static void PlatformDetection_DetectFile(string path, Stream stream, List <Pair <Engine, Game> > platforms) { try { stream.Position = 0; RBA rba = new RBA(new EndianReader(stream, Endianness.LittleEndian)); platforms.Add(new Pair <Engine, Game>(Instance, Game.Unknown)); } catch { } }
public override bool AddSong(PlatformData data, SongData song, ProgressIndicator progress) { FormatData formatdata = new TemporaryFormatData(song, data); RBA rba = data.Session["rba"] as RBA; AudioFormat audio = HarmonixMetadata.GetAudioFormat(song); AudioFormatMogg.Instance.Create(formatdata, rba.Audio, audio); ChartFormatRB.Instance.Create(formatdata, rba.Chart, null, 0, rba.Weights, rba.Milo, ChartFormatRB.Milo3Version, false, false); //song.AlbumArt = XboxImage.Create(new EndianReader(albumfile.Data, Endianness.LittleEndian)).Bitmap; data.AddSong(formatdata); return(true); }
public static void ExportRBN(string path, FormatData original) { Program.Form.Progress.QueueTask(progress => { progress.NewTask("Exporting to RBA file", 16); RBA rba = new RBA(); FormatData data = original; Program.Form.TaskMutex.WaitOne(); bool local = data.PlatformData.Platform == PlatformLocalStorage.Instance; bool ownformat = false; if (!local && Configuration.MaxConcurrentTasks > 1) { data = new TemporaryFormatData(data.Song, data.PlatformData); original.SaveTo(data); ownformat = true; } Program.Form.TaskMutex.ReleaseMutex(); using (DelayedStreamCache cache = new DelayedStreamCache()) { AudioFormat audioformat = (data.GetFormat(FormatType.Audio) as IAudioFormat).DecodeAudio(data, progress); ushort[] masks = PlatformRB2WiiCustomDLC.RemixAudioTracks(data.Song, audioformat); progress.Progress(); // RBN Required DTA settings SongsDTA dta = PlatformRB2WiiCustomDLC.GetSongsDTA(data.Song, audioformat, false); dta.AlbumArt = true; dta.BaseName = "song"; dta.Song.Name = "songs/" + dta.BaseName + "/" + dta.BaseName; dta.Song.MidiFile = "songs/" + dta.BaseName + "/" + dta.BaseName + ".mid"; dta.Rating = 4; dta.Genre = "rock"; dta.SubGenre = "subgenre_rock"; dta.Format = 4; dta.SongID = 0; dta.Origin = "rb2"; dta.Ugc = 1; dta.SongLength = 300000; dta.Preview[0] = 0; dta.Preview[1] = 30000; dta.Context = 2000; dta.BasePoints = 0; if (!dta.TuningOffsetCents.HasValue) { dta.TuningOffsetCents = 0; } rba.Audio = new TemporaryStream(); cache.AddStream(rba.Audio); progress.Progress(); progress.SetNextWeight(10); long samples = audioformat.Decoder.Samples; CryptedMoggStream mogg = new CryptedMoggStream(rba.Audio); mogg.WriteHeader(); RawkAudio.Encoder encoder = new RawkAudio.Encoder(mogg, audioformat.Mappings.Count, audioformat.Decoder.SampleRate); progress.NewTask("Transcoding Audio", samples); JaggedShortArray buffer = new JaggedShortArray(encoder.Channels, audioformat.Decoder.AudioBuffer.Rank2); AudioFormat.ProcessOffset(audioformat.Decoder, encoder, audioformat.InitialOffset); while (samples > 0) { int read = audioformat.Decoder.Read((int)Math.Min(samples, audioformat.Decoder.AudioBuffer.Rank2)); if (read <= 0) { break; } audioformat.Decoder.AudioBuffer.DownmixTo(buffer, masks, read); encoder.Write(buffer, read); samples -= read; progress.Progress(read); } progress.EndTask(); progress.Progress(10); encoder.Dispose(); audioformat.Decoder.Dispose(); rba.Audio.Position = 0; dta.Song.TracksCount.Add(audioformat.Mappings.Count(m => m.Instrument == Instrument.Drums)); dta.Song.TracksCount.Add(audioformat.Mappings.Count(m => m.Instrument == Instrument.Bass)); dta.Song.TracksCount.Add(audioformat.Mappings.Count(m => m.Instrument == Instrument.Guitar)); dta.Song.TracksCount.Add(audioformat.Mappings.Count(m => m.Instrument == Instrument.Vocals)); dta.Song.TracksCount.Add(audioformat.Mappings.Count(m => m.Instrument == Instrument.Ambient)); for (int i = 0; i < dta.Song.Cores.Count; i++) { dta.Song.Cores[i] = -1; } rba.Data = new TemporaryStream(); cache.AddStream(rba.Data); dta.Save(rba.Data); Stream stream = new MemoryStream(Properties.Resources.rbn_metadata); rba.Metadata = stream; stream = new MemoryStream(Properties.Resources.rbn_album); rba.AlbumArt = stream; stream = new MemoryStream(Properties.Resources.rbn_milo); rba.Milo = stream; stream = new MemoryStream(Properties.Resources.rbn_weights); rba.Weights = stream; if (data.Formats.Contains(ChartFormatRB.Instance) && !ChartFormatRB.Instance.NeedsFixing(data)) { rba.Chart = data.GetStream(ChartFormatRB.Instance, ChartFormatRB.ChartFile); } else { IChartFormat chartformat = data.GetFormat(FormatType.Chart) as IChartFormat; NoteChart chart = PlatformRB2WiiCustomDLC.AdjustChart(data.Song, audioformat, chartformat.DecodeChart(data, progress)); rba.Chart = new TemporaryStream(); cache.AddStream(rba.Chart); chart.ToMidi().ToMid().Save(rba.Chart); } progress.Progress(3); rba.Strings.Add(((char)0x02).ToString()); rba.Strings.Add(((char)0x22).ToString()); rba.Strings.Add((char)0x02 + "090923"); rba.Strings.Add("090923"); rba.Strings.Add(string.Empty); rba.Strings.Add(string.Empty); rba.Strings.Add((char)0x02 + "090923"); rba.Strings.Add("s/rawk/a"); Stream ostream = new FileStream(path, FileMode.Create); rba.Save(ostream); ostream.Close(); data.CloseStream(rba.Chart); if (ownformat) { data.Dispose(); } progress.Progress(); progress.EndTask(); } }); }