示例#1
0
        private List <VsqHandle> writeEventListCor(ITextWriter writer, int eos)
        {
            List <VsqHandle> handles = buildHandleList();

            writer.writeLine("[EventList]");
            List <VsqEvent> temp = new List <VsqEvent>();

            foreach (var @event in Events.iterator())
            {
                temp.Add(@event);
            }
            temp.Sort();
            int i = 0;

            while (i < temp.Count)
            {
                VsqEvent item = temp[i];
                if (!item.ID.Equals(VsqID.EOS))
                {
                    string ids   = "ID#" + PortUtil.formatDecimal("0000", item.ID.value);
                    int    clock = temp[i].Clock;
                    while (i + 1 < temp.Count && clock == temp[i + 1].Clock)
                    {
                        i++;
                        ids += ",ID#" + PortUtil.formatDecimal("0000", temp[i].ID.value);
                    }
                    writer.writeLine(clock + "=" + ids);
                }
                i++;
            }
            writer.writeLine(eos + "=EOS");
            return(handles);
        }
示例#2
0
 public void add(VsqEvent item, int internal_id)
 {
     updateIDList();
     item.InternalID = internal_id;
     Events.Add(item);
     m_ids.Add(internal_id);
 }
示例#3
0
            public int next()
            {
                int count = list.getCount();

                for (int i = pos + 1; i < count; i++)
                {
                    VsqEvent item = list.getElement(i);
                    if (kindSinger)
                    {
                        if (item.ID.type == VsqIDType.Singer)
                        {
                            pos = i;
                            return(i);
                        }
                    }
                    if (kindNote)
                    {
                        if (item.ID.type == VsqIDType.Anote)
                        {
                            pos = i;
                            return(i);
                        }
                    }
                    if (kindDynaff || kindCrescend || kindDecrescend)
                    {
                        if (item.ID.type == VsqIDType.Aicon && item.ID.IconDynamicsHandle != null && item.ID.IconDynamicsHandle.IconID != null)
                        {
                            string iconid = item.ID.IconDynamicsHandle.IconID;
                            if (kindDynaff)
                            {
                                if (iconid.StartsWith(IconDynamicsHandle.ICONID_HEAD_DYNAFF))
                                {
                                    pos = i;
                                    return(i);
                                }
                            }
                            if (kindCrescend)
                            {
                                if (iconid.StartsWith(IconDynamicsHandle.ICONID_HEAD_CRESCEND))
                                {
                                    pos = i;
                                    return(i);
                                }
                            }
                            if (kindDecrescend)
                            {
                                if (iconid.StartsWith(IconDynamicsHandle.ICONID_HEAD_DECRESCEND))
                                {
                                    pos = i;
                                    return(i);
                                }
                            }
                        }
                    }
                }
                return(-1);
            }
示例#4
0
        /// <summary>
        /// ノートを追加するコマンドを発行します。
        /// </summary>
        /// <param name="track"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        public static VsqCommand generateCommandEventAdd(int track, VsqEvent item)
        {
            VsqCommand command = new VsqCommand();

            command.Type    = VsqCommandType.EVENT_ADD;
            command.Args    = new Object[2];
            command.Args[0] = track;
            command.Args[1] = (VsqEvent)item.clone();
            return(command);
        }
示例#5
0
        public static VsqCommand generateCommandEventReplace(int track, VsqEvent item)
        {
            VsqCommand command = new VsqCommand();

            command.Type    = VsqCommandType.EVENT_REPLACE;
            command.Args    = new Object[2];
            command.Args[0] = track;
            command.Args[1] = item.clone();
            return(command);
        }
示例#6
0
        public void setForID(int internal_id, VsqEvent value)
        {
            int c = Events.Count;

            for (int i = 0; i < c; i++)
            {
                if (Events[i].InternalID == internal_id)
                {
                    Events[i] = value;
                    break;
                }
            }
        }
