Esempio n. 1
0
        public PlayableHitsound(MapAssetStore assetStore, SampleControlPoint samplePoint, List <SoundInfo> samples,
                                ISoundPool soundPool)
        {
            this.soundTable = assetStore.SoundTable;
            this.soundPool  = soundPool;

            hitsoundAudio.AddRange(ExtractAudio(assetStore, samples));

            volume = samplePoint.Volume;
        }
Esempio n. 2
0
        private void handleSampleControlPoint(SampleControlPoint newPoint)
        {
            var existing = beatmap.ControlPointInfo.SamplePointAt(newPoint.Time);

            if (newPoint.EquivalentTo(existing))
            {
                return;
            }

            beatmap.ControlPointInfo.SamplePoints.Add(newPoint);
        }
        /// <summary>
        /// Adds specified sample point to the beatmap.
        /// </summary>
        private void AddSamplePoint(SampleControlPoint point)
        {
            // Replace existing point if equal time.
            var existingPoint = map.ControlPoints.SamplePointAt(point.Time);

            if (point.IsEquivalentTo(existingPoint))
            {
                return;
            }
            if (existingPoint.Time == point.Time)
            {
                map.ControlPoints.SamplePoints.Remove(existingPoint);
            }

            map.ControlPoints.SamplePoints.Add(point);
        }
Esempio n. 4
0
        private void handleSampleControlPoint(SampleControlPoint newPoint)
        {
            var existing = beatmap.ControlPointInfo.SamplePointAt(newPoint.Time);

            if (existing.Time == newPoint.Time)
            {
                // autogenerated points should not replace non-autogenerated.
                // this allows for incorrectly ordered timing points to still be correctly handled.
                if (newPoint.AutoGenerated && !existing.AutoGenerated)
                {
                    return;
                }

                beatmap.ControlPointInfo.SamplePoints.Remove(existing);
            }

            beatmap.ControlPointInfo.SamplePoints.Add(newPoint);
        }
