Пример #1
0
        public static IEnumerable <Note> Silhouette(this IEnumerable <Note> seq)
        {
            Queue <Note>[]  unendedNotes = new Queue <Note> [256 * 16];
            FastList <Note> notesQueue   = new FastList <Note>();

            for (int i = 0; i < unendedNotes.Length; i++)
            {
                unendedNotes[i] = new Queue <Note>();
            }

            Queue <Note> queueFromNote(Note n) => unendedNotes[n.Key * 16 + n.Channel];

            foreach (var n in seq)
            {
                var q = queueFromNote(n);
                if (q.Count == 0 || q.Last().End + 0.00000001 < n.Start)
                {
                    var newNote = new Note(n.Channel, n.Key, 1, n.Start, n.End);
                    q.Enqueue(newNote);
                    notesQueue.Add(newNote);
                }
                else
                {
                    q.Last().End = n.End;
                }
                if (!notesQueue.ZeroLen && queueFromNote(notesQueue.First).Count > 1)
                {
                    queueFromNote(notesQueue.First).Dequeue();
                    yield return(notesQueue.Pop());
                }
            }
            foreach (Note n in notesQueue)
            {
                yield return(n);
            }
            notesQueue.Unlink();
        }