OSDN Git Service

a662b933110b6137088fe42bc060291d01b226ef
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 07.MIDIインポート / CMIDIインポートダイアログ.cs
1 using System;\r
2 using System.Collections;\r
3 using System.Collections.Generic;\r
4 using System.Text;\r
5 using System.Windows.Forms;\r
6 using System.ComponentModel;\r
7 using System.IO;\r
8 using System.Drawing;\r
9 using System.Diagnostics;\r
10 using System.Xml;\r
11 using System.Runtime.Serialization;\r
12 using DTXCreator.譜面;\r
13 using DTXCreator.WAV_BMP_AVI;\r
14 using DTXCreator.Properties;\r
15 \r
16 namespace DTXCreator.MIDIインポート\r
17 {\r
18     public partial class CMIDIインポートダイアログ : Form\r
19     {\r
20 \r
21         private CMIDI cMIDI;\r
22         public Cメインフォーム formメインフォーム;\r
23                 private System.Resources.ResourceManager resource;\r
24                 \r
25         public CMIDIインポートダイアログ()\r
26         {\r
27             InitializeComponent();\r
28                         dgvチャンネル一覧変更イベント抑止();\r
29                         resource = new System.Resources.ResourceManager( this.GetType() );\r
30         }\r
31 \r
32                 private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)\r
33         {\r
34             if ( e.KeyCode == Keys.Return )\r
35             {\r
36                 this.buttonOK.PerformClick();\r
37             }\r
38             else if ( e.KeyCode == Keys.Escape )\r
39             {\r
40                 this.buttonCancel.PerformClick();\r
41             }\r
42         }\r
43 \r
44         private void buttonOpen_Click(object sender, EventArgs e)\r
45         {\r
46             tMIDIファイルを選択する();\r
47         }\r
48 \r
49                 private void buttonOpenSettings_Click(object sender, EventArgs e)\r
50                 {\r
51                         tMIDIインポート設定ファイル選択ダイアログを開く();\r
52                 }\r
53 \r
54                 private void buttonSaveSettings_Click(object sender, EventArgs e)\r
55                 {\r
56                         tMIDIインポート設定ファイル保存ダイアログを開く();\r
57                 }\r
58         \r
59         // レーン名をワンクリックで開く用\r
60         private void dgv割り当て一覧_CellEnter( object sender, DataGridViewCellEventArgs e )\r
61         {\r
62             DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
63 \r
64             if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )\r
65                 SendKeys.Send("{F4}");\r
66         }\r
67 \r
68                 // 割り当て一覧が更新された時の処理\r
69         private void dgv割り当て一覧_CellEndEdit( object sender, DataGridViewCellEventArgs e )\r
70         {\r
71             DataGridView dgv割り当て一覧 = (DataGridView) sender;\r
72 \r
73             if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" )\r
74                 tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );\r
75                         \r
76             tMIDIチップをレーンに割り当てる();\r
77 \r
78         }\r
79 \r
80                 /// <summary>\r
81                 /// dgvチャンネル一覧変更の内容をプログラム中で変更する時は、CellValueChangedイベントを抑止する為にこの関数を呼ぶこと\r
82                 /// </summary>\r
83                 private void dgvチャンネル一覧変更イベント抑止()\r
84                 {\r
85                         try\r
86                         {\r
87                                 dgvチャンネル一覧.CellValueChanged -= dgvチャンネル一覧_CellValueChanged;\r
88                         }\r
89                         catch ( Exception e )\r
90                         {\r
91                                 Debug.WriteLine( "dgvチャンネル一覧.CellValueChangedのイベントエントリ削除に失敗しましたが、続行します。{0}", e.Message );\r
92                         }\r
93                 }\r
94 \r
95                 /// <summary>\r
96                 /// dgvチャンネル一覧変更イベント抑止()を呼び出し、\r
97                 /// dgvチャンネル一覧変更の内容をプログラム中で変更し終わった時にこの関数を呼ぶこと\r
98                 /// </summary>\r
99                 private void dgvチャンネル一覧変更イベント復旧()\r
100                 {\r
101                         dgvチャンネル一覧.CellValueChanged += dgvチャンネル一覧_CellValueChanged;\r
102                 }\r
103 \r
104                 /// <summary>\r
105                 /// チェックした瞬間にCellValueChangedを発生させる用\r
106                 /// </summary>\r
107                 private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)\r
108                 {\r
109                         if ( dgvチャンネル一覧.IsCurrentCellDirty )\r
110                         {\r
111                                 dgvチャンネル一覧.CommitEdit( DataGridViewDataErrorContexts.Commit );\r
112                         }\r
113                 }\r
114 \r
115                 private void dgvチャンネル一覧_CellValueChanged( object sender, DataGridViewCellEventArgs e )\r
116                 {\r
117                         if ( cMIDI != null ) {\r
118                                 t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
119                         }\r
120                 }\r
121 \r
122                 /// <summary>\r
123                 /// ファイルを開いた時か、チャンネル一覧のチェック変更時に呼び出す\r
124                 /// </summary>\r
125                 private void t読み込むチャンネルを取得してキー毎のノート数を計算する()\r
126                 {\r
127                         // キー毎のノート数初期化\r
128                         for ( int i = 0 ; i < 128 ; i++ ) cMIDI.nドラムチャンネルのキー毎のノート数[i] = 0;\r
129                         \r
130                         // MIDIイベントの内、チャンネル一覧でチェックの入ってるチャンネルを持つノートを、変換するノートとしてカウントする\r
131                         foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
132                         {\r
133                                 if (vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.NoteOnOff)\r
134                                 {\r
135                                         if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value)\r
136                                         {\r
137                                                 cMIDI.nドラムチャンネルのキー毎のノート数[vMIDIイベント.nキー] ++;\r
138                                 }\r
139                         }\r
140                         }\r
141             for ( int i = 0 ; i < 128 ; i++ )\r
142                 this.dgv割り当て一覧.Rows[127-i].Cells[ "Assign_Notes" ].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];\r
143 \r
144                         t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
145 \r
146                 }\r
147 \r
148         public void tMIDI割り当て一覧を作成する()\r
149         {\r
150             // レーン一覧を作成\r
151             this.Assign_DTX_Lane.Items.AddRange( "* Disuse *" );\r
152             foreach ( Cレーン cレーン in this.formメインフォーム.mgr譜面管理者.listレーン )\r
153             {\r
154                                 if ( cレーン.eレーン種別 == Cレーン.E種別.WAV ) this.Assign_DTX_Lane.Items.AddRange( cレーン.strレーン名 );\r
155             }\r
156             \r
157             // MIDIキー一覧を作成\r
158             for ( int i = 127; i >= 0; i-- )\r
159             {\r
160                 string str楽器名 = "";\r
161                 string[] strキー名 = new string[] { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", };\r
162                 string strレーン名 = "* Disuse *";\r
163                                 bool b裏チャンネル = false;\r
164                 switch ( i )\r
165                 {\r
166                     case 35 : str楽器名 = "Bass Drum 2"; strレーン名 = "BD"; break;\r
167                     case 36 : str楽器名 = "Bass Drum 1"; strレーン名 = "BD"; break;\r
168                     case 37 : str楽器名 = "Side Stick"; strレーン名 = "SE1"; break;\r
169                     case 38 : str楽器名 = "Snare Drum 1"; strレーン名 = "SD"; break;\r
170                     case 39 : str楽器名 = "Hand Clap"; strレーン名 = "SE1"; break;\r
171                     case 40 : str楽器名 = "Snare Drum 2"; strレーン名 = "SD"; break;\r
172                     case 41 : str楽器名 = "Low Tom 2"; strレーン名 = "FT"; break;\r
173                     case 42 : str楽器名 = "Closed Hi-hat"; strレーン名 = "HH"; break;\r
174                     case 43 : str楽器名 = "Low Tom 1"; strレーン名 = "FT"; break;\r
175                     case 44 : str楽器名 = "Pedal Hi-hat"; strレーン名 = "LP"; break;\r
176                     case 45 : str楽器名 = "Mid Tom 2"; strレーン名 = "LT"; break;\r
177                     case 46 : str楽器名 = "Open Hi-hat"; strレーン名 = "HH"; b裏チャンネル = true; break;\r
178                     case 47 : str楽器名 = "Mid Tom 1"; strレーン名 = "LT"; break;\r
179                     case 48 : str楽器名 = "High Tom 2"; strレーン名 = "HT"; break;\r
180                     case 49 : str楽器名 = "Crash Cymbal 1"; strレーン名 = "CY"; break;\r
181                     case 50 : str楽器名 = "High Tom 1"; strレーン名 = "HT"; break;\r
182                     case 51 : str楽器名 = "Ride Cymbal 1"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
183                     case 52 : str楽器名 = "Chinese Cymbal"; strレーン名 = "CY"; break;\r
184                     case 53 : str楽器名 = "Ride Bell"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
185                     case 54 : str楽器名 = "Tambourine"; strレーン名 = "SE1"; break;\r
186                     case 55 : str楽器名 = "Splash Cymbal"; strレーン名 = "LC"; break;\r
187                     case 56 : str楽器名 = "Cowbell"; strレーン名 = "SE1"; break;\r
188                     case 57 : str楽器名 = "Crash Cymbal 2"; strレーン名 = "LC"; break;\r
189                     case 58 : str楽器名 = "Vibra Slap"; strレーン名 = "SE1"; break;\r
190                     case 59 : str楽器名 = "Ride Cymbal 2"; strレーン名 = "CY"; b裏チャンネル = true; break;\r
191                     case 60 : str楽器名 = "High Bongo"; break;\r
192                     case 61 : str楽器名 = "Low Bongo"; break;\r
193                     case 62 : str楽器名 = "Mute High Conga"; break;\r
194                     case 63 : str楽器名 = "Open High Conga"; break;\r
195                     case 64 : str楽器名 = "Low Conga"; break;\r
196                     case 65 : str楽器名 = "High Timbale"; break;\r
197                     case 66 : str楽器名 = "Low Timbale"; break;\r
198                     case 67 : str楽器名 = "High Agogo"; break;\r
199                     case 68 : str楽器名 = "Low Agogo"; break;\r
200                     case 69 : str楽器名 = "Cabasa"; break;\r
201                     case 70 : str楽器名 = "Maracas"; break;\r
202                     case 71 : str楽器名 = "Short Whistle"; break;\r
203                     case 72 : str楽器名 = "Long Whistle"; break;\r
204                     case 73 : str楽器名 = "Short Guiro"; break;\r
205                     case 74 : str楽器名 = "Long Guiro"; break;\r
206                     case 75 : str楽器名 = "Claves"; break;\r
207                     case 76 : str楽器名 = "High Wood Block"; break;\r
208                     case 77 : str楽器名 = "Low Wood Block"; break;\r
209                     case 78 : str楽器名 = "Mute Cuica"; break;\r
210                     case 79 : str楽器名 = "Open Cuica"; break;\r
211                     case 80 : str楽器名 = "Mute Triangle"; break;\r
212                     case 81 : str楽器名 = "Open Triangle"; break;                }\r
213                 this.dgv割り当て一覧.Rows.Add( i, strキー名[i%12], strレーン名, b裏チャンネル, 0, str楽器名 );\r
214 \r
215                                 // 黒鍵に色付け\r
216                 if ( i%12 == 1 || i%12 == 3 || i%12 == 6 || i%12 == 8 || i%12 == 10 )\r
217                                         this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 240, 248, 255 );\r
218                                 // C(ド)に色付け\r
219                 if ( i%12 == 0 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );\r
220 \r
221                 tMIDI割り当て一覧のレーン名の背景色を変更する( 127-i );\r
222 \r
223             }\r
224             this.dgv割り当て一覧.Columns[ "Assign_MIDI_Key" ].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
225             this.dgv割り当て一覧.Columns[ "Assign_DTX_Lane" ].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
226             this.dgv割り当て一覧.Columns[ "Assign_DTX_Lane" ].DefaultCellStyle.Font = new Font( "meiryo", 8f, FontStyle.Bold );\r
227             this.dgv割り当て一覧.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;\r
228 \r
229             this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 82;//key35=LBDが表示される位置\r
230         }\r
231 \r
232         public void tMIDIチャンネル一覧を作成する()\r
233         {\r
234                         for (int i = 0; i < 16; i++)\r
235                         {\r
236                                 this.dgvチャンネル一覧.Rows.Add( i+1, 0, (i+1==10) );\r
237                                 this.dgvチャンネル一覧.Rows[i].DefaultCellStyle.BackColor = (i+1==10) ? Color.FromArgb( 255, 224, 224 ) : Color.FromArgb( 255, 255, 255 );\r
238                         }\r
239                         //      dgvチャンネル一覧変更イベント復旧();     //ここでイベントを復旧してはいけない\r
240                                                                                                                 //(直後にファイルを開く動作+解析動作が発生するのでそこで)\r
241                                                                                                                 //ChangValueイベントが発生しイベントが何度も発生してしまう\r
242                 }\r
243 \r
244         public void tMIDIファイルを選択する()\r
245         {\r
246             #region [ ファイル選択 ]\r
247             //-----------------\r
248 \r
249             OpenFileDialog dialog = new OpenFileDialog();\r
250                         dialog.Title = Resources.strMIDIファイル選択ダイアログのタイトル;\r
251             dialog.Filter = Resources.strMIDIファイル選択ダイアログのフィルタ;\r
252             dialog.FilterIndex = 1;\r
253             dialog.InitialDirectory = this.formメインフォーム.strMIDIインポートフォルダ;\r
254             DialogResult result = dialog.ShowDialog();\r
255 \r
256             if (result != DialogResult.OK) return;\r
257 \r
258             //-----------------\r
259             #endregion\r
260 \r
261             this.tMIDIファイルを開く( dialog.FileName );\r
262         }\r
263 \r
264         public void tMIDIファイルを開く( string strファイル名 )\r
265         {\r
266             #region [ ファイル確認 ]\r
267             //-----------------\r
268             if ( !File.Exists( strファイル名 ) )\r
269             {\r
270                 MessageBox.Show(\r
271                     Resources.strファイルが存在しませんMSG,\r
272                     Resources.strMIDIインポートエラーのタイトル,\r
273                     MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
274                 return;\r
275             }\r
276             //-----------------\r
277             #endregion\r
278 \r
279             #region [ 拡張子確認 ]\r
280             //-----------------\r
281             string str拡張子 = Path.GetExtension(strファイル名);\r
282 \r
283             if ( !str拡張子.Equals(".mid", StringComparison.OrdinalIgnoreCase ) && !str拡張子.Equals( ".midi", StringComparison.OrdinalIgnoreCase) )\r
284             {\r
285                 MessageBox.Show(\r
286                                         Resources.strMIDIファイルではないMSG,\r
287                                         Resources.strMIDIインポートエラーのタイトル,\r
288                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
289                 return;\r
290             }\r
291             //-----------------\r
292             #endregion\r
293 \r
294                         #region [ 各設定 ]\r
295             //-----------------\r
296                         this.formメインフォーム.strMIDIインポートフォルダ = Path.GetDirectoryName( strファイル名 ) + @"\";\r
297             //-----------------\r
298             #endregion\r
299 \r
300                         #region [ MIDIファイル解析 ]\r
301             //-----------------\r
302             cMIDI = new CMIDI( strファイル名 );\r
303             cMIDI.formメインフォーム = this.formメインフォーム;\r
304                         cMIDI.dgvチャンネル一覧 = this.dgvチャンネル一覧;\r
305             cMIDI.tMIDIを解析する();\r
306                         \r
307             // ヘッダがMIDI以外なら中断\r
308             if ( !cMIDI.bMIDIファイル )\r
309             {\r
310                 MessageBox.Show(\r
311                     Resources.strMIDIファイルではないMSG,\r
312                                         Resources.strMIDIインポートエラーのタイトル,\r
313                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
314                                 cMIDI = null;\r
315                 return;\r
316             }\r
317 \r
318             //-----------------\r
319             #endregion\r
320             \r
321             #region [ 解析結果を出力 ]\r
322             //-----------------\r
323                         \r
324             // MIDI解析内容をテキストボックスに出力する\r
325             string str文字列 = "";\r
326             str文字列 += "File:" + strファイル名 + "\r\n";\r
327             str文字列 += "BPM:" + cMIDI.f先頭BPM + "\r\n";\r
328             str文字列 += "TimeBase:" + cMIDI.n分解能 + "\r\n";\r
329             str文字列 += "\r\n";\r
330             \r
331             foreach ( CMIDIトラック value in cMIDI.lMIDIトラック )\r
332             {\r
333                 str文字列 += "Track " + value.nトラック数;\r
334                 str文字列 += " : " + value.strトラック名 + "\r\n";\r
335                 str文字列 += value.str解析内容 + "\r\n";\r
336             }\r
337             \r
338             this.textBox1.Text = str文字列;\r
339 \r
340                         //-----------------\r
341             #endregion\r
342                         \r
343             // 各チャンネルのノート数をチャンネル一覧に出力する\r
344                         dgvチャンネル一覧変更イベント抑止();\r
345                         for ( int i = 0; i < 16; i++ )\r
346                         {\r
347                                 this.dgvチャンネル一覧.Rows[i].Cells[ "Channel_Notes" ].Value = cMIDI.nチャンネル0to15毎のノート数[i];\r
348                                 this.dgvチャンネル一覧.Rows[i].Cells[ "Channel_Load" ].Value  = cMIDI.bドラムチャンネルと思われる[i];\r
349                         }\r
350                         dgvチャンネル一覧変更イベント復旧();\r
351 \r
352             // 各キーのノート数を割り当て一覧に出力する\r
353                         t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
354 \r
355                         // 読み込むチャンネルが確定したら、割り当て一覧が更新された時の処理\r
356                         tMIDIチップをレーンに割り当てる();\r
357         }\r
358                 \r
359                 /// <summary>\r
360                 /// レーン名変更時に呼び出すこと\r
361                 /// </summary>\r
362         private void tMIDI割り当て一覧のレーン名の背景色を変更する( int RowIndex )\r
363         {\r
364                         string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Value;\r
365             int nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( strレーン名 );\r
366 \r
367             if ( nレーン番号 >= this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "LC" ) )\r
368             {\r
369                 Color color = this.formメインフォーム.mgr譜面管理者.listレーン[nレーン番号].col背景色;\r
370                 color = Color.FromArgb( color.R/2+128, color.G/2+128, color.B/2+128 );\r
371                 this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Style.BackColor = color;\r
372             }\r
373                         else if ( strレーン名 == "* Disuse *" )\r
374                         {\r
375                 Color color = Color.FromArgb( 128, 128, 128 );\r
376                 this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Style.BackColor = color;\r
377                         }\r
378         }\r
379 \r
380         public void tMIDIインポート結果を反映する()\r
381         {\r
382             if ( cMIDI != null && cMIDI.lMIDIイベント.Count > 0 )\r
383             {\r
384                                 #region [ チップリストで、ベロシティをDTX向けに調整する ]\r
385                                 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
386                                 {\r
387                                         int velo = vMIDIイベント.nベロシティ;\r
388                                         if ( this.checkBoxベロシティ最大値127.Checked ) velo = (int)(velo / 1.27);//127を最大値\r
389                                         if ( this.checkBoxベロシティカーブ調整.Checked ) velo = (int)( Math.Pow( velo, 1.5 ) / Math.Pow( 100, 0.5 ) );//ベロシティカーブ\r
390                                         velo = ( velo / (int)this.numericUpDownVOLUME間隔.Value ) * (int)this.numericUpDownVOLUME間隔.Value;\r
391                                         velo = ( velo > 100 ) ? 100 : ( ( velo == 0 ) ? 1 : velo );\r
392                                         vMIDIイベント.nベロシティ_DTX変換後 = velo;\r
393                                 }\r
394                                 #endregion\r
395                                 \r
396                                 #region [ 読み込むチャンネルを取得してキー毎のノート数を計算する ]\r
397                                 t読み込むチャンネルを取得してキー毎のノート数を計算する();\r
398                                 #endregion\r
399 \r
400                                 #region [ 配置予定チップを割り当て一覧に沿ってレーンを割り当てる ]\r
401                                 tMIDIチップをレーンに割り当てる();\r
402                                 #endregion\r
403                                 \r
404                                 #region [ WAVリスト出力 ]\r
405 \r
406                                 #region [ #WAV02 BGM仮置き用 ]\r
407                                 CWAV cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( 2 );\r
408                                 cwav.strラベル名 = "BGM";\r
409                                 cwav.bBGMとして使用 = true;\r
410                                 cwav.col背景色 = Color.FromArgb( 224, 255, 224 );\r
411                                 #endregion\r
412                                 \r
413                                 #region [ #WAV04 以降をWAVリスト割り当てに使う ]\r
414                                 // WAVリストをソートして見やすくする\r
415                                 cMIDI.lMIDIWAV.Sort( nMIDIWAVSort );\r
416 \r
417                                 int nWAVCount = 4;\r
418                                 int nレーン番号before = 0;\r
419                                 \r
420                                 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )\r
421                                 {\r
422                                         // ノートチップ以外をWAVリストに表示させない→WAVリスト化する部分で処理する\r
423                                         //if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
424 \r
425                                         // レーン毎に1行空ける\r
426                                         if ( nWAVCount > 4 && nレーン番号before != vMIDIWAV.nレーン番号 ) nWAVCount++;\r
427                                         nレーン番号before = vMIDIWAV.nレーン番号;\r
428 \r
429                                         // WAVリストに配置\r
430                                         cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( nWAVCount );\r
431                                         cwav.strファイル名 = vMIDIWAV.nキー.ToString() + ".ogg";\r
432                                         cwav.n音量0to100 = vMIDIWAV.nベロシティ_DTX変換後;\r
433                                         cwav.strラベル名 = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].strレーン名\r
434                                                 + ( vMIDIWAV.b裏チャンネル ? "*" : "" )\r
435                                                 + " " + vMIDIWAV.strコメント;\r
436 \r
437                                         // WAVリストの背景色を、レーンの色に合わせる\r
438                                         Color color = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].col背景色;\r
439                                         cwav.col背景色 = Color.FromArgb( color.R/2 + 128, color.G/2 + 128, color.B/2 + 128 );\r
440 \r
441                                         // 配置予定全チップにWAV番号を指定する\r
442                                         foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
443                                         {\r
444                                                 if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )\r
445                                                         vMIDIイベント.nWAV = nWAVCount;\r
446                                         }\r
447                                         nWAVCount ++;\r
448                                 }\r
449                                 #endregion\r
450 \r
451                                 #region [ WAVリスト強制更新 ]\r
452                                 this.formメインフォーム.listViewWAVリスト.Refresh();\r
453                                 #endregion\r
454 \r
455                                 #endregion\r
456                                 \r
457                                 #region [ 小節付加+変拍子設定 ]\r
458                                 tMIDIイベントリストから小節リストを構成する( cMIDI.lMIDIイベント, cMIDI.n分解能 );\r
459                                 #endregion\r
460                                 \r
461                                 #region [ チップ配置 ]\r
462                                 // 複数トラックへの対応のため\r
463                                 cMIDI.lMIDIイベント.Sort( ( ( a, b ) => (int) a.n時間 - (int) b.n時間 ) );\r
464 \r
465                                 // 配置予定チップで、選択されているチャンネルのノーツを実際に配置する\r
466                 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
467                 {\r
468                                         if ( vMIDIイベント.b入力 )\r
469                                         {\r
470                                                 vMIDIイベント.挿入( this.formメインフォーム, cMIDI.n分解能 );\r
471                                         }\r
472                 }\r
473 \r
474                                 // BGMチップを仮置き\r
475                                 this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );\r
476                                 #endregion\r
477 \r
478                                 #region [ 情報を出力 ]\r
479                 if ( cMIDI.f先頭BPM > 0.0 ) this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.f先頭BPM;\r
480 \r
481                                 string str曲タイトル = cMIDI.lMIDIトラック[0].strトラック名;\r
482                                 if ( str曲タイトル == "" )\r
483                                 {\r
484                                         str曲タイトル = Path.GetFileName( cMIDI.strファイル名 );\r
485                                 }\r
486 \r
487                 this.formメインフォーム.textBox曲名.Text = str曲タイトル;\r
488 \r
489                                 if ( cMIDI.n重複チップ数 > 0 ) this.formメインフォーム.textBoxコメント.Text = resource.GetString("label重複チップ数.Text") + " : "+cMIDI.n重複チップ数;\r
490                                 #endregion\r
491 \r
492                                 #region [ LP発生なら、LPレーンを表示する。 ]\r
493                                 for ( int i = 0; i < this.dgv割り当て一覧.Rows.Count; i++ )\r
494                                 {\r
495                                         if ( (string)this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value == "LP" &&\r
496                                                 (int)this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Notes" ].Value > 0 )\r
497                                         {\r
498                                                 this.formメインフォーム.mgr譜面管理者.tExpandLanes( Cレーン.ELaneType.LP );\r
499                                         }\r
500                                 }\r
501                                 #endregion\r
502 \r
503                                 tMIDIインポート設定をファイルに保存する();\r
504                         }\r
505                 }\r
506                 \r
507                 /// <summary>\r
508                 /// dgv割り当て一覧で設定した値に応じて、各レーンへ振り分ける\r
509                 /// </summary>\r
510         private void tMIDIチップをレーンに割り当てる()\r
511         {\r
512                         if ( cMIDI == null ) return;\r
513 \r
514                         // MIDIイベントがひとつでもあるなら処理する\r
515                         if ( cMIDI.lMIDIイベント.Count == 0 ) return;\r
516 \r
517                         #region [ 振り分け ]\r
518                         foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
519                         {\r
520                                 if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_MIDI_Key" ].Value )\r
521                                 {\r
522                                         if ( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_DTX_Lane" ].Value != "* Disuse *" )\r
523                                         {\r
524                                                 vMIDIイベント.nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_DTX_Lane" ].Value );\r
525                                                 vMIDIイベント.strコメント = (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_Comment" ].Value;\r
526                                                 vMIDIイベント.b裏チャンネル = (bool)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_BackCH" ].Value;\r
527                                                 vMIDIイベント.b入力 = (bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value;\r
528                                         }\r
529                                         else\r
530                                         {\r
531                                                 vMIDIイベント.nレーン番号 = 0;\r
532                                                 vMIDIイベント.strコメント = "";\r
533                                                 vMIDIイベント.b裏チャンネル = false;\r
534                                                 vMIDIイベント.b入力 = false;\r
535                                         }\r
536                                         if ( vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BPM  ||\r
537                                                         vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
538                                         {\r
539                                                 vMIDIイベント.b入力 = true;\r
540                                         }\r
541                                 }\r
542                         }\r
543                         #endregion\r
544 \r
545                         #region [ WAVリスト化する ]\r
546                         cMIDI.lMIDIWAV = new List<CMIDIイベント>();\r
547 \r
548                         foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )\r
549                         {\r
550                                 // チャンネル一覧で選択されているものと、ノートのみリスト化\r
551                                 if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
552 \r
553                                 // WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する\r
554                                 bool bMIDIWAV_AddFlag = true;\r
555                                 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )\r
556                                 {\r
557                                         if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )\r
558                                         {\r
559                                                 bMIDIWAV_AddFlag = false;\r
560                                                 break;\r
561                                         }\r
562                                 }\r
563                                 if (bMIDIWAV_AddFlag)\r
564                                 {\r
565                                         cMIDI.lMIDIWAV.Add( vMIDIイベント );\r
566                                 }\r
567                         }\r
568                         #endregion\r
569 \r
570                         t同時刻で同じレーンに配置予定のチップを数えて反映する();\r
571         }\r
572 \r
573                 private void t同時刻で同じレーンに配置予定のチップを数えて反映する()\r
574                 {\r
575                         cMIDI.n重複チップ数 = 0;\r
576                         List<string> lMIDIイベント_重複 = new List<string>();\r
577                         \r
578                         // 読み込むチャンネルだけチェックする\r
579                         foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント ){\r
580                                 // チャンネル一覧で選択されているものと、ノートのみ数える\r
581                                 if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;\r
582 \r
583                                         string str = "" + vMIDIイベント.nレーン番号 + ":" + vMIDIイベント.n時間;\r
584                                         if ( lMIDIイベント_重複.Contains( str ) ) cMIDI.n重複チップ数 ++;\r
585                                         else lMIDIイベント_重複.Add( str );\r
586                                 }\r
587 \r
588                         this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;\r
589                 }\r
590 \r
591                 private struct barlen\r
592                 {\r
593                         public int n時間;\r
594                         public int n分子;\r
595                         public int n分母;\r
596 \r
597                         public barlen( int _n時間, int _n分子, int _n分母 )\r
598                         {\r
599                                 n時間 = _n時間;\r
600                                 n分子 = _n分子;\r
601                                 n分母 = _n分母;\r
602                         }\r
603                 }\r
604         \r
605                 private void tMIDIイベントリストから小節リストを構成する( List<CMIDIイベント> cml, int n四分音符の分解能 )\r
606                 {\r
607                         if ( cml.Count <= 0 ) return;\r
608 \r
609                         // 最終拍子イベント以降、曲最後までの小節について、この先のロジックで小節長を変更するために、ダミーで最後に拍子変更のイベントを入れる。\r
610 \r
611                         int n最終分子 = 4;\r
612                         int n最終分母 = 4;\r
613                         int n最終時間 = (int)cml[ cml.Count - 1 ].n時間;\r
614 \r
615                         cml.Reverse();\r
616                         foreach ( CMIDIイベント cm in cml )\r
617                         {\r
618                                 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
619                                 {\r
620                                         n最終分子 = cm.n拍子分子;\r
621                                         n最終分母 = cm.n拍子分母;\r
622                                         break;\r
623                                 }\r
624                         }\r
625                         cml.Reverse();\r
626 \r
627                         //if ( n最終時間 >= 0 )\r
628                         {\r
629                                 cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );\r
630                         }\r
631                 \r
632                         foreach ( CMIDIイベント cm in cml )\r
633                         {\r
634                                 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )\r
635                                 {\r
636                                         // もし拍子変更イベントの絶対時間が、小節外にあれば、必要なだけ小節を追加する\r
637                                         while ( true )\r
638                                         {\r
639                                                 bool bExistBar = true;\r
640                                                 // 現在保持している小節リストの、nGridの最大値を取得する\r
641                                                 int nCurrentMaxBar = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す();\r
642                                                 int nCurremtMaxBar_FirstGrid = this.formメインフォーム.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( nCurrentMaxBar );\r
643                                                 if ( nCurremtMaxBar_FirstGrid < 0 ) nCurremtMaxBar_FirstGrid = 0;\r
644 \r
645                                                 C小節 c最終小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nCurremtMaxBar_FirstGrid );\r
646                                                 float fCurrent小節倍率 = (c最終小節 == null) ? 1.0f : c最終小節.f小節長倍率;\r
647                                                 int nCurrentMaxGrid = nCurremtMaxBar_FirstGrid + (int) ( 192 * fCurrent小節倍率 ) - 1;\r
648                                                 if ( nCurrentMaxBar < 0 ) nCurrentMaxGrid = -1;\r
649 \r
650                                                 // 拍子変更イベントの絶対時間が、小節外にあれば、新規に小節を一つ追加する。\r
651                                                 // 小節長は前の小節長を継承するか、MIDIイベント指定による新しい値にするか。\r
652                                                 // 小節を1つ追加しただけでは足りないのであれば、whileループで繰り返し追加し続ける。\r
653                                                 int nEvent時間 = (int)cm.n時間 * ( 192 / 4 ) / n四分音符の分解能;\r
654                                                 if ( nCurrentMaxGrid < (int) nEvent時間 )\r
655                                                 {\r
656                                                         ++nCurrentMaxBar;\r
657 \r
658                                                         C小節 c小節 = new C小節( nCurrentMaxBar );\r
659                                                         if ( c小節 != null )\r
660                                                         {\r
661                                                                 c小節.f小節長倍率 = fCurrent小節倍率;\r
662                                                                 this.formメインフォーム.mgr譜面管理者.dic小節.Add( nCurrentMaxBar, c小節 );\r
663                                                         }\r
664                                                         else\r
665                                                         {\r
666                                                                 throw new Exception("C小節の作成に失敗しました。");\r
667                                                         }\r
668                                                 }\r
669                                                 else\r
670                                                 {\r
671                                                         // 小節追加whileループの最後か、または小節が既に存在する場合でも、拍子の変更があれば反映する。\r
672                                                         if (cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen)\r
673                                                         {\r
674                                                                 C小節 c小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nEvent時間 );\r
675                                                                 this.formメインフォーム.t小節長を変更する_小節単位( c小節.n小節番号0to3599, (float)cm.n拍子分子 / cm.n拍子分母 );\r
676                                                         }\r
677                                                         break;\r
678                                                 }\r
679                                         }\r
680                                 }\r
681                         }\r
682                         }\r
683 \r
684                 /// <summary>\r
685                 /// WAVリストを順番にソートする\r
686                 /// ・レーン番号:昇順\r
687                 /// ・裏チャンネル:昇順(表が0、裏が1)\r
688                 /// ・(MIDIの)キー:昇順\r
689                 /// ・音量:降順\r
690                 /// </summary>\r
691                 static int nMIDIWAVSort( CMIDIイベント a, CMIDIイベント b )\r
692                 {\r
693                         // 昇順\r
694                         if ( a.nレーン番号 > b.nレーン番号 ) return 1;\r
695                         else if ( a.nレーン番号 < b.nレーン番号 ) return -1;\r
696                         else\r
697                         {\r
698                                 // 昇順\r
699                                 if ( (a.b裏チャンネル?1:0) > (b.b裏チャンネル?1:0) ) return 1;\r
700                                 else if ( (a.b裏チャンネル?1:0) < (b.b裏チャンネル?1:0) ) return -1;\r
701                                 else\r
702                                 {\r
703                                         // 昇順\r
704                                         if ( a.nキー > b.nキー ) return 1;\r
705                                         else if ( a.nキー < b.nキー ) return -1;\r
706                                         else\r
707                                         {\r
708                                                 // 降順\r
709                                                 if ( a.nベロシティ > b.nベロシティ ) return -1;\r
710                                                 else if ( a.nベロシティ < b.nベロシティ ) return 1;\r
711                                                 else return 0;\r
712                                         }\r
713                                 }\r
714                         }\r
715                 }\r
716 \r
717                 #region [ 設定ファイル関連 ]\r
718                 //-----------------\r
719 \r
720 //              [Serializable]\r
721                 [DataContract]\r
722                 [KnownType( typeof( DTXC_MIDIConvSetting ) )]\r
723                 public struct DTXC_MIDIConvSetting\r
724                 {\r
725                         [DataMember]\r
726                         public DTXC_MIDIConvSetting_Assign[] Assign;\r
727                         [DataMember]\r
728                         public DTXC_MIDIConvSetting_Other Other;\r
729 \r
730                         public DTXC_MIDIConvSetting(DTXC_MIDIConvSetting_Assign[] _Assign, DTXC_MIDIConvSetting_Other _Other)\r
731                         {\r
732                                 Assign = _Assign;\r
733                                 Other = _Other;\r
734                         }\r
735 \r
736                 }\r
737 \r
738                 [DataContract]\r
739                 [KnownType( typeof( DTXC_MIDIConvSetting_Assign ) )]\r
740                 public struct DTXC_MIDIConvSetting_Assign\r
741                 {\r
742                         [DataMember]\r
743                         public int MIDI_Key;\r
744                         [DataMember]\r
745                         public string DTX_Lane;\r
746                         [DataMember]\r
747                         public bool BackCH;\r
748                         [DataMember]\r
749                         public string Comment;\r
750 \r
751                         public DTXC_MIDIConvSetting_Assign(int _MIDI_Key, string _DTX_Lane, bool _BackCH, string _Comment)\r
752                         {\r
753                                 MIDI_Key = _MIDI_Key;\r
754                                 DTX_Lane = _DTX_Lane;\r
755                                 BackCH   = _BackCH;\r
756                                 Comment   = _Comment;\r
757                         }\r
758                 }\r
759                 \r
760                 [DataContract]\r
761                 [KnownType( typeof( DTXC_MIDIConvSetting_Other ) )]\r
762                 public struct DTXC_MIDIConvSetting_Other\r
763                 {\r
764                         [DataMember]\r
765                         public bool VelocityMax127;\r
766                         [DataMember]\r
767                         public bool VelocityCurveFix;\r
768                         [DataMember]\r
769                         public int DTXVOLUME;\r
770 \r
771                         public DTXC_MIDIConvSetting_Other( bool _VelocityCurveFix, bool _VelocityMax127, int _DTXVOLUME )\r
772                         {\r
773                                 VelocityCurveFix = _VelocityCurveFix;\r
774                                 VelocityMax127   = _VelocityMax127;\r
775                                 DTXVOLUME        = _DTXVOLUME;\r
776                         }\r
777                 }\r
778 \r
779                 public void tMIDIインポート設定をファイルから読み込む()\r
780                 {\r
781                         #region [ ファイル確認 ]\r
782                         // ファイルが無かったら新規で保存して読み込まない\r
783                         if ( !File.Exists( this.formメインフォーム.strMIDIインポート設定ファイル ) ) {\r
784                                 this.formメインフォーム.strMIDIインポート設定ファイル = Directory.GetCurrentDirectory() + @"\" + "DTXCreatorSMFSettings.xml";\r
785                                 tMIDIインポート設定をファイルに保存する();\r
786                                 return;\r
787                         }\r
788                         #endregion\r
789                         \r
790                         #region [ xmlファイルから読込 ]\r
791                         DTXC_MIDIConvSetting mcs;\r
792 \r
793                         using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Open ) )\r
794                         {\r
795                                 var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );\r
796                                 mcs = (DTXC_MIDIConvSetting) serializer.Deserialize( stream );\r
797                         }\r
798                         #endregion\r
799                         \r
800                         #region [ 割り当て一覧の反映 ]\r
801                         for ( int i = 0; i < 128; i++ )\r
802                         {\r
803                                 this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_MIDI_Key" ].Value = mcs.Assign[ i ].MIDI_Key;\r
804                                 this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value = mcs.Assign[ i ].DTX_Lane;\r
805                                 this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_BackCH" ].Value   = mcs.Assign[ i ].BackCH;\r
806                                 this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Comment" ].Value  = mcs.Assign[ i ].Comment;\r
807                         }\r
808                         #endregion\r
809 \r
810                         #region [ その他インポート設定の反映 ]\r
811                         checkBoxベロシティカーブ調整.Checked = mcs.Other.VelocityCurveFix;\r
812                         checkBoxベロシティ最大値127.Checked  = mcs.Other.VelocityMax127;\r
813                         numericUpDownVOLUME間隔.Value        = mcs.Other.DTXVOLUME;\r
814                         #endregion\r
815                         \r
816                         labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );\r
817 \r
818                         #region [ 割り当て一覧が更新された時の処理 ]\r
819             //-----------------\r
820                         for ( int i = 0 ; i < 128 ; i++ ) tMIDI割り当て一覧のレーン名の背景色を変更する( i );\r
821                         tMIDIチップをレーンに割り当てる();\r
822             //-----------------\r
823             #endregion\r
824                 }\r
825         \r
826                 public void tMIDIインポート設定をファイルに保存する()\r
827                 {\r
828                         DTXC_MIDIConvSetting mcs = new DTXC_MIDIConvSetting();\r
829                         mcs.Assign = new DTXC_MIDIConvSetting_Assign[ 128 ];\r
830                         mcs.Other = new DTXC_MIDIConvSetting_Other();\r
831 \r
832                         #region [ 割り当て一覧の格納 ]\r
833                         for (int i = 0; i < 128; i++)\r
834                         {\r
835                                 mcs.Assign[ i ].MIDI_Key = (int)    this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_MIDI_Key" ].Value;\r
836                                 mcs.Assign[ i ].DTX_Lane = (string) this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_DTX_Lane" ].Value;\r
837                                 mcs.Assign[ i ].BackCH   = (bool)   this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_BackCH" ].Value;\r
838                                 mcs.Assign[ i ].Comment  = (string) this.dgv割り当て一覧.Rows[ i ].Cells[ "Assign_Comment" ].Value;\r
839                         }\r
840                         #endregion\r
841 \r
842                         #region [ その他インポート設定の格納 ]\r
843                         mcs.Other.VelocityCurveFix = checkBoxベロシティカーブ調整.Checked;\r
844                         mcs.Other.VelocityMax127   = checkBoxベロシティ最大値127.Checked;\r
845                         mcs.Other.DTXVOLUME        = (int)numericUpDownVOLUME間隔.Value;\r
846                         #endregion\r
847                         \r
848                         #region [ xmlファイルに保存 ]\r
849                         using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Create ) )\r
850                         {\r
851                                 var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );\r
852                                 serializer.Serialize( stream, mcs );\r
853                         }\r
854                         #endregion\r
855                         \r
856                         labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );\r
857                 }\r
858 \r
859                 private void tMIDIインポート設定ファイル選択ダイアログを開く()\r
860                 {\r
861                         #region [ ファイル選択 ]\r
862             //-----------------\r
863             OpenFileDialog dialog = new OpenFileDialog();\r
864                         dialog.Title = Resources.strMIDIインポート設定ファイル選択ダイアログのタイトル;\r
865             dialog.Filter = Resources.strMIDIインポート設定ファイル選択ダイアログのフィルタ;\r
866             dialog.FilterIndex = 1;\r
867             dialog.InitialDirectory =\r
868                                 ( this.formメインフォーム.strMIDIインポート設定ファイル != "" )\r
869                                 ? Path.GetDirectoryName( this.formメインフォーム.strMIDIインポート設定ファイル ) + @"\"\r
870                                 : Directory.GetCurrentDirectory();\r
871             DialogResult result = dialog.ShowDialog();\r
872 \r
873             if (result != DialogResult.OK) return;\r
874 \r
875                         string strファイル名 = dialog.FileName;\r
876             //-----------------\r
877             #endregion\r
878 \r
879                         #region [ ファイル確認 ]\r
880             //-----------------\r
881             if ( !File.Exists( strファイル名 ) )\r
882             {\r
883                 MessageBox.Show(\r
884                     Resources.strMIDIインポート設定ファイルではないMSG,\r
885                     Resources.strMIDIインポートエラーのタイトル,\r
886                     MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);\r
887                 return;\r
888             }\r
889             //-----------------\r
890             #endregion\r
891 \r
892             #region [ 拡張子確認 ]\r
893             //-----------------\r
894             string str拡張子 = Path.GetExtension(strファイル名);\r
895 \r
896             if ( !str拡張子.Equals(".xml", StringComparison.OrdinalIgnoreCase ) )\r
897             {\r
898                 MessageBox.Show(\r
899                                         Resources.strMIDIインポート設定ファイルではないMSG,\r
900                                         Resources.strMIDIインポートエラーのタイトル,\r
901                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
902                 return;\r
903             }\r
904             //-----------------\r
905             #endregion\r
906 \r
907                         #region [ 各設定 ]\r
908             //-----------------\r
909                         this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;\r
910             //-----------------\r
911             #endregion\r
912 \r
913                         tMIDIインポート設定をファイルから読み込む();\r
914                 }\r
915 \r
916                 private void tMIDIインポート設定ファイル保存ダイアログを開く()\r
917                 {\r
918                         #region [ ファイル選択 ]\r
919             //-----------------\r
920                         SaveFileDialog dialog = new SaveFileDialog();\r
921                         dialog.Title = Resources.strMIDIインポート設定ファイル保存ダイアログのタイトル;\r
922                         dialog.Filter = Resources.strMIDIインポート設定ファイル選択ダイアログのフィルタ;\r
923                         dialog.FilterIndex = 1;\r
924                         dialog.InitialDirectory = \r
925                                 ( this.formメインフォーム.strMIDIインポート設定ファイル != "" )\r
926                                 ? Path.GetDirectoryName( this.formメインフォーム.strMIDIインポート設定ファイル ) + @"\"\r
927                                 : Directory.GetCurrentDirectory();\r
928                         DialogResult result = dialog.ShowDialog();\r
929 \r
930             if (result != DialogResult.OK) return;\r
931 \r
932                         string strファイル名 = dialog.FileName;\r
933             //-----------------\r
934             #endregion\r
935 \r
936                         #region [ 拡張子変更 ]\r
937             //-----------------\r
938                         if ( Path.GetExtension( strファイル名 ).Length == 0 )\r
939                                 strファイル名 = Path.ChangeExtension( strファイル名, ".xml" );\r
940             //-----------------\r
941             #endregion\r
942                         \r
943                         #region [ 各設定 ]\r
944             //-----------------\r
945                         this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;\r
946             //-----------------\r
947             #endregion\r
948 \r
949                         tMIDIインポート設定をファイルに保存する();\r
950                 }\r
951 \r
952                 //-----------------\r
953                 #endregion\r
954 \r
955         }\r
956 }\r