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
10 using DTXCreator.譜面;
\r
11 using DTXCreator.WAV_BMP_AVI;
\r
12 using DTXCreator.Properties;
\r
14 namespace DTXCreator.MIDIインポート
\r
16 public partial class CMIDIインポートダイアログ : Form
\r
19 private CMIDI cMIDI;
\r
20 public Cメインフォーム formメインフォーム;
\r
21 private System.Resources.ResourceManager resource;
\r
23 public CMIDIインポートダイアログ()
\r
25 InitializeComponent();
\r
26 dgvチャンネル一覧変更イベント抑止();
\r
27 resource = new System.Resources.ResourceManager( this.GetType() );
\r
30 private void CMIDIインポートダイアログ_KeyDown(object sender, KeyEventArgs e)
\r
32 if ( e.KeyCode == Keys.Return )
\r
34 this.buttonOK.PerformClick();
\r
36 else if ( e.KeyCode == Keys.Escape )
\r
38 this.buttonCancel.PerformClick();
\r
42 private void buttonOpen_Click(object sender, EventArgs e)
\r
44 this.tMIDIファイルを選択する();
\r
48 private void dgv割り当て一覧_CellEnter( object sender, DataGridViewCellEventArgs e )
\r
50 DataGridView dgv割り当て一覧 = (DataGridView) sender;
\r
52 if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" && dgv割り当て一覧.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn )
\r
53 SendKeys.Send("{F4}");
\r
57 private void dgv割り当て一覧_CellEndEdit( object sender, DataGridViewCellEventArgs e )
\r
59 DataGridView dgv割り当て一覧 = (DataGridView) sender;
\r
61 if ( dgv割り当て一覧.Columns[e.ColumnIndex].Name == "DTX_Lane" )
\r
62 tMIDI割り当て一覧のレーン名の背景色を変更する( e.RowIndex );
\r
64 if ( cMIDI != null ) tMIDIチップをレーンに割り当てる();
\r
69 /// dgvチャンネル一覧変更の内容をプログラム中で変更する時は、CellValueChangedイベントを抑止する為にこの関数を呼ぶこと
\r
71 private void dgvチャンネル一覧変更イベント抑止()
\r
75 dgvチャンネル一覧.CellValueChanged -= dgvチャンネル一覧_CellValueChanged;
\r
77 catch ( Exception e )
\r
79 Debug.WriteLine( "dgvチャンネル一覧.CellValueChangedのイベントエントリ削除に失敗しましたが、続行します。{0}", e.Message );
\r
84 /// dgvチャンネル一覧変更イベント抑止()を呼び出し、
\r
85 /// dgvチャンネル一覧変更の内容をプログラム中で変更し終わった時にこの関数を呼ぶこと
\r
87 private void dgvチャンネル一覧変更イベント復旧()
\r
89 dgvチャンネル一覧.CellValueChanged += dgvチャンネル一覧_CellValueChanged;
\r
93 /// チェックした瞬間にCellValueChangedを発生させる用
\r
95 private void dgvチャンネル一覧_CurrentCellDirtyStateChanged(object sender, EventArgs e)
\r
97 if ( dgvチャンネル一覧.IsCurrentCellDirty )
\r
99 dgvチャンネル一覧.CommitEdit( DataGridViewDataErrorContexts.Commit );
\r
103 private void dgvチャンネル一覧_CellValueChanged( object sender, DataGridViewCellEventArgs e )
\r
105 if ( cMIDI != null ) {
\r
106 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
111 /// ファイルを開いた時か、チャンネル一覧のチェック変更時に呼び出す
\r
113 private void t読み込むチャンネルを取得してキー毎のノート数を計算する()
\r
116 for ( int i = 0 ; i < 128 ; i++ ) cMIDI.nドラムチャンネルのキー毎のノート数[i] = 0;
\r
118 // MIDIイベントの内、チャンネル一覧でチェックの入ってるチャンネルを持つノートを、変換するノートとしてカウントする
\r
119 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
121 if (vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.NoteOnOff)
\r
123 if ((bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells["ChLoad"].Value)
\r
125 cMIDI.nドラムチャンネルのキー毎のノート数[vMIDIイベント.nキー] ++;
\r
129 for ( int i = 0 ; i < 128 ; i++ )
\r
130 this.dgv割り当て一覧.Rows[127-i].Cells["Notes"].Value = cMIDI.nドラムチャンネルのキー毎のノート数[i];
\r
132 t同時刻で同じレーンに配置予定のチップを数えて反映する();
\r
136 public void tMIDI割り当て一覧を作成する()
\r
139 this.DTX_Lane.Items.AddRange( "* Disuse *" );
\r
140 foreach ( Cレーン cレーン in this.formメインフォーム.mgr譜面管理者.listレーン )
\r
142 if ( cレーン.eレーン種別 == Cレーン.E種別.WAV ) this.DTX_Lane.Items.AddRange( cレーン.strレーン名 );
\r
146 for ( int i = 127; i >= 0; i-- )
\r
148 string str楽器名 = "";
\r
149 string[] strキー名 = new string[] { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B", };
\r
150 string strレーン名 = "* Disuse *";
\r
151 bool b裏チャンネル = false;
\r
154 case 35 : str楽器名 = "Bass Drum 2"; strレーン名 = "BD"; break;
\r
155 case 36 : str楽器名 = "Bass Drum 1"; strレーン名 = "BD"; break;
\r
156 case 37 : str楽器名 = "Side Stick"; strレーン名 = "SE1"; break;
\r
157 case 38 : str楽器名 = "Snare Drum 1"; strレーン名 = "SD"; break;
\r
158 case 39 : str楽器名 = "Hand Clap"; strレーン名 = "SE1"; break;
\r
159 case 40 : str楽器名 = "Snare Drum 2"; strレーン名 = "SD"; break;
\r
160 case 41 : str楽器名 = "Low Tom 2"; strレーン名 = "FT"; break;
\r
161 case 42 : str楽器名 = "Closed Hi-hat"; strレーン名 = "HH"; break;
\r
162 case 43 : str楽器名 = "Low Tom 1"; strレーン名 = "FT"; break;
\r
163 case 44 : str楽器名 = "Pedal Hi-hat"; strレーン名 = "LP"; break;
\r
164 case 45 : str楽器名 = "Mid Tom 2"; strレーン名 = "LT"; break;
\r
165 case 46 : str楽器名 = "Open Hi-hat"; strレーン名 = "HH"; b裏チャンネル = true; break;
\r
166 case 47 : str楽器名 = "Mid Tom 1"; strレーン名 = "LT"; break;
\r
167 case 48 : str楽器名 = "High Tom 2"; strレーン名 = "HT"; break;
\r
168 case 49 : str楽器名 = "Crash Cymbal 1"; strレーン名 = "CY"; break;
\r
169 case 50 : str楽器名 = "High Tom 1"; strレーン名 = "HT"; break;
\r
170 case 51 : str楽器名 = "Ride Cymbal 1"; strレーン名 = "CY"; b裏チャンネル = true; break;
\r
171 case 52 : str楽器名 = "Chinese Cymbal"; strレーン名 = "CY"; break;
\r
172 case 53 : str楽器名 = "Ride Bell"; strレーン名 = "CY"; b裏チャンネル = true; break;
\r
173 case 54 : str楽器名 = "Tambourine"; strレーン名 = "SE1"; break;
\r
174 case 55 : str楽器名 = "Splash Cymbal"; strレーン名 = "LC"; break;
\r
175 case 56 : str楽器名 = "Cowbell"; strレーン名 = "SE1"; break;
\r
176 case 57 : str楽器名 = "Crash Cymbal 2"; strレーン名 = "LC"; break;
\r
177 case 58 : str楽器名 = "Vibra Slap"; strレーン名 = "SE1"; break;
\r
178 case 59 : str楽器名 = "Ride Cymbal 2"; strレーン名 = "CY"; b裏チャンネル = true; break;
\r
179 case 60 : str楽器名 = "High Bongo"; break;
\r
180 case 61 : str楽器名 = "Low Bongo"; break;
\r
181 case 62 : str楽器名 = "Mute High Conga"; break;
\r
182 case 63 : str楽器名 = "Open High Conga"; break;
\r
183 case 64 : str楽器名 = "Low Conga"; break;
\r
184 case 65 : str楽器名 = "High Timbale"; break;
\r
185 case 66 : str楽器名 = "Low Timbale"; break;
\r
186 case 67 : str楽器名 = "High Agogo"; break;
\r
187 case 68 : str楽器名 = "Low Agogo"; break;
\r
188 case 69 : str楽器名 = "Cabasa"; break;
\r
189 case 70 : str楽器名 = "Maracas"; break;
\r
190 case 71 : str楽器名 = "Short Whistle"; break;
\r
191 case 72 : str楽器名 = "Long Whistle"; break;
\r
192 case 73 : str楽器名 = "Short Guiro"; break;
\r
193 case 74 : str楽器名 = "Long Guiro"; break;
\r
194 case 75 : str楽器名 = "Claves"; break;
\r
195 case 76 : str楽器名 = "High Wood Block"; break;
\r
196 case 77 : str楽器名 = "Low Wood Block"; break;
\r
197 case 78 : str楽器名 = "Mute Cuica"; break;
\r
198 case 79 : str楽器名 = "Open Cuica"; break;
\r
199 case 80 : str楽器名 = "Mute Triangle"; break;
\r
200 case 81 : str楽器名 = "Open Triangle"; break;
\r
202 this.dgv割り当て一覧.Rows.Add( i, strキー名[i%12], strレーン名, b裏チャンネル, 0, str楽器名 );
\r
205 if ( i%12 == 1 || i%12 == 3 || i%12 == 6 || i%12 == 8 || i%12 == 10 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 240, 248, 255 );
\r
207 if ( i%12 == 0 ) this.dgv割り当て一覧.Rows[127-i].DefaultCellStyle.BackColor = Color.FromArgb( 255, 224, 224 );
\r
209 tMIDI割り当て一覧のレーン名の背景色を変更する( 127-i );
\r
212 this.dgv割り当て一覧.Columns["MIDI_Key"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
\r
213 this.dgv割り当て一覧.Columns["DTX_Lane"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
\r
214 this.dgv割り当て一覧.Columns["DTX_Lane"].DefaultCellStyle.Font = new Font( "meiryo", 8f, FontStyle.Bold );
\r
215 this.dgv割り当て一覧.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
\r
217 this.dgv割り当て一覧.FirstDisplayedScrollingRowIndex = 81;//key35=LBDが表示される位置
\r
221 public void tMIDIチャンネル一覧を作成する()
\r
223 for (int i = 1; i <= 16; i++)
\r
225 this.dgvチャンネル一覧.Rows.Add( i, 0, (i==10) );
\r
226 this.dgvチャンネル一覧.Rows[i-1].DefaultCellStyle.BackColor = (i==10) ? Color.FromArgb( 255, 224, 224 ) : Color.FromArgb( 255, 255, 255 );
\r
228 // dgvチャンネル一覧変更イベント復旧(); //ここでイベントを復旧してはいけない
\r
229 //(直後にファイルを開く動作+解析動作が発生するのでそこで)
\r
230 //ChangValueイベントが発生しイベントが何度も発生してしまう
\r
233 public void tMIDIファイルを選択する()
\r
236 //-----------------
\r
238 OpenFileDialog dialog = new OpenFileDialog();
\r
239 dialog.Title = Resources.strMIDIファイル選択ダイアログのタイトル;
\r
240 dialog.Filter = Resources.strMIDIファイル選択ダイアログのフィルタ;
\r
241 dialog.FilterIndex = 1;
\r
242 dialog.InitialDirectory = this.formメインフォーム.strMIDIインポートフォルダ;
\r
243 DialogResult result = dialog.ShowDialog();
\r
245 if (result != DialogResult.OK) return;
\r
247 //-----------------
\r
250 this.tMIDIファイルを開く( dialog.FileName );
\r
253 public void tMIDIファイルを開く( string strファイル名 )
\r
256 //-----------------
\r
257 if ( !File.Exists( strファイル名 ) )
\r
260 Resources.strファイルが存在しませんMSG,
\r
261 Resources.strMIDIインポートエラーのタイトル,
\r
262 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
\r
265 //-----------------
\r
269 //-----------------
\r
270 string str拡張子 = Path.GetExtension(strファイル名);
\r
272 if ( !str拡張子.Equals(".mid", StringComparison.OrdinalIgnoreCase ) && !str拡張子.Equals( ".midi", StringComparison.OrdinalIgnoreCase) )
\r
275 Resources.strMIDIファイルではないMSG,
\r
276 Resources.strMIDIインポートエラーのタイトル,
\r
277 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
280 //-----------------
\r
284 //-----------------
\r
285 this.formメインフォーム.strMIDIインポートフォルダ = Path.GetDirectoryName( strファイル名 ) + @"\";
\r
286 //-----------------
\r
289 #region [ MIDIファイル解析 ]
\r
290 //-----------------
\r
291 cMIDI = new CMIDI( strファイル名 );
\r
292 cMIDI.formメインフォーム = this.formメインフォーム;
\r
293 cMIDI.dgvチャンネル一覧 = this.dgvチャンネル一覧;
\r
294 cMIDI.tMIDIを解析する();
\r
297 if ( !cMIDI.bMIDIファイル )
\r
300 Resources.strMIDIファイルではないMSG,
\r
301 Resources.strMIDIインポートエラーのタイトル,
\r
302 MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );
\r
307 //-----------------
\r
310 #region [ 解析結果を出力 ]
\r
311 //-----------------
\r
313 // MIDI解析内容をテキストボックスに出力する
\r
314 string str文字列 = "";
\r
315 str文字列 += "File:" + strファイル名 + "\r\n";
\r
316 str文字列 += "BPM:" + cMIDI.f先頭BPM + "\r\n";
\r
317 str文字列 += "TimeBase:" + cMIDI.n分解能 + "\r\n";
\r
320 foreach ( CMIDIトラック value in cMIDI.lMIDIトラック )
\r
322 str文字列 += "Track " + value.nトラック数;
\r
323 str文字列 += " : " + value.strトラック名 + "\r\n";
\r
324 str文字列 += value.str解析内容 + "\r\n";
\r
327 this.textBox1.Text = str文字列;
\r
329 // 各チャンネルのノート数をチャンネル一覧に出力する
\r
330 dgvチャンネル一覧変更イベント抑止();
\r
331 for ( int i = 0; i < 16; i++ )
\r
333 this.dgvチャンネル一覧.Rows[i].Cells["ChNotes"].Value = cMIDI.nチャンネル0to15毎のノート数[i];
\r
334 this.dgvチャンネル一覧.Rows[i].Cells["ChLoad"].Value = cMIDI.bドラムチャンネルと思われる[i];
\r
336 dgvチャンネル一覧変更イベント復旧();
\r
338 // 各キーのノート数を割り当て一覧に出力する
\r
339 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
342 tMIDIチップをレーンに割り当てる();
\r
344 //-----------------
\r
351 private void tMIDI割り当て一覧のレーン名の背景色を変更する( int RowIndex )
\r
353 string strレーン名 = (string)this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Value;
\r
354 int nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( strレーン名 );
\r
356 if ( nレーン番号 >= this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "LC" ) )
\r
358 Color color = this.formメインフォーム.mgr譜面管理者.listレーン[nレーン番号].col背景色;
\r
359 color = Color.FromArgb( color.R/2+128, color.G/2+128, color.B/2+128 );
\r
360 this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;
\r
362 else if ( strレーン名 == "* Disuse *" )
\r
364 Color color = Color.FromArgb( 128, 128, 128 );
\r
365 this.dgv割り当て一覧.Rows[RowIndex].Cells["DTX_Lane"].Style.BackColor = color;
\r
369 public void tMIDIインポート結果を反映する()
\r
371 if ( cMIDI != null && cMIDI.lMIDIイベント.Count > 0 )
\r
374 #region [ チップリストで、ベロシティをDTX向けに調整する ]
\r
375 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
377 int velo = vMIDIイベント.nベロシティ;
\r
378 if ( this.checkBoxベロシティ最大値127.Checked ) velo = (int)(velo / 1.27);//127を最大値
\r
379 if ( this.checkBoxベロシティカーブ調整.Checked ) velo = (int)( Math.Pow( velo, 1.5 ) / Math.Pow( 100, 0.5 ) );//ベロシティカーブ
\r
380 velo = ( velo / (int)this.numericUpDownVOLUME間隔.Value ) * (int)this.numericUpDownVOLUME間隔.Value;
\r
381 velo = ( velo > 100 ) ? 100 : ( ( velo == 0 ) ? 1 : velo );
\r
382 vMIDIイベント.nベロシティ_DTX変換後 = velo;
\r
386 #region [ 読み込むチャンネルを取得してキー毎のノート数を計算する ]
\r
387 t読み込むチャンネルを取得してキー毎のノート数を計算する();
\r
390 #region [ 配置予定チップを割り当て一覧に沿ってレーンを割り当てる ]
\r
391 tMIDIチップをレーンに割り当てる();
\r
394 #region [ WAVリスト出力 ]
\r
396 #region [ #WAV02 BGM仮置き用 ]
\r
397 CWAV cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( 2 );
\r
398 cwav.strラベル名 = "BGM";
\r
399 cwav.bBGMとして使用 = true;
\r
400 cwav.col背景色 = Color.FromArgb( 224, 255, 224 );
\r
403 #region [ #WAV04 以降をWAVリスト割り当てに使う ]
\r
404 // WAVリストをソートして見やすくする
\r
405 cMIDI.lMIDIWAV.Sort( nMIDIWAVSort );
\r
408 int nレーン番号before = 0;
\r
410 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )
\r
412 // ノートチップ以外をWAVリストに表示させない→WAVリスト化する部分で処理する
\r
413 //if ( vMIDIWAV.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;
\r
416 if ( nWAVCount > 4 && nレーン番号before != vMIDIWAV.nレーン番号 ) nWAVCount++;
\r
417 nレーン番号before = vMIDIWAV.nレーン番号;
\r
420 cwav = this.formメインフォーム.mgrWAVリスト管理者.tWAVをキャッシュから検索して返す_なければ新規生成する( nWAVCount );
\r
421 cwav.strファイル名 = vMIDIWAV.nキー.ToString() + ".ogg";
\r
422 cwav.n音量0to100 = vMIDIWAV.nベロシティ_DTX変換後;
\r
423 cwav.strラベル名 = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].strレーン名
\r
424 + ( vMIDIWAV.b裏チャンネル ? "*" : "" )
\r
425 + " " + vMIDIWAV.strコメント;
\r
427 // WAVリストの背景色を、レーンの色に合わせる
\r
428 Color color = this.formメインフォーム.mgr譜面管理者.listレーン[vMIDIWAV.nレーン番号].col背景色;
\r
429 cwav.col背景色 = Color.FromArgb( color.R/2 + 128, color.G/2 + 128, color.B/2 + 128 );
\r
431 // 配置予定全チップにWAV番号を指定する
\r
432 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
434 if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )
\r
435 vMIDIイベント.nWAV = nWAVCount;
\r
441 #region [ WAVリスト強制更新 ]
\r
442 this.formメインフォーム.listViewWAVリスト.Refresh();
\r
447 #region [ 小節付加+変拍子設定 ]
\r
448 tMIDIイベントリストから小節リストを構成する( cMIDI.lMIDIイベント, cMIDI.n分解能 );
\r
453 cMIDI.lMIDIイベント.Sort( ( ( a, b ) => (int) a.n時間 - (int) b.n時間 ) );
\r
455 // 配置予定チップで、選択されているチャンネルのノーツを実際に配置する
\r
456 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
458 if ( vMIDIイベント.b入力 )
\r
460 vMIDIイベント.挿入( this.formメインフォーム, cMIDI.n分解能 );
\r
465 this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );
\r
469 if ( cMIDI.f先頭BPM > 0.0 ) this.formメインフォーム.numericUpDownBPM.Value = (decimal)cMIDI.f先頭BPM;
\r
471 string str曲タイトル = cMIDI.lMIDIトラック[0].strトラック名;
\r
472 if ( str曲タイトル == "" )
\r
474 str曲タイトル = Path.GetFileName( cMIDI.strファイル名 );
\r
477 this.formメインフォーム.textBox曲名.Text = str曲タイトル;
\r
479 if ( cMIDI.n重複チップ数 > 0 ) this.formメインフォーム.textBoxコメント.Text = resource.GetString("label重複チップ数.Text") + " : "+cMIDI.n重複チップ数;
\r
482 #region [ LP発生なら、LPレーンを表示する。 ]
\r
483 for ( int i = 0; i < this.dgv割り当て一覧.Rows.Count; i++ )
\r
485 if ( (string)this.dgv割り当て一覧.Rows[ i ].Cells[ "DTX_Lane" ].Value == "LP" &&
\r
486 (int)this.dgv割り当て一覧.Rows[ i ].Cells[ "Notes" ].Value > 0 )
\r
488 this.formメインフォーム.mgr譜面管理者.tExpandLanes( Cレーン.ELaneType.LP );
\r
496 /// dgv割り当て一覧で設定した値に応じて、各レーンへ振り分ける
\r
498 private void tMIDIチップをレーンに割り当てる()
\r
500 // MIDIイベントがひとつでもあるなら処理する
\r
501 if ( cMIDI.lMIDIイベント.Count == 0 ) return;
\r
504 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
506 if (vMIDIイベント.nキー == (int)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["MIDI_Key"].Value )
\r
508 if ( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["DTX_Lane"].Value != "* Disuse *" )
\r
510 vMIDIイベント.nレーン番号 = this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["DTX_Lane"].Value );
\r
511 vMIDIイベント.strコメント = (string)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["Comment"].Value;
\r
512 vMIDIイベント.b裏チャンネル = (bool)dgv割り当て一覧.Rows[127-vMIDIイベント.nキー].Cells["BackCH"].Value;
\r
513 vMIDIイベント.b入力 = (bool)cMIDI.dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells["ChLoad"].Value;
\r
517 vMIDIイベント.nレーン番号 = 0;
\r
518 vMIDIイベント.strコメント = "";
\r
519 vMIDIイベント.b裏チャンネル = false;
\r
520 vMIDIイベント.b入力 = false;
\r
522 if ( vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BPM ||
\r
523 vMIDIイベント.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
525 vMIDIイベント.b入力 = true;
\r
531 #region [ WAVリスト化する ]
\r
532 cMIDI.lMIDIWAV = new List<CMIDIイベント>();
\r
534 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント )
\r
536 // チャンネル一覧で選択されているものと、ノートのみリスト化
\r
537 if ( !vMIDIイベント.b入力 || vMIDIイベント.eイベントタイプ != CMIDIイベント.Eイベントタイプ.NoteOnOff ) continue;
\r
539 // WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する
\r
540 bool bMIDIWAV_AddFlag = true;
\r
541 foreach ( CMIDIイベント vMIDIWAV in cMIDI.lMIDIWAV )
\r
543 if ( vMIDIWAV.strWAV重複チェック == vMIDIイベント.strWAV重複チェック )
\r
545 bMIDIWAV_AddFlag = false;
\r
549 if (bMIDIWAV_AddFlag)
\r
551 cMIDI.lMIDIWAV.Add( vMIDIイベント );
\r
556 t同時刻で同じレーンに配置予定のチップを数えて反映する();
\r
560 private void t同時刻で同じレーンに配置予定のチップを数えて反映する()
\r
563 List<string> lMIDIイベント_重複 = new List<string>();
\r
565 // 読み込むチャンネルだけチェックする
\r
566 foreach ( CMIDIイベント vMIDIイベント in cMIDI.lMIDIイベント ){
\r
567 if ( (bool)dgvチャンネル一覧.Rows[vMIDIイベント.nチャンネル0to15].Cells["ChLoad"].Value ){
\r
568 string str = "" + vMIDIイベント.nレーン番号 + ":" + vMIDIイベント.n時間;
\r
569 if ( lMIDIイベント_重複.Contains( str ) ) cMIDI.n重複チップ数 ++;
\r
570 else lMIDIイベント_重複.Add( str );
\r
574 this.label重複チップ数.Text = resource.GetString("label重複チップ数.Text") + " : " + cMIDI.n重複チップ数;
\r
577 private struct barlen
\r
583 public barlen( int _n時間, int _n分子, int _n分母 )
\r
591 private void tMIDIイベントリストから小節リストを構成する( List<CMIDIイベント> cml, int n四分音符の分解能 )
\r
593 if ( cml.Count <= 0 ) return;
\r
595 // 最終拍子イベント以降、曲最後までの小節について、この先のロジックで小節長を変更するために、ダミーで最後に拍子変更のイベントを入れる。
\r
599 int n最終時間 = (int)cml[ cml.Count - 1 ].n時間;
\r
602 foreach ( CMIDIイベント cm in cml )
\r
604 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
615 cml.Add( new CMIDIBARLen( (UInt32)n最終時間, n最終分子, n最終分母 ) );
\r
619 this.formメインフォーム.mgr譜面管理者.dic小節.Clear();
\r
620 foreach ( CMIDIイベント cm in cml )
\r
622 if ( cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen )
\r
624 // もし拍子変更イベントの絶対時間が、小節外にあれば、必要なだけ小節を追加する
\r
627 bool bExistBar = true;
\r
628 // 現在保持している小節リストの、nGridの最大値を取得する
\r
629 int nCurrentMaxBar = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す();
\r
630 int nCurremtMaxBar_FirstGrid = this.formメインフォーム.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( nCurrentMaxBar );
\r
631 if ( nCurremtMaxBar_FirstGrid < 0 ) nCurremtMaxBar_FirstGrid = 0;
\r
633 C小節 c最終小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nCurremtMaxBar_FirstGrid );
\r
634 float fCurrent小節倍率 = (c最終小節 == null) ? 1.0f : c最終小節.f小節長倍率;
\r
635 int nCurrentMaxGrid = nCurremtMaxBar_FirstGrid + (int) ( 192 * fCurrent小節倍率 ) - 1;
\r
636 if ( nCurrentMaxBar < 0 ) nCurrentMaxGrid = -1;
\r
638 // 拍子変更イベントの絶対時間が、小節外にあれば、新規に小節を一つ追加する。
\r
639 // 小節長は前の小節長を継承するか、MIDIイベント指定による新しい値にするか。
\r
640 // 小節を1つ追加しただけでは足りないのであれば、whileループで繰り返し追加し続ける。
\r
641 int nEvent時間 = (int)cm.n時間 * ( 192 / 4 ) / n四分音符の分解能;
\r
642 if ( nCurrentMaxGrid < (int) nEvent時間 )
\r
646 C小節 c小節 = new C小節( nCurrentMaxBar );
\r
649 c小節.f小節長倍率 = fCurrent小節倍率;
\r
650 this.formメインフォーム.mgr譜面管理者.dic小節.Add( nCurrentMaxBar, c小節 );
\r
654 throw new Exception("C小節の作成に失敗しました。");
\r
659 // 小節追加whileループの最後か、または小節が既に存在する場合でも、拍子の変更があれば反映する。
\r
660 if (cm.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BarLen)
\r
662 C小節 c小節 = this.formメインフォーム.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( nEvent時間 );
\r
663 this.formメインフォーム.t小節長を変更する_小節単位( c小節.n小節番号0to3599, (float)cm.n拍子分子 / cm.n拍子分母 );
\r
673 /// WAVリストを順番にソートする
\r
675 /// ・裏チャンネル:昇順(表が0、裏が1)
\r
679 static int nMIDIWAVSort( CMIDIイベント a, CMIDIイベント b )
\r
682 if ( a.nレーン番号 > b.nレーン番号 ) return 1;
\r
683 else if ( a.nレーン番号 < b.nレーン番号 ) return -1;
\r
687 if ( (a.b裏チャンネル?1:0) > (b.b裏チャンネル?1:0) ) return 1;
\r
688 else if ( (a.b裏チャンネル?1:0) < (b.b裏チャンネル?1:0) ) return -1;
\r
692 if ( a.nキー > b.nキー ) return 1;
\r
693 else if ( a.nキー < b.nキー ) return -1;
\r
697 if ( a.nベロシティ > b.nベロシティ ) return -1;
\r
698 else if ( a.nベロシティ < b.nベロシティ ) return 1;
\r