示例#7
0
        /// <summary>
        /// 指定したトラックのレンダラーを変更します
        /// </summary>
        /// <param name="track"></param>
        /// <param name="new_renderer"></param>
        /// <param name="singers"></param>
        public void changeRenderer(string new_renderer, List <VsqID> singers)
        {
            VsqID default_id   = null;
            int   singers_size = singers.Count;

            if (singers_size <= 0)
            {
                default_id      = new VsqID();
                default_id.type = VsqIDType.Singer;
                IconHandle singer_handle = new IconHandle();
                singer_handle.IconID   = "$0701" + PortUtil.toHexString(0, 4);
                singer_handle.IDS      = "Unknown";
                singer_handle.Index    = 0;
                singer_handle.Language = 0;
                singer_handle.setLength(1);
                singer_handle.Original = 0;
                singer_handle.Program  = 0;
                singer_handle.Caption  = "";
                default_id.IconHandle  = singer_handle;
            }
            else
            {
                default_id = singers[0];
            }

            for (Iterator <VsqEvent> itr = getSingerEventIterator(); itr.hasNext();)
            {
                VsqEvent   ve            = itr.next();
                IconHandle singer_handle = (IconHandle)ve.ID.IconHandle;
                int        program       = singer_handle.Program;
                bool       found         = false;
                for (int i = 0; i < singers_size; i++)
                {
                    VsqID id = singers[i];
                    if (program == singer_handle.Program)
                    {
                        ve.ID = (VsqID)id.clone();
                        found = true;
                        break;
                    }
                }
                if (!found)
                {
                    VsqID add = (VsqID)default_id.clone();
                    add.IconHandle.Program = program;
                    ve.ID = add;
                }
            }
            MetaText.Common.Version = new_renderer;
        }
示例#8
0
        public int add(VsqEvent item)
        {
            int id = getNextId(0);

            add(item, id);
            Events.Sort();
            int count = Events.Count;

            for (int i = 0; i < count; i++)
            {
                m_ids[i] = Events[i].InternalID;
            }
            return(id);
        }
示例#9
0
        public int findIndexFromID(int internal_id)
        {
            int c = Events.Count;

            for (int i = 0; i < c; i++)
            {
                VsqEvent item = Events[i];
                if (item.InternalID == internal_id)
                {
                    return(i);
                }
            }
            return(-1);
        }
示例#10
0
        public static VsqCommand generateCommandEventReplaceRange(int track, VsqEvent[] items)
        {
            VsqCommand command = new VsqCommand();

            command.Type    = VsqCommandType.EVENT_REPLACE_RANGE;
            command.Args    = new Object[2];
            command.Args[0] = track;
            VsqEvent[] objs = new VsqEvent[items.Length];
            for (int i = 0; i < items.Length; i++)
            {
                objs[i] = (VsqEvent)items[i].clone();
            }
            command.Args[1] = objs;
            return(command);
        }
示例#11
0
        public static VsqCommand generateCommandEventAddRange(int track, VsqEvent[] items)
        {
            VsqCommand command = new VsqCommand();

            command.Type    = VsqCommandType.EVENT_ADD_RANGE;
            command.Args    = new Object[2];
            command.Args[0] = track;
            VsqEvent[] cp_items = new VsqEvent[items.Length];
            for (int i = 0; i < items.Length; i++)
            {
                cp_items[i] = (VsqEvent)items[i].clone();
            }
            command.Args[1] = cp_items;
            return(command);
        }
示例#12
0
 public static bool Edit(cadencii.vsq.VsqFile Vsq)
 {
     for (int i = 1; i < Vsq.Track.size(); i++)
     {
         for (Iterator <VsqEvent> itr = Vsq.Track.get(i).getNoteEventIterator(); itr.hasNext();)
         {
             cadencii.vsq.VsqEvent item = itr.next();
             if (item.ID.Note < 127)
             {
                 item.ID.Note++;
             }
         }
     }
     return(true);
 }
