Exemplo n.º 1
0
        private int AnalyzeBend(partWork pw, Note note, int ml)
        {
            int n = -1;
            int bendDelayCounter;

            pw.octaveNow       = note.octave;     // pw.octaveNew;
            pw.bendOctave      = note.bendOctave; // pw.octaveNow;
            pw.bendNote        = note.bendCmd;
            pw.bendShift       = note.bendShift;
            pw.bendWaitCounter = -1;
            bendDelayCounter   = 0;//TODO: bendDelay

            n             = note.bendOctave;
            n             = Common.CheckRange(n, 1, 8);
            pw.bendOctave = n;

            //音符の変化量
            int ed = Const.NOTE.IndexOf(pw.bendNote) + 1 + (pw.bendOctave - 1) * 12 + pw.bendShift;// + pw.keyShift+pw.relKeyShift;// pw.bendShift;

            ed = Common.CheckRange(ed, 0, 8 * 12 - 1);
            int st = Const.NOTE.IndexOf(note.cmd) + 1 + (pw.octaveNow - 1) * 12 + note.shift;// + pw.keyShift + pw.relKeyShift;// note.shift;//

            st = Common.CheckRange(st, 0, 8 * 12 - 1);

            int delta = ed - st;

            if (delta == 0 || bendDelayCounter == ml)
            {
                pw.bendNote        = 'r';
                pw.bendWaitCounter = -1;
            }
            else
            {
                //1音符当たりのウエイト
                float      wait             = (ml - bendDelayCounter - 1) / (float)delta;
                float      tl               = 0;
                float      bf               = Math.Sign(wait);
                List <int> lstBend          = new List <int>();
                int        toneDoublerShift = GetToneDoublerShift(
                    pw
                    , pw.octaveNow
                    , note.cmd
                    , note.shift);
                for (int i = 0; i < Math.Abs(delta); i++)
                {
                    bf += wait;
                    tl += wait;
                    GetFNumAtoB(
                        pw
                        , out int a
                        , pw.octaveNow
                        , note.cmd
                        //, note.shift + (i + 0) * Math.Sign(delta)
                        //, pw.keyShift + pw.relKeyShift + (i + 0) * Math.Sign(delta)
                        , (i + 0) * Math.Sign(delta)
                        , out int b
                        , pw.octaveNow
                        , note.cmd
                        //, note.shift + (i + 1) * Math.Sign(delta)
                        //, pw.keyShift + pw.relKeyShift + (i + 1) * Math.Sign(delta)
                        , (i + 1) * Math.Sign(delta)
                        , delta
                        );

                    if (Math.Abs(bf) >= 1.0f)
                    {
                        for (int j = 0; j < (int)Math.Abs(bf); j++)
                        {
                            int c = b - a;
                            int d = (int)Math.Abs(bf);
                            lstBend.Add((int)(a + ((float)c / (float)d) * (float)j));
                        }
                        bf -= (int)bf;
                    }
                }
                Stack <Tuple <int, int> > lb = new Stack <Tuple <int, int> >();
                int of  = -1;
                int cnt = 1;
                foreach (int f in lstBend)
                {
                    if (of == f)
                    {
                        cnt++;
                        continue;
                    }
                    lb.Push(new Tuple <int, int>(f, cnt));
                    of  = f;
                    cnt = 1;
                }
                pw.bendList = new Stack <Tuple <int, int> >();
                foreach (Tuple <int, int> lbt in lb)
                {
                    pw.bendList.Push(lbt);
                }
                Tuple <int, int> t = pw.bendList.Pop();
                pw.bendFnum        = t.Item1;
                pw.bendWaitCounter = parent.GetWaitCounter(t.Item2);
            }

            return(bendDelayCounter);
        }