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(); }