示例#13
0
        /// <summary>
        /// 指定したゲートタイムにおいて、歌唱を担当している歌手のVsqEventを取得します.
        /// </summary>
        /// <param name="clock"></param>
        /// <returns></returns>
        public VsqEvent getSingerEventAt(int clock)
        {
            VsqEvent last = null;

            for (Iterator <VsqEvent> itr = getSingerEventIterator(); itr.hasNext();)
            {
                VsqEvent item = itr.next();
                if (clock < item.Clock)
                {
                    return(last);
                }
                last = item;
            }
            return(last);
        }
示例#14
0
 public static bool Edit(cadencii.vsq.VsqFile Vsq)
 {
     for (int i = 1; i < Vsq.Track.size(); i++)
     {
         for (Iterator <VsqEvent> itr = Vsq.Track.get(i).getNoteEventIterator(); itr.hasNext();)
         {
             cadencii.vsq.VsqEvent item = itr.next();
             // 32分音符の長さは,クロック数に直すと60クロック
             if (item.ID.Length > 60)
             {
                 item.ID.Length -= 60;
             }
         }
     }
     return(true);
 }
示例#15
0
        /// <summary>
        /// 指定した位置に,指定した量の空白を挿入します
        /// </summary>
        /// <param name="clock_start">空白を挿入する位置</param>
        /// <param name="clock_amount">挿入する空白の量</param>
        public void insertBlank(int clock_start, int clock_amount)
        {
            // イベントをシフト
            for (Iterator <VsqEvent> itr = getEventIterator(); itr.hasNext();)
            {
                VsqEvent item = itr.next();
                if (item.ID.type == VsqIDType.Singer && item.Clock <= 0)
                {
                    continue;
                }
                if (clock_start <= item.Clock)
                {
                    item.Clock += clock_amount;
                }
            }

            // コントロールカーブをシフト
            foreach (string name in CURVES)
            {
                VsqBPList list = getCurve(name);
                if (list == null)
                {
                    continue;
                }

                // 後ろからシフトしないといけない
                int size = list.size();
                for (int i = size - 1; i >= 0; i--)
                {
                    int clock = list.getKeyClock(i);
                    if (clock_start <= clock)
                    {
                        int value = list.getElementA(i);
                        list.move(clock, clock + clock_amount, value);
                    }
                }
            }
        }
示例#16
0
 public static bool Edit(cadencii.vsq.VsqFile Vsq)
 {
     System.IO.StreamWriter sw = null;
     try {
         sw = new System.IO.StreamWriter(@"c:\lyrics.txt");
         for (Iterator <VsqEvent> itr = Vsq.Track.get(1).getNoteEventIterator(); itr.hasNext();)
         {
             cadencii.vsq.VsqEvent item = itr.next();
             int    clStart             = item.Clock;
             int    clEnd    = clStart + item.ID.Length;
             double secStart = Vsq.getSecFromClock(clStart);
             double secEnd   = Vsq.getSecFromClock(clEnd);
             sw.WriteLine(secStart + "\t" + secEnd + "\t" + item.ID.LyricHandle.L0.Phrase + "\t" + item.ID.LyricHandle.L0.PhoneticSymbol);
         }
     } catch {
         return(false);
     } finally {
         if (sw != null)
         {
             sw.Close();
         }
     }
     return(true);
 }
示例#17
0
 public int addEvent(VsqEvent item)
 {
     return(MetaText.getEventList().add(item));
 }
示例#18
0
 public void setEvent(int index, VsqEvent item)
 {
     MetaText.getEventList().setElement(index, item);
 }
示例#19
0
 public void setElement(int index, VsqEvent value)
 {
     value.InternalID = Events[index].InternalID;
     Events[index]    = value;
 }
