public static Clip CropClip(Clip clip, decimal start, decimal duration) { var processedClip = new Clip(duration, clip.IsLooping); processedClip.Notes.AddRange(ClipUtilities.GetSplitNotesInRangeAtPosition(start, start + duration, clip.Notes, 0)); return(processedClip); }
public static ProcessResultArray <Clip> Apply(Command command, params Clip[] clips) { (var success, var msg) = OptionParser.TryParseOptions(command, out ScanOptions options); if (!success) { return(new ProcessResultArray <Clip>(msg)); } var processedClips = new Clip[clips.Length]; for (var c = 0; c < clips.Length; c++) { var clip = clips[c]; var processedClip = new Clip(options.Window * options.Count, clip.IsLooping); decimal delta = clip.Length / options.Count, curPos = 0; for (int i = 0; i < options.Count; i++) { processedClip.Notes.AddRange(ClipUtilities.GetSplitNotesInRangeAtPosition(curPos, curPos + options.Window, clip.Notes, options.Window * i)); curPos += delta; } processedClips[c] = processedClip; } return(new ProcessResultArray <Clip>(processedClips)); }
public static ProcessResultArray <Clip> Apply(CropOptions options, params Clip[] clips) { var processedClips = new Clip[clips.Length]; var start = options.Lengths.Length > 1 ? options.Lengths[0] : 0; var duration = options.Lengths.Length > 1 ? options.Lengths[1] : options.Lengths[0]; var i = 0; foreach (var clip in clips) { var processedClip = new Clip(duration, clip.IsLooping); processedClip.Notes.AddRange(ClipUtilities.GetSplitNotesInRangeAtPosition(start, start + duration, clip.Notes, 0)); processedClips[i++] = processedClip; } return(new ProcessResultArray <Clip>(processedClips)); }
public static ProcessResultArray <Clip> Apply(VelocityScaleOptions options, params Clip[] clips) { var processedClips = new Clip[clips.Length]; var i = 0; foreach (var clip in clips) { var processedClip = new Clip(clip.Length, clip.IsLooping); processedClip.Notes.AddRange(ClipUtilities.GetSplitNotesInRangeAtPosition(0, clip.Length, clip.Notes, 0)); foreach (var item in processedClip.Notes) { item.Velocity = System.Math.Min(FullMidiVelocityRange, System.Math.Abs((int)System.Math.Floor(item.Velocity * options.Strength))); } processedClips[i++] = processedClip; } return(new ProcessResultArray <Clip>(processedClips)); }
public static ProcessResultArray <Clip> Apply(InterleaveOptions options, ClipMetaData metadata, params Clip[] clips) { if (clips.Length < 2) { clips = new[] { clips[0], clips[0] }; } decimal position = 0; int repeatsIndex = 0; Clip resultClip = new Clip(4, true); switch (options.Mode) { case Event: if (options.ChunkChords) { foreach (var clip in clips) { clip.GroupSimultaneousNotes(); } } var noteCounters = clips.Select(c => new IntCounter(c.Notes.Count)).ToArray(); position = clips[0].Notes[0].Start; while (noteCounters.Any(nc => !nc.Overflow)) { for (var clipIndex = 0; clipIndex < clips.Length; clipIndex++) { var clip = clips[clipIndex]; var currentNoteCounter = noteCounters[clipIndex]; for (var repeats = 0; repeats < options.Repeats[repeatsIndex % options.Repeats.Length]; repeats++) { var note = clip.Notes[currentNoteCounter.Value]; if (!options.Solo || clip.ClipReference.Track == metadata.TrackNumber) { var newNote = new NoteEvent(note); newNote.Start = position; resultClip.Notes.Add(newNote); } position += clip.DurationUntilNextNote(currentNoteCounter.Value); } if (options.Skip) { foreach (var noteCounter in noteCounters) { noteCounter.Inc(); } } else { currentNoteCounter.Inc(); } repeatsIndex++; } } if (options.ChunkChords) { resultClip.Flatten(); } break; case Time: var srcPositions = clips.Select(c => new DecimalCounter(c.Length)).ToArray(); int timeRangeIndex = 0; while (srcPositions.Any(c => !c.Overflow)) { for (var clipIndex = 0; clipIndex < clips.Length; clipIndex++) { var clip = clips[clipIndex]; var currentTimeRange = options.Ranges[timeRangeIndex]; for (var repeats = 0; repeats < options.Repeats[repeatsIndex % options.Repeats.Length]; repeats++) { if (!options.Solo || clip.ClipReference.Track == metadata.TrackNumber) { resultClip.Notes.AddRange( ClipUtilities.GetSplitNotesInRangeAtPosition( srcPositions[clipIndex].Value, srcPositions[clipIndex].Value + currentTimeRange, clips[clipIndex].Notes, position ) ); } position += currentTimeRange; } if (options.Skip) { foreach (var srcPosition in srcPositions) { srcPosition.Inc(currentTimeRange); } } else { srcPositions[clipIndex].Inc(currentTimeRange); } repeatsIndex++; timeRangeIndex = (timeRangeIndex + 1) % options.Ranges.Length; // this means that you cannot use the Counts parameter to have varying time ranges for each repeat } } break; } resultClip.Length = position; return(new ProcessResultArray <Clip>(new[] { resultClip })); }