using DTXCreator.WAV_BMP_AVI;\r
using DTXCreator.UndoRedo;\r
using DTXCreator.オプション関連;\r
+using DTXCreator.MIDIインポート;\r
using DTXCreator.汎用;\r
using DTXCreator.Properties;\r
using FDK;\r
public Cチップパレット dlgチップパレット;\r
private Cオプション管理 mgrオプション管理者 = null;\r
private C選択モード管理 mgr選択モード管理者 = null;\r
- private C編集モード管理 mgr編集モード管理者 = null;\r
+ internal C編集モード管理 mgr編集モード管理者 = null;\r
internal C譜面管理 mgr譜面管理者 = null;\r
internal CWAVリスト管理 mgrWAVリスト管理者 = null;\r
internal CBMPリスト管理 mgrBMPリスト管理者 = null;\r
internal CAVIリスト管理 mgrAVIリスト管理者 = null;\r
internal CUndoRedo管理 mgrUndoRedo管理者 = null;\r
internal Cクリップボード cbクリップボード = null;\r
+ private CMIDIインポート管理 mgrMIDIインポート管理者 = null;\r
\r
internal MakeTempDTX makeTempDTX = null;\r
\r
return this.numericUpDownBPM.Value;\r
}\r
}\r
- internal int n現在選択中のWAV・BMP・AVIリストの行番号0to1294;\r
+ internal int n現在選択中のWAV_BMP_AVIリストの行番号0to1294;\r
\r
/// <summary>\r
/// DTXC.exe のあるフォルダの絶対パス。\r
}\r
}\r
\r
+ /// <summary>\r
+ /// 最後にMIDIを読み込んだフォルダ\r
+ /// </summary>\r
+ public string strMIDIインポートフォルダ;\r
+\r
//-----------------\r
#endregion\r
\r
#region [ 全体を通して必要な管理者オブジェクトを生成する。]\r
//-----------------\r
this.mgrオプション管理者 = new Cオプション管理( this );\r
+ this.mgrMIDIインポート管理者 = new CMIDIインポート管理(this);\r
//-----------------\r
#endregion\r
\r
\r
if( Directory.Exists( this.str作業フォルダ名 ) )\r
{\r
- Directory.SetCurrentDirectory( this.str作業フォルダ名 );\r
+ //Directory.SetCurrentDirectory( this.str作業フォルダ名 ); // #35399: 2015/8/15 カレントディレクトリを変更すると、.NET4以降用にbuildしたDTXMania本体での再生に失敗するため、カレントディレクトリの変更を中止する\r
+ // #35399: ただし作業フォルダは維持する(書き設定行は不要だが、if分岐は残す必要あり)\r
+ // this.str作業フォルダ名 = this.appアプリ設定.LastWorkFolder; \r
}\r
else\r
{\r
}\r
//-----------------\r
#endregion\r
+ #region [ レーン表示/非表示の反映 #26005 2011.8.29 yyagi; added ]\r
+ for ( int i = 0; i < this.appアプリ設定.LanesInfo.Count; i++ )\r
+ {\r
+ for ( int j = 0; j < this.mgr譜面管理者.listレーン.Count; j++ )\r
+ {\r
+ if ( this.mgr譜面管理者.listレーン[ j ].strレーン名 == this.appアプリ設定.LanesInfo[ i ].Name )\r
+ {\r
+ this.mgr譜面管理者.listレーン[ j ].bIsVisible = this.appアプリ設定.LanesInfo[ i ].Checked;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ this.mgr譜面管理者.tRefreshDisplayLanes();\r
+ #endregion\r
+ #region [ 選択モード/編集モードの設定 ]\r
+ if ( this.appアプリ設定.InitialOperationMode )\r
+ {\r
+ this.t選択モードにする();\r
+ }\r
+ else\r
+ {\r
+ this.t編集モードにする();\r
+ }\r
+ #endregion\r
+ #region [ MIDIインポートフォルダ ]\r
+ //-----------------\r
+ this.strMIDIインポートフォルダ = this.appアプリ設定.LastMIDIImportFolder;\r
+ \r
+ if( ! Directory.Exists( this.strMIDIインポートフォルダ ) )\r
+ this.strMIDIインポートフォルダ = Directory.GetCurrentDirectory();\r
+ //-----------------\r
+ #endregion\r
+\r
}\r
private void tアプリ設定の保存()\r
{\r
this.str作業フォルダ名;\r
//-----------------\r
#endregion\r
-\r
+ #region [ レーン表示/非表示 #26005 2011.8.29 yyagi; added ]\r
+ this.appアプリ設定.LanesInfo.Clear();\r
+ foreach ( DTXCreator.譜面.Cレーン c in this.mgr譜面管理者.listレーン )\r
+ {\r
+ this.appアプリ設定.AddLanesInfo( c.strレーン名, c.bIsVisible );\r
+ }\r
+ #endregion\r
+ #region [ MIDIインポートフォルダ ]\r
+ //-----------------\r
+ this.appアプリ設定.LastMIDIImportFolder =\r
+ this.strMIDIインポートフォルダ;\r
+ //-----------------\r
+ #endregion\r
\r
// 保存する。\r
\r
#region [ アプリ設定をXML形式ファイルで出力する。 ]\r
//-----------------\r
var serializer = new XmlSerializer( typeof( AppSetting ) );\r
- var stream = new FileStream( str設定ファイル名, FileMode.Create );\r
- serializer.Serialize( (Stream) stream, this.appアプリ設定 );\r
- stream.Close();\r
+ using ( var stream = new FileStream( str設定ファイル名, FileMode.Create ) ) // #33204 2014.2.13 yyagi usingを使って、エラー発生時のファイルロックを回避\r
+ {\r
+ serializer.Serialize( (Stream) stream, this.appアプリ設定 );\r
+ }\r
//-----------------\r
#endregion\r
}\r
#endregion\r
#region [ 新規作成 ]\r
//-----------------\r
- private void tシナリオ・新規作成()\r
+ public void tシナリオ_新規作成()\r
{\r
// 作成前の保存確認。\r
\r
//-----------------\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBox曲名.Clear();\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBox製作者.Clear();\r
+ CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxGenre.Clear();\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxコメント.Clear();\r
CUndoRedo管理.bUndoRedoした直後 = true; this.numericUpDownBPM.Value = 120.0M;\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxDLEVEL.Text = "50";\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxSTAGEFILE.Clear();\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxBACKGROUND.Clear();\r
CUndoRedo管理.bUndoRedoした直後 = true; this.textBoxRESULTIMAGE.Clear();\r
+ CUndoRedo管理.bUndoRedoした直後 = true; this.check556x710BGAAVI.Checked = false;\r
//-----------------\r
#endregion\r
\r
this.listViewAVIリスト.Items.Clear();\r
this.mgrAVIリスト管理者 = new CAVIリスト管理( this, this.listViewAVIリスト );\r
\r
- this.tWAV・BMP・AVIリストのカーソルを全部同じ行に合わせる( 0 );\r
+ this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( 0 );\r
//-----------------\r
#endregion\r
\r
\r
#region [ 譜面の生成・初期化 ]\r
//-----------------\r
- this.mgr譜面管理者 = new C譜面管理( this );\r
- this.mgr譜面管理者.t初期化();\r
+ if ( this.mgr譜面管理者 == null ) // 初回起動時は、レーン表示有無の構成に初期値を使用(して、後でDTXCreatorConfig.settingsのものに置き換える)\r
+ {\r
+ this.mgr譜面管理者 = new C譜面管理( this );\r
+ this.mgr譜面管理者.t初期化();\r
+ }\r
+ else // 起動後のdtxファイル読み込み等の場合は、直前のレーン表示有無の構成を踏襲する\r
+ {\r
+ #region [ レーン表示/非表示状態の待避 #26005 2011.8.30 yyagi; added ]\r
+ List<Cレーン> lc = new List<Cレーン>(this.mgr譜面管理者.listレーン);\r
+ #endregion\r
+\r
+ this.mgr譜面管理者 = new C譜面管理( this );\r
+ this.mgr譜面管理者.t初期化();\r
+\r
+ #region [ レーン表示/非表示の反映 #26005 2011.8.30 yyagi; added ]\r
+ for ( int i = 0; i < this.mgr譜面管理者.listレーン.Count; i++ )\r
+ {\r
+ this.mgr譜面管理者.listレーン[ i ].bIsVisible = lc[ i ].bIsVisible;\r
+ }\r
+ this.mgr譜面管理者.tRefreshDisplayLanes();\r
+ #endregion\r
+ }\r
//-----------------\r
#endregion\r
\r
this.mgrUndoRedo管理者 = new CUndoRedo管理();\r
\r
CUndoRedo管理.bUndoRedoした直後 = false;\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
//-----------------\r
#endregion\r
\r
- #region [ ã\80\8cï¼\92大ã\83¢ã\83¼ã\83\89ã\80\8dã\81®ç®¡ç\90\86è\80\85ã\82\92ç\94\9fæ\88\90ã\80\81å\88\9dæ\9c\9fã\81¯ç·¨é\9b\86ã\83¢ã\83¼ã\83\89ã\81«ã\81\99ã\82\8b。]\r
+ #region [ ã\80\8cï¼\92大ã\83¢ã\83¼ã\83\89ã\80\8dã\81®ç®¡ç\90\86è\80\85ã\82\92ç\94\9fæ\88\90ã\80\81å\88\9dæ\9c\9fã\83¢ã\83¼ã\83\89ã\81¯ã\80\81è¨å®\9aå\80¤ã\81\8bã\82\89å\8f\96å¾\97ã\81\99ã\82\8bã\83»ã\83»ã\83»ã\81\8cã\80\81èµ·å\8b\95æ\99\82ã\81¯è\9cé\9d¢ç\94\9fæ\88\90å¾\8cã\81«è¨å®\9aå\80¤ã\82\92èªã\81¿ã\81 ã\81\99ã\81®ã\81§ã\80\81è¨å®\9aå\80¤èªã\81¿å\87ºã\81\97å¾\8cã\81«å\86\8dè¨å®\9aã\81\99ã\82\8bã\81\93ã\81¨ã\80\82。]\r
//-----------------\r
this.mgr選択モード管理者 = new C選択モード管理( this );\r
this.mgr編集モード管理者 = new C編集モード管理( this );\r
- \r
- this.t編集モードにする();\r
+\r
+ if ( this.appアプリ設定.InitialOperationMode )\r
+ {\r
+ this.t選択モードにする();\r
+ }\r
+ else\r
+ {\r
+ this.t編集モードにする();\r
+ }\r
//-----------------\r
#endregion\r
\r
this.b未保存 = false;\r
//-----------------\r
#endregion\r
+ #region [ 再生制御用フラグを立てる。(DTXVに必ずリロードさせるため) ]\r
+ //-----------------\r
+ this.bDTXファイルを開いた = true;\r
+ //-----------------\r
+ #endregion\r
}\r
//-----------------\r
#endregion\r
#region [ 開く ]\r
//-----------------\r
- private void tシナリオ・開く()\r
+ private void tシナリオ_開く()\r
{\r
// 作成前の保存確認。\r
\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・DragDropされたファイルを開く( string[] DropFiles )\r
+ private void tシナリオ_DragDropされたファイルを開く( string[] DropFiles )\r
{\r
// 開くファイルを決定する。\r
\r
\r
#region [ ファイルを読み込む。]\r
//-----------------\r
- this.t演奏ファイルを開いて読み込む( strファイル名 );\r
+ string strExt = Path.GetExtension( strファイル名 ).ToLower();\r
+\r
+ if ( strExt.Equals(".dtx") )\r
+ {\r
+ this.t演奏ファイルを開いて読み込む( strファイル名 );\r
+ }\r
+ else if (strExt.Equals(".smf") || strExt.Equals(".mid"))\r
+ {\r
+ this.mgrMIDIインポート管理者.tMIDIインポート管理を開く( strファイル名 );\r
+ this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加\r
+ }\r
+ else\r
+ {\r
+ MessageBox.Show(\r
+ Resources.strDTXファイルではありませんMSG,\r
+ Resources.str確認ダイアログのタイトル,\r
+ MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
+\r
+ return; // 中断\r
+ }\r
//-----------------\r
#endregion\r
}\r
\r
this.strDTXファイル名 = Path.ChangeExtension( Path.GetFileName( strファイル名 ), ".dtx" ); // 拡張子は強制的に .dtx に変更。\r
this.str作業フォルダ名 = Path.GetDirectoryName( strファイル名 ) + @"\"; // 読み込み後、カレントフォルダは、作業ファイルのあるフォルダに移動する。\r
-\r
+ // #35399: カレントディレクトリの変更はしない。.NET4以降でbuildしたDTXMania本体で再生できなくなるため。\r
//-----------------\r
#endregion\r
\r
#endregion\r
#region [ 上書き保存/名前をつけて保存 ]\r
//-----------------\r
- private void tシナリオ・上書き保存()\r
+ private void tシナリオ_上書き保存()\r
{\r
// 前処理。\r
+ bool bDoSave = true;\r
\r
this.dlgチップパレット.t一時的に隠蔽する();\r
\r
\r
string str絶対パスファイル名 = this.tファイル保存ダイアログを開いてファイル名を取得する();\r
\r
- if( string.IsNullOrEmpty( str絶対パスファイル名 ) )\r
- return; // ファイル保存ダイアログがキャンセルされたのならここで打ち切り。\r
-\r
- //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\"; // ダイアログでディレクトリを変更した場合、カレントディレクトリも変更されている。\r
- this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";\r
- this.strDTXファイル名 = Path.GetFileName( str絶対パスファイル名 );\r
-\r
-\r
- // WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。\r
-\r
- this.mgrWAVリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
- this.mgrBMPリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
- this.mgrAVIリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
+ if (string.IsNullOrEmpty(str絶対パスファイル名))\r
+ {\r
+ bDoSave = false;\r
+ }\r
+ else\r
+ {\r
+ //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\"; // ダイアログでディレクトリを変更した場合、カレントディレクトリも変更されている。\r
+ this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";\r
+ this.strDTXファイル名 = Path.GetFileName(str絶対パスファイル名);\r
+\r
+ // WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。\r
+ this.mgrWAVリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
+ this.mgrBMPリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
+ this.mgrAVIリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
+ }\r
}\r
//-----------------\r
#endregion\r
\r
-\r
// DTXファイルへ出力。\r
+ if (bDoSave)\r
+ {\r
\r
+ #region [ 選択モードだったなら選択を解除する。]\r
+ //-----------------\r
+ if (this.b選択モードである)\r
+ this.mgr選択モード管理者.t全チップの選択を解除する();\r
+ //-----------------\r
+ #endregion\r
\r
- #region [ 選択モードだったなら選択を解除する。]\r
- //-----------------\r
- if( this.b選択モードである )\r
- this.mgr選択モード管理者.t全チップの選択を解除する();\r
- //-----------------\r
- #endregion\r
-\r
- #region [ DTXファイルを出力する。]\r
- //-----------------\r
- var sw = new StreamWriter( this.str作業フォルダ名 + this.strDTXファイル名, false, Encoding.GetEncoding( 932/*Shift-JIS*/ ) );\r
- new CDTX入出力( this ).tDTX出力( sw );\r
- sw.Close();\r
- //-----------------\r
- #endregion\r
+ #region [ DTXファイルを出力する。]\r
+ //-----------------\r
+ var sw = new StreamWriter(this.str作業フォルダ名 + this.strDTXファイル名, false, Encoding.GetEncoding("utf-16"));\r
+ new CDTX入出力(this).tDTX出力(sw);\r
+ sw.Close();\r
+ //-----------------\r
+ #endregion\r
\r
- #region [ 出力したファイルのパスを、[ファイル]メニューの最近使ったファイル一覧に追加する。 ]\r
- //-----------------\r
- this.appアプリ設定.AddRecentUsedFile( this.str作業フォルダ名 + this.strDTXファイル名 );\r
- this.t最近使ったファイルをFileメニューへ追加する();\r
- //-----------------\r
- #endregion\r
+ #region [ 出力したファイルのパスを、[ファイル]メニューの最近使ったファイル一覧に追加する。 ]\r
+ //-----------------\r
+ this.appアプリ設定.AddRecentUsedFile(this.str作業フォルダ名 + this.strDTXファイル名);\r
+ this.t最近使ったファイルをFileメニューへ追加する();\r
+ //-----------------\r
+ #endregion\r
\r
+ #region [ Viewer用の一時ファイルを削除する (修正+保存、直後のViewer再生時に、直前の修正が反映されなくなることへの対応) ]\r
+ tViewer用の一時ファイルを削除する();\r
+ #endregion\r
\r
- // 後処理。\r
+ // 後処理。\r
+ this.b未保存 = false;\r
+ }\r
\r
#region [「保存中です」ポップアップを閉じる。]\r
//-----------------\r
#endregion\r
\r
this.dlgチップパレット.t一時的な隠蔽を解除する();\r
- this.b未保存 = false;\r
}\r
- private void tシナリオ・名前をつけて保存()\r
+ private void tシナリオ_名前をつけて保存()\r
{\r
// 前処理。\r
\r
\r
// 保存する。\r
\r
- this.tシナリオ・上書き保存();\r
+ this.tシナリオ_上書き保存();\r
\r
\r
// 後処理。\r
#endregion\r
#region [ 終了 ]\r
//-----------------\r
- private void tシナリオ・終了()\r
+ private void tシナリオ_終了()\r
{\r
// ウィンドウを閉じる。\r
\r
#endregion\r
#region [ 検索/置換 ]\r
//-----------------\r
- private void tシナリオ・検索()\r
+ private void tシナリオ_検索()\r
{\r
this.mgr選択モード管理者.t検索する(); // モードによらず、検索はすべて選択モード管理者が行う。\r
}\r
- private void tシナリオ・置換()\r
+ private void tシナリオ_置換()\r
{\r
this.mgr選択モード管理者.t置換する(); // モードによらず、置換はすべて選択モード管理者が行う。\r
}\r
#endregion\r
#region [ 小節長変更/小節の挿入/小節の削除 ]\r
//-----------------\r
- private void tシナリオ・小節長を変更する( C小節 cs )\r
+ private void tシナリオ_小節長を変更する( C小節 cs )\r
{\r
// 前処理。\r
\r
\r
// 小節長を変更。\r
\r
- #region [ 小節長を変更する。]\r
//-----------------\r
int n変更開始小節番号 = cs.n小節番号0to3599;\r
int n変更終了小節番号 = ( dlg.b後続変更 ) ? this.mgr譜面管理者.n現在の最大の小節番号を返す() : cs.n小節番号0to3599;\r
\r
- for( int i = n変更開始小節番号; i <= n変更終了小節番号; i++ )\r
- this.t小節長を変更する・小節単位( i, dlg.f倍率 );\r
+ #region [ BEATレーンをすべてバックアップ(コピー)しておく。小節長変更でBEATチップが削除されると困るので。]\r
+ int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
+ List<Cチップ> listBEATチップ = new List<Cチップ>();\r
+ foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
+ {\r
+ C小節 c小節 = pair.Value;\r
+ for ( int index = 0; index < c小節.listチップ.Count; index++ )\r
+ {\r
+ if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT )\r
+ {\r
+ listBEATチップ.Add( c小節.listチップ[ index ] );\r
+ }\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ #region [ 小節長変更を実行する ]\r
+ for ( int n小節番号 = n変更開始小節番号; n小節番号 <= n変更終了小節番号; n小節番号++ )\r
+ {\r
+ #region [ 指定した小節が存在しなければ、中断 ]\r
+ C小節 c小節 = this.mgr譜面管理者.p小節を返す( n変更開始小節番号 );\r
+ if ( c小節 == null )\r
+ {\r
+ return; // 中断\r
+ }\r
+ #endregion\r
+\r
+ int n旧Grid数 = (int) ( c小節.f小節長倍率 * 192 + 0.5 );\r
+ int n新Grid数 = (int) ( dlg.f倍率 * 192 + 0.5 );\r
+ int nGrid増減 = n旧Grid数 - n新Grid数;\r
+\r
+ this.t小節長を変更する_小節単位( n小節番号, dlg.f倍率 );\r
+\r
+ // そして、Gridの増減があった分だけ、コピーしたBEATチップのGridを増減する\r
+ int nGrid_BAR = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n変更開始小節番号 );\r
+ for ( int index = 0; index < listBEATチップ.Count; index++ )\r
+ {\r
+ // Gridを増減するのは、小節長変更した小節以降のチップだけ。\r
+ // 更に、小節長変更した小節上では、新しい小節長で溢れた分のチップだけGridを増減する。\r
+ // (この条件で、Grid数が増えた場合も対応できている)\r
+ if ( \r
+ ( n小節番号 > n変更開始小節番号 ) ||\r
+ ( ( n小節番号 == n変更開始小節番号 ) && ( nGrid_BAR + n新Grid数 < listBEATチップ[ index ].n位置grid ) )\r
+ )\r
+ {\r
+ Cチップ cc = new Cチップ();\r
+ cc.tコピーfrom( listBEATチップ[ index ] );\r
+ cc.n位置grid += nGrid増減;\r
+ listBEATチップ[ index ] = cc;\r
+ }\r
+ }\r
\r
+ }\r
+ #endregion\r
//-----------------\r
+ \r
+ this.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
+\r
+ #region [ BEATレーンのチップを全削除する ]\r
+ //this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );\r
+ //this.tシナリオ・削除();\r
+ foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
+ {\r
+ C小節 c小節 = pair.Value;\r
+ for( int i = 0; i < c小節.listチップ.Count; i++ )\r
+ {\r
+ Cチップ cチップ = c小節.listチップ[ i ];\r
+\r
+ if( cチップ.nレーン番号0to == laneBEAT )\r
+ {\r
+ #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]\r
+ //-----------------\r
+ var cc = new Cチップ();\r
+ cc.tコピーfrom( cチップ );\r
+ \r
+ var ur = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
+\r
+ this.mgrUndoRedo管理者.tノードを追加する(\r
+ new CUndoRedoセル<Cチップ配置用UndoRedo>( \r
+ null, \r
+ new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ), \r
+ new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),\r
+ ur, ur ) );\r
+ //-----------------\r
+ #endregion\r
+ \r
+ // チップを小節のチップリストから削除する。\r
+ c小節.listチップ.RemoveAt( i );\r
+\r
+ // リストが更新されたので、最初のチップから見直す。\r
+ i = -1;\r
+ }\r
+ }\r
+ }\r
#endregion\r
\r
+ #region [ コピーしておいた(そして、nGridを更新した))BEATチップを、BEATレーンに戻す ]\r
+ foreach ( Cチップ cチップ in listBEATチップ )\r
+ {\r
+ this.mgr編集モード管理者.tBeatチップを配置する( cチップ.n位置grid, cチップ.n値_整数1to1295, cチップ.f値_浮動小数, cチップ.b裏 );\r
+ }\r
+ #endregion\r
\r
// 後処理。\r
-\r
this.b未保存 = true;\r
+ this.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
+ listBEATチップ.Clear();\r
+ listBEATチップ = null;\r
+\r
+ // 画面を再描画。\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+\r
}\r
- private void t小節長を変更する・小節単位( int n小節番号, float f倍率 )\r
+ public void t小節長を変更する_小節単位( int n小節番号, float f倍率 )\r
{\r
// 対象の小節を取得。\r
\r
#endregion\r
\r
#region [ 小節からはみ出したチップを削除する。チップの削除操作は Undo/Redo に記録する。]\r
+\r
//-----------------\r
for( int i = 0; i < c小節.listチップ.Count; i++ )\r
{\r
\r
// 画面を再描画。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
- private void tシナリオ・小節を挿入する( int n挿入位置の小節番号 )\r
+ private void tシナリオ_小節を挿入する( int n挿入位置の小節番号 )\r
{\r
// 作業を記録。\r
\r
\r
// 後処理。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
this.b未保存 = true;\r
}\r
- private void tシナリオ・小節を削除する( int n削除位置の小節番号 )\r
+ private void tシナリオ_小節を削除する( int n削除位置の小節番号 )\r
{\r
// 作業記録開始。\r
\r
\r
// 後処理。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
this.b未保存 = true;\r
}\r
#endregion\r
#region [ 選択チップの切り取り/コピー/貼り付け/削除 ]\r
//-----------------\r
- private void tシナリオ・切り取り()\r
+ private void tシナリオ_切り取り()\r
{\r
// 事前チェック。\r
\r
\r
#region [ 切り取り = コピー + 削除 ]\r
//-----------------\r
- this.tシナリオ・コピー();\r
- this.tシナリオ・削除();\r
+ this.tシナリオ_コピー();\r
+ this.tシナリオ_削除();\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・コピー()\r
+ private void tシナリオ_コピー()\r
{\r
// 事前チェック。\r
\r
\r
#region [ 画面を再描画する。]\r
//-----------------\r
- this.t選択チップの有無に応じて編集用GUIの有効・無効を設定する();\r
+ this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・貼り付け( int n譜面先頭からの位置grid )\r
+ private void tシナリオ_貼り付け( int n譜面先頭からの位置grid )\r
{\r
// 事前チェック。\r
\r
\r
#region [ 画面を再描画する。]\r
//-----------------\r
- this.t選択チップの有無に応じて編集用GUIの有効・無効を設定する();\r
+ this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・削除()\r
+ private void tシナリオ_削除()\r
{\r
// 事前チェック。\r
\r
\r
bool b削除されたチップがある = false;\r
bool b削除完了 = false;\r
+ int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
+ List<int> list削除処理済BEAT_index = new List<int>();\r
\r
while( !b削除完了 )\r
{\r
#endregion\r
\r
\r
- // チップオブジェクトを削除する。\r
-\r
- c小節.listチップ.Remove( cチップ );\r
- \r
- \r
- // フラグを設定してループする。\r
-\r
- b削除完了 = false; // まだ終わらんよ\r
- b削除されたチップがある = true;\r
- break;\r
+ #region [ チップオブジェクトを削除する。ただしBEATオブジェクトは削除禁止。表裏を反転するだけ。]\r
+ if ( cチップ.nレーン番号0to != laneBEAT )\r
+ {\r
+ c小節.listチップ.Remove( cチップ );\r
+\r
+ // フラグを設定してループする。(foreachのlistを更新しているため)\r
+ b削除完了 = false; // まだ終わらんよ\r
+ b削除されたチップがある = true;\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ int p = c小節.listチップ.IndexOf( cチップ );\r
+ if ( !list削除処理済BEAT_index.Contains( p ) ) // まだ裏表反転したことがないチップならば\r
+ {\r
+ cチップ.nチャンネル番号00toFF = ( cチップ.b裏 ) ? 0xF3 : 0xF8; // 表裏反転\r
+ cチップ.b裏 = !cチップ.b裏;\r
+ c小節.listチップ[ p ] = cチップ;\r
+ list削除処理済BEAT_index.Add( p );\r
+\r
+ // フラグを設定してループする。(foreachのlistを更新しているため)\r
+ b削除完了 = false; // まだ終わらんよ\r
+ b削除されたチップがある = true;\r
+ break;\r
+ }\r
+ }\r
+ #endregion\r
}\r
}\r
//-----------------\r
#endregion\r
}\r
+ list削除処理済BEAT_index.Clear();\r
+ list削除処理済BEAT_index = null;\r
\r
#region [ 1つでもチップを削除したなら、未保存フラグを立てる。 ]\r
//-----------------\r
\r
// 画面を再描画する。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
- this.t選択チップの有無に応じて編集用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+ this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
}\r
//-----------------\r
#endregion\r
#region [ DTXViewer での再生・停止 ]\r
//-----------------\r
- private void tシナリオ・Viewerで最初から再生する()\r
+ private void tシナリオ_Viewerで最初から再生する()\r
{\r
- this.tViewer用の一時ファイルを出力する( false );\r
+ #region [ DTXViewer 用の一時ファイルを出力する。]\r
+ //-----------------\r
+ this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
+ this.b前回BGMありで再生した = true;\r
+ //-----------------\r
+ #endregion\r
\r
#region [ 再生開始オプション引数に一時ファイルを指定して DTXViewer プロセスを起動する。]\r
//-----------------\r
\r
#region [ DTXViewer が起動していなければ起動する。]\r
//-----------------\r
- Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
+ // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
+ // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
//-----------------\r
#endregion\r
\r
#region [ 実行中の DTXViewer に再生オプションを渡す。 ]\r
//-----------------\r
- Process.Start( strDTXViewerのパス, \r
- this.appアプリ設定.ViewerInfo.PlayStartOption + " " + this.strViewer演奏用一時ファイル名 );\r
+ Process.Start( strDTXViewerのパス,\r
+ this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartOption + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
//-----------------\r
#endregion\r
}\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・Viewerで現在位置から再生する()\r
+ private void tシナリオ_Viewerで現在位置から再生する()\r
{\r
- this.tViewer用の一時ファイルを出力する( false );\r
+ #region [ DTXViewer 用の一時ファイルを出力する。]\r
+ //-----------------\r
+ this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
+ this.b前回BGMありで再生した = true;\r
+ //-----------------\r
+ #endregion\r
\r
try\r
{\r
\r
#region [ DTXViewer が起動していなければ起動する。]\r
//-----------------\r
- \r
- Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
- \r
+ // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
+ // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
//-----------------\r
#endregion\r
\r
this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
\r
Process.Start( strDTXViewerのパス,\r
- this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 );\r
+ this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
\r
//-----------------\r
#endregion\r
#endregion\r
}\r
}\r
- private void tシナリオ・Viewerで現在位置からBGMのみ再生する()\r
+ private void tシナリオ_Viewerで現在位置からBGMのみ再生する()\r
{\r
#region [ DTXViewer 用の一時ファイルを出力する。]\r
//-----------------\r
- this.tViewer用の一時ファイルを出力する( true );\r
+ this.tViewer用の一時ファイルを出力する( true, this.b未保存 | this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
+ this.b前回BGMありで再生した = false;\r
//-----------------\r
#endregion\r
\r
\r
#region [ DTXViewer が起動していなければ起動する。]\r
//-----------------\r
- Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
+ // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
+ // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 ); // 起動完了まで最大20秒待つ\r
//-----------------\r
#endregion\r
\r
//-----------------\r
C小節 c小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
Process.Start( strDTXViewerのパス,\r
- this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 );\r
+ this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
//-----------------\r
#endregion\r
}\r
#endregion\r
}\r
}\r
- private void tシナリオ・Viewerを再生停止する()\r
+ private void tシナリオ_Viewerを再生停止する()\r
{\r
try\r
{\r
}\r
\r
private string strViewer演奏用一時ファイル名 = "";\r
- private void tViewer用の一時ファイルを出力する( bool bBGMのみ出力 )\r
+ private void tViewer用の一時ファイルを出力する( bool bBGMのみ出力, bool b前回から更新があった )\r
{\r
// 一時ファイル名を自動生成。\r
\r
+ // 前回から更新がなければ(連続して再生ボタンを押した、など)、前回の生成ファイルをそのまま返す。\r
+ // (初めての再生の場合は、tempファイル未生成のため、このまま生成フローを続ける。)\r
+ if ( !b前回から更新があった && File.Exists( Path.Combine( this.mgr譜面管理者.strPATH_WAV, this.strViewer演奏用一時ファイル名 ) ) )\r
+ {\r
+ return;\r
+ }\r
+\r
+ // 再生速度変更フラグをリセット。\r
+ b再生速度を変更した = false;\r
+ bDTXファイルを開いた = false;\r
+\r
//this.strViewer演奏用一時ファイル名 = Path.GetTempFileName(); //\r
this.strViewer演奏用一時ファイル名 = makeTempDTX.GetTempFileName(); // #24746 2011.4.1 yyagi add; a countermeasure for temp-flooding\r
\r
this.mgr譜面管理者.strPATH_WAV = "";\r
}\r
}\r
+ private void tViewer用の一時ファイルを削除する()\r
+ {\r
+ this.strViewer演奏用一時ファイル名 = ""; // #35351 2015.7.23 yyagi add; to fix viewer plyback correctly just after save.\r
+ }\r
//-----------------\r
#endregion\r
#region [ Undo / Redo ]\r
//-----------------\r
- private void tシナリオ・Undoする()\r
+ private void tシナリオ_Undoする()\r
{\r
// Undo を実行する。\r
\r
\r
#region [ GUI を再描画する。]\r
//-----------------\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
- this.t選択チップの有無に応じて編集用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+ this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
//-----------------\r
#endregion\r
}\r
- private void tシナリオ・Redoする()\r
+ private void tシナリオ_Redoする()\r
{\r
// Redo を実行する。\r
\r
\r
#region [ GUI を再描画する。]\r
//-----------------\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
- this.t選択チップの有無に応じて編集用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+ this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
this.pictureBox譜面パネル.Refresh();\r
//-----------------\r
#endregion\r
this.toolStripMenuItem選択モード.CheckState = CheckState.Unchecked;\r
this.toolStripMenuItem編集モード.CheckState = CheckState.Checked;\r
}\r
- public void t選択チップの有無に応じて編集用GUIの有効・無効を設定する()\r
+ public void t選択チップの有無に応じて編集用GUIの有効無効を設定する()\r
{\r
bool b譜面上に選択チップがある = this.b選択チップがある;\r
bool bクリップボードに選択チップがある = ( this.cbクリップボード != null ) && ( this.cbクリップボード.nセル数 > 0 );\r
}\r
public void t選択モードのコンテクストメニューを表示する( int x, int y )\r
{\r
- // メニューを表示。\r
-\r
- this.contextMenuStrip譜面右メニュー.Show( this.pictureBox譜面パネル, x, y );\r
-\r
- \r
// メニューの左上隅座標を控えておく。\r
\r
this.pt選択モードのコンテクストメニューを開いたときのマウスの位置 = new Point( x, y );\r
+ \r
+ #region [ クリックされた箇所のレーン番号を取得する。]\r
+ //-----------------\r
+ int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( pt選択モードのコンテクストメニューを開いたときのマウスの位置.X );\r
+ string strLane = (lane < 0)? "" : this.mgr譜面管理者.listレーン[ lane ].strレーン名;\r
+ //-----------------\r
+ #endregion\r
+\r
+ #region [ クリックされた箇所の小節番号を取得する。]\r
+ //-----------------\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( pt選択モードのコンテクストメニューを開いたときのマウスの位置.Y );\r
+ C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
+ if ( csクリックされた小節 == null ) return; // 小節が生成されていないところで右クリックした場合は何もしない(NullReferenceException回避)\r
+ int nPartNo = csクリックされた小節.n小節番号0to3599;\r
+ string strPartNo = C変換.str小節番号を文字列3桁に変換して返す( nPartNo );\r
+ //-----------------\r
+ #endregion\r
+\r
+ #region [ コンテクストメニューの[選択]項目に、レーン名と小節番号の情報をを付与する。 ]\r
+ int indexMenuLaneSelect1 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択1" );\r
+ int indexMenuLaneSelect2 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降2" );\r
+ int indexMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItem小節内のすべてのチップの選択" );\r
+\r
+ string strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text;\r
+ strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(\r
+ strItemMenuLaneSelect , @"\[(.*)\]", "[" + strLane + "]" );\r
+ this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text = strItemMenuLaneSelect;\r
+\r
+ strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text;\r
+ strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(\r
+ strItemMenuLaneSelect, @"\[(.*)\]", "[" + strLane + "]" );\r
+ this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text = strItemMenuLaneSelect;\r
+\r
+ string strItemMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text;\r
+ strItemMenuPartSelect = System.Text.RegularExpressions.Regex.Replace(\r
+ strItemMenuPartSelect, @"\[(.*)\]", "[" + strPartNo + "]" );\r
+ this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text = strItemMenuPartSelect;\r
+ #endregion\r
+\r
+ // メニューを表示。\r
+\r
+ this.contextMenuStrip譜面右メニュー.Show( this.pictureBox譜面パネル, x, y );\r
}\r
public void t最近使ったファイルをFileメニューへ追加する()\r
{\r
\r
#region [ ToolStripMenuItem を手動で作って [ファイル] のサブメニューリストに追加する。]\r
//-----------------\r
+ string strShotenPath = AdjustPathString( path ); // #35890 2016.1.3 yyagi; shorten "RecentFiles" text if needed\r
var item2 = new ToolStripMenuItem() {\r
Name = "最近使ったファイル" + i,\r
Size = this.toolStripMenuItem終了.Size,\r
- Text = "&" + i + " " + path,\r
+ Text = "&" + i + " " + strShotenPath,\r
+ ToolTipText = path,\r
};\r
item2.Click += new EventHandler( this.toolStripMenuItem最近使ったファイル_Click );\r
this.toolStripMenuItemファイル.DropDownItems.Add( item2 );\r
//-----------------\r
#endregion\r
}\r
- public void tWAV・BMP・AVIリストのカーソルを全部同じ行に合わせる( int nIndex番号0to1294 )\r
+ // 参考: http://gushwell.ldblog.jp/archives/50815731.html\r
+ private string AdjustPathString( string text )\r
+ {\r
+ int nTargetWidth = (int)(this.Width * 0.8f);\r
+ Bitmap bmp = new Bitmap(nTargetWidth, this.Height);\r
+ Graphics g = Graphics.FromImage( bmp );\r
+ var item = new ToolStripMenuItem();\r
+ SizeF size = g.MeasureString( text, item.Font );\r
+//Debug.WriteLine( "WinWidth"+ this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString());\r
+ while ( nTargetWidth < size.Width )\r
+ {\r
+ string text2 = ShortenPathString( text );\r
+ if ( text == text2 )\r
+ break;\r
+ size = g.MeasureString( text2, this.Font );\r
+ text = text2;\r
+//Debug.WriteLine( "winWidth" + this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString() );\r
+ }\r
+ item.Dispose();\r
+ g.Dispose();\r
+ bmp.Dispose();\r
+ return text;\r
+ }\r
+ private string ShortenPathString( string text )\r
+ {\r
+ int nWidth = this.Width;\r
+ List<string> list = new List<string>(text.Split('\\'));\r
+ int i = list.Count / 2;\r
+ if ( list[i] != "..." )\r
+ {\r
+ list[i] = "...";\r
+ }\r
+ else\r
+ {\r
+ if ( list.Count % 2 == 0 && i > 1 )\r
+ list.RemoveAt(i - 1);\r
+ else if ( list.Count % 2 == 1 && i < list.Count - 2 )\r
+ list.RemoveAt(i + 1);\r
+ }\r
+ StringBuilder sb = new StringBuilder(list[0]);\r
+ for ( int n = 1; n < list.Count; n++ ) {\r
+ sb.Append('\\').Append(list[n]);\r
+ }\r
+//Debug.WriteLine( "org:" + text );\r
+//Debug.WriteLine( "now:" + sb );\r
+ return sb.ToString();\r
+ }\r
+ public void tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( int nIndex番号0to1294 )\r
{\r
if( nIndex番号0to1294 >= 0 && nIndex番号0to1294 <= 1294 )\r
{\r
this.mgrBMPリスト管理者.tItemを選択する( nIndex番号0to1294 );\r
this.mgrAVIリスト管理者.tItemを選択する( nIndex番号0to1294 );\r
\r
- this.n現在選択中のWAV・BMP・AVIリストの行番号0to1294 = nIndex番号0to1294;\r
+ this.n現在選択中のWAV_BMP_AVIリストの行番号0to1294 = nIndex番号0to1294;\r
}\r
}\r
public string strファイルの存在するディレクトリを絶対パスで返す( string strファイル )\r
strファイルの絶対パス = this.str作業フォルダ名 + strファイル;\r
}\r
\r
+ // 正規化する。(\a\b\c\..\d を \a\b\d にする)\r
+\r
+// FileInfo fi = new FileInfo( strファイルの絶対パス );\r
+//\ strファイルの絶対パス = fi.FullName;\r
+\r
return strファイルの絶対パス;\r
}\r
public Point pt現在のマウス位置を譜面の可視領域相対の座標dotで返す()\r
{\r
return new Size( this.splitContainerタブと譜面を分割.Panel2.Width, this.pictureBox譜面パネル.Height );\r
}\r
- public void tUndoRedo用GUIの有効・無効を設定する()\r
+ public void tUndoRedo用GUIの有効無効を設定する()\r
{\r
this.toolStripMenuItemアンドゥ.Enabled = this.mgrUndoRedo管理者.nUndo可能な回数 > 0;\r
this.toolStripMenuItemリドゥ.Enabled = this.mgrUndoRedo管理者.nRedo可能な回数 > 0;\r
#region [ private ]\r
//-----------------\r
private bool _b未保存 = true;\r
+ private bool b前回BGMありで再生した = true;\r
+ private bool b再生速度を変更した = false;\r
+ private bool bDTXファイルを開いた = false;\r
private Point pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
private int n現在のガイド間隔4to64or0 = 16; // 初期は16分間隔\r
private bool b選択チップがある\r
}\r
}\r
\r
- private void tDTXV演奏関連のボタンとメニューのEnabledの設定()\r
+ public void tDTXV演奏関連のボタンとメニューのEnabledの設定()\r
{\r
if( File.Exists( this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path ) )\r
{\r
- // DTXViewer が存在するなら Enable\r
+ // DTXViewer(DTXManiaGR) が存在するなら Enable\r
\r
this.toolStripButton先頭から再生.Enabled = true;\r
this.toolStripButton現在位置から再生.Enabled = true;\r
}\r
else\r
{\r
- // DTXViewer が存在しないなら Disable\r
+ // DTXViewer(DTXManiaGR) が存在しないなら Disable\r
\r
this.toolStripButton先頭から再生.Enabled = false;\r
this.toolStripButton現在位置から再生.Enabled = false;\r
};\r
if( dialog.ShowDialog() == DialogResult.OK )\r
{\r
- str相対ファイル名 = Cファイル選択・パス変換.str基点からの相対パスに変換して返す( dialog.FileName, this.str作業フォルダ名 );\r
+ str相対ファイル名 = Cファイル選択_パス変換.str基点からの相対パスに変換して返す( dialog.FileName, this.str作業フォルダ名 );\r
str相対ファイル名.Replace( '/', '\\' );\r
}\r
else\r
\r
return str相対ファイル名;\r
}\r
- private DialogResult t未保存なら保存する()\r
+ public DialogResult t未保存なら保存する()\r
{\r
var result = DialogResult.OK;\r
\r
// YES なら上書き保存。\r
\r
if( result == DialogResult.Yes )\r
- this.tシナリオ・上書き保存();\r
+ this.tシナリオ_上書き保存();\r
\r
\r
// 画面を再描画。\r
string[] data = (string[]) e.Data.GetData( DataFormats.FileDrop );\r
if( data.Length >= 1 )\r
{\r
- this.tシナリオ・DragDropされたファイルを開く( data );\r
+ this.tシナリオ_DragDropされたファイルを開く( data );\r
}\r
}\r
private void Cメインフォーム_DragEnter( object sender, DragEventArgs e )\r
private void Cメインフォーム_Load( object sender, EventArgs e )\r
{\r
this.tアプリ起動時に一度だけ行う初期化処理();\r
- this.t譜面を初期化する();\r
+ // this.t譜面を初期化する(); // 2011.8.29 yyagi; removed this.t譜面を初期化する() because it has already done in this.tアプリ起動時に一度だけ行う初期化処理().\r
}\r
//-----------------\r
#endregion\r
\r
private void splitContainerタブと譜面を分割_MouseWheel( object sender, MouseEventArgs e )\r
{\r
- #region [ 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理する。]\r
- //-----------------\r
- if( e.Delta == 0 )\r
- return; // 移動量なし\r
-\r
+ if ( ( Control.ModifierKeys & Keys.Shift ) == Keys.Shift )\r
+ {\r
+ #region [ Shiftを押しながらホイール操作すると、横スクロール。]\r
+ if ( e.Delta == 0 )\r
+ return; // 移動量なし\r
\r
- // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。\r
+ // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。\r
\r
- int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;\r
+ int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;\r
\r
+ // 1行=1レーン とする。(が、実際には適当に設定しただけ。1レーンには設定していない)\r
\r
- // 1行=1拍(64/4=16グリッド)とする。\r
+ int n移動すべき数grid = n移動すべき行数 * 16;\r
\r
- int n移動すべき数grid = n移動すべき行数 * 16;\r
\r
+ // スクロールバーのつまみを移動。\r
\r
- // スクロールバーのつまみを移動。\r
+ int n新しい位置 = this.hScrollBar譜面用水平スクロールバー.Value + n移動すべき数grid;\r
+ int n最小値 = this.hScrollBar譜面用水平スクロールバー.Minimum;\r
+ int n最大値 = ( this.hScrollBar譜面用水平スクロールバー.Maximum + 1 ) - this.hScrollBar譜面用水平スクロールバー.LargeChange;\r
\r
- int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;\r
- int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;\r
- int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
+ if ( n新しい位置 < n最小値 )\r
+ {\r
+ n新しい位置 = n最小値;\r
+ }\r
+ else if ( n新しい位置 > n最大値 )\r
+ {\r
+ n新しい位置 = n最大値;\r
+ }\r
\r
- if( n新しい位置 < n最小値 )\r
- {\r
- n新しい位置 = n最小値;\r
+ this.hScrollBar譜面用水平スクロールバー.Value = n新しい位置;\r
+ //-----------------\r
+ #endregion\r
}\r
- else if( n新しい位置 > n最大値 )\r
+ else\r
{\r
- n新しい位置 = n最大値;\r
- }\r
+ #region [ 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理する。]\r
+ //-----------------\r
+ if ( e.Delta == 0 )\r
+ return; // 移動量なし\r
\r
- this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;\r
- //-----------------\r
- #endregion\r
+\r
+ // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。\r
+\r
+ int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;\r
+\r
+\r
+ // 1行=1拍(64/4=16グリッド)とする。\r
+\r
+ int n移動すべき数grid = n移動すべき行数 * 16;\r
+\r
+\r
+ // スクロールバーのつまみを移動。\r
+\r
+ int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;\r
+ int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;\r
+ int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
+\r
+ if ( n新しい位置 < n最小値 )\r
+ {\r
+ n新しい位置 = n最小値;\r
+ }\r
+ else if ( n新しい位置 > n最大値 )\r
+ {\r
+ n新しい位置 = n最大値;\r
+ }\r
+\r
+ this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;\r
+ //-----------------\r
+ #endregion\r
+ }\r
}\r
private void splitContainerタブと譜面を分割_Panel2_SizeChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
private void toolStripMenuItem選択チップの切り取り_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・切り取り();\r
+ this.tシナリオ_切り取り();\r
}\r
private void toolStripMenuItem選択チップのコピー_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・コピー();\r
+ this.tシナリオ_コピー();\r
}\r
private void toolStripMenuItem選択チップの貼り付け_Click( object sender, EventArgs e )\r
{\r
\r
// Y座標から位置gridを得て、そこへ貼り付ける。\r
\r
- this.tシナリオ・貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptMenuClient.Y ) );\r
+ this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptMenuClient.Y ) );\r
}\r
private void toolStripMenuItem選択チップの削除_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・削除();\r
+ this.tシナリオ_削除();\r
}\r
\r
private void toolStripMenuItemすべてのチップの選択_Click( object sender, EventArgs e )\r
\r
this.mgr選択モード管理者.t全チップを選択する();\r
}\r
-\r
- private void toolStripMenuItem小節長変更_Click( object sender, EventArgs e )\r
+ private void toolStripMenuItemレーン内のすべてのチップの選択_Click( object sender, EventArgs e )\r
+ {\r
+ // 編集モードなら強制的に選択モードにする。\r
+\r
+ if ( this.b編集モードである )\r
+ this.t選択モードにする();\r
+\r
+ // メニューが開かれたときのマウスの座標を取得。\r
+ // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
+ // メニューの表示位置からは取得しないこと。\r
+\r
+ Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
+\r
+\r
+ // マウス位置に小節を挿入。\r
+\r
+ #region [ クリックされた箇所のレーン番号を取得する。]\r
+ //-----------------\r
+ int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );\r
+ if ( lane < 0 )\r
+ return; // クリックされた箇所にレーンがない\r
+\r
+ //-----------------\r
+ #endregion\r
+\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( lane );\r
+\r
+ }\r
+ private void toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降_Click( object sender, EventArgs e )\r
+ {\r
+ // 編集モードなら強制的に選択モードにする。\r
+\r
+ if ( this.b編集モードである )\r
+ this.t選択モードにする();\r
+\r
+ // メニューが開かれたときのマウスの座標を取得。\r
+ // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
+ // メニューの表示位置からは取得しないこと。\r
+\r
+ Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
+\r
+ #region [ クリックされた箇所のレーン番号を取得する。]\r
+ //-----------------\r
+ int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );\r
+ if ( lane < 0 )\r
+ return; // クリックされた箇所にレーンがない\r
+\r
+ //-----------------\r
+ #endregion\r
+ #region [ クリックされた箇所の小節を取得する。]\r
+ //-----------------\r
+ if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
+ return; // クリックされた箇所にレーンがない\r
+\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
+\r
+ C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
+ //-----------------\r
+ #endregion\r
+\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( lane, csクリックされた小節.n小節番号0to3599 );\r
+ }\r
+\r
+ private void toolStripMenuItem小節内のすべてのチップの選択_Click( object sender, EventArgs e )\r
+ {\r
+ // 編集モードなら強制的に選択モードにする。\r
+\r
+ if ( this.b編集モードである )\r
+ this.t選択モードにする();\r
+\r
+ // メニューが開かれたときのマウスの座標を取得。\r
+ // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
+ // メニューの表示位置からは取得しないこと。\r
+\r
+ Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
+\r
+ #region [ クリックされた箇所の小節を取得する。]\r
+ //-----------------\r
+ if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
+ return; // クリックされた箇所にレーンがない\r
+\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
+ C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
+ //-----------------\r
+ #endregion\r
+\r
+ this.mgr選択モード管理者.t小節上の全チップを選択する( csクリックされた小節.n小節番号0to3599 );\r
+ }\r
+\r
+ private void toolStripMenuItem小節長変更_Click( object sender, EventArgs e )\r
{\r
// メニューが開かれたときのマウスの座標を取得。\r
// ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )\r
return; // クリックされた箇所にレーンがないなら無視。\r
\r
- int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptマウス位置.Y );\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );\r
C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
//-----------------\r
#endregion\r
#region [ 取得した小節の小節長を変更する。]\r
//-----------------\r
if( csクリックされた小節 != null )\r
- this.tシナリオ・小節長を変更する( csクリックされた小節 );\r
+ this.tシナリオ_小節長を変更する( csクリックされた小節 );\r
//-----------------\r
#endregion\r
}\r
if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
return; // クリックされた箇所にレーンがない\r
\r
- int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptマウスの位置.Y );\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
//-----------------\r
#endregion\r
#region [ 該当小節の下へ新しい小節を挿入する。]\r
//-----------------\r
if( csクリックされた小節 != null )\r
- this.tシナリオ・小節を挿入する( csクリックされた小節.n小節番号0to3599 );\r
+ this.tシナリオ_小節を挿入する( csクリックされた小節.n小節番号0to3599 );\r
//-----------------\r
#endregion\r
}\r
if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )\r
return; // クリックされた箇所にレーンがないなら無視。\r
\r
- int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptマウス位置.Y );\r
+ int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );\r
C小節 cs削除する小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
//-----------------\r
#endregion\r
#region [ 該当小節を削除する。]\r
//-----------------\r
if( cs削除する小節 != null )\r
- this.tシナリオ・小節を削除する( cs削除する小節.n小節番号0to3599 );\r
+ this.tシナリオ_小節を削除する( cs削除する小節.n小節番号0to3599 );\r
//-----------------\r
#endregion\r
}\r
\r
#region [ GUIイベント:基本情報関連 ]\r
//-----------------\r
+ #region [ Title ]\r
private string textBox曲名_以前の値 = "";\r
private void textBox曲名_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox曲名 ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBox曲名_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBox曲名 );\r
\r
this.textBox曲名.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ Author ]\r
private string textBox製作者_以前の値 = "";\r
private void textBox製作者_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox製作者 ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBox製作者_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBox製作者 );\r
\r
this.textBox製作者.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ Comment ]\r
private string textBoxコメント_以前の値 = "";\r
private void textBoxコメント_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxコメント ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxコメント_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxコメント );\r
\r
this.textBoxコメント.Focus();\r
}\r
+ #endregion\r
+ #region [ Genre ]\r
+ private string textBoxGenre_以前の値 = "";\r
+ private void textBoxGenre_TextChanged( object sender, EventArgs e )\r
+ {\r
+ // Undo/Redo リストを修正する。\r
\r
+ #region [ Undo/Redo リストを修正。]\r
+ //-----------------\r
+ if ( !CUndoRedo管理.bUndoRedoした直後 )\r
+ {\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
+\r
+ if ( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxGenre ) )\r
+ {\r
+ // 既存のセルの値を更新。\r
+\r
+ ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxGenre.Text;\r
+ }\r
+ else\r
+ {\r
+ // 新しいセルを追加。\r
+\r
+ this.mgrUndoRedo管理者.tノードを追加する(\r
+ new CUndoRedoセル<string>(\r
+ this.textBoxGenre,\r
+ new DGUndoを実行する<string>( this.textBoxGenre_Undo ),\r
+ new DGRedoを実行する<string>( this.textBoxGenre_Redo ),\r
+ this.textBoxGenre_以前の値, this.textBoxGenre.Text ) );\r
+\r
+ // Undo ボタンを有効にする。\r
+\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+ }\r
+ }\r
+ //-----------------\r
+ #endregion\r
+\r
+\r
+ // Undo 用に値を保管しておく。\r
+\r
+ this.textBoxGenre_以前の値 = this.textBoxGenre.Text;\r
+\r
+\r
+ // 完了。\r
+\r
+ CUndoRedo管理.bUndoRedoした直後 = false;\r
+ this.b未保存 = true;\r
+ }\r
+ private void textBoxGenre_Leave( object sender, EventArgs e )\r
+ {\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
+\r
+ if ( oセル仮想 != null )\r
+ oセル仮想.t所有権の放棄( this.textBoxGenre );\r
+ }\r
+ private void textBoxGenre_Undo( string str変更前, string str変更後 )\r
+ {\r
+ // 変更前の値に戻す。\r
+\r
+ this.tタブを選択する( Eタブ種別.基本情報 );\r
+\r
+ this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
+ this.textBoxGenre.Text = str変更前;\r
+\r
+ this.textBoxGenre.Focus();\r
+ }\r
+ private void textBoxGenre_Redo( string str変更前, string str変更後 )\r
+ {\r
+ // 変更後の値に戻す。\r
+\r
+ this.tタブを選択する( Eタブ種別.基本情報 );\r
+\r
+ this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
+ this.textBoxGenre.Text = str変更後;\r
+\r
+ this.textBoxGenre.Focus();\r
+ }\r
+ #endregion\r
+\r
+ #region [ BPM ]\r
private decimal numericUpDownBPM_以前の値 = 120.0M;\r
private void numericUpDownBPM_ValueChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.numericUpDownBPM ) )\r
{\r
\r
// Undoボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void numericUpDownBPM_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.numericUpDownBPM );\r
\r
this.numericUpDownBPM.Focus();\r
}\r
+ #endregion\r
\r
+ #region [ DLEVEL ]\r
private int nDLEVEL_以前の値 = 50;\r
private void textBoxDLEVEL_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null && oセル仮想.b所有権がある( this.hScrollBarDLEVEL ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
this.hScrollBarDLEVEL.Value = n変更後;\r
}\r
-\r
+ #endregion\r
+ #region [ GLEVEL ]\r
private int nGLEVEL_以前の値;\r
private void textBoxGLEVEL_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarGLEVEL ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
this.hScrollBarGLEVEL.Value = n変更後;\r
}\r
-\r
+ #endregion\r
+ #region [ BLEVEL ]\r
private int nBLEVEL_以前の値;\r
private void textBoxBLEVEL_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarBLEVEL ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
this.hScrollBarBLEVEL.Value = n変更後;\r
}\r
+ #endregion\r
\r
+ #region [ PANEL ]\r
private string textBoxパネル_以前の値 = "";\r
private void textBoxパネル_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxパネル ) )\r
{\r
\r
// Undoボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxパネル_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxパネル );\r
\r
this.textBoxパネル.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ PREVIEW ]\r
private string textBoxPREVIEW_以前の値 = "";\r
private void textBoxPREVIEW_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREVIEW ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxPREVIEW_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxPREVIEW );\r
\r
this.textBoxPREVIEW.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ PREIMAGE ]\r
private string textBoxPREIMAGE_以前の値 = "";\r
private void textBoxPREIMAGE_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREIMAGE ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxPREIMAGE_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxPREIMAGE );\r
\r
this.textBoxPREIMAGE.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ STAGEFILE ]\r
private string textBoxSTAGEFILE_以前の値 = "";\r
private void textBoxSTAGEFILE_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxSTAGEFILE ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxSTAGEFILE_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxSTAGEFILE );\r
\r
this.textBoxSTAGEFILE.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ BACKGROUND ]\r
private string textBoxBACKGROUND_以前の値 = "";\r
private void textBoxBACKGROUND_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxBACKGROUND ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxBACKGROUND_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxBACKGROUND );\r
\r
this.textBoxBACKGROUND.Focus();\r
}\r
-\r
+ #endregion\r
+ #region [ RESULTIMAGE ]\r
private string textBoxRESULTIMAGE_以前の値 = "";\r
private void textBoxRESULTIMAGE_TextChanged( object sender, EventArgs e )\r
{\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxRESULTIMAGE ) )\r
{\r
\r
// Undo ボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBoxRESULTIMAGE_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBoxRESULTIMAGE );\r
\r
this.textBoxRESULTIMAGE.Focus();\r
}\r
+ #endregion\r
\r
+ #region [ PREVIEW参照ボタン ]\r
private void buttonPREVIEW参照_Click( object sender, EventArgs e )\r
{\r
string str初期フォルダ名 = this.str作業フォルダ名;\r
this.b未保存 = true;\r
}\r
}\r
+ #endregion\r
+ #region [ PREIMAGE参照ボタン ]\r
private void buttonPREIMAGE参照_Click( object sender, EventArgs e )\r
{\r
string str初期フォルダ名 = this.str作業フォルダ名;\r
this.b未保存 = true;\r
}\r
}\r
+ #endregion\r
+ #region [ STAGEFILE参照ボタン ]\r
private void buttonSTAGEFILE参照_Click( object sender, EventArgs e )\r
{\r
string str初期フォルダ名 = this.str作業フォルダ名;\r
this.b未保存 = true;\r
}\r
}\r
+ #endregion\r
+ #region [ BACKGROUND参照ボタン ]\r
private void buttonBACKGROUND参照_Click( object sender, EventArgs e )\r
{\r
string str初期フォルダ名 = this.str作業フォルダ名;\r
this.b未保存 = true;\r
}\r
}\r
+ #endregion\r
+ #region [ RESULTIMAGE参照ボタン ]\r
private void buttonRESULTIMAGE参照_Click( object sender, EventArgs e )\r
{\r
string str初期フォルダ名 = this.str作業フォルダ名;\r
this.b未保存 = true;\r
}\r
}\r
+ #endregion\r
+ #region [ Use 556 x 710 BGA/AVI ]\r
+ private bool check556x710BGAAVI_以前の値 = false;\r
+ private void check556x710BGAAVI_CheckedChanged(object sender, EventArgs e)\r
+ {\r
+ // Undo/Redo リストを修正する。\r
+\r
+ #region [ Undo/Redo リストを修正。]\r
+ //-----------------\r
+ if (!CUndoRedo管理.bUndoRedoした直後)\r
+ {\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
+\r
+ if ((oセル仮想 != null) && oセル仮想.b所有権がある(this.check556x710BGAAVI))\r
+ {\r
+ // 既存のセルの値を更新。\r
+\r
+ ((CUndoRedoセル<bool>)oセル仮想).変更後の値 = this.check556x710BGAAVI.Checked;\r
+ }\r
+ else\r
+ {\r
+ // 新しいセルを追加。\r
+\r
+ this.mgrUndoRedo管理者.tノードを追加する(\r
+ new CUndoRedoセル<bool>(\r
+ this.check556x710BGAAVI.Checked,\r
+ new DGUndoを実行する<bool>(this.check556x710BGAAVI_Undo),\r
+ new DGRedoを実行する<bool>(this.check556x710BGAAVI_Redo),\r
+ this.check556x710BGAAVI_以前の値, this.check556x710BGAAVI.Checked));\r
+\r
+ // Undo ボタンを有効にする。\r
+\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
+ }\r
+ }\r
+ //-----------------\r
+ #endregion\r
+\r
+\r
+ // Undo 用に値を保管しておく。\r
+\r
+ this.check556x710BGAAVI_以前の値 = this.check556x710BGAAVI.Checked;\r
+ \r
+\r
+ // 完了。\r
+\r
+ CUndoRedo管理.bUndoRedoした直後 = false;\r
+ this.b未保存 = true;\r
+ }\r
+ private void check556x710BGAAVI_Leave(object sender, EventArgs e)\r
+ {\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
+\r
+ if (oセル仮想 != null)\r
+ oセル仮想.t所有権の放棄(this.check556x710BGAAVI);\r
+ }\r
+ private void check556x710BGAAVI_Undo(bool b変更前, bool b変更後)\r
+ {\r
+ // 変更前の値に戻す。\r
+\r
+ this.tタブを選択する(Eタブ種別.基本情報);\r
+\r
+ this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
+ this.check556x710BGAAVI.Checked = b変更前;\r
+\r
+ this.check556x710BGAAVI.Focus();\r
+ }\r
+ private void check556x710BGAAVI_Redo(bool b変更前, bool b変更後)\r
+ {\r
+ // 変更後の値に戻す。\r
+\r
+ this.tタブを選択する(Eタブ種別.基本情報);\r
+\r
+ this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
+ this.check556x710BGAAVI.Checked = b変更後;\r
+\r
+ this.check556x710BGAAVI.Focus();\r
+ }\r
+ #endregion\r
//-----------------\r
#endregion\r
#region [ GUIイベント:WAVリスト関連 ]\r
#region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
//-----------------\r
if( this.listViewWAVリスト.SelectedIndices.Count > 0 )\r
- this.tWAV・BMP・AVIリストのカーソルを全部同じ行に合わせる( this.listViewWAVリスト.SelectedIndices[ 0 ] );\r
+ this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewWAVリスト.SelectedIndices[ 0 ] );\r
//-----------------\r
#endregion\r
}\r
#region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
//-----------------\r
if( this.listViewBMPリスト.SelectedIndices.Count > 0 )\r
- this.tWAV・BMP・AVIリストのカーソルを全部同じ行に合わせる( this.listViewBMPリスト.SelectedIndices[ 0 ] );\r
+ this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewBMPリスト.SelectedIndices[ 0 ] );\r
//-----------------\r
#endregion\r
}\r
#region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
//-----------------\r
if( this.listViewAVIリスト.SelectedIndices.Count > 0 )\r
- this.tWAV・BMP・AVIリストのカーソルを全部同じ行に合わせる( this.listViewAVIリスト.SelectedIndices[ 0 ] );\r
+ this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewAVIリスト.SelectedIndices[ 0 ] );\r
//-----------------\r
#endregion\r
}\r
//-----------------\r
if( !CUndoRedo管理.bUndoRedoした直後 )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox自由入力欄 ) )\r
{\r
\r
// Undoボタンを有効にする。\r
\r
- this.tUndoRedo用GUIの有効・無効を設定する();\r
+ this.tUndoRedo用GUIの有効無効を設定する();\r
}\r
}\r
//-----------------\r
}\r
private void textBox自由入力欄_Leave( object sender, EventArgs e )\r
{\r
- CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す・見るだけ();\r
+ CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
\r
if( oセル仮想 != null )\r
oセル仮想.t所有権の放棄( this.textBox自由入力欄 );\r
//-----------------\r
private void toolStripMenuItem新規_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・新規作成();\r
+ this.tシナリオ_新規作成();\r
}\r
private void toolStripMenuItem開く_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・開く();\r
+ this.tシナリオ_開く();\r
}\r
private void toolStripMenuItem上書き保存_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・上書き保存();\r
+ this.tシナリオ_上書き保存();\r
}\r
private void toolStripMenuItem名前を付けて保存_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・名前をつけて保存();\r
+ this.tシナリオ_名前をつけて保存();\r
}\r
private void toolStripMenuItem終了_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・終了();\r
+ this.tシナリオ_終了();\r
}\r
private void toolStripMenuItem最近使ったファイル_Click( object sender, EventArgs e )\r
{\r
//-----------------\r
private void toolStripMenuItemアンドゥ_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Undoする();\r
+ this.tシナリオ_Undoする();\r
}\r
private void toolStripMenuItemリドゥ_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Redoする();\r
+ this.tシナリオ_Redoする();\r
}\r
private void toolStripMenuItem切り取り_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・切り取り();\r
+ this.tシナリオ_切り取り();\r
}\r
private void toolStripMenuItemコピー_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・コピー();\r
+ this.tシナリオ_コピー();\r
}\r
private void toolStripMenuItem貼り付け_Click( object sender, EventArgs e )\r
{\r
{\r
// マウスが譜面上になかった → 表示領域下辺から貼り付ける\r
\r
- this.tシナリオ・貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
+ this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
}\r
else\r
{\r
// マウスが譜面上にあった\r
\r
- this.tシナリオ・貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptマウス位置.Y ) );\r
+ this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y ) );\r
}\r
}\r
private void toolStripMenuItem削除_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・削除();\r
+ this.tシナリオ_削除();\r
}\r
private void toolStripMenuItemすべて選択_Click( object sender, EventArgs e )\r
{\r
}\r
private void toolStripMenuItem検索_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・検索();\r
+ this.tシナリオ_検索();\r
}\r
private void toolStripMenuItem置換_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・置換();\r
+ this.tシナリオ_置換();\r
}\r
//-----------------\r
#endregion\r
//-----------------\r
private void toolStripMenuItem先頭から再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで最初から再生する();\r
+ this.tシナリオ_Viewerで最初から再生する();\r
}\r
private void toolStripMenuItem現在位置から再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで現在位置から再生する();\r
+ this.tシナリオ_Viewerで現在位置から再生する();\r
}\r
private void toolStripMenuItem現在位置からBGMのみ再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで現在位置からBGMのみ再生する();\r
+ this.tシナリオ_Viewerで現在位置からBGMのみ再生する();\r
}\r
private void toolStripMenuItem再生停止_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerを再生停止する();\r
+ this.tシナリオ_Viewerを再生停止する();\r
}\r
//-----------------\r
#endregion\r
private void toolStripMenuItemオプション_Click( object sender, EventArgs e )\r
{\r
this.mgrオプション管理者.tオプションダイアログを開いて編集し結果をアプリ設定に格納する();\r
+ this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加\r
}\r
+ private void toolStripMenuItemMIDIImport_Click( object sender, EventArgs e)\r
+ {\r
+ this.mgrMIDIインポート管理者.tMIDIインポート管理を開く();\r
+ this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加\r
+ }\r
//-----------------\r
#endregion\r
#region [ GUIイベント:メニューバー [ヘルプ] ]\r
//-----------------\r
private void toolStripButton新規作成_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・新規作成();\r
+ this.tシナリオ_新規作成();\r
}\r
private void toolStripButton開く_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・開く();\r
+ this.tシナリオ_開く();\r
}\r
private void toolStripButton上書き保存_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・上書き保存();\r
+ this.tシナリオ_上書き保存();\r
}\r
private void toolStripButton切り取り_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・切り取り();\r
+ this.tシナリオ_切り取り();\r
}\r
private void toolStripButtonコピー_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・コピー();\r
+ this.tシナリオ_コピー();\r
}\r
private void toolStripButton貼り付け_Click( object sender, EventArgs e )\r
{\r
{\r
// マウスが譜面上になかった → 表示領域下辺から貼り付ける\r
\r
- this.tシナリオ・貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
+ this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
}\r
else\r
{\r
// マウスが譜面上にあった\r
\r
- this.tシナリオ・貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す・ガイド幅単位( ptマウスの位置.Y ) );\r
+ this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y ) );\r
}\r
}\r
private void toolStripButton削除_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・削除();\r
+ this.tシナリオ_削除();\r
}\r
private void toolStripButtonアンドゥ_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Undoする();\r
+ this.tシナリオ_Undoする();\r
}\r
private void toolStripButtonリドゥ_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Redoする();\r
+ this.tシナリオ_Redoする();\r
}\r
private void toolStripButtonチップパレット_Click( object sender, EventArgs e )\r
{\r
}\r
private void toolStripButton先頭から再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで最初から再生する();\r
+ this.tシナリオ_Viewerで最初から再生する();\r
}\r
private void toolStripButton現在位置から再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで現在位置から再生する();\r
+ this.tシナリオ_Viewerで現在位置から再生する();\r
}\r
private void toolStripButton現在位置からBGMのみ再生_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerで現在位置からBGMのみ再生する();\r
+ this.tシナリオ_Viewerで現在位置からBGMのみ再生する();\r
}\r
private void toolStripButton再生停止_Click( object sender, EventArgs e )\r
{\r
- this.tシナリオ・Viewerを再生停止する();\r
+ this.tシナリオ_Viewerを再生停止する();\r
+ }\r
+\r
+ //private void ToolStripMenuItemBeatChipsGeneration_Click( object sender, EventArgs e ) // Beat Detections\r
+ //{\r
+ // GenarateBeatChip_Main();\r
+ //}\r
+\r
+\r
+ // 2度続けて実行するとチップが増えておかしくなる?要調査。\r
+ private void GenarateBeatChip_Main()\r
+ {\r
+ string filename = "";\r
+\r
+ #region [ BGM, BPM, BEATレーンのレーン番号を取得 ]\r
+ int laneBGM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" );\r
+ int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );\r
+ int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
+ #endregion\r
+\r
+ #region [ BGMレーンにあるチップを抽出して、beat検出する対象のサウンドファイルを決める ]\r
+ // とりあえずBGMチップは1個しかない前提で進める。追々、複数のBGMチップでも動作するようにはしたい。\r
+ #region [ BGMチップ抽出 ]\r
+ int nBGMチップの小節番号 = -1;\r
+ int nBGMチップのindex = -1;\r
+ foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
+ {\r
+ C小節 c小節 = pair.Value;\r
+ nBGMチップのindex = c小節.listチップ.FindIndex(\r
+ delegate( Cチップ cチップ )\r
+ {\r
+ return ( cチップ.nレーン番号0to == laneBGM );\r
+ }\r
+ );\r
+ if ( nBGMチップのindex >= 0 )\r
+ {\r
+ nBGMチップの小節番号 = c小節.n小節番号0to3599;\r
+ filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( c小節.listチップ[ nBGMチップのindex ].n値_整数1to1295);\r
+ Debug.WriteLine( filename );\r
+ break; // とりあえず1個見つけたらbreakしちゃう\r
+ }\r
+ //for ( int i = 0; i < c小節.listチップ.Count; i++ )\r
+ //{\r
+ //Cチップ cチップ = c小節.listチップ[ i ];\r
+ //if ( cチップ.nレーン番号0to == lane )\r
+ //{\r
+ // nBGMチップのindex = i;\r
+ // filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( cチップ.n値・整数1to1295 );\r
+ // Debug.WriteLine( filename );\r
+ //}\r
+ //}\r
+ }\r
+ if ( filename == "" )\r
+ {\r
+ MessageBox.Show( "BGMチップが配置されていません。BGMチップを1つ配置してください。", "BGMチップ検出エラー", MessageBoxButtons.OK, MessageBoxIcon.Error );\r
+ return;\r
+ }\r
+ #endregion\r
+ #endregion\r
+\r
+ #region [ マウスカーソルを待機中に変更 (アプリウインドウ外で右クリックメニュー選択していると、効果がない・・・) ]\r
+ this.Cursor = Cursors.WaitCursor;\r
+ #endregion\r
+\r
+ #region [ BPM,BEATレーンの情報を消去 ]\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM );\r
+ this.tシナリオ_削除();\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );\r
+ this.tシナリオ_削除();\r
+ #endregion\r
+\r
+\r
+ #region [ BASSFXのBeat detectionを実行する ]\r
+ FDK.CBeatDetect cbd = new CBeatDetect( filename );\r
+\r
+ float tempo = cbd.GetTempo();\r
+// Debug.WriteLine( "BPM=" + tempo );\r
+\r
+ List<FDK.CBeatDetect.stBeatPos> listBeatPositions = cbd.GetBeatPositions();\r
+// Debug.WriteLine( "Count: " + listBeatPositions.Count );\r
+ #endregion\r
+\r
+ // 四分音符以下、8分音符以下などと選べるようにしたい。\r
+ #region [ 四分音符以下の間隔で検出されたbeatを、端折る。端折らないと、検出beat数が多過ぎて、人が扱えなくなる。ただ、端折り方はもう少し熟慮が必要。]\r
+ float last = 0;\r
+ float minBeatDelta = 60.0f / tempo; // 4分音符の長さ\r
+ int count = 10;\r
+\r
+ // 最初の10個くらいは、端折らない。まず拍の頭をとるのに必要な情報を落とすわけにはいかないので。\r
+ // 10個目以降は、四分音符未満の長さのbeatを、端折る。(裏BEATレーンに回す)\r
+ //if ( listBeatPositions.Count > 10 )\r
+ //{\r
+ // for ( int i = count; i < listBeatPositions.Count; i++ )\r
+ // {\r
+ // if ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta )\r
+ // {\r
+ // FDK.CBeatDetect.stBeatPos sbp = new CBeatDetect.stBeatPos(\r
+ // listBeatPositions[ i ].fBeatTime,\r
+ // 0,\r
+ // 0,\r
+ // 0,\r
+ // ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta ),\r
+ // true\r
+ // );\r
+\r
+ // listBeatPositions[ i ] = sbp;\r
+ // }\r
+ // last = listBeatPositions[ i ].fBeatTime;\r
+ // }\r
+ //}\r
+ #endregion\r
+\r
+ #region [ ただのデバッグ表示 ]\r
+ //last = 0;\r
+ //for ( int i = 0; i < listBeatPositions.Count; i++ )\r
+ //{\r
+ // //Debug.WriteLine( listBeatPositionsLight[ i ] - last );\r
+ // Debug.WriteLine( listBeatPositions[ i ].fBeatTime );\r
+ // last = listBeatPositions[ i ].fBeatTime;\r
+ //}\r
+ //Debug.WriteLine( "========================" );\r
+ #endregion\r
+\r
+ #region [ 未使用: 端折った区間内で、それぞれBPMを再取得してみる → これは意味なし。1つのbeatしか得られないため、正しいBPMを取得できない。]\r
+ //List<float> listTempo_interval = new List<float>();\r
+ //last = 0;\r
+ //for ( int i = 0; i < listBeatPositionsLight.Count - 1; i++ )\r
+ //{\r
+ // listTempo_interval.Add( cbd.GetTempo( last, listBeatPositionsLight[ i ] ) );\r
+ // last = listBeatPositionsLight[ i ];\r
+ // Debug.WriteLine( listTempo_interval[ i ] );\r
+ //}\r
+ #endregion\r
+\r
+\r
+ int n1拍目のBeatPositionIndex = 0;\r
+\r
+ #region [ 1小節目の頭に1発目の拍が来るよう、BGMチップをずらす。ただしこれだけだと、最大1grid分の時間誤差が発生する。(BPM=125時に最大10msの誤差)]\r
+ int nBGM位置grid = 0;\r
+ if ( nBGMチップの小節番号 >= 0 && nBGMチップのindex >= 0 )\r
+ {\r
+ // float f小節長倍率 = 1.0f;\r
+ C小節 c小節_0小節目 = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ];\r
+ Cチップ cチップBGM = c小節_0小節目.listチップ[ nBGMチップのindex ];\r
+ nBGM位置grid = (int) ( 192f * c小節_0小節目.f小節長倍率 * listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime / ( ( 60 * 4 ) / tempo ) + 0.5 );\r
+ // ここでnBGM位置Gridが192(x小節長)を超えることがある\r
+ // → 192(x小節長)をひいて、次の小節に回す。(小節ごとに小節長倍率が変化する可能性があることに注意)\r
+ // → スマン、この実装ではまだ、DTXデータの最初はしばらく小節倍率が一定である前提になっちゃってる・・\r
+ cチップBGM.n位置grid = (int) ( 192 * c小節_0小節目.f小節長倍率 + 0.5f ) - ( nBGM位置grid % 192 ); // "192-" が必要なことに注意\r
+ c小節_0小節目.listチップ[ nBGMチップのindex ] = cチップBGM;\r
+ this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ] = c小節_0小節目;\r
+ }\r
+ #endregion\r
+\r
+ #region [ 0小節目のBPMを設定し、1つ目の拍が1小節目の頭に来るようにする。]\r
+ // まず、0小節の頭にBPM設定を追加する。\r
+ this.mgr編集モード管理者.tBPMチップを配置する( 0 * 192, tempo ); // 既にBPMチップが配置されている場合の処理は????????????????\r
+ this.numericUpDownBPM.Value = (decimal) ( (int) ( tempo + 0.5 ) );\r
+ numericUpDownBPM_ValueChanged( null, null );\r
+ numericUpDownBPM_Leave( null, null );\r
+\r
+ // 更に、先の1グリッド分の誤差をなくすために、BGMチップの位置だけでなく、0小節目のBPMも微調整する。\r
+ float f小節長倍率_ = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ].f小節長倍率; // 手抜き。すまん。\r
+ float fBGM再生直後のBPM = ( 60 * 4 ) * nBGM位置grid / ( 192.0f * f小節長倍率_ ) / listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;\r
+ this.mgr編集モード管理者.tBPMチップを配置する( 192 - ( nBGM位置grid % 192 ), fBGM再生直後のBPM );\r
+ #endregion\r
+\r
+\r
+\r
+// 頭の1個目のBEATチップがちゃんと配置されてないよ!!!!!\r
+\r
+\r
+\r
+ #region [ BEATレーンにチップを配置する ]\r
+ // int lastGrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 ); // 0小節目の倍率\r
+ //int last小節内Grid = 0;\r
+ //int last小節番号 = nBGMチップの小節番号;\r
+ int n最初の拍のある小節番号 = 1 + ( nBGM位置grid / 192 );\r
+ float lastBeatTime = listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;\r
+ int lastnGrid = -1;\r
+\r
+ for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
+ {\r
+ //Debug.Write( "[" + index + "] " );\r
+\r
+ // 今注目しているBEATチップが、どの小節・拍(grid)に収まるかを計算する\r
+ // // 誤差を小さくするため、直前のBEATポイントからの相対位置として計算すること。\r
+ // // 絶対位置で計算すると、最初のBPM計算の誤差がそのままBEAT位置に現れる。 // やり残し★★★★★★\r
+ // // ...としたいのだが、まだできてない。全部絶対位置で計算している。\r
+ FDK.CBeatDetect.stBeatPos sbp = listBeatPositions[ index ];\r
+\r
+ float deltatime = sbp.fBeatTime - lastBeatTime;\r
+ //Debug.Write( "delta=" + deltatime );\r
+ int n小節番号 = n最初の拍のある小節番号;\r
+ float f1小節の時間 = ( 60 / tempo ) * 4;\r
+ #region [ 0小節目の場合 ]\r
+ if ( deltatime < 0 )\r
+ {\r
+ while ( n小節番号 >= 0 && deltatime < 0 )\r
+ {\r
+ n小節番号--;\r
+ deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
+ //(int) ( 192 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 ); // 0小節目の倍率\r
+ }\r
+ if ( deltatime < 0 )\r
+ {\r
+ Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );\r
+ continue;\r
+ }\r
+ }\r
+ #endregion\r
+ #region [ 1小節目以降の場合 ]\r
+ else\r
+ {\r
+ //Debug.Write( " + " + f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192 + "(" + lastGrid + "|" + last小節内Grid +")=" );\r
+ // deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192; // 直前のgrid(その小節の頭から)の分\r
+ //Debug.WriteLine( deltatime );\r
+ while ( true )\r
+ {\r
+ if ( deltatime < f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 )\r
+ {\r
+ break;\r
+ }\r
+ n小節番号++;\r
+\r
+ #region [ 小節ノードが不足しているなら、追加する ]\r
+ if ( this.mgr譜面管理者.n現在の最大の小節番号を返す() < n小節番号 )\r
+ {\r
+ for ( int i = n小節番号; i < n小節番号 + 5; i++ )\r
+ {\r
+ this.mgr譜面管理者.dic小節.Add( i, new C小節( i ) );\r
+ this.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<int>( null, new DGUndoを実行する<int>( this.mgr譜面管理者.t小節挿入のUndo ), new DGRedoを実行する<int>( this.mgr譜面管理者.t小節挿入のRedo ), i, i ) );\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ deltatime -= f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
+ }\r
+ if ( deltatime < 0 )\r
+ {\r
+ Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );\r
+ continue;\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ // ここまでで、n小節番号を得ている\r
+ // ここで、更にgridを得たうえで、16分音符相当にquantizeして、BEATチップの位置とする\r
+\r
+ #region [ BEATチップを置く ]\r
+ float f小節長倍率 = this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
+ int n小節内Grid = (int) ( 192f * f小節長倍率 * deltatime / ( ( 60 * 4 ) / tempo ) + 0.5 );\r
+\r
+ #region [ Gridを16分音符単位(==12grid単位)でquantizeする ]\r
+ //Debug.Write( "nGrid: " + n小節内Grid + " -> " );\r
+ n小節内Grid = ( ( n小節内Grid + 6 ) / 12 ) * 12;\r
+ //Debug.WriteLine( n小節内Grid );\r
+ #endregion\r
+\r
+ int nGrid = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + n小節内Grid;\r
+\r
+ if ( lastnGrid != nGrid )\r
+ {\r
+ // indexを+1しているのは、チップ番号を01から開始するため。\r
+ this.mgr編集モード管理者.tBeatチップを配置する( nGrid, index + 1, sbp.fBeatTime, sbp.b無効 );\r
+ // this.mgr編集モード管理者.tHHチップを配置する( nGrid, 1, sbp.b無効 ); // デバッグ用・見やすくするために暫定的に。\r
+ sbp.nGrid = nGrid;\r
+ sbp.n小節番号 = n小節番号;\r
+ listBeatPositions[ index ] = sbp; // Grid情報を入れて、listを更新 (この情報はBPx挿入時に使う)\r
+ lastnGrid = nGrid;\r
+ }\r
+ //if ( !sbp.b無効 )\r
+ {\r
+ //lastGrid = nGrid;\r
+ //last小節内Grid = n小節内Grid;\r
+ //last小節番号 = n小節番号;\r
+ //lastBeatTime = sbp.fBeatTime;\r
+ }\r
+ #endregion\r
+ //Debug.WriteLine( "[" + index + "]: n小節番号=" + n小節番号 + ", Grid= " + n小節内Grid + "/" + nGrid + ", BeatTime=" + sbp.fBeatTime + ", 裏=" + sbp.b無効 );\r
+ }\r
+ #endregion\r
+\r
+ BPMchipsGeneneration_Main();\r
+\r
+ cbd.Dispose();\r
+ cbd = null;\r
+\r
+ #region [ Beatレーンを表示する ]\r
+ this.mgr譜面管理者.listレーン[ laneBEAT ].bIsVisible = true;\r
+ #endregion\r
+\r
+ #region [ 画面の再描画 ]\r
+ this.pictureBox譜面パネル.Invalidate();\r
+ #endregion\r
+\r
+\r
+ #region [ listBeatPositionsの開放 ]\r
+ listBeatPositions.Clear();\r
+ listBeatPositions = null;\r
+ #endregion\r
+\r
+ #region [ マウスカーソルの形を元に戻す ]\r
+ this.Cursor = Cursors.Default;\r
+ #endregion\r
+ }\r
+\r
+ //private void ToolStripMenuItemBPMChipsGeneration_Click( object sender, EventArgs e )\r
+ //{\r
+ // BPMchipsGeneneration_Main();\r
+ //}\r
+\r
+ private void BPMchipsGeneneration_Main()\r
+ {\r
+ #region [ BPMレーンとHHレーンを消去(0小節目を除く) ]\r
+ int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM, 1 );\r
+ this.tシナリオ_削除();\r
+\r
+ #region [ デバッグ用: HHレーンを消去 ]\r
+ int laneHH = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "HH" );\r
+ this.mgr選択モード管理者.tレーン上の全チップを選択する( laneHH, 1 );\r
+ this.tシナリオ_削除();\r
+ #endregion\r
+ #endregion\r
+\r
+ //★★★★小節長1.00以外の場合に後で対応のこと。\r
+ #region [ BEATレーンから、listBestPositionを生成 ]\r
+ int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
+//Debug.WriteLine( "laneBEAT=" + laneBEAT );\r
+ List<FDK.CBeatDetect.stBeatPos> listBeatPositions = new List<CBeatDetect.stBeatPos>();\r
+ foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
+ {\r
+ C小節 c小節 = pair.Value;\r
+ for ( int index = 0; index < c小節.listチップ.Count; index++ )\r
+ {\r
+ if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT &&\r
+ !c小節.listチップ[ index ].b裏 )\r
+ {\r
+ int n小節番号 = c小節.n小節番号0to3599;\r
+//Debug.WriteLine( "n小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );\r
+\r
+ \r
+ listBeatPositions.Add(\r
+ new CBeatDetect.stBeatPos(\r
+ c小節.listチップ[ index ].f値_浮動小数,\r
+ n小節番号,\r
+ this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + c小節.listチップ[ index ].n位置grid,\r
+ c小節.listチップ[ index ].n位置grid,\r
+ c小節.listチップ[ index ].b裏,\r
+ true\r
+ )\r
+ );\r
+ }\r
+ else\r
+ {\r
+//Debug.WriteLine( "N小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );\r
+ }\r
+ }\r
+ }\r
+ #endregion\r
+\r
+\r
+ #region [ BEATチップの位置に合わせて、BPMを計算し、BPxチップを配置する ]\r
+\r
+ int n1拍目のBeatPositionIndex = 0;\r
+\r
+ int lastindex = 0;\r
+ for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
+ {\r
+ if ( listBeatPositions[ index ].b無効 )\r
+ {\r
+ continue;\r
+ }\r
+ #region [ 次の有効なBeatPointを検出する ]\r
+ int nextIndex = -1;\r
+ for ( int i = index + 1; i < listBeatPositions.Count; i++ )\r
+ {\r
+ if ( listBeatPositions[ i ].bレーン表示する && !listBeatPositions[ i ].b無効 )\r
+ //if ( listBeatPositions[ i ].bレーン表示する )\r
+ {\r
+ nextIndex = i;\r
+ break;\r
+ }\r
+ }\r
+ #endregion\r
+\r
+ #region [ BPMチップを置く]\r
+ //int lastgrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 ); // 0小節目の倍率\r
+ //int lastindex = n1拍目のBeatPositionIndex;\r
+ //int last小節番号 = nBGMチップの小節番号;\r
+\r
+ if ( nextIndex >= 0 )\r
+ {\r
+ float deltatime = listBeatPositions[ nextIndex ].fBeatTime - listBeatPositions[ index ].fBeatTime;\r
+//Debug.WriteLine( "deltatime=" + deltatime+ ", nextIndex=" + nextIndex + ", fBeatTime(nextIndex)=" + listBeatPositions[ nextIndex ].fBeatTime+ ", index=" + index + ", fBeatTIme(index) =" + listBeatPositions[ index ].fBeatTime );\r
+\r
+ //int current小節番号 = listBeatPositionsLight[ index ].n小節番号;\r
+ //int next小節番号 = listBeatPositionsLight[ nextIndex ].n小節番号;\r
+ int deltagrid = listBeatPositions[ nextIndex ].nGrid - listBeatPositions[ index ].nGrid;\r
+//Debug.WriteLine( "deltagrid=" + deltagrid + ", nextIndex=" + nextIndex + ", nGrid(nextIndex)=" + listBeatPositions[ nextIndex ].nGrid + ", index=" + index + ", nGrid(index) =" + listBeatPositions[ index ].nGrid );\r
+ float fBPM = 60.0f / ( deltatime / deltagrid * 48 ); // 四分音符==48grid\r
+//Debug.WriteLine( "fBPM=" + fBPM + ", deltatime=" + deltatime + ", deltagrid=" + deltagrid );\r
+\r
+ // BPMチップを配置する(裏BEATチップに対しては、配置しない)\r
+ if ( nextIndex >= 0 )\r
+ {\r
+ this.mgr編集モード管理者.tBPMチップを配置する( listBeatPositions[ index ].nGrid, fBPM );\r
+// Debug.WriteLine( " tBPM: #" + index + "=" + fBPM );\r
+ }\r
+\r
+\r
+ //this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 ); // デバッグ用・見やすくするために暫定的に。\r
+\r
+// Debug.WriteLine( "(" + index + "->" + nextIndex + "): BPM=" + fBPM + ", nGrid=" + listBeatPositions[ index ].nGrid + ", deltagrid=" + deltagrid +" , deltatime=" + deltatime );\r
+ lastindex = index;\r
+ }\r
+ #endregion\r
+ }\r
+ #region [ デバッグ用: HHチップを置く ]\r
+ for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
+ {\r
+ this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 ); // デバッグ用・見やすくするために暫定的に。\r
+ }\r
+ #endregion\r
+\r
+ #region [ listBeatPositionsの開放 ]\r
+ listBeatPositions.Clear();\r
+ listBeatPositions = null;\r
+ #endregion\r
+\r
+ #endregion\r
+ }\r
+\r
+ private void generateBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )\r
+ {\r
+ GenarateBeatChip_Main();\r
+ }\r
+\r
+ private void generateBPMFromBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )\r
+ {\r
+ BPMchipsGeneneration_Main();\r
+ }\r
+\r
+ private void toolStripComboBox演奏速度_SelectedIndexChanged( object sender, EventArgs e )\r
+ {\r
+ this.b再生速度を変更した = true;\r
+ }\r
+\r
+ public bool DetectDTXManiaProcess()\r
+ {\r
+ bool target = false;\r
+//Debug.WriteLine( "process start" );\r
+ for ( int i = 0; i < 5; i++ ) // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする\r
+ {\r
+ #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
+ // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
+ // DTXManiaでそのパターンはない?のでこのままいく。\r
+ // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
+\r
+ //Process current = Process.GetCurrentProcess();\r
+ //Process[] running = Process.GetProcessesByName( current.ProcessName );\r
+ string appPath = Application.ExecutablePath;\r
+ string processname = Path.Combine( Path.GetDirectoryName( appPath ), "DTXManiaGR.exe" );\r
+//Debug.WriteLine( "processname=" + processname );\r
+ //Process[] running = Process.GetProcesses(); // .GetProcessesByName( processname );\r
+\r
+ System.Management.ManagementClass mc =\r
+ new System.Management.ManagementClass( "Win32_Process" );\r
+ System.Management.ManagementObjectCollection moc = mc.GetInstances();\r
+ \r
+ //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
+\r
+ foreach ( System.Management.ManagementObject mo in moc )\r
+ {\r
+//Debug.WriteLine( "filename=" + mo["ExecutablePath"] );\r
+//Debug.WriteLine( "2" );\r
+if ( (string)mo[ "ExecutablePath" ] == processname )\r
+{\r
+//Debug.WriteLine( "3" );\r
+ //if ( mo["ProcessId"] != 0 )\r
+ {\r
+//Debug.WriteLine( "4" );\r
+ target = true;\r
+ break;\r
+ }\r
+}\r
+//Debug.WriteLine( "5" );\r
+ }\r
+ #endregion\r
+\r
+ #region [ 起動中のDTXManiaがいれば、そのプロセスを返す ]\r
+ if ( target != false )\r
+ {\r
+ break;\r
+ }\r
+ #endregion\r
+ }\r
+\r
+//Debug.WriteLine( "process end;" );\r
+ return target;\r
}\r
+\r
+ private void calcDifficultyToolStripMenuItem_Click(object sender, EventArgs e)\r
+ {\r
+ DTXCreator.コード._05.譜面.C難易度自動計算マン f = new コード._05.譜面.C難易度自動計算マン(this);\r
+\r
+ Cメッセージポップアップ pop = new Cメッセージポップアップ(Resources.str難易度計算マン計算中);\r
+ pop.Owner = this;\r
+ pop.Show();\r
+ pop.Refresh();\r
+\r
+ f.Prepare();\r
+ hScrollBarDLEVEL.Value = f.DLevel;\r
+ hScrollBarGLEVEL.Value = f.GLevel;\r
+ hScrollBarBLEVEL.Value = f.BLevel;\r
+ pop.Close();\r
+ }\r
+\r
//-----------------\r
#endregion\r
\r