2 using System.Collections;
\r
3 using System.Collections.Generic;
\r
5 using System.Windows.Forms;
\r
6 using System.ComponentModel;
\r
8 using System.Drawing;
\r
9 using System.Diagnostics;
\r
11 using System.Runtime.Serialization;
\r
12 using DTXCreator.譜面;
\r
13 using DTXCreator.WAV_BMP_AVI;
\r
14 using DTXCreator.Properties;
\r
16 namespace DTXCreator.MIDIインポート
\r
18 public partial class CMIDIインポートダイアログ : Form
\r
21 private CMIDI cMIDI;
\r
22 public Cメインフォーム formメインフォーム;
\r
23 private System.Resources.ResourceManager resource;
\r
25 public CMIDIインポートダイアログ()
\r
27 InitializeComponent();
\r
28 dgvチャンネル一覧変更イベント抑止();
\r
29 resource = new System.Resources.ResourceManager( this.GetType() );
\r
32 private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)
\r
34 if ( e.KeyCode == Keys.Return )
\r
36 this.buttonOK.PerformClick();
\r
38 else if ( e.KeyCode == Keys.Escape )
\r
40 this.buttonCancel.PerformClick();
\r
44 private void buttonOpen_Click(object sender, EventArgs e)
\r
49 private void buttonOpenSettings_Click(object sender, EventArgs e)
\r
51 tMIDIインポート設定ファイル選択ダイアログを開く();
\r
54 private void buttonSaveSettings_Click(object sender, EventArgs e)
\r
56 tMIDIインポート設定ファイル保存ダイアログを開く();
\r
60 private void dgv割り当て一覧_CellEnter( object sender, DataGridViewCellEventArgs e )
\r
62 DataGridView dgv割り当て一覧 = (DataGridView) sender;
\r
64 if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )
\r
65 SendKeys.Send("{F4}");
\r
69 private void dgv割り当て一覧_CellEndEdit( object sender, DataGridViewCellEventArgs e )
\r
71 DataGridView dgv割り当て一覧 = (DataGridView) sender;
\r
73 if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "Assign_DTX_Lane" )
\r
74 tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );
\r
76 tMIDIチップをレーンに割り当てる();
\r
81 /// dgvチャンネル一覧変更の内容をプログラム中で変更する時は、CellValueChangedイベントを抑止する為にこの関数を呼ぶこと
\r
83 private void dgvチャンネル一覧変更イベント抑止()
\r
87 dgvチャンネル一覧.CellValueChanged -= dgvチャンネル一覧_CellValueChanged;
\r
89 catch ( Exception e )
\r
91 Debug.WriteLine( "dgvチャンネル一覧.CellValueChangedのイベントエントリ削除に失敗しましたが、続行します。{0}", e.Message );
\r
96 /// dgvチャンネル一覧変更イベント抑止()を呼び出し、
\r
97 /// dgvチャンネル一覧変更の内容をプログラム中で変更し終わった時にこの関数を呼ぶこと
\r
99 private void dgvチャンネル一覧変更イベント復旧()
\r
101 dgvチャンネル一覧.CellValueChanged += dgvチャンネル一覧_CellValueChanged;
\r
105 /// チェックした瞬間にCellValueChangedを発生させる用
\r
107 private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)
\r
109 if ( dgvチャンネル一覧.IsCurrentCellDirty )
\r
111 dgvチャンネル一覧.CommitEdit( DataGridViewDataErrorContexts.Commit );
\r
115 private void dgvチャンネル一覧_CellValueChanged( object sender, DataGridViewCellEventArgs e )
\r
117 if ( cMIDI != null ) {
\r
118 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
123 /// ファイルを開いた時か、チャンネル一覧のチェック変更時に呼び出す
\r
125 private void t読み込むチャンネルを取得してキー毎のノート数を計算する()
\r
128 for ( int i = 0 ; i < 128 ; i++ ) cMIDI.nドラムチャンネルのキー毎のノート数[i] = 0;
\r
130 // MIDIイベントの内、チャンネル一覧でチェックの入ってるチャンネルを持つノートを、変換するノートとしてカウントする
\r
131 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
133 if (vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.NoteOnOff)
\r
135 if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells[ "Channel_Load" ].Value)
\r
137 cMIDI.nドラムチャンネルのキー毎のノート数[vMIDIイベント.nキー] ++;
\r
141 for ( int i = 0 ; i < 128 ; i++ )
\r
142 this.dgv割り当て一覧.Rows[127-i].Cells[ "Assign_Notes" ].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];
\r
144 t同時刻で同じレーンに配置予定のチップを数えて反映する();
\r
148 public void tMIDI割り当て一覧を作成する()
\r
151 this.Assign_DTX_Lane.Items.AddRange( "* Disuse *" );
\r
152 foreach ( Cレーン cレーン in this.formメインフォーム.mgr譜面管理者.listレーン )
\r
154 if ( cレーン.eレーン種別 == Cレーン.E種別.WAV ) this.Assign_DTX_Lane.Items.AddRange( cレーン.strレーン名 );
\r
158 for ( int i = 127; i >= 0; i-- )
\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
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
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
219 if ( i%12 == 0 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );
\r
221 tMIDI割り当て一覧のレーン名の背景色を変更する( 127-i );
\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
229 this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 82;//key35=LBDが表示される位置
\r
232 public void tMIDIチャンネル一覧を作成する()
\r
234 for (int i = 0; i < 16; i++)
\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
239 // dgvチャンネル一覧変更イベント復旧(); //ここでイベントを復旧してはいけない
\r
240 //(直後にファイルを開く動作+解析動作が発生するのでそこで)
\r
241 //ChangValueイベントが発生しイベントが何度も発生してしまう
\r
244 public void tMIDIファイルを選択する()
\r
247 //-----------------
\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
256 if (result != DialogResult.OK) return;
\r
258 //-----------------
\r
261 this.tMIDIファイルを開く( dialog.FileName );
\r
264 public void tMIDIファイルを開く( string strファイル名 )
\r
267 //-----------------
\r
268 if ( !File.Exists( strファイル名 ) )
\r
271 Resources.strファイルが存在しませんMSG,
\r
272 Resources.strMIDIインポートエラーのタイトル,
\r
273 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
\r
276 //-----------------
\r
280 //-----------------
\r
281 string str拡張子 = Path.GetExtension(strファイル名);
\r
283 if ( !str拡張子.Equals(".mid", StringComparison.OrdinalIgnoreCase ) && !str拡張子.Equals( ".midi", StringComparison.OrdinalIgnoreCase) )
\r
286 Resources.strMIDIファイルではないMSG,
\r
287 Resources.strMIDIインポートエラーのタイトル,
\r
288 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
291 //-----------------
\r
295 //-----------------
\r
296 this.formメインフォーム.strMIDIインポートフォルダ = Path.GetDirectoryName( strファイル名 ) + @"\";
\r
297 //-----------------
\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
308 if ( !cMIDI.bMIDIファイル )
\r
311 Resources.strMIDIファイルではないMSG,
\r
312 Resources.strMIDIインポートエラーのタイトル,
\r
313 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
318 //-----------------
\r
321 #region [ 解析結果を出力 ]
\r
322 //-----------------
\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
331 foreach ( CMIDIトラック value in cMIDI.lMIDIトラック )
\r
333 str文字列 += "Track " + value.nトラック数;
\r
334 str文字列 += " : " + value.strトラック名 + "\r\n";
\r
335 str文字列 += value.str解析内容 + "\r\n";
\r
338 this.textBox1.Text = str文字列;
\r
340 //-----------------
\r
343 // 各チャンネルのノート数をチャンネル一覧に出力する
\r
344 dgvチャンネル一覧変更イベント抑止();
\r
345 for ( int i = 0; i < 16; i++ )
\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
350 dgvチャンネル一覧変更イベント復旧();
\r
352 // 各キーのノート数を割り当て一覧に出力する
\r
353 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
355 // 読み込むチャンネルが確定したら、割り当て一覧が更新された時の処理
\r
356 tMIDIチップをレーンに割り当てる();
\r
362 private void tMIDI割り当て一覧のレーン名の背景色を変更する( int RowIndex )
\r
364 string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Value;
\r
365 int nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( strレーン名 );
\r
367 if ( nレーン番号 >= this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "LC" ) )
\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
373 else if ( strレーン名 == "* Disuse *" )
\r
375 Color color = Color.FromArgb( 128, 128, 128 );
\r
376 this.dgv割り当て一覧.Rows[RowIndex].Cells[ "Assign_DTX_Lane" ].Style.BackColor = color;
\r
380 public void tMIDIインポート結果を反映する()
\r
382 if ( cMIDI != null && cMIDI.lMIDIイベント.Count > 0 )
\r
384 #region [ チップリストで、ベロシティをDTX向けに調整する ]
\r
385 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\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
396 #region [ 読み込むチャンネルを取得してキー毎のノート数を計算する ]
\r
397 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
400 #region [ 配置予定チップを割り当て一覧に沿ってレーンを割り当てる ]
\r
401 tMIDIチップをレーンに割り当てる();
\r
404 #region [ WAVリスト出力 ]
\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
413 #region [ #WAV04 以降をWAVリスト割り当てに使う ]
\r
414 // WAVリストをソートして見やすくする
\r
415 cMIDI.lMIDIWAV.Sort( nMIDIWAVSort );
\r
418 int nレーン番号before = 0;
\r
420 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )
\r
422 // ノートチップ以外をWAVリストに表示させない→WAVリスト化する部分で処理する
\r
423 //if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;
\r
426 if ( nWAVCount > 4 && nレーン番号before != vMIDIWAV.nレーン番号 ) nWAVCount++;
\r
427 nレーン番号before = vMIDIWAV.nレーン番号;
\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
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
441 // 配置予定全チップにWAV番号を指定する
\r
442 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
444 if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )
\r
445 vMIDIイベント.nWAV = nWAVCount;
\r
451 #region [ WAVリスト強制更新 ]
\r
452 this.formメインフォーム.listViewWAVリスト.Refresh();
\r
457 #region [ 小節付加+変拍子設定 ]
\r
458 tMIDIイベントリストから小節リストを構成する( cMIDI.lMIDIイベント, cMIDI.n分解能 );
\r
463 cMIDI.lMIDIイベント.Sort( ( ( a, b ) => (int) a.n時間 - (int) b.n時間 ) );
\r
465 // 配置予定チップで、選択されているチャンネルのノーツを実際に配置する
\r
466 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
468 if ( vMIDIイベント.b入力 )
\r
470 vMIDIイベント.挿入( this.formメインフォーム, cMIDI.n分解能 );
\r
475 this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );
\r
479 if ( cMIDI.f先頭BPM > 0.0 ) this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.f先頭BPM;
\r
481 string str曲タイトル = cMIDI.lMIDIトラック[0].strトラック名;
\r
482 if ( str曲タイトル == "" )
\r
484 str曲タイトル = Path.GetFileName( cMIDI.strファイル名 );
\r
487 this.formメインフォーム.textBox曲名.Text = str曲タイトル;
\r
489 if ( cMIDI.n重複チップ数 > 0 ) this.formメインフォーム.textBoxコメント.Text = resource.GetString("label重複チップ数.Text") + " : "+cMIDI.n重複チップ数;
\r
492 #region [ LP発生なら、LPレーンを表示する。 ]
\r
493 for ( int i = 0; i < this.dgv割り当て一覧.Rows.Count; i++ )
\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
498 this.formメインフォーム.mgr譜面管理者.tExpandLanes( Cレーン.ELaneType.LP );
\r
503 tMIDIインポート設定をファイルに保存する();
\r
508 /// dgv割り当て一覧で設定した値に応じて、各レーンへ振り分ける
\r
510 private void tMIDIチップをレーンに割り当てる()
\r
512 if ( cMIDI == null ) return;
\r
514 // MIDIイベントがひとつでもあるなら処理する
\r
515 if ( cMIDI.lMIDIイベント.Count == 0 ) return;
\r
518 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
520 if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_MIDI_Key" ].Value )
\r
522 if ( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells[ "Assign_DTX_Lane" ].Value != "* Disuse *" )
\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
531 vMIDIイベント.nレーン番号 = 0;
\r
532 vMIDIイベント.strコメント = "";
\r
533 vMIDIイベント.b裏チャンネル = false;
\r
534 vMIDIイベント.b入力 = false;
\r
536 if ( vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BPM ||
\r
537 vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
539 vMIDIイベント.b入力 = true;
\r
545 #region [ WAVリスト化する ]
\r
546 cMIDI.lMIDIWAV = new List<CMIDIイベント>();
\r
548 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
550 // チャンネル一覧で選択されているものと、ノートのみリスト化
\r
551 if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;
\r
553 // WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する
\r
554 bool bMIDIWAV_AddFlag = true;
\r
555 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )
\r
557 if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )
\r
559 bMIDIWAV_AddFlag = false;
\r
563 if (bMIDIWAV_AddFlag)
\r
565 cMIDI.lMIDIWAV.Add( vMIDIイベント );
\r
570 t同時刻で同じレーンに配置予定のチップを数えて反映する();
\r
573 private void t同時刻で同じレーンに配置予定のチップを数えて反映する()
\r
576 List<string> lMIDIイベント_重複 = new List<string>();
\r
578 // 読み込むチャンネルだけチェックする
\r
579 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント ){
\r
580 // チャンネル一覧で選択されているものと、ノートのみ数える
\r
581 if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;
\r
583 string str = "" + vMIDIイベント.nレーン番号 + ":" + vMIDIイベント.n時間;
\r
584 if ( lMIDIイベント_重複.Contains( str ) ) cMIDI.n重複チップ数 ++;
\r
585 else lMIDIイベント_重複.Add( str );
\r
588 this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;
\r
591 private struct barlen
\r
597 public barlen( int _n時間, int _n分子, int _n分母 )
\r
605 private void tMIDIイベントリストから小節リストを構成する( List<CMIDIイベント> cml, int n四分音符の分解能 )
\r
607 if ( cml.Count <= 0 ) return;
\r
609 // 最終拍子イベント以降、曲最後までの小節について、この先のロジックで小節長を変更するために、ダミーで最後に拍子変更のイベントを入れる。
\r
613 int n最終時間 = (int)cml[ cml.Count - 1 ].n時間;
\r
616 foreach ( CMIDIイベント cm in cml )
\r
618 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
627 //if ( n最終時間 >= 0 )
\r
629 cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );
\r
632 foreach ( CMIDIイベント cm in cml )
\r
634 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
636 // もし拍子変更イベントの絶対時間が、小節外にあれば、必要なだけ小節を追加する
\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
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
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
658 C小節 c小節 = new C小節( nCurrentMaxBar );
\r
661 c小節.f小節長倍率 = fCurrent小節倍率;
\r
662 this.formメインフォーム.mgr譜面管理者.dic小節.Add( nCurrentMaxBar, c小節 );
\r
666 throw new Exception("C小節の作成に失敗しました。");
\r
671 // 小節追加whileループの最後か、または小節が既に存在する場合でも、拍子の変更があれば反映する。
\r
672 if (cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen)
\r
674 C小節 c小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nEvent時間 );
\r
675 this.formメインフォーム.t小節長を変更する_小節単位( c小節.n小節番号0to3599, (float)cm.n拍子分子 / cm.n拍子分母 );
\r
685 /// WAVリストを順番にソートする
\r
687 /// ・裏チャンネル:昇順(表が0、裏が1)
\r
691 static int nMIDIWAVSort( CMIDIイベント a, CMIDIイベント b )
\r
694 if ( a.nレーン番号 > b.nレーン番号 ) return 1;
\r
695 else if ( a.nレーン番号 < b.nレーン番号 ) return -1;
\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
704 if ( a.nキー > b.nキー ) return 1;
\r
705 else if ( a.nキー < b.nキー ) return -1;
\r
709 if ( a.nベロシティ > b.nベロシティ ) return -1;
\r
710 else if ( a.nベロシティ < b.nベロシティ ) return 1;
\r
717 #region [ 設定ファイル関連 ]
\r
718 //-----------------
\r
722 [KnownType( typeof( DTXC_MIDIConvSetting ) )]
\r
723 public struct DTXC_MIDIConvSetting
\r
726 public DTXC_MIDIConvSetting_Assign[] Assign;
\r
728 public DTXC_MIDIConvSetting_Other Other;
\r
730 public DTXC_MIDIConvSetting(DTXC_MIDIConvSetting_Assign[] _Assign, DTXC_MIDIConvSetting_Other _Other)
\r
739 [KnownType( typeof( DTXC_MIDIConvSetting_Assign ) )]
\r
740 public struct DTXC_MIDIConvSetting_Assign
\r
743 public int MIDI_Key;
\r
745 public string DTX_Lane;
\r
747 public bool BackCH;
\r
749 public string Comment;
\r
751 public DTXC_MIDIConvSetting_Assign(int _MIDI_Key, string _DTX_Lane, bool _BackCH, string _Comment)
\r
753 MIDI_Key = _MIDI_Key;
\r
754 DTX_Lane = _DTX_Lane;
\r
756 Comment = _Comment;
\r
761 [KnownType( typeof( DTXC_MIDIConvSetting_Other ) )]
\r
762 public struct DTXC_MIDIConvSetting_Other
\r
765 public bool VelocityMax127;
\r
767 public bool VelocityCurveFix;
\r
769 public int DTXVOLUME;
\r
771 public DTXC_MIDIConvSetting_Other( bool _VelocityCurveFix, bool _VelocityMax127, int _DTXVOLUME )
\r
773 VelocityCurveFix = _VelocityCurveFix;
\r
774 VelocityMax127 = _VelocityMax127;
\r
775 DTXVOLUME = _DTXVOLUME;
\r
779 public void tMIDIインポート設定をファイルから読み込む()
\r
782 // ファイルが無かったら新規で保存して読み込まない
\r
783 if ( !File.Exists( this.formメインフォーム.strMIDIインポート設定ファイル ) ) {
\r
784 this.formメインフォーム.strMIDIインポート設定ファイル = Directory.GetCurrentDirectory() + @"\" + "DTXCreatorSMFSettings.xml";
\r
785 tMIDIインポート設定をファイルに保存する();
\r
790 #region [ xmlファイルから読込 ]
\r
791 DTXC_MIDIConvSetting mcs;
\r
793 using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Open ) )
\r
795 var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );
\r
796 mcs = (DTXC_MIDIConvSetting) serializer.Deserialize( stream );
\r
800 #region [ 割り当て一覧の反映 ]
\r
801 for ( int i = 0; i < 128; i++ )
\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
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
816 labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );
\r
818 #region [ 割り当て一覧が更新された時の処理 ]
\r
819 //-----------------
\r
820 for ( int i = 0 ; i < 128 ; i++ ) tMIDI割り当て一覧のレーン名の背景色を変更する( i );
\r
821 tMIDIチップをレーンに割り当てる();
\r
822 //-----------------
\r
826 public void tMIDIインポート設定をファイルに保存する()
\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
832 #region [ 割り当て一覧の格納 ]
\r
833 for (int i = 0; i < 128; i++)
\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
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
848 #region [ xmlファイルに保存 ]
\r
849 using ( var stream = new FileStream( this.formメインフォーム.strMIDIインポート設定ファイル, FileMode.Create ) )
\r
851 var serializer = new System.Xml.Serialization.XmlSerializer( typeof( DTXC_MIDIConvSetting ) );
\r
852 serializer.Serialize( stream, mcs );
\r
856 labelMIDIImportSettingsFile.Text = Path.GetFileName( this.formメインフォーム.strMIDIインポート設定ファイル );
\r
859 private void tMIDIインポート設定ファイル選択ダイアログを開く()
\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
873 if (result != DialogResult.OK) return;
\r
875 string strファイル名 = dialog.FileName;
\r
876 //-----------------
\r
880 //-----------------
\r
881 if ( !File.Exists( strファイル名 ) )
\r
884 Resources.strMIDIインポート設定ファイルではないMSG,
\r
885 Resources.strMIDIインポートエラーのタイトル,
\r
886 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
\r
889 //-----------------
\r
893 //-----------------
\r
894 string str拡張子 = Path.GetExtension(strファイル名);
\r
896 if ( !str拡張子.Equals(".xml", StringComparison.OrdinalIgnoreCase ) )
\r
899 Resources.strMIDIインポート設定ファイルではないMSG,
\r
900 Resources.strMIDIインポートエラーのタイトル,
\r
901 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
904 //-----------------
\r
908 //-----------------
\r
909 this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;
\r
910 //-----------------
\r
913 tMIDIインポート設定をファイルから読み込む();
\r
916 private void tMIDIインポート設定ファイル保存ダイアログを開く()
\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
930 if (result != DialogResult.OK) return;
\r
932 string strファイル名 = dialog.FileName;
\r
933 //-----------------
\r
937 //-----------------
\r
938 if ( Path.GetExtension( strファイル名 ).Length == 0 )
\r
939 strファイル名 = Path.ChangeExtension( strファイル名, ".xml" );
\r
940 //-----------------
\r
944 //-----------------
\r
945 this.formメインフォーム.strMIDIインポート設定ファイル = strファイル名;
\r
946 //-----------------
\r
949 tMIDIインポート設定をファイルに保存する();
\r
952 //-----------------
\r