Ejemplo n.º 1
0
        public static OJM Decode(string filename)
        {
            if (!File.Exists(filename))
            {
                return(null);
            }

            var ojm = new OJM();

            ojm.Filename = filename;
            var samples = new List <IChartSample>();

            if (OMCDecoder.Check(filename))
            {
                ojm.Format = OJM.FileFormat.OMC;
                var omc = OMCDecoder.Decode(filename);
                foreach (var sample in omc.WaveSamples)
                {
                    samples.Add(sample.Value);
                }

                foreach (var sample in omc.OggSamples)
                {
                    samples.Add(sample.Value);
                }
            }
            else if (M30Decoder.Check(filename))
            {
                ojm.Format = OJM.FileFormat.M30;
                var m30 = M30Decoder.Decode(filename);
                foreach (var sample in m30.Samples)
                {
                    samples.Add(sample.Value);
                }
            }
            else
            {
                throw new FormatException("Invalid OJM Format.");
            }

            ojm.Samples = samples.ToArray();
            return(ojm);
        }
Ejemplo n.º 2
0
        public override Chart Decode(int level)
        {
            var diff  = (OJN.Difficulty)level;
            var ojn   = OJNDecoder.Decode(Filename);
            var chart = new Chart(Filename)
            {
                Title    = ojn.Title,
                Artist   = ojn.Artist,
                Pattern  = ojn.Pattern,
                BPM      = ojn.BPM,
                Duration = TimeSpan.FromSeconds(ojn.Duration[diff]),

                ThumbnailData = ojn.Thumbnail,
                CoverArtData  = ojn.CoverArt
            };

            OnChartHeaderDecoded(Filename, chart);

            OJM ojm    = OJMDecoder.Decode(Filename.Replace(Path.GetFileName(Filename), ojn.OJMFileName));
            var events = ojn.GetEvents(diff);

            // Load OJM Samples and assign to events
            if (ojm != null)
            {
                ojn.OJM = ojm;
                foreach (var sample in ojm.Samples)
                {
                    var sampleEvents = Array.FindAll(events, (e) => {
                        var se = e as Event.Sound;
                        return(se != null && se.Id == sample.Id && se.Signature != Event.SignatureType.Release);
                    });

                    if (sampleEvents != null)
                    {
                        foreach (var ev in sampleEvents)
                        {
                            var sound = ev as Event.Sound;
                            sound.Name    = sample.Name;
                            sound.Payload = sample.Payload;

                            if (sound.Offset <= (192 / 4))
                            {
                                sound.Preload();
                            }
                        }

                        //bool bgm = sample.Id >= 1000;
                        //if (bgm)
                        //{
                        //    //var music = new Music(sample.Payload);
                        //    //var stream = new MemoryStream(sample.Payload);
                        //    foreach (var ev in sampleEvents)
                        //    {
                        //        var sound     = ev as Event.Sound;
                        //        sound.Name    = sample.Name;
                        //        sound.Payload = sample.Payload;
                        //        //sound.Sample  = new Music(stream);
                        //    }
                        //}
                        //else
                        //{
                        //    //var buffer = new SoundBuffer(sample.Payload);
                        //    foreach (var ev in sampleEvents)
                        //    {
                        //        var sound     = ev as Event.Sound;
                        //        sound.Name    = sample.Name;
                        //        sound.Payload = sample.Payload;
                        //        //sound.Sample  = new Sound(buffer);
                        //    }
                        //}
                    }
                }
            }

            chart.Events = events;
            return(chart);
        }