1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341
|
using System;
using System.IO;
using System.Windows.Forms;
using org.kbinani.cadencii;
using org.kbinani.media;
using org.kbinani.vsq;
using org.kbinani.java.util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
public class SmartHtml {
public static void Main( string[] args ) {
if ( args.Length != 2 ) {
return;
}
string indir = args[0];
string outdir = args[1];
if ( !Directory.Exists( indir ) || !Directory.Exists( outdir ) ) {
Console.WriteLine( "error; directory not exists" );
return;
}
List<string> files = new List<string>( Directory.GetFiles( "*.htm" ) );
files.AddRange( Directory.GetFiles( "*.html" ) );
foreach ( string name in files ) {
string path = Path.Combine( indir, name );
XmlDocument doc = new XmlDocument();
doc.Load( path );
XmlTextWriter xtw = new XmlTextWriter( new FileStream( Path.Combine( outdir, name ), FileMode.OpenOrCreate, FileAccess.Write ), System.Text.Encoding.GetEncoding( "Shift_JIS" ) );
doc.WriteTo( xtw );
xtw.Close();
}
}
}
/*public class Search {
public static bool Edit( VsqFile vsq ) {
int selectedid = -1;
Form f;
int track = AppManager.getSelected();
bool begin_count = false;
if ( AppManager.getSelectedEventCount() <= 0 ) {
// 選択状態の音符がひとつも無い場合。
// 曲の最初の音符から検索することにする
for ( Iterator<VsqEvent> itr = vsq.Track[track].getNoteEventIterator(); itr.hasNext(); ) {
VsqEvent item = itr.next();
selectedid = item.InternalID;
break;
}
if ( selectedid < 0 ) {
// 音符が1つも配置されていない場合、何もせず戻る
return true;
}
begin_count = true;
} else {
selectedid = AppManager.getLastSelectedEvent().original.InternalID;
}
for ( Iterator<VsqEvent> itr = vsq.Track[track].getNoteEventIterator(); itr.hasNext(); ) {
VsqEvent item = itr.next();
if ( item.InternalID == selectedid ) {
begin_count = true;
if ( AppManager.isSelectedEventContains( track, item.InternalID ) ) {
AppManager.removeSelectedEvent( item.InternalID );
continue;
}
}
if ( begin_count ) {
if ( item.ID.type == VsqIDType.Anote ) {
if ( item.ID.Length < 240 ) {
AppManager.addSelectedEvent( item.InternalID );
AppManager.setCurrentClock( item.Clock );
AppManager.mMainWindow.ensureCursorVisible();
break;
}
}
}
}
return true;
}
}*/
public static class AutoBRI {
public static bool Edit( org.kbinani.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 );
}
org.kbinani.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(); ) {
org.kbinani.vsq.VsqEvent item = itr.next();
// 指定されたInternalIDと同じなら,編集する
if ( item.InternalID == internal_id ) {
// Brightnessカーブを取得
org.kbinani.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;
}
/// <summary>
/// 音符の先頭からの位置(x)におけるBRI値を計算する.音符の先頭がx=0,音符の末尾がx=1に対応する
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private static int getCurve( float x ) {
return 64;
}
}
public class AutoBRITool : IPaletteTool {
/// <summary>
/// インターフェースIPaletteToolのメンバー
/// </summary>
/// <param name="track">編集対象のトラック</param>
/// <param name="manager">Cadenciiのマネージャ</param>
/// <param name="ids">クリックされたイベントのInternalIDが格納された配列</param>
/// <param name="button">クリックされたときのマウスボタン</param>
/// <returns></returns>
public bool edit( org.kbinani.vsq.VsqTrack track, int[] ids, System.Windows.Forms.MouseButtons button ) {
// コントロールカーブの時間方向の解像度を,Cadenciiの設定値から取得
int resol = AppManager.editorConfig.getControlCurveResolutionValue();
for ( int i = 0; i < ids.Length; i++ ) {
int internal_id = ids[i];
for ( Iterator<VsqEvent> itr = track.getNoteEventIterator(); itr.hasNext(); ) {
org.kbinani.vsq.VsqEvent item = itr.next();
// 指定されたInternalIDと同じなら,編集する
if ( item.InternalID == internal_id ) {
// Brightnessカーブを取得
org.kbinani.vsq.VsqBPList bri = track.getCurve( "BRI" );
// 音符の最後の位置でのBRIを取得.処理の最後で追加
int value_at_end = bri.getValue( item.Clock + item.ID.Length );
// これから編集しようとしている範囲にすでに値がある場合,邪魔なので削除する
for ( Iterator<int> itr2 = bri.keyClockIterator(); itr2.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;
}
/// <summary>
/// 音符の先頭からの位置(x)におけるBRI値を計算する.音符の先頭がx=0,音符の末尾がx=1に対応する
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private int getCurve( float x ) {
return 64;
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールの名前を返す.
/// </summary>
/// <param name="lang"></param>
/// <returns></returns>
public string getName( string lang ) {
return "Auto BRI";
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールの概要を返す.
/// </summary>
/// <param name="lang"></param>
/// <returns></returns>
public string getDescription( string lang ) {
return "edit BRI automatically";
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールが設定ダイアログを持っているかどうかを表すbool値を返す.
/// </summary>
/// <returns></returns>
public bool hasDialog() {
return false;
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールの設定ダイアログを開き,ダイアログの結果を返す.
/// </summary>
/// <returns></returns>
public System.Windows.Forms.DialogResult openDialog() {
return System.Windows.Forms.DialogResult.Cancel;
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールのUIを,指定した言語に変更する.
/// </summary>
/// <param name="lang"></param>
public void applyLanguage( string lang ) {
}
/// <summary>
/// IPaletteToolのメンバー.このパレットツールのアイコンを返す.
/// </summary>
/// <returns></returns>
public System.Drawing.Bitmap getIcon() {
return null;
}
}
public static class SaveMetaText {
public static bool Edit( org.kbinani.vsq.VsqFile vsq ) {
vsq.Track.get( 1 ).printMetaText( @"c:\meta_text.txt", "Shift_JIS" );
return true;
}
}
public static class PrintLyric {
public static bool Edit( org.kbinani.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(); ) {
org.kbinani.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 static class UpHalfStep {
public static bool Edit( org.kbinani.vsq.VsqFile Vsq ) {
for ( int i = 1; i < Vsq.Track.size(); i++ ) {
for ( Iterator<VsqEvent> itr = Vsq.Track.get( i ).getNoteEventIterator(); itr.hasNext(); ) {
org.kbinani.vsq.VsqEvent item = itr.next();
if ( item.ID.Note < 127 ) {
item.ID.Note++;
}
}
}
return true;
}
}
public static class Trim32 {
public static bool Edit( org.kbinani.vsq.VsqFile Vsq ) {
for ( int i = 1; i < Vsq.Track.size(); i++ ) {
for ( Iterator<VsqEvent> itr = Vsq.Track.get( i ).getNoteEventIterator(); itr.hasNext(); ) {
org.kbinani.vsq.VsqEvent item = itr.next();
// 32分音符の長さは,クロック数に直すと60クロック
if ( item.ID.Length > 60 ) {
item.ID.Length -= 60;
}
}
}
return true;
}
}
|