Exemple #1
0
        public override ChartFormat DecodeChart(FormatData data, ProgressIndicator progress)
        {
            if (!data.HasStream(this, ChartFile))
            {
                throw new FormatException();
            }

            Stream stream = data.GetStream(this, ChartFile);
            Midi   midi   = Midi.Create(Mid.Create(stream));

            if (data.Song.Data.GetValue <bool>("RBChartExpertPlus"))
            {
                Midi.Track track = midi.GetTrack("PART DRUMS");
                if (track != null)
                {
                    foreach (Midi.NoteEvent note in track.Notes)
                    {
                        if (note.Note == 95)
                        {
                            note.Note = 96;
                        }
                    }
                }
            }
            ChartFormat chart = ChartFormat.Create(midi);

            data.CloseStream(stream);
            return(chart);
        }
Exemple #2
0
        public override ChartFormat DecodeChart(FormatData data, ProgressIndicator progress)
        {
            if (!data.HasStream(this, ChartFile))
            {
                throw new FormatException();
            }

            Stream stream = data.GetStream(this, ChartFile);
            Midi   midi   = Midi.Create(Mid.Create(stream));

            data.CloseStream(stream);

            ChartFormat chart = new ChartFormat(NoteChart.Create(midi));

            DecodeLeftHandAnimations(chart.Chart, midi);
            ChartFormatGH2.DecodeDrums(chart.Chart, midi, true);
            ChartFormatGH2.DecodeOverdrive(chart.Chart);

            ImportMap.ImportChart(data.Song, chart.Chart);

            return(chart);
        }
Exemple #3
0
        public override ChartFormat DecodeChart(FormatData data, ProgressIndicator progress)
        {
            if (!data.HasStream(this, ChartFile))
            {
                throw new FormatException();
            }

            Stream stream = data.GetStream(this, ChartFile);
            Midi   midi   = Midi.Create(Mid.Create(stream));

            data.CloseStream(stream);

            DecodeCoop(midi, data.Song.Data.GetValue <bool>("GH2ChartCoop"));

            ChartFormat chart = new ChartFormat(NoteChart.Create(midi));

            DecodeDrums(chart.Chart, midi, false);
            DecodeOverdrive(chart.Chart);

            ImportMap.ImportChart(data.Song, chart.Chart);

            return(chart);
        }
        public override bool AddSong(PlatformData data, SongData song, ProgressIndicator progress)
        {
            FormatData formatdata = new TemporaryFormatData(song, data);

            DirectoryNode dir = data.Session["songdir"] as DirectoryNode;

            int         delay      = 0;
            bool        eighthhopo = false;
            int         hopofreq   = -1;
            AudioFormat format     = new AudioFormat();
            FileNode    songini    = dir.Navigate("song.ini", false, true) as FileNode;

            if (songini != null)
            {
                Ini ini = Ini.Create(songini.Data);
                songini.Data.Close();
                string value = ini.GetValue("song", "name"); if (value != null)
                {
                    song.Name = value;
                }
                value = ini.GetValue("song", "artist"); if (value != null)
                {
                    song.Artist = value;
                }
                value = ini.GetValue("song", "album"); if (value != null)
                {
                    song.Album = value;
                }
                value = ini.GetValue("song", "genre"); if (value != null)
                {
                    song.Genre = value;
                }
                value = ini.GetValue("song", "year"); if (value != null)
                {
                    song.Year = int.Parse(value);
                }
                value = ini.GetValue("song", "version"); if (value != null)
                {
                    song.Version = int.Parse(value);
                }
                value = ini.GetValue("song", "delay"); if (value != null)
                {
                    delay = int.Parse(value);
                }
                value = ini.GetValue("song", "eighthnote_hopo"); if (value != null)
                {
                    eighthhopo = string.Compare(value, "true", true) == 0 ? true : false;
                }
                value = ini.GetValue("song", "hopofreq"); if (value != null)
                {
                    hopofreq = int.Parse(value);
                }
                value = ini.GetValue("song", "tags"); if (value != null)
                {
                    song.Master = string.Compare(value, "cover", true) == 0 ? false : true;
                }
                value = ini.GetValue("song", "icon"); if (value != null)
                {
                    song.Game = GetGameFromIcon(value);
                }
                value = ini.GetValue("song", "diff_band"); if (value != null)
                {
                    song.Difficulty[Instrument.Ambient] = ImportMap.GetBaseRank(Instrument.Ambient, int.Parse(value));
                }
                value = ini.GetValue("song", "diff_bass"); if (value != null)
                {
                    song.Difficulty[Instrument.Bass] = ImportMap.GetBaseRank(Instrument.Bass, int.Parse(value));
                }
                value = ini.GetValue("song", "diff_drums"); if (value != null)
                {
                    song.Difficulty[Instrument.Drums] = ImportMap.GetBaseRank(Instrument.Drums, int.Parse(value));
                }
                value = ini.GetValue("song", "diff_guitar"); if (value != null)
                {
                    song.Difficulty[Instrument.Guitar] = ImportMap.GetBaseRank(Instrument.Guitar, int.Parse(value));
                }
            }

            format.InitialOffset = -delay;

            FileNode album = dir.Navigate("album.png", false, true) as FileNode;

            if (album != null)
            {
                song.AlbumArt = new Bitmap(album.Data);
            }

            FileNode  chartfile = dir.Navigate("notes.mid", false, true) as FileNode;
            NoteChart chart     = null;

            if (chartfile != null)
            {
                ChartFormatRB.Instance.Create(formatdata, chartfile.Data, null, 0, null, null, 0, false, true);
                chart = NoteChart.Create(Midi.Create(Mid.Create(chartfile.Data)));
                chartfile.Data.Close();
            }

            if (chart != null && eighthhopo)
            {
                song.HopoThreshold = chart.Division.TicksPerBeat / 2 + 10;
            }
            else if (hopofreq >= 0)
            {
                // TODO: This
            }

            List <Stream> streams = new List <Stream>();

            foreach (Node node in dir)
            {
                FileNode file = node as FileNode;
                if (file == null)
                {
                    continue;
                }
                string extension = Path.GetExtension(file.Name).ToLower();
                if (extension != ".ogg")
                {
                    continue;
                }

                string            name       = Path.GetFileNameWithoutExtension(file.Name);
                Instrument        instrument = Platform.InstrumentFromString(name);
                RawkAudio.Decoder decoder    = new RawkAudio.Decoder(file.Data, RawkAudio.Decoder.AudioFormat.VorbisOgg);
                for (int i = 0; i < decoder.Channels; i++)
                {
                    format.Mappings.Add(new AudioFormat.Mapping(0, 0, instrument));
                }
                decoder.Dispose();
                file.Data.Close();

                streams.Add(file.Data);
            }
            format.AutoBalance();

            if (streams.Count > 0)
            {
                AudioFormatOgg.Instance.Create(formatdata, streams.ToArray(), format);
            }
            else if (chartfile == null)
            {
                return(false);
            }

            data.AddSong(formatdata);

            return(true);
        }