Esempio n. 5
0
        private void handleControlPoints(TextWriter writer)
        {
            if (beatmap.ControlPointInfo.Groups.Count == 0)
            {
                return;
            }

            var legacyControlPoints = new LegacyControlPointInfo();

            foreach (var point in beatmap.ControlPointInfo.AllControlPoints)
            {
                legacyControlPoints.Add(point.Time, point.DeepClone());
            }

            writer.WriteLine("[TimingPoints]");

            SampleControlPoint     lastRelevantSamplePoint     = null;
            DifficultyControlPoint lastRelevantDifficultyPoint = null;

            bool isOsuRuleset = beatmap.BeatmapInfo.RulesetID == 0;

            // iterate over hitobjects and pull out all required sample and difficulty changes
            extractDifficultyControlPoints(beatmap.HitObjects);
            extractSampleControlPoints(beatmap.HitObjects);

            // handle scroll speed, which is stored as "slider velocity" in legacy formats.
            // this is relevant for scrolling ruleset beatmaps.
            if (!isOsuRuleset)
            {
                foreach (var point in legacyControlPoints.EffectPoints)
                {
                    legacyControlPoints.Add(point.Time, new DifficultyControlPoint {
                        SliderVelocity = point.ScrollSpeed
                    });
                }
            }

            foreach (var group in legacyControlPoints.Groups)
            {
                var groupTimingPoint = group.ControlPoints.OfType <TimingControlPoint>().FirstOrDefault();

                // If the group contains a timing control point, it needs to be output separately.
                if (groupTimingPoint != null)
                {
                    writer.Write(FormattableString.Invariant($"{groupTimingPoint.Time},"));
                    writer.Write(FormattableString.Invariant($"{groupTimingPoint.BeatLength},"));
                    outputControlPointAt(groupTimingPoint.Time, true);
                }

                // Output any remaining effects as secondary non-timing control point.
                var difficultyPoint = legacyControlPoints.DifficultyPointAt(group.Time);
                writer.Write(FormattableString.Invariant($"{group.Time},"));
                writer.Write(FormattableString.Invariant($"{-100 / difficultyPoint.SliderVelocity},"));
                outputControlPointAt(group.Time, false);
            }

            void outputControlPointAt(double time, bool isTimingPoint)
            {
                var samplePoint = legacyControlPoints.SamplePointAt(time);
                var effectPoint = legacyControlPoints.EffectPointAt(time);

                // Apply the control point to a hit sample to uncover legacy properties (e.g. suffix)
                HitSampleInfo tempHitSample = samplePoint.ApplyTo(new ConvertHitObjectParser.LegacyHitSampleInfo(string.Empty));

                // Convert effect flags to the legacy format
                LegacyEffectFlags effectFlags = LegacyEffectFlags.None;

                if (effectPoint.KiaiMode)
                {
                    effectFlags |= LegacyEffectFlags.Kiai;
                }
                if (effectPoint.OmitFirstBarLine)
                {
                    effectFlags |= LegacyEffectFlags.OmitFirstBarLine;
                }

                writer.Write(FormattableString.Invariant($"{(int)legacyControlPoints.TimingPointAt(time).TimeSignature},"));
                writer.Write(FormattableString.Invariant($"{(int)toLegacySampleBank(tempHitSample.Bank)},"));
                writer.Write(FormattableString.Invariant($"{toLegacyCustomSampleBank(tempHitSample)},"));
                writer.Write(FormattableString.Invariant($"{tempHitSample.Volume},"));
                writer.Write(FormattableString.Invariant($"{(isTimingPoint ? '1' : '0')},"));
                writer.Write(FormattableString.Invariant($"{(int)effectFlags}"));
                writer.WriteLine();
            }

            IEnumerable <DifficultyControlPoint> collectDifficultyControlPoints(IEnumerable <HitObject> hitObjects)
            {
                if (!isOsuRuleset)
                {
                    yield break;
                }

                foreach (var hitObject in hitObjects)
                {
                    yield return(hitObject.DifficultyControlPoint);

                    foreach (var nested in collectDifficultyControlPoints(hitObject.NestedHitObjects))
                    {
                        yield return(nested);
                    }
                }
            }

            void extractDifficultyControlPoints(IEnumerable <HitObject> hitObjects)
            {
                foreach (var hDifficultyPoint in collectDifficultyControlPoints(hitObjects).OrderBy(dp => dp.Time))
                {
                    if (!hDifficultyPoint.IsRedundant(lastRelevantDifficultyPoint))
                    {
                        legacyControlPoints.Add(hDifficultyPoint.Time, hDifficultyPoint);
                        lastRelevantDifficultyPoint = hDifficultyPoint;
                    }
                }
            }

            IEnumerable <SampleControlPoint> collectSampleControlPoints(IEnumerable <HitObject> hitObjects)
            {
                foreach (var hitObject in hitObjects)
                {
                    yield return(hitObject.SampleControlPoint);

                    foreach (var nested in collectSampleControlPoints(hitObject.NestedHitObjects))
                    {
                        yield return(nested);
                    }
                }
            }

            void extractSampleControlPoints(IEnumerable <HitObject> hitObject)
            {
                foreach (var hSamplePoint in collectSampleControlPoints(hitObject).OrderBy(sp => sp.Time))
                {
                    if (!hSamplePoint.IsRedundant(lastRelevantSamplePoint))
                    {
                        legacyControlPoints.Add(hSamplePoint.Time, hSamplePoint);
                        lastRelevantSamplePoint = hSamplePoint;
                    }
                }
            }
        }
