コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: Scan.cs プロジェクト: twobob/mutateful
        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));
        }
コード例 #3
0
ファイル: Crop.cs プロジェクト: rinckd/mutateful
        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));
        }
コード例 #4
0
ファイル: VelocityScale.cs プロジェクト: twobob/mutateful
        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));
        }
コード例 #5
0
        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 }));
        }