Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
        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();
            });
        }
Ejemplo n.º 3
0
        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();
            });
        }
Ejemplo n.º 4
0
        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();
            });
        }
Ejemplo n.º 5
0
        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();
        }
Ejemplo n.º 6
0
        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();
        }
Ejemplo n.º 7
0
        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();
                }
            });
        }
Ejemplo n.º 8
0
        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();
                }
            });
        }