private void MenuSongsCreate_Click(object sender, EventArgs e) { SongData song = new SongData(Storage); FormatData data = new TemporaryFormatData(song, Storage); if (EditForm.Show(data, true, true, this) != DialogResult.Cancel) { Progress.QueueTask(progress => { progress.NewTask("Installing \"" + data.Song.Name + "\" locally", 2); FormatData localdata = PlatformLocalStorage.Instance.CreateSong(Storage, data.Song); data.SaveTo(localdata); data.Dispose(); progress.Progress(); PlatformLocalStorage.Instance.SaveSong(Storage, localdata, progress); progress.Progress(); UpdateSongList(); progress.EndTask(); }); } else { data.Dispose(); } }
private static void QueueExportFoF(string path, FormatData data) { Program.Form.Progress.QueueTask(progress => { progress.NewTask("Installing \"" + data.Song.Name + "\" to Frets on Fire", 1); FormatData source = data; Program.Form.TaskMutex.WaitOne(); bool local = data.PlatformData.Platform == PlatformLocalStorage.Instance; bool ownformat = false; if (!local && Configuration.MaxConcurrentTasks > 1) { source = new TemporaryFormatData(data.Song, data.PlatformData); data.SaveTo(source); ownformat = true; } Program.Form.TaskMutex.ReleaseMutex(); PlatformData platformdata = new PlatformData(PlatformFretsOnFire.Instance, Game.Unknown); platformdata.Session["path"] = path; PlatformFretsOnFire.Instance.SaveSong(platformdata, data, progress); progress.Progress(); if (ownformat) { source.Dispose(); } progress.EndTask(); }); }
private void QueueInstallLocal(FormatData data) { Progress.QueueTask(progress => { progress.NewTask("Ripping \"" + data.Song.Name + "\" locally", 16); FormatData destination = PlatformLocalStorage.Instance.CreateSong(Storage, data.Song); progress.SetNextWeight(14); try { bool audio = false; if (Configuration.LocalTranscode && !data.Formats.Contains(AudioFormatRB2Mogg.Instance) && !data.Formats.Contains(AudioFormatRB2Bink.Instance)) { TaskMutex.WaitOne(); TemporaryFormatData olddata = new TemporaryFormatData(data.Song, data.PlatformData); data.SaveTo(olddata, FormatType.Audio); data.SaveTo(olddata, FormatType.Metadata); TaskMutex.ReleaseMutex(); audio = true; try { Platform.Transcode(FormatType.Audio, olddata, new IFormat[] { AudioFormatRB2Mogg.Instance }, destination, progress); } catch (UnsupportedTranscodeException exception) { Exceptions.Warning(exception, "Transcoding audio from " + data.Song.Name + " to Rock Band 2 format failed."); } olddata.Dispose(); } progress.Progress(14); TaskMutex.WaitOne(); if (!audio) { data.SaveTo(destination); } else { data.SaveTo(destination, FormatType.Chart); data.SaveTo(destination, FormatType.Metadata); } TaskMutex.ReleaseMutex(); progress.Progress(); PlatformLocalStorage.Instance.SaveSong(Storage, destination, progress); } catch (Exception ex) { PlatformLocalStorage.Instance.DeleteSong(Storage, destination, progress); throw new Exception("An error occurred when installing " + data.Song.Name + " locally.", ex); } progress.Progress(); UpdateSongList(); progress.EndTask(); }); }
private void QueueInstallSD(FormatData data) { Progress.QueueTask(progress => { progress.NewTask("Installing \"" + data.Song.Name + "\" to SD", 10); FormatData source = data; TaskMutex.WaitOne(); bool local = data.PlatformData.Platform == PlatformLocalStorage.Instance; bool ownformat = false; if (!local && Configuration.MaxConcurrentTasks > 1) { source = new TemporaryFormatData(data.Song, data.PlatformData); data.SaveTo(source); ownformat = true; } TaskMutex.ReleaseMutex(); progress.Progress(); FormatData dest = source; progress.SetNextWeight(10); if (!source.Formats.Contains(AudioFormatRB2Mogg.Instance) && !source.Formats.Contains(AudioFormatRB2Bink.Instance)) { if (local && !ownformat) { dest = new TemporaryFormatData(source.Song, source.PlatformData); source.SaveTo(dest, FormatType.Chart); source.SaveTo(dest, FormatType.Metadata); ownformat = true; } Platform.Transcode(FormatType.Audio, source, new IFormat[] { AudioFormatRB2Mogg.Instance }, dest, progress); } progress.Progress(10); progress.SetNextWeight(3); PlatformRB2WiiCustomDLC.Instance.SaveSong(SD, dest, progress); progress.Progress(3); if (ownformat) { dest.Dispose(); } UpdateSongList(); progress.EndTask(); }); }
private void ReplaceAudioButton_Click(object sender, EventArgs e) { OpenDialog.Multiselect = true; OpenDialog.Title = "Select audio files"; OpenDialog.Filter = "Common Audio Files|*.ogg;*.wav;*.flac;*.mp3;*.aiff;*.ac3|All Files|*"; if (OpenDialog.ShowDialog(this) == DialogResult.Cancel) { return; } bool allogg = true; using (DelayedStreamCache cache = new DelayedStreamCache()) { FormatData data = new TemporaryFormatData(); AudioFormat format = new AudioFormat(); List <string> names = new List <string>(); Stream[] streams = new Stream[OpenDialog.FileNames.Length]; for (int i = 0; i < streams.Length; i++) { string filename = OpenDialog.FileNames[i]; streams[i] = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); cache.AddStream(streams[i]); IDecoder decoder; if (new EndianReader(streams[i], Endianness.BigEndian).ReadUInt32() != OggMagic) { allogg = false; streams[i].Position = 0; decoder = new FFmpegDecoder(streams[i]); } else { decoder = new RawkAudio.Decoder(streams[i], RawkAudio.Decoder.AudioFormat.VorbisOgg); } for (int k = 0; k < decoder.Channels; k++) { names.Add(Path.GetFileName(filename) + " [Channel #" + (k + 1).ToString("0") + "]"); float balance = 0; if (decoder.Channels == 2) { balance = k == 0 ? -1 : 1; } format.Mappings.Add(new AudioFormat.Mapping(0, balance, Platform.InstrumentFromString(Path.GetFileNameWithoutExtension(filename)))); } decoder.Dispose(); streams[i].Position = 0; } if (AudioForm.Show(format, names.ToArray(), this) == DialogResult.Cancel) { return; } foreach (IFormat audioformat in Data.GetFormats(FormatType.Audio)) { foreach (string audiostream in Data.GetStreamNames(audioformat)) { Data.DeleteStream(audiostream); } } if (allogg) { AudioFormatOgg.Instance.Create(data, streams, format); } else { AudioFormatFFmpeg.Instance.Create(data, streams, format); } data.SaveTo(Data); } UpdateAudioSizes(); }
private void ReplaceChartButton_Click(object sender, EventArgs e) { OpenDialog.Multiselect = false; OpenDialog.Title = "Select a note chart file"; OpenDialog.Filter = "Supported Files (*.mid, *.chart)|*.mid;*.chart|All Files|*"; if (OpenDialog.ShowDialog(this) == DialogResult.Cancel) { return; } Stream stream = new FileStream(OpenDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read); Mid mid = Mid.Create(stream); stream.Position = 0; Chart chart = mid == null?Chart.Create(stream) : null; if (mid == null && chart == null) { stream.Close(); throw new FormatException(); } List <IChartFormat> formats = new List <IChartFormat>(); if (mid != null) { formats.Add(ChartFormatRB.Instance); formats.Add(ChartFormatGH2.Instance); } if (chart != null) { formats.Add(ChartFormatChart.Instance); } ChartForm.ShowResult result = ChartForm.Show(formats, this); if (result.Result == DialogResult.Cancel) { return; } if (mid != null || chart != null) { foreach (IFormat format in Data.GetFormats(FormatType.Chart)) { foreach (string chartstream in Data.GetStreamNames(format)) { Data.DeleteStream(chartstream); } } } Stream milo = null; Stream pan = null; Stream weights = null; FormatData data = new TemporaryFormatData(Data.Song); if (result.Format == ChartFormatRB.Instance) { if (result.Milo.HasValue()) { milo = new FileStream(result.Milo, FileMode.Open, FileAccess.Read, FileShare.Read); } if (result.Weights.HasValue()) { weights = new FileStream(result.Weights, FileMode.Open, FileAccess.Read, FileShare.Read); } if (result.Pan.HasValue()) { pan = new FileStream(result.Pan, FileMode.Open, FileAccess.Read, FileShare.Read); } ChartFormatRB.Instance.Create(data, stream, pan, weights, milo, result.ExpertPlus, result.FixForQuickplay, Song.Game); } else if (result.Format == ChartFormatGH2.Instance) { ChartFormatGH2.Instance.Create(data, stream, result.Coop); } else if (result.Format == ChartFormatChart.Instance) { ChartFormatChart.Instance.Create(data, stream, result.Coop); } data.SaveTo(Data); stream.Close(); if (milo != null) { milo.Close(); } if (pan != null) { pan.Close(); } if (weights != null) { weights.Close(); } UpdateChartSizes(); }
internal static void Export360(string path, FormatData original) { Program.Form.Progress.QueueTask(progress => { progress.NewTask("Exporting to 360 DLC file", 16); SongData song = original.Song; StfsArchive stfs = new StfsArchive(); stfs.Stfs.ContentType = StfsFile.ContentTypes.Marketplace; stfs.Stfs.TitleID = 0x45410829; for (int i = 0; i < stfs.Stfs.DisplayName.Length; i++) { stfs.Stfs.DisplayName[i] = song.Artist + " - " + song.Name; } for (int i = 0; i < stfs.Stfs.DisplayDescription.Length; i++) { stfs.Stfs.DisplayDescription[i] = "RawkSD DLC - http://rawksd.japaneatahand.com"; } stfs.Stfs.TitleName = "Rawk Band 2"; stfs.Stfs.Publisher = "RawkSD"; stfs.Stfs.TitleThumbnail = WiiImage.Create(new EndianReader(new MemoryStream(ConsoleHaxx.RawkSD.Properties.Resources.rawksd_albumart), Endianness.LittleEndian)).Bitmap; if (song.AlbumArt != null) { stfs.Stfs.Thumbnail = song.AlbumArt; } else { stfs.Stfs.Thumbnail = stfs.Stfs.TitleThumbnail; } StfsFile.SignedHeader header = new StfsFile.SignedHeader(StfsFile.FileTypes.LIVE); stfs.Stfs.Header = header; header.Licenses[0].ID = 0xFFFFFFFFFFFFFFFF; stfs.Stfs.MetadataVersion = 2; StfsFile.PackageDescriptor desc = new StfsFile.PackageDescriptor(); stfs.Stfs.Descriptor = desc; desc.StructSize = 0x24; desc.BlockSeparation = 1; desc.FileTableBlockCount = 0x100; // byte apparently stfs.Stfs.TransferFlags = 0xC0; 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(); Stream songs = null; Stream audio = null; Stream chart = data.GetStream(ChartFormatRB.Instance, ChartFormatRB.ChartFile); Stream pan = data.GetStream(ChartFormatRB.Instance, ChartFormatRB.PanFile); Stream weights = data.GetStream(ChartFormatRB.Instance, ChartFormatRB.WeightsFile); Stream milo = data.GetStream(ChartFormatRB.Instance, ChartFormatRB.MiloFile); milo = new MemoryStream(Properties.Resources.rbn_milo); // TODO: properly convert milo if (milo == null) { milo = new MemoryStream(ConsoleHaxx.RawkSD.Properties.Resources.rawksd_milo); } 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(song, audioformat, false); dta.AlbumArt = false; dta.Song.Name = "songs/" + song.ID + "/" + song.ID; dta.Song.MidiFile = "songs/" + song.ID + "/" + song.ID + ".mid"; dta.Rating = 4; dta.SubGenre = "subgenre_core"; dta.Format = 4; //dta.SongID = 0; dta.Origin = "rb2"; //dta.Ugc = 1; //dta.SongLength = 300000; dta.Context = 2000; dta.BasePoints = 0; if (!dta.TuningOffsetCents.HasValue) { dta.TuningOffsetCents = 0; } audio = new TemporaryStream(); cache.AddStream(audio); progress.Progress(); progress.SetNextWeight(10); long samples = audioformat.Decoder.Samples; CryptedMoggStream mogg = new CryptedMoggStream(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(); 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; } songs = new TemporaryStream(); cache.AddStream(songs); dta.ToDTB().SaveDTA(songs); ChartFormat chartformat = (data.GetFormat(FormatType.Chart) as IChartFormat).DecodeChart(data, progress); if (chart != null && ChartFormatRB.Instance.NeedsFixing(data)) { data.CloseStream(chart); chart = null; } if (chart == null) { chart = new TemporaryStream(); cache.AddStream(chart); PlatformRB2WiiCustomDLC.AdjustChart(song, audioformat, chartformat).ToMidi().ToMid().Save(chart); chart.Position = 0; } if (weights == null) { weights = new TemporaryStream(); cache.AddStream(weights); PlatformRB2WiiCustomDLC.CreateWeights(weights, chartformat); weights.Position = 0; } if (pan == null) { pan = new TemporaryStream(); cache.AddStream(pan); PlatformRB2WiiCustomDLC.CreatePan(pan, chartformat); pan.Position = 0; } progress.Progress(3); DirectoryNode dir = new DirectoryNode("songs"); stfs.Root.AddChild(dir); dir.AddChild(new FileNode("songs.dta", songs)); DirectoryNode songdir = new DirectoryNode(song.ID); dir.AddChild(songdir); songdir.AddChild(new FileNode(song.ID + ".mogg", audio)); songdir.AddChild(new FileNode(song.ID + ".mid", chart)); DirectoryNode gendir = new DirectoryNode("gen"); songdir.AddChild(gendir); gendir.AddChild(new FileNode(song.ID + ".milo_xbox", milo)); gendir.AddChild(new FileNode(song.ID + "_weights.bin", weights)); Stream ostream = new FileStream(path, FileMode.Create); stfs.Save(ostream); ostream.Close(); data.CloseStream(audio); data.CloseStream(chart); data.CloseStream(pan); data.CloseStream(weights); data.CloseStream(milo); if (ownformat) { data.Dispose(); } progress.Progress(); progress.EndTask(); } }); }
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(); } }); }