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); }
public void add(VsqEvent item, int internal_id) { updateIDList(); item.InternalID = internal_id; Events.Add(item); m_ids.Add(internal_id); }
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); }
/// <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); }
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); }
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; } } }
/// <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; }
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); }
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); }
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); }
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); }
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); }
/// <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); }
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); }
/// <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); } } } }
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); }
public int addEvent(VsqEvent item) { return(MetaText.getEventList().add(item)); }
public void setEvent(int index, VsqEvent item) { MetaText.getEventList().setElement(index, item); }
public void setElement(int index, VsqEvent value) { value.InternalID = Events[index].InternalID; Events[index] = value; }
/// <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); } } }
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; } } } }
/// <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; } } } } } } }
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); }
public void addEvent(VsqEvent item, int internal_id) { MetaText.Events.add(item, internal_id); }