示例#20
0
        /// <summary>
        /// このトラックの指定した範囲を削除し,削除範囲以降の部分を削除開始位置までシフトします
        /// </summary>
        /// <param name="clock_start"></param>
        /// <param name="clock_end"></param>
        public void removePart(int clock_start, int clock_end)
        {
            int dclock = clock_end - clock_start;

            // 削除する範囲に歌手変更イベントが存在するかどうかを検査。
            VsqEvent t_last_singer = null;

            for (Iterator <VsqEvent> itr = getSingerEventIterator(); itr.hasNext();)
            {
                VsqEvent ve = itr.next();
                if (clock_start <= ve.Clock && ve.Clock < clock_end)
                {
                    t_last_singer = ve;
                }
                if (ve.Clock == clock_end)
                {
                    t_last_singer = null; // 後でclock_endの位置に補うが、そこにに既に歌手変更イベントがあるとまずいので。
                }
            }
            VsqEvent last_singer = null;

            if (t_last_singer != null)
            {
                last_singer       = (VsqEvent)t_last_singer.clone();
                last_singer.Clock = clock_end;
            }

            bool changed = true;

            // イベントの削除
            while (changed)
            {
                changed = false;
                int numEvents = getEventCount();
                for (int i = 0; i < numEvents; i++)
                {
                    VsqEvent itemi = getEvent(i);
                    if (clock_start <= itemi.Clock && itemi.Clock < clock_end)
                    {
                        removeEvent(i);
                        changed = true;
                        break;
                    }
                }
            }

            // クロックのシフト
            if (last_singer != null)
            {
                addEvent(last_singer); //歌手変更イベントを補う
            }
            int num_events = getEventCount();

            for (int i = 0; i < num_events; i++)
            {
                VsqEvent itemi = getEvent(i);
                if (clock_end <= itemi.Clock)
                {
                    itemi.Clock -= dclock;
                }
            }

            for (int i = 0; i < VsqTrack.CURVES.Length; i++)
            {
                string    curve  = VsqTrack.CURVES[i];
                VsqBPList bplist = getCurve(curve);
                if (bplist == null)
                {
                    continue;
                }
                VsqBPList buf_bplist = (VsqBPList)bplist.clone();
                bplist.clear();
                int  value_at_end = buf_bplist.getValue(clock_end);
                bool at_end_added = false;
                foreach (var key in buf_bplist.keyClockIterator())
                {
                    if (key < clock_start)
                    {
                        bplist.add(key, buf_bplist.getValue(key));
                    }
                    else if (clock_end <= key)
                    {
                        if (key == clock_end)
                        {
                            at_end_added = true;
                        }
                        bplist.add(key - dclock, buf_bplist.getValue(key));
                    }
                }
                if (!at_end_added)
                {
                    bplist.add(clock_end - dclock, value_at_end);
                }
            }
        }
示例#21
0
    private static void hamori(cadencii.vsq.VsqFile vsq, int basecode, int opt)
    {
        // opt : 0 -> 3度上, 1 -> 5度上, 2 -> 4度下
        //            4(or 3)     7           -5
        // 3度上(Cmaj)
        // C     D     E  F     G     A     B
        // 4, 4, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3
        int step = (new int[] { 4, 7, -5 })[opt];

        int note;
        Dictionary <int, int> target_ids = new Dictionary <int, int>();

        for (cadencii.java.util.Iterator <SelectedEventEntry> itr = AppManager.itemSelection.getEventIterator(); itr.hasNext();)
        {
            SelectedEventEntry see = itr.next();
            target_ids.Add(see.original.InternalID, 0);
        }
        int track = AppManager.getSelected();
        int tmp;

        if (opt == 0)
        {
            for (int j = 0; j < vsq.Track.get(track).getEventCount(); j++)
            {
                cadencii.vsq.VsqEvent item = vsq.Track.get(track).getEvent(j);
                if (item.ID.type == cadencii.vsq.VsqIDType.Anote && target_ids.ContainsKey(item.InternalID))
                {
                    tmp  = (item.ID.Note + 12 - basecode) % 12;
                    step = ((1 < tmp && tmp < 5) || 8 < tmp) ? 3 : 4;
                    note = item.ID.Note + step;
                    if (note < 0)
                    {
                        note = 0;
                    }
                    if (127 < note)
                    {
                        note = 127;
                    }
                    item.ID.Note = note;
                }
            }
        }
        else
        {
            for (int j = 0; j < vsq.Track.get(track).getEventCount(); j++)
            {
                cadencii.vsq.VsqEvent item = vsq.Track.get(track).getEvent(j);
                if (item.ID.type == cadencii.vsq.VsqIDType.Anote && target_ids.ContainsKey(item.InternalID))
                {
                    tmp  = (item.ID.Note + 12 - basecode) % 12;
                    tmp  = tmp == 11 ? step - 1 : step;
                    note = item.ID.Note + tmp;
                    if (note < 0)
                    {
                        note = 0;
                    }
                    if (127 < note)
                    {
                        note = 127;
                    }
                    item.ID.Note = note;
                }
            }
        }
    }
