Ejemplo n.º 1
0
        public override Pattern Generate()
        {
            var endTimeData  = HitObject as IHasEndTime;
            var positionData = HitObject as IHasColumn;

            int column = positionData.Column;

            var pattern = new Pattern();

            if (endTimeData != null)
            {
                pattern.Add(new HoldNote {
                    StartTime = HitObject.StartTime,
                    Duration  = endTimeData.Duration,
                    Column    = column,
                    //Head = { Samples = sampleInfoListAt(HitObject.StartTime) },
                    //Tail = { Samples = sampleInfoListAt(endTimeData.EndTime) },
                });
            }
            else if (positionData != null)
            {
                pattern.Add(new Note {
                    StartTime = HitObject.StartTime,
                    Samples   = HitObject.Samples,
                    Column    = column
                });
            }

            return(pattern);
        }
Ejemplo n.º 2
0
            private Pattern generate()
            {
                var positionData = HitObject as IHasXPosition;

                int column = GetColumn(positionData?.X ?? 0);

                var pattern = new Pattern();

                if (HitObject is IHasDuration endTimeData)
                {
                    pattern.Add(new HoldNote
                    {
                        StartTime   = HitObject.StartTime,
                        Duration    = endTimeData.Duration,
                        Column      = column,
                        Samples     = HitObject.Samples,
                        NodeSamples = (HitObject as IHasRepeats)?.NodeSamples ?? defaultNodeSamples
                    });
                }
                else if (HitObject is IHasXPosition)
                {
                    pattern.Add(new Note
                    {
                        StartTime = HitObject.StartTime,
                        Samples   = HitObject.Samples,
                        Column    = column
                    });
                }

                return(pattern);
            }
Ejemplo n.º 3
0
            private Pattern generate()
            {
                var endTimeData  = HitObject as IHasEndTime;
                var positionData = HitObject as IHasXPosition;

                int column = GetColumn(positionData?.X ?? 0);

                var pattern = new Pattern();

                if (endTimeData != null)
                {
                    pattern.Add(new HoldNote
                    {
                        StartTime = HitObject.StartTime,
                        Duration  = endTimeData.Duration,
                        Column    = column,
                        Head      = { Samples = sampleInfoListAt(HitObject.StartTime) },
                        Tail      = { Samples = sampleInfoListAt(endTimeData.EndTime) },
                    });
                }
                else if (positionData != null)
                {
                    pattern.Add(new Note
                    {
                        StartTime = HitObject.StartTime,
                        Samples   = HitObject.Samples,
                        Column    = column
                    });
                }

                return(pattern);
            }
Ejemplo n.º 4
0
        public Pattern GetPatternAt(int segment)
        {
            var pattern      = new Pattern(StaccatoElementsFactory.CreateTrackElement(9));
            int layerCounter = 0;

            foreach (string layer in GetLayersAt(segment))
            {
                pattern.Add(StaccatoElementsFactory.CreateLayerElement(layerCounter));
                layerCounter++;
                pattern.Add(GetStaccatoStringForRhythm(layer));
            }
            return(pattern);
        }
        // Merge two patterns to one.
        private void convolute_basic(Pattern target, Pattern source1, Pattern source2)
        {
            target.Clear();
            int g_n = source1.Count;
            int f_n = source2.Count;

            if (g_n == 0 || f_n == 0)
            {
                return;
            }
            for (int k = 0; k < g_n + f_n - 1; k++)
            {
                double sumweight = 0, summass = 0;
                int    start = k < (f_n - 1) ? 0 : k - f_n + 1; // max(0, k-f_n+1)
                int    end   = k < (g_n - 1) ? k : g_n - 1;     // min(g_n - 1, k)
                for (int i = start; i <= end; i++)
                {
                    double weight = source1[i].Intensity * source2[k - i].Intensity;
                    double mass   = source1[i].Mz + source2[k - i].Mz;
                    sumweight += weight;
                    summass   += weight * mass;
                }
                Peak p = new Peak();
                if (sumweight == 0)
                {
                    p.Mz = DUMMY_MASS;
                }
                else
                {
                    p.Mz = summass / sumweight;
                }
                p.Intensity = sumweight;
                target.Add(p);
            }
        }
