Esempio n. 1
0
        MidiSequence _ProcessTrack(MidiSequence trk)
        {
            var ofs = (int)OffsetUpDown.Value;
            var len = (int)LengthUpDown.Value;

            if (0 == UnitsCombo.SelectedIndex)             // beats
            {
                len = (int)Math.Min(Math.Ceiling(len * (decimal)_file.TimeBase), _file.Length);
                ofs = (int)Math.Min(Math.Ceiling(ofs * (decimal)_file.TimeBase), _file.Length);
            }
            switch (StartCombo.SelectedIndex)
            {
            case 1:
                ofs += _file.FirstDownBeat;
                break;

            case 2:
                ofs += _file.FirstNoteOn;
                break;
            }
            switch (StartCombo.SelectedIndex)
            {
            case 1:
                ofs += _file.FirstDownBeat;
                break;

            case 2:
                ofs += _file.FirstNoteOn;
                break;
            }
            if (0 != ofs && CopyTimingPatchCheckBox.Checked)
            {
                var end = trk.FirstNoteOn;
                if (0 == end)
                {
                    end = trk.Length;
                }
                var trk2 = trk.GetRange(ofs, len);
                var ins  = 0;
                for (int ic = trk.Events.Count, i = 0; i < ic; ++i)
                {
                    var ev = trk.Events[i];
                    if (ev.Position >= end)
                    {
                        break;
                    }
                    var m = ev.Message;
                    switch (m.Status)
                    {
                    case 0xFF:
                        var mm = m as MidiMessageMeta;
                        switch (mm.Data1)
                        {
                        case 0x51:
                        case 0x54:
                            trk2.Events.Insert(ins, ev.Clone());
                            ++ins;
                            break;
                        }
                        break;

                    default:
                        if (0xC0 == (ev.Message.Status & 0xF0))
                        {
                            trk2.Events.Insert(ins, ev.Clone());
                            ++ins;
                        }
                        break;
                    }
                }
                trk = trk2;
            }
            else
            {
                if (trk.Length != len || 0 != ofs)
                {
                    trk = trk.GetRange(ofs, len);
                }
            }
            if (1m != StretchUpDown.Value)
            {
                trk = trk.Stretch((double)StretchUpDown.Value, AdjustTempoCheckBox.Checked);
            }
            return(trk);
        }