示例#22
0
        /// <summary>
        /// クレッシェンド,デクレッシェンド,および強弱記号をダイナミクスカーブに反映させます.
        /// この操作によって,ダイナミクスカーブに設定されたデータは全て削除されます.
        /// </summary>
        public void reflectDynamics()
        {
            VsqBPList dyn = getCurve("dyn");

            dyn.clear();
            for (Iterator <VsqEvent> itr = getDynamicsEventIterator(); itr.hasNext();)
            {
                VsqEvent           item   = itr.next();
                IconDynamicsHandle handle = item.ID.IconDynamicsHandle;
                if (handle == null)
                {
                    continue;
                }
                int clock  = item.Clock;
                int length = item.ID.getLength();

                if (handle.isDynaffType())
                {
                    // 強弱記号
                    dyn.add(clock, handle.getStartDyn());
                }
                else
                {
                    // クレッシェンド,デクレッシェンド
                    int start_dyn = dyn.getValue(clock);

                    // 範囲内のアイテムを削除
                    int count = dyn.size();
                    for (int i = count - 1; i >= 0; i--)
                    {
                        int c = dyn.getKeyClock(i);
                        if (clock <= c && c <= clock + length)
                        {
                            dyn.removeElementAt(i);
                        }
                        else if (c < clock)
                        {
                            break;
                        }
                    }

                    VibratoBPList bplist = handle.getDynBP();
                    if (bplist == null || (bplist != null && bplist.getCount() <= 0))
                    {
                        // カーブデータが無い場合
                        double a = 0.0;
                        if (length > 0)
                        {
                            a = (handle.getEndDyn() - handle.getStartDyn()) / (double)length;
                        }
                        int last_val = start_dyn;
                        for (int i = clock; i < clock + length; i++)
                        {
                            int val = start_dyn + (int)(a * (i - clock));
                            if (val < dyn.getMinimum())
                            {
                                val = dyn.getMinimum();
                            }
                            else if (dyn.getMaximum() < val)
                            {
                                val = dyn.getMaximum();
                            }
                            if (last_val != val)
                            {
                                dyn.add(i, val);
                                last_val = val;
                            }
                        }
                    }
                    else
                    {
                        // カーブデータがある場合
                        int last_val   = handle.getStartDyn();
                        int last_clock = clock;
                        int bpnum      = bplist.getCount();
                        int last       = start_dyn;

                        // bplistに指定されている分のデータ点を追加
                        for (int i = 0; i < bpnum; i++)
                        {
                            VibratoBPPair point      = bplist.getElement(i);
                            int           pointClock = clock + (int)(length * point.X);
                            if (pointClock <= last_clock)
                            {
                                continue;
                            }
                            int    pointValue = point.Y;
                            double a          = (pointValue - last_val) / (double)(pointClock - last_clock);
                            for (int j = last_clock; j <= pointClock; j++)
                            {
                                int val = start_dyn + (int)((j - last_clock) * a);
                                if (val < dyn.getMinimum())
                                {
                                    val = dyn.getMinimum();
                                }
                                else if (dyn.getMaximum() < val)
                                {
                                    val = dyn.getMaximum();
                                }
                                if (val != last)
                                {
                                    dyn.add(j, val);
                                    last = val;
                                }
                            }
                            last_val   = point.Y;
                            last_clock = pointClock;
                        }

                        // bplistの末尾から,clock => clock + lengthまでのデータ点を追加
                        int last2 = last;
                        if (last_clock < clock + length)
                        {
                            double a = (handle.getEndDyn() - last_val) / (double)(clock + length - last_clock);
                            for (int j = last_clock; j < clock + length; j++)
                            {
                                int val = last2 + (int)((j - last_clock) * a);
                                if (val < dyn.getMinimum())
                                {
                                    val = dyn.getMinimum();
                                }
                                else if (dyn.getMaximum() < val)
                                {
                                    val = dyn.getMaximum();
                                }
                                if (val != last)
                                {
                                    dyn.add(j, val);
                                    last = val;
                                }
                            }
                        }
                    }
                }
            }
        }