Esempio n. 6
0
        private void handleTimingPoint(string line)
        {
            try
            {
                string[] split = line.Split(',');

                double time            = getOffsetTime(double.Parse(split[0].Trim(), NumberFormatInfo.InvariantInfo));
                double beatLength      = double.Parse(split[1].Trim(), NumberFormatInfo.InvariantInfo);
                double speedMultiplier = beatLength < 0 ? 100.0 / -beatLength : 1;

                TimeSignatures timeSignature = TimeSignatures.SimpleQuadruple;
                if (split.Length >= 3)
                {
                    timeSignature = split[2][0] == '0' ? TimeSignatures.SimpleQuadruple : (TimeSignatures)int.Parse(split[2]);
                }

                LegacySampleBank sampleSet = defaultSampleBank;
                if (split.Length >= 4)
                {
                    sampleSet = (LegacySampleBank)int.Parse(split[3]);
                }

                //SampleBank sampleBank = SampleBank.Default;
                //if (split.Length >= 5)
                //    sampleBank = (SampleBank)int.Parse(split[4]);

                int sampleVolume = defaultSampleVolume;
                if (split.Length >= 6)
                {
                    sampleVolume = int.Parse(split[5]);
                }

                bool timingChange = true;
                if (split.Length >= 7)
                {
                    timingChange = split[6][0] == '1';
                }

                bool kiaiMode = false;
                bool omitFirstBarSignature = false;
                if (split.Length >= 8)
                {
                    int effectFlags = int.Parse(split[7]);
                    kiaiMode = (effectFlags & 1) > 0;
                    omitFirstBarSignature = (effectFlags & 8) > 0;
                }

                string stringSampleSet = sampleSet.ToString().ToLower();
                if (stringSampleSet == @"none")
                {
                    stringSampleSet = @"normal";
                }

                DifficultyControlPoint difficultyPoint = beatmap.ControlPointInfo.DifficultyPointAt(time);
                SampleControlPoint     samplePoint     = beatmap.ControlPointInfo.SamplePointAt(time);
                EffectControlPoint     effectPoint     = beatmap.ControlPointInfo.EffectPointAt(time);

                if (timingChange)
                {
                    beatmap.ControlPointInfo.TimingPoints.Add(new TimingControlPoint
                    {
                        Time          = time,
                        BeatLength    = beatLength,
                        TimeSignature = timeSignature
                    });
                }

                if (speedMultiplier != difficultyPoint.SpeedMultiplier)
                {
                    beatmap.ControlPointInfo.DifficultyPoints.RemoveAll(x => x.Time == time);
                    beatmap.ControlPointInfo.DifficultyPoints.Add(new DifficultyControlPoint
                    {
                        Time            = time,
                        SpeedMultiplier = speedMultiplier
                    });
                }

                if (stringSampleSet != samplePoint.SampleBank || sampleVolume != samplePoint.SampleVolume)
                {
                    beatmap.ControlPointInfo.SamplePoints.Add(new SampleControlPoint
                    {
                        Time         = time,
                        SampleBank   = stringSampleSet,
                        SampleVolume = sampleVolume
                    });
                }

                if (kiaiMode != effectPoint.KiaiMode || omitFirstBarSignature != effectPoint.OmitFirstBarLine)
                {
                    beatmap.ControlPointInfo.EffectPoints.Add(new EffectControlPoint
                    {
                        Time             = time,
                        KiaiMode         = kiaiMode,
                        OmitFirstBarLine = omitFirstBarSignature
                    });
                }
            }
            catch (FormatException e)
            {
            }
        }
Esempio n. 7
0
 public SampleRowAttribute(SampleControlPoint sample)
     : base(sample, "sample")
 {
     sampleBank = sample.SampleBankBindable.GetBoundCopy();
     volume     = sample.SampleVolumeBindable.GetBoundCopy();
 }
Esempio n. 8
0
 public SamplePointPiece(SampleControlPoint samplePoint)
 {
     this.samplePoint = samplePoint;
     volume           = samplePoint.SampleVolumeBindable.GetBoundCopy();
     bank             = samplePoint.SampleBankBindable.GetBoundCopy();
 }