Ejemplo n.º 6
0
        private void ParsePattern(XmlReader r)
        {
            if (!r.ReadToDescendant("pattern"))
            {
                return;
            }

            do
            {
                if (r.IsEmptyElement)
                {
                    continue;
                }

                string name = r.GetAttribute("name"); // this.reader["name"];

                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }

                var pat = new Pattern(name);

                using (var rr = r.ReadSubtree()) {
                    rr.Read();
                    while (rr.Read())
                    {
                        switch (rr.NodeType)
                        {
                        case XmlNodeType.Element:
                            if (rr.Name.Equals("factor", StringComparison.Ordinal))
                            {
                                string s = rr.GetAttribute("value") ?? string.Empty;

                                try {
                                    pat.Add(XmlConvert.ToDouble(s));
                                }
                                catch (FormatException) {
                                    LogException(ErrorCode.Err202, rr.ReadInnerXml());
                                }
                            }

                            break;

                        case XmlNodeType.Comment:
                            pat.Comment = rr.Value;
                            break;
                        }
                    }
                }


                try {
                    net.Patterns.Add(pat);
                }
                catch (ArgumentException) {
                    LogException(ErrorCode.Err215, pat.Name);
                }
            } while (r.ReadToNextSibling("pattern"));
        }
Ejemplo n.º 7
0
        public Pattern GetPattern()
        {
            Pattern pattern = new Pattern();

            foreach (Chord chord in GetChords())
            {
                pattern.Add(chord);
            }

            if (allSequence != null)
            {
                pattern = ReplacementFormatUtil.ReplaceDollarsWithCandidates(allSequence, GetChords(),
                                                                             new Pattern(GetChords()));
            }

            if (eachSequence != null)
            {
                Pattern p2 = new Pattern();
                foreach (var chordString in pattern.ToString().Split(' '))
                {
                    Chord chord = new Chord(chordString);
                    p2.Add(ReplacementFormatUtil.ReplaceDollarsWithCandidates(eachSequence, chord.GetNotes(), chord));
                }

                pattern = p2;
            }

            return(pattern);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Constructs and adds a note to a pattern.
        /// </summary>
        /// <param name="pattern">The pattern to add to.</param>
        /// <param name="column">The column to add the note to.</param>
        /// <param name="startTime">The start time of the note.</param>
        /// <param name="endTime">The end time of the note (set to <paramref name="startTime"/> for a non-hold note).</param>
        private void addToPattern(Pattern pattern, int column, double startTime, double endTime)
        {
            ManiaHitObject newObject;

            if (startTime == endTime)
            {
                newObject = new Note
                {
                    StartTime = startTime,
                    Samples   = sampleInfoListAt(startTime),
                    Column    = column
                };
            }
            else
            {
                var holdNote = new HoldNote
                {
                    StartTime = startTime,
                    Column    = column,
                    Duration  = endTime - startTime,
                    Head      = { Samples = sampleInfoListAt(startTime) },
                    Tail      = { Samples = sampleInfoListAt(endTime) }
                };

                newObject = holdNote;
            }

            pattern.Add(newObject);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Constructs and adds a note to a pattern.
        /// </summary>
        /// <param name="pattern">The pattern to add to.</param>
        /// <param name="column">The column to add the note to.</param>
        /// <param name="holdNote">Whether to add a hold note.</param>
        private void addToPattern(Pattern pattern, int column, bool holdNote)
        {
            ManiaHitObject newObject;

            if (holdNote)
            {
                var hold = new HoldNote
                {
                    StartTime = HitObject.StartTime,
                    Column    = column,
                    Duration  = endTime - HitObject.StartTime
                };

                hold.Head.Samples.Add(new SampleInfo
                {
                    Name = SampleInfo.HIT_NORMAL
                });

                hold.Tail.Samples = HitObject.Samples;

                newObject = hold;
            }
            else
            {
                newObject = new Note
                {
                    StartTime = HitObject.StartTime,
                    Samples   = HitObject.Samples,
                    Column    = column
                };
            }

            pattern.Add(newObject);
        }
Ejemplo n.º 10
0
        public override IEnumerable <Pattern> Generate()
        {
            var originalPattern = generate();

            if (originalPattern.HitObjects.Count() == 1)
            {
                yield return(originalPattern);

                yield break;
            }

            // We need to split the intermediate pattern into two new patterns:
            // 1. A pattern containing all objects that do not end at our EndTime.
            // 2. A pattern containing all objects that end at our EndTime. This will be used for further pattern generation.
            var intermediatePattern = new Pattern();
            var endTimePattern      = new Pattern();

            foreach (var obj in originalPattern.HitObjects)
            {
                if (!Precision.AlmostEquals(EndTime, obj.GetEndTime()))
                {
                    intermediatePattern.Add(obj);
                }
                else
                {
                    endTimePattern.Add(obj);
                }
            }

            yield return(intermediatePattern);

            yield return(endTimePattern);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Constructs and adds a note to a pattern.
        /// </summary>
        /// <param name="pattern">The pattern to add to.</param>
        /// <param name="column">The column to add the note to.</param>
        /// <param name="holdNote">Whether to add a hold note.</param>
        private void addToPattern(Pattern pattern, int column, bool holdNote)
        {
            ManiaHitObject newObject;

            if (holdNote)
            {
                newObject = new HoldNote
                {
                    StartTime   = HitObject.StartTime,
                    Duration    = endTime - HitObject.StartTime,
                    Column      = column,
                    Samples     = HitObject.Samples,
                    NodeSamples = (HitObject as IHasRepeats)?.NodeSamples
                };
            }
            else
            {
                newObject = new Note
                {
                    StartTime = HitObject.StartTime,
                    Samples   = HitObject.Samples,
                    Column    = column
                };
            }

            pattern.Add(newObject);
        }
Ejemplo n.º 12
0
 private void addToPattern(Pattern pattern, int column)
 {
     pattern.Add(new Note
     {
         StartTime = HitObject.StartTime,
         Samples   = HitObject.Samples,
         Column    = column
     });
 }
        public Pattern Calculate(FormMap fm, double limit, long charge)
        {
            Pattern tmp    = new Pattern();
            Pattern result = new Pattern();

            result.Add(new Peak()
            {
                Mz = 0.0, Intensity = 1.0
            });

            foreach (var i in fm)
            {
                int           atom_index = i.Key;
                SuperAtomList sal        = sad[atom_index];
                int           n          = i.Value;
                int           j          = 0;
                while (n > 0)
                {
                    int sz = sal.Count;
                    if (j == sz)
                    {
                        sal.Add(new Pattern());
                        convolute_basic(sal[j], sal[j - 1], sal[j - 1]);
                        Prune(sal[j], limit);
                    }
                    if ((n & 1) == 1)
                    { // digit is 1, convolute result
                        convolute_basic(tmp, result, sal[j]);
                        Prune(tmp, limit);
                        result.Clear();
                        result.AddRange(tmp);
                    }
                    n >>= 1;
                    j++;
                }
            }

            // take charge into account
            foreach (var p in result)
            {
                if (charge > 0)
                {
                    p.Mz = p.Mz / Math.Abs(charge) - ELECTRON_MASS;
                }
                else if (charge < 0)
                {
                    p.Mz = p.Mz / Math.Abs(charge) + ELECTRON_MASS;
                }
            }

            if (result.Count == 0)
            {
                throw new Exception("Calculate profile failed");
            }
            return(result);
        }
Ejemplo n.º 14
0
        public void PitchWheelTest()
        {
            Pattern pattern = new Pattern("V0 60w");

            for (int i = 0; i < 16384; i += 150)
            {
                pattern.Add(":PW(" + i + ") 60t");
            }
            player.Play(pattern);
        }
Ejemplo n.º 15
0
        public Pattern GetPattern()
        {
            Pattern fullPattern = new Pattern();

            for (int segment = 0; segment < Length; segment++)
            {
                fullPattern.Add(GetPatternAt(segment));
            }
            return(fullPattern);
        }
        /// <summary>
        /// Generates a hold note alongside normal notes.
        /// </summary>
        /// <param name="startTime">The start time of notes.</param>
        /// <returns>The <see cref="Pattern"/> containing the hit objects.</returns>
        private Pattern generateHoldAndNormalNotes(double startTime)
        {
            // - - - -
            // ■ x x -
            // ■ - x x
            // ■ x - x
            // ■ - x x

            var pattern = new Pattern();

            int holdColumn = GetColumn((HitObject as IHasXPosition)?.X ?? 0, true);
            if (convertType.HasFlag(PatternType.ForceNotStack) && PreviousPattern.ColumnWithObjects < TotalColumns)
                holdColumn = FindAvailableColumn(holdColumn, PreviousPattern);

            // Create the hold note
            addToPattern(pattern, holdColumn, startTime, EndTime);

            int nextColumn = GetRandomColumn();
            int noteCount;
            if (ConversionDifficulty > 6.5)
                noteCount = GetRandomNoteCount(0.63, 0);
            else if (ConversionDifficulty > 4)
                noteCount = GetRandomNoteCount(TotalColumns < 6 ? 0.12 : 0.45, 0);
            else if (ConversionDifficulty > 2.5)
                noteCount = GetRandomNoteCount(TotalColumns < 6 ? 0 : 0.24, 0);
            else
                noteCount = 0;
            noteCount = Math.Min(TotalColumns - 1, noteCount);

            bool ignoreHead = !sampleInfoListAt(startTime).Any(s => s.Name == HitSampleInfo.HIT_WHISTLE || s.Name == HitSampleInfo.HIT_FINISH || s.Name == HitSampleInfo.HIT_CLAP);

            var rowPattern = new Pattern();

            for (int i = 0; i <= spanCount; i++)
            {
                if (!(ignoreHead && startTime == HitObject.StartTime))
                {
                    for (int j = 0; j < noteCount; j++)
                    {
                        nextColumn = FindAvailableColumn(nextColumn, validation: c => c != holdColumn, patterns: rowPattern);
                        addToPattern(rowPattern, nextColumn, startTime, startTime);
                    }
                }

                pattern.Add(rowPattern);
                rowPattern.Clear();

                startTime += SegmentDuration;
            }

            return pattern;
        }
Ejemplo n.º 17
0
        private Pattern generateRandomPattern(double p2, double p3, double p4, double p5)
        {
            var pattern = new Pattern();

            pattern.Add(generateRandomNotes(getRandomNoteCount(p2, p3, p4, p5)));

            if (RandomStart > 0 && hasSpecialColumn)
            {
                addToPattern(pattern, 0);
            }

            return(pattern);
        }
        private static void GetPatternsFromDir(Pattern pattern, bool useRazor)
        {
            // get all patterns in this directory
            foreach (var filePath in Directory.EnumerateFiles(pattern.FullDirectoryPath, (useRazor ? "*.cshtml" : "*.htm"), SearchOption.TopDirectoryOnly))
            {
                // We ignore patterns starting with underscore (_)
                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath);

                if (fileNameWithoutExtension != null && (useRazor || !fileNameWithoutExtension.StartsWith("_")))
                {
                    pattern.Add(new Pattern(filePath, pattern.RootPath));
                }
            }

            // get any sub directories and their patterns
            foreach (var dirPath in Directory.EnumerateDirectories(pattern.FullDirectoryPath))
            {
                var dirPattern = new Pattern(dirPath, pattern.RootPath);

                GetPatternsFromDir(dirPattern, useRazor);

                pattern.Add(dirPattern);
            }
        }
Ejemplo n.º 19
0
        public void MicrotonalTest()
        {
            Pattern normalScale    = new Pattern("(A4 A#4 B4 C5 C#5 D5 D#5 E5 F5 F#5 G5 G#5 A5 A#5 B5 C6)s");
            Pattern microtoneScale = new Pattern();
            var     preprocessor   = new MicrotonePreprocessor();

            for (double freq = Note.FrequencyForNote("A4"); freq < Note.FrequencyForNote("C6"); freq += 10.5)
            {
                microtoneScale.Add("m" + freq + "s");
            }

            Console.WriteLine("First, playing normal scale: " + normalScale);
            player.Play(normalScale);

            player.Play("Rw5");

            Console.WriteLine($"Second, playing microtone scale. You should hear middle ranges in these notes: {microtoneScale}");
            player.Play(microtoneScale);

            Console.WriteLine("The expanded version of the microtone string is: " + preprocessor.Preprocess(microtoneScale.ToString(), null));

            player.Play("Rw5");

            Pattern pitchWheelDemo = new Pattern();

            Console.WriteLine("Now, let's do a pitch wheel demo. Same note (Middle-C, note 60), played with 163 different pitch wheel settings, each 100 cents apart.");
            for (int i = 0; i < 16383; i += 100)
            {
                pitchWheelDemo.Add(":PW(" + i + ") 60t");
            }
            Console.WriteLine("This should sound like it gradually ramps up.");
            player.Play(pitchWheelDemo);

            player.Play("Rw5");

            Console.WriteLine("Now playing four notes. The first two should sound different from each other, and the second two should sound the same as the first two.");
            string microtone = "m346.0w m356.5w";

            player.Play(microtone);
            player.Play(preprocessor.Preprocess(microtone, null));
        }
Ejemplo n.º 20
0
        public Pattern GetPattern()
        {
            Pattern pattern    = new Pattern();
            bool    foundChord = false;
            string  chordName  = GetChordType();

            if (chordName != null)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(InsertChordNameIntoNote(Root, chordName));
                for (int i = 0; i < Inversion; i++)
                {
                    sb.Append("^");
                }
                pattern.Add(sb.ToString());
                foundChord = true;
            }
            if (!foundChord)
            {
                return(GetPatternWithNotes());
            }
            return(pattern);
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Generates a hold note alongside normal notes.
        /// </summary>
        /// <param name="startTime">The start time of notes.</param>
        /// <returns>The <see cref="Pattern"/> containing the hit objects.</returns>
        private Pattern generateHoldAndNormalNotes(double startTime)
        {
            // - - - -
            // ■ x x -
            // ■ - x x
            // ■ x - x
            // ■ - x x

            var pattern = new Pattern();

            int holdColumn = GetColumn((HitObject as IHasXPosition)?.X ?? 0, true);

            if ((convertType & PatternType.ForceNotStack) > 0 && PreviousPattern.ColumnWithObjects < TotalColumns)
            {
                while (PreviousPattern.ColumnHasObject(holdColumn))
                {
                    holdColumn = Random.Next(RandomStart, TotalColumns);
                }
            }

            // Create the hold note
            addToPattern(pattern, holdColumn, startTime, endTime);

            int nextColumn = Random.Next(RandomStart, TotalColumns);
            int noteCount;

            if (ConversionDifficulty > 6.5)
            {
                noteCount = GetRandomNoteCount(0.63, 0);
            }
            else if (ConversionDifficulty > 4)
            {
                noteCount = GetRandomNoteCount(TotalColumns < 6 ? 0.12 : 0.45, 0);
            }
            else if (ConversionDifficulty > 2.5)
            {
                noteCount = GetRandomNoteCount(TotalColumns < 6 ? 0 : 0.24, 0);
            }
            else
            {
                noteCount = 0;
            }
            noteCount = Math.Min(TotalColumns - 1, noteCount);

            bool ignoreHead = !sampleInfoListAt(startTime).Any(s => s.Name == SampleInfo.HIT_WHISTLE || s.Name == SampleInfo.HIT_FINISH || s.Name == SampleInfo.HIT_CLAP);

            var rowPattern = new Pattern();

            for (int i = 0; i <= spanCount; i++)
            {
                if (!(ignoreHead && startTime == HitObject.StartTime))
                {
                    for (int j = 0; j < noteCount; j++)
                    {
                        while (rowPattern.ColumnHasObject(nextColumn) || nextColumn == holdColumn)
                        {
                            nextColumn = Random.Next(RandomStart, TotalColumns);
                        }
                        addToPattern(rowPattern, nextColumn, startTime, startTime);
                    }
                }

                pattern.Add(rowPattern);
                rowPattern.Clear();

                startTime += segmentDuration;
            }

            return(pattern);
        }
Ejemplo n.º 22
0
 /// <summary>
 /// Adds to a search pattern an additional search by class name.
 /// </summary>
 /// <param name="value">The class name to search for.</param>
 /// <returns>The search pattern.</returns>
 public Search AndByClassName(string value)
 {
     Pattern.Add("className", value);
     return(this);
 }
Ejemplo n.º 23
0
 /// <summary>
 /// Gets the extended search pattern.
 /// </summary>
 /// <returns>The search pattern.</returns>
 public Search AndIsVisibleOnScreen()
 {
     Pattern.Add("VisibleOnScreen", true);
     return(this);
 }
Ejemplo n.º 24
0
        public Pattern EncodePattern(string input)
        {
            var pattern = new Pattern();

            for (var index = 0; index < input.Length; index++)
            {
                var maxLength = input.Length - index;
                //Maximal munch
                for (var len = maxLength; len > 0; len--)
                {
                    var bunch = input.Substring(index, len);

                    if (Lingon.DefaultSet.FirstOrDefault(ling => ling.Symbol == bunch) != null)
                    {
                        pattern.Add(Lingon.DefaultSet.FirstOrDefault(ling => ling.Symbol == bunch));
                        index += len - 1;
                        break;
                    }
                    else if (bunch.StartsWith("[") && bunch.EndsWith("]") && len > 2)
                    {
                        pattern.Add(new NonceSet(EncodePattern(bunch.Substring(1, bunch.Length - 2))));
                        index += len - 1;
                        break;
                    }
                    else if (bunch.Length > 1 && bunch.Substring(1).StartsWith("[") && bunch.EndsWith("]"))
                    {
                        var symbol = bunch.Substring(0, 1);
                        var split  = bunch.Substring(1).Split("]").Where(ft => ft != "").ToList();

                        if (split.Any(segment => !segment.StartsWith("[")))
                        {
                            continue;
                        }

                        var features    = split.Select(ft => ft.Replace("[", ""));
                        var hasFeatures = new List <Feature>();
                        var notFeatures = new List <Feature>();

                        if (Lingons.ContainsKey(symbol))
                        {
                            hasFeatures.AddRange(Lingons[symbol].Features);
                        }
                        else if (Categories.ContainsKey(symbol))
                        {
                            hasFeatures.AddRange(Categories[symbol].HasFeatures);
                            notFeatures.AddRange(Categories[symbol].NotFeatures);
                        }


                        foreach (var feature in features)
                        {
                            var add  = !feature.StartsWith("-");
                            var name = feature.Substring(1);
                            (add ? hasFeatures : notFeatures).Add(Feature.AllFeatures.First(ft => String.Equals(ft.Name, name, StringComparison.CurrentCultureIgnoreCase)));
                        }

                        pattern.Add(new Category(hasFeatures, notFeatures));
                        index += len - 1; //Move to end of bunch
                        break;
                    }
                    else if (Lingons.ContainsKey(bunch))
                    {
                        pattern.Add(Lingons[bunch]);
                        index += len - 1; //Move to end of bunch
                        break;
                    }
                    else if (Categories.ContainsKey(bunch))
                    {
                        pattern.Add(Categories[bunch]);
                        index += len - 1; //Move to end of bunch
                        break;
                    }
                    else if (len == 1)
                    {
                        pattern.Add(Lingon.Unknown);
                        break;
                    }
                }
            }

            return(pattern);
        }
        public EmassCalculator(string filename)
        {
            if (!File.Exists(filename))
            {
                throw new FileNotFoundException(filename);
            }

            IsotopicMap = new ElemMap();

            using (StreamReader f = new StreamReader(filename))
            {
                sad.Clear();
                IsotopicMap.Clear();

                string line;
                int    elemindex = 0;
                int    state     = 0;
                while ((line = f.ReadLine()) != null)
                {
                    string element;
                    switch (state)
                    {
                    case 0: // new element
                        var m0 = eleReg.Match(line);
                        element = m0.Groups[1].Value;
                        IsotopicMap[element] = elemindex;
                        var pkl = new Pattern();
                        var sal = new SuperAtomList();
                        sal.Add(pkl);
                        sad.Add(sal);
                        elemindex++;
                        state = 1;
                        break;

                    case 1: // isotope
                        var m1 = eleReg.Match(line);
                        if (m1.Success)
                        {
                            Peak p = new Peak();
                            p.Mz        = MyConvert.ToDouble(m1.Groups[1].Value);
                            p.Intensity = MyConvert.ToDouble(m1.Groups[2].Value);
                            Pattern idist = sad.Last().First();
                            // fill the gaps in the patterns with zero abundancy peaks
                            if (idist.Count > 0)
                            {
                                double prevmass = idist.Last().Mz;
                                for (int i = 0; i < (int)(p.Mz - prevmass - 0.5); i++)
                                {
                                    Peak filler = new Peak();
                                    filler.Mz        = DUMMY_MASS;
                                    filler.Intensity = 0;
                                    idist.Add(filler);
                                }
                            }
                            // insert the peak
                            idist.Add(p);
                        }
                        else
                        {
                            state = 0;
                        }
                        break;
                    }
                }
            }
        }