示例#23
0
    public static bool Edit(cadencii.vsq.VsqFile vsq)
    {
        // 選択されているアイテム(のInternalID)をリストアップ
        System.Collections.Generic.List <int> ids = new System.Collections.Generic.List <int>();
        for (Iterator <SelectedEventEntry> itr = AppManager.itemSelection.getEventIterator(); itr.hasNext();)
        {
            SelectedEventEntry entry = itr.next();
            ids.Add(entry.original.InternalID);
        }

        cadencii.vsq.VsqTrack track = vsq.Track.get(AppManager.getSelected());

        // コントロールカーブの時間方向の解像度を,Cadenciiの設定値から取得
        int resol = AppManager.editorConfig.getControlCurveResolutionValue();

        for (int i = 0; i < ids.Count; i++)
        {
            int internal_id = ids[i];

            for (Iterator <VsqEvent> itr = track.getNoteEventIterator(); itr.hasNext();)
            {
                cadencii.vsq.VsqEvent item = itr.next();
                // 指定されたInternalIDと同じなら,編集する
                if (item.InternalID == internal_id)
                {
                    // Brightnessカーブを取得
                    cadencii.vsq.VsqBPList bri = track.getCurve("BRI");

                    // 音符の最後の位置でのBRIを取得.処理の最後で追加
                    int value_at_end = bri.getValue(item.Clock + item.ID.Length);

                    // これから編集しようとしている範囲にすでに値がある場合,邪魔なので削除する
                    for (Iterator <int> itr2 = bri.keyClockIterator(); itr.hasNext();)
                    {
                        int clock = itr2.next();
                        System.Console.WriteLine("clock=" + clock);
                        if (item.Clock <= clock && clock <= item.Clock + item.ID.Length)
                        {
                            itr2.remove();
                        }
                    }

                    // 直前に指定したBRI値.最初はありえない値にしておく
                    int last_v = -1;

                    // 時間方向解像度(resol)ごとのクロックに対して,順次BRIを設定
                    for (int clock = item.Clock; clock <= item.Clock + item.ID.Length; clock += resol)
                    {
                        // BRIを取得.x=0が音符の先頭,x=1が音符の末尾.getCurve関数は,この仕様を満たすようにBRIを返すように,お好みで定義
                        float x = (clock - item.Clock) / (float)item.ID.Length;
                        int   v = getCurve(x);

                        if (last_v != v)
                        {
                            // 直前に指定した値と違うときだけ追加.
                            bri.add(clock, v);
                        }

                        // 「直前の値」を更新
                        last_v = v;
                    }

                    // 音符末尾の位置のBRIを強制的に元の値に戻す.これをやらないと,
                    // その音符の末尾以降のBRIがそのまま編集の影響を受けてしまう
                    bri.add(item.Clock + item.ID.Length, value_at_end);
                    break;
                }
            }
        }
        return(true);
    }
示例#24
0
 public void addEvent(VsqEvent item, int internal_id)
 {
     MetaText.Events.add(item, internal_id);
 }