Esempio n. 9
0
        private void handleControlPoints(TextWriter writer)
        {
            if (beatmap.ControlPointInfo.Groups.Count == 0)
            {
                return;
            }

            writer.WriteLine("[TimingPoints]");

            if (!(beatmap.ControlPointInfo is LegacyControlPointInfo))
            {
                var legacyControlPoints = new LegacyControlPointInfo();

                foreach (var point in beatmap.ControlPointInfo.AllControlPoints)
                {
                    legacyControlPoints.Add(point.Time, point.DeepClone());
                }

                beatmap.ControlPointInfo = legacyControlPoints;

                SampleControlPoint lastRelevantSamplePoint = null;

                // iterate over hitobjects and pull out all required sample changes
                foreach (var h in beatmap.HitObjects)
                {
                    var hSamplePoint = h.SampleControlPoint;

                    if (!hSamplePoint.IsRedundant(lastRelevantSamplePoint))
                    {
                        legacyControlPoints.Add(hSamplePoint.Time, hSamplePoint);
                        lastRelevantSamplePoint = hSamplePoint;
                    }
                }
            }

            foreach (var group in beatmap.ControlPointInfo.Groups)
            {
                var groupTimingPoint = group.ControlPoints.OfType <TimingControlPoint>().FirstOrDefault();

                // If the group contains a timing control point, it needs to be output separately.
                if (groupTimingPoint != null)
                {
                    writer.Write(FormattableString.Invariant($"{groupTimingPoint.Time},"));
                    writer.Write(FormattableString.Invariant($"{groupTimingPoint.BeatLength},"));
                    outputControlPointAt(groupTimingPoint.Time, true);
                }

                // Output any remaining effects as secondary non-timing control point.
                var difficultyPoint = beatmap.ControlPointInfo.DifficultyPointAt(group.Time);
                writer.Write(FormattableString.Invariant($"{group.Time},"));
                writer.Write(FormattableString.Invariant($"{-100 / difficultyPoint.SpeedMultiplier},"));
                outputControlPointAt(group.Time, false);
            }

            void outputControlPointAt(double time, bool isTimingPoint)
            {
                var samplePoint = ((LegacyControlPointInfo)beatmap.ControlPointInfo).SamplePointAt(time);
                var effectPoint = beatmap.ControlPointInfo.EffectPointAt(time);

                // Apply the control point to a hit sample to uncover legacy properties (e.g. suffix)
                HitSampleInfo tempHitSample = samplePoint.ApplyTo(new ConvertHitObjectParser.LegacyHitSampleInfo(string.Empty));

                // Convert effect flags to the legacy format
                LegacyEffectFlags effectFlags = LegacyEffectFlags.None;

                if (effectPoint.KiaiMode)
                {
                    effectFlags |= LegacyEffectFlags.Kiai;
                }
                if (effectPoint.OmitFirstBarLine)
                {
                    effectFlags |= LegacyEffectFlags.OmitFirstBarLine;
                }

                writer.Write(FormattableString.Invariant($"{(int)beatmap.ControlPointInfo.TimingPointAt(time).TimeSignature},"));
                writer.Write(FormattableString.Invariant($"{(int)toLegacySampleBank(tempHitSample.Bank)},"));
                writer.Write(FormattableString.Invariant($"{toLegacyCustomSampleBank(tempHitSample)},"));
                writer.Write(FormattableString.Invariant($"{tempHitSample.Volume},"));
                writer.Write(FormattableString.Invariant($"{(isTimingPoint ? '1' : '0')},"));
                writer.Write(FormattableString.Invariant($"{(int)effectFlags}"));
                writer.WriteLine();
            }
        }
Esempio n. 10
0
 public DrumSample(SampleControlPoint samplePoint)
 {
     this.samplePoint = samplePoint;
 }
Esempio n. 11
0
 public SampleEditPopover(HitObject hitObject)
 {
     this.hitObject = hitObject;
     point          = hitObject.SampleControlPoint;
 }