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); }
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); }
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); }
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(); }
public static ChartFormat Create(Stream stream) { return(Create(Midi.Create(Mid.Create(stream)))); }