Exemple #5
0
        static void Main(string[] args)
        {
            string arkpath  = args[0];
            string songname = args[1];

            FileStream arkfile = new FileStream(arkpath, FileMode.Open, FileAccess.Read);

            Ark ark = new Ark(new EndianReader(arkfile, Endianness.LittleEndian));

            DirectoryNode songdir = ark.Root.Find("songs") as DirectoryNode;

            songdir = songdir.Find(songname) as DirectoryNode;

            Midi midi = Midi.Create(Mid.Create((songdir.Find(songname + "_g.mid") as FileNode).Data));

            Dictionary <InstrumentBank, Stream> banks = new Dictionary <InstrumentBank, Stream>();

            foreach (FileNode node in songdir.Files)
            {
                if (node.Name.EndsWith(".bnk"))
                {
                    InstrumentBank bank = InstrumentBank.Create(new EndianReader(node.Data, Endianness.LittleEndian));

                    FileNode nse = songdir.Find(Path.GetFileNameWithoutExtension(node.Name) + ".nse") as FileNode;

                    banks.Add(bank, nse.Data);
                }
            }

            int        tracknum = 0;
            FileStream outfile  = new FileStream(@"Z:\" + songname + "_" + midi.Tracks.Count.ToString() + ".raw", FileMode.Create, FileAccess.ReadWrite);
            //EndianReader writer = new EndianReader(outfile, Endianness.BigEndian);
            EndianReader writer = new EndianReader(new TemporaryStream(), Endianness.BigEndian);

            foreach (Midi.Track track in midi.Tracks)
            {
                List <Midi.Event> events = new List <Midi.Event>();
                events.AddRange(track.Banks.Cast <Midi.Event>());
                events.AddRange(track.Instruments.Cast <Midi.Event>());
                events.AddRange(track.Notes.Cast <Midi.Event>());

                InstrumentBank[]            bankids       = new InstrumentBank[0x10];
                InstrumentBank.Bank[]       subbankids    = new InstrumentBank.Bank[0x10];
                InstrumentBank.Instrument[] instrumentids = new InstrumentBank.Instrument[0x10];
                InstrumentBank.Sound[][]    soundids      = new InstrumentBank.Sound[0x10][];

                events.Sort(new SpecialEventComparer());

                foreach (Midi.ChannelEvent e in events.Cast <Midi.ChannelEvent>())
                {
                    Midi.BankEvent       banke       = e as Midi.BankEvent;
                    Midi.InstrumentEvent instrumente = e as Midi.InstrumentEvent;
                    Midi.NoteEvent       notee       = e as Midi.NoteEvent;

                    if (banke != null)
                    {
                        bankids[banke.Channel]    = banks.Select(b => b.Key).SingleOrDefault(b => b.Banks.SingleOrDefault(b2 => b2.ID == banke.Bank) != null);
                        subbankids[banke.Channel] = bankids[banke.Channel].Banks.SingleOrDefault(b => b.ID == banke.Bank);
                    }
                    else if (instrumente != null)
                    {
                        instrumentids[instrumente.Channel] = bankids[instrumente.Channel].Instruments.SingleOrDefault(i => i.ID == instrumente.Instrument);
                        int soundoffset = 0;
                        foreach (var instrument in bankids[instrumente.Channel].Instruments)
                        {
                            if (instrument == instrumentids[instrumente.Channel])
                            {
                                break;
                            }

                            soundoffset += instrument.Sounds;
                        }
                        soundids[instrumente.Channel] = bankids[instrumente.Channel].Sounds.Skip(soundoffset).Take(instrumentids[instrumente.Channel].Sounds).ToArray();
                    }
                    else
                    {
                        var bank = bankids[notee.Channel];
                        if (bank == null)
                        {
                            continue;
                        }

                        var instrument = instrumentids[notee.Channel];
                        if (instrument == null)
                        {
                            continue;                                                                 // Chart note, not audio-playable
                        }
                        var sound = soundids[notee.Channel].FirstOrDefault(s => s.ID0 == notee.Note); // Should be SingleOrDefault, but some duplicates use Sound.Unknown
                        if (sound == null)
                        {
                            continue;
                        }

                        ulong notetime = midi.GetTime(notee.Time);
                        long  sample   = (long)(notetime / 1000 * (uint)bank.Samples[sound.Sample].SampleRate / 1000);
                        long  duration = (long)((midi.GetTime(notee.Time + notee.Duration) - notetime) / 1000 * (uint)bank.Samples[sound.Sample].SampleRate / 1000);

                        short[] samples = bank.Decode(banks[bank], bank.Samples[sound.Sample]);

                        int volume = sound.Volume * notee.Velocity * instrument.Volume * subbankids[notee.Channel].Volume / 0x7F / 0x7F / 0x7F;
                        //int balance = ((int)sound.Balance - 0x40) * ((int)instrument.Balance - 0x40) / 0x40;
                        int balance = (int)sound.Balance - 0x40;
                        int lvolume = balance <= 0x00 ? 0x7F : 0x7F - balance * 2;
                        int rvolume = balance >= 0x00 ? 0x7F : 0x7F + balance * 2;

                        lvolume = lvolume * volume / 0x7F;
                        rvolume = rvolume * volume / 0x7F;

                        writer.Position = (sample * 2) * midi.Tracks.Count * 2 + tracknum * 2 * 2;
                        //writer.Position = (sample * 2) * midi.Tracks.Count + tracknum * 2;
                        duration = Math.Min(duration, samples.Length);
                        for (int i = 0; i < duration; i++)
                        {
                            //writer.Write(samples[i]);

                            if (lvolume > 1)
                            {
                                writer.Write((short)((int)samples[i] * lvolume / 0x7F));
                            }
                            else
                            {
                                writer.Position += 2;
                            }
                            if (rvolume > 1)
                            {
                                writer.Write((short)((int)samples[i] * rvolume / 0x7F));
                            }
                            else
                            {
                                writer.Position += 2;
                            }

                            writer.Position += 2 * (midi.Tracks.Count - 1) * 2;

                            //writer.Position += 2 * (midi.Tracks.Count - 1);
                        }
                    }
                }

                tracknum++;
                Console.WriteLine("Track: " + tracknum.ToString());
            }

            writer.Position = 0;
            Util.StreamCopy(outfile, writer.Base);

            outfile.Close();
            writer.Base.Close();

            arkfile.Close();
        }
Exemple #6
0
 public static ChartFormat Create(Stream stream)
 {
     return(Create(Midi.Create(Mid.Create(stream))));
 }