<Compile Include="コード\00.全体\Program.cs" />\r
<Compile Include="Properties\AssemblyInfo.cs" />\r
<Compile Include="コード\07.MIDIインポート\CMIDI.cs" />\r
- <Compile Include="コード\07.MIDIインポート\CMIDIインポートダイアログ.cs" />\r
+ <Compile Include="コード\07.MIDIインポート\CMIDIインポートダイアログ.cs">\r
+ <SubType>Form</SubType>\r
+ </Compile>\r
<Compile Include="コード\07.MIDIインポート\CMIDIインポートダイアログ.Designer.cs">\r
<DependentUpon>CMIDIインポートダイアログ.cs</DependentUpon>\r
</Compile>\r
<Compile Include="コード\07.MIDIインポート\CMIDIインポート管理.cs" />\r
- <Compile Include="ã\82³ã\83¼ã\83\89\07.MIDIã\82¤ã\83³ã\83\9dã\83¼ã\83\88\CMIDIã\83\81ã\83\83ã\83\97.cs" />\r
+ <Compile Include="ã\82³ã\83¼ã\83\89\07.MIDIã\82¤ã\83³ã\83\9dã\83¼ã\83\88\CMIDIã\82¤ã\83\99ã\83³ã\83\88.cs" />\r
<Compile Include="コード\07.MIDIインポート\CMIDIトラック.cs" />\r
<EmbeddedResource Include="Properties\Resources.ja-JP.resx">\r
<SubType>Designer</SubType>\r
public Cチップパレット dlgチップパレット;\r
private Cオプション管理 mgrオプション管理者 = null;\r
private C選択モード管理 mgr選択モード管理者 = null;\r
- private C編集モード管理 mgr編集モード管理者 = null;\r
+ internal C編集モード管理 mgr編集モード管理者 = null;\r
internal C譜面管理 mgr譜面管理者 = null;\r
internal CWAVリスト管理 mgrWAVリスト管理者 = null;\r
internal CBMPリスト管理 mgrBMPリスト管理者 = null;\r
#region [ ファイルを読み込む。]\r
//-----------------\r
string strExt = Path.GetExtension( strファイル名 ).ToLower();\r
- Debug.WriteLine( "ext=" + strExt );\r
\r
if ( strExt.Equals(".dtx") )\r
{\r
public byte[] byMIDIバイナリ;\r
public bool bMIDIファイル;\r
public List<CMIDIトラック> lMIDIトラック;\r
- public List<CMIDIã\83\81ã\83\83ã\83\97> lチップ;\r
+ public List<CMIDIã\82¤ã\83\99ã\83³ã\83\88> lチップ;\r
public double dBPM;\r
public string strTimeSignature;\r
public int[] nドラム各ノート数;\r
public int n分解能;\r
public Cメインフォーム formメインフォーム;\r
- public List<CMIDIã\83\81ã\83\83ã\83\97> lMIDIWAV;\r
+ public List<CMIDIã\82¤ã\83\99ã\83³ã\83\88> lMIDIWAV;\r
public int n読み込みCh;\r
\r
public int dトラック数\r
this.byMIDIバイナリ = File.ReadAllBytes( this.strファイル名 );\r
this.bMIDIファイル = ( strBin2BinStr(this.byMIDIバイナリ, 0, 4) == "4D 54 68 64" );\r
this.lMIDIトラック = new List<CMIDIトラック>();\r
- this.lã\83\81ã\83\83ã\83\97 = new List<CMIDIã\83\81ã\83\83ã\83\97>();\r
- this.nドラム各ノート数 = new int[128];\r
- this.lMIDIWAV = new List<CMIDIã\83\81ã\83\83ã\83\97>();\r
+ this.lã\83\81ã\83\83ã\83\97 = new List<CMIDIã\82¤ã\83\99ã\83³ã\83\88>();\r
+ this.nドラム各ノート数 = new int[256];\r
+ this.lMIDIWAV = new List<CMIDIã\82¤ã\83\99ã\83³ã\83\88>();\r
}\r
\r
// 解析処理 全バイナリを見てMTrkだけ抜き取る\r
{\r
// MThdが存在しなければ解析処理を行わない\r
if ( !bMIDIファイル ) return;\r
- this.lMIDIWAV = new List<CMIDIã\83\81ã\83\83ã\83\97>();\r
+ this.lMIDIWAV = new List<CMIDIã\82¤ã\83\99ã\83³ã\83\88>();\r
\r
this.n分解能 = nBin2Int( this.byMIDIバイナリ, 12, 2 );\r
\r
// MTrkがあればトラックを追加する\r
if ( strBin2BinStr(this.byMIDIバイナリ, i, 4) == "4D 54 72 6B" )\r
{\r
- byte[] data_track = new byte[65536];\r
+ int track_size = nBin2Int( this.byMIDIバイナリ, i + 4, 4 );\r
+ byte[] data_track = new byte[track_size + 8 + 8]; // 大きめに取りました\r
Array.Copy( this.byMIDIバイナリ, i, data_track, 0, nBin2Int( this.byMIDIバイナリ, i+4, 4 ) + 8 );\r
this.lMIDIトラック.Add( new CMIDIトラック( this, this.dトラック数, data_track ) );\r
this.lMIDIトラック[this.lMIDIトラック.Count-1].tトラックチャンクを走査する();\r
// DataGridViewに設定した値に応じて各レーンに振り分ける\r
public void tMIDIチップをレーンに割り当てる( DataGridView dgv )\r
{\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in this.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in this.lチップ )\r
{\r
foreach (DataGridViewRow dgvr in dgv.Rows)\r
{\r
vMIDIチップ.strコメント = "";\r
vMIDIチップ.b入力 = false;\r
}\r
+ if ( vMIDIチップ.eイベントタイプ == CMIDIイベント.Eイベントタイプ.BPM )\r
+ {\r
+ vMIDIチップ.b入力 = true;\r
+ }\r
}\r
}\r
}\r
\r
public void tMIDIチップをMIDIWAVリスト化する()\r
{\r
- this.lMIDIWAV = new List<CMIDIã\83\81ã\83\83ã\83\97>();\r
+ this.lMIDIWAV = new List<CMIDIã\82¤ã\83\99ã\83³ã\83\88>();\r
\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in this.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in this.lチップ )\r
{\r
// WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する\r
bool bMIDIWAV_AddFlag = true;\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIWAV in this.lMIDIWAV )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIWAV in this.lMIDIWAV )\r
{\r
if ( vMIDIWAV.strWAV重複チェック == vMIDIチップ.strWAV重複チェック )\r
{\r
if (this.lチップ.Count == 0) return 0;\r
\r
int nMIDIチップ同時刻同レーン重複 = 0;\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ1 in this.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ1 in this.lチップ )\r
{\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ2 in this.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ2 in this.lチップ )\r
{\r
if ( vMIDIチップ1.nキー != vMIDIチップ2.nキー && vMIDIチップ1.nレーン番号 == vMIDIチップ2.nレーン番号 && vMIDIチップ1.n時間 == vMIDIチップ2.n時間 )\r
{\r
return nMIDIチップ同時刻同レーン重複/2;\r
}\r
\r
- public CMIDIã\83\81ã\83\83ã\83\97 pMIDIチップで一番遅い時間のチップを返す()\r
+ public CMIDIã\82¤ã\83\99ã\83³ã\83\88 pMIDIチップで一番遅い時間のチップを返す()\r
{\r
if (this.lチップ.Count == 0) return null;\r
\r
- CMIDIã\83\81ã\83\83ã\83\97 cMIDIチップ = null;\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in this.lチップ )\r
+ CMIDIã\82¤ã\83\99ã\83³ã\83\88 cMIDIチップ = null;\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in this.lチップ )\r
{\r
if ( cMIDIチップ == null || cMIDIチップ.n時間 <= vMIDIチップ.n時間 )\r
{\r
using System.ComponentModel;\r
using System.IO;\r
using System.Drawing;\r
+using System.Diagnostics;\r
using DTXCreator.譜面;\r
using DTXCreator.WAV_BMP_AVI;\r
using DTXCreator.Properties;\r
if ( cMIDI != null && cMIDI.lチップ.Count > 0 )\r
{\r
// チップリストで、ベロシティをDTX向けに調整する\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in cMIDI.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in cMIDI.lチップ )\r
{\r
- int num3 = vMIDIチップ.nベロシティ;\r
- if ( this.checkBox2.Checked ) num3 = (int)(num3 / 1.27);\r
- if ( this.checkBox1.Checked ) num3 = (int)( Math.Pow( num3, 1.5 ) / Math.Pow( 100, 0.5 ) );\r
- num3 = ( num3 / (int)this.numericUpDown1.Value ) * (int)this.numericUpDown1.Value;\r
- num3 = ( num3 > 100 ) ? 100 : ( ( num3 == 0 ) ? 1 : num3 );\r
- vMIDIチップ.nベロシティ_DTX変換後 = num3;\r
+ int velo = vMIDIチップ.nベロシティ;\r
+ if ( this.checkBox2.Checked ) velo = (int)(velo / 1.27);\r
+ if ( this.checkBox1.Checked ) velo = (int)( Math.Pow( velo, 1.5 ) / Math.Pow( 100, 0.5 ) );\r
+ velo = ( velo / (int)this.numericUpDown1.Value ) * (int)this.numericUpDown1.Value;\r
+ velo = ( velo > 100 ) ? 100 : ( ( velo == 0 ) ? 1 : velo );\r
+ vMIDIチップ.nベロシティ_DTX変換後 = velo;\r
}\r
\r
// 配置予定チップをレーン指定に沿って割り当てる\r
int nWAVCount = 4;\r
int nレーン番号before = 0;\r
\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vチップWAV in cMIDI.lMIDIWAV )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vチップWAV in cMIDI.lMIDIWAV )\r
{\r
if ( nWAVCount > 4 && nレーン番号before != vチップWAV.nレーン番号 ) nWAVCount++;\r
nレーン番号before = vチップWAV.nレーン番号;\r
cwav.col背景色 = Color.FromArgb( color.R/2 + 128, color.G/2 + 128, color.B/2 + 128 );\r
\r
// 配置予定全チップのWAVを指定する\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in cMIDI.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in cMIDI.lチップ )\r
{\r
if ( vチップWAV.strWAV重複チェック == vMIDIチップ.strWAV重複チェック ) vMIDIチップ.nWAV = nWAVCount;\r
}\r
if ( cMIDI.nMIDI重複チップ数を返す() > 0 ) this.formメインフォーム.textBoxコメント.Text = "重複チップ : "+cMIDI.nMIDI重複チップ数を返す();\r
\r
// 小節付加\r
- int num = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す();\r
- int num2 = cMIDI.pMIDIチップで一番遅い時間のチップを返す().n時間 / ( cMIDI.n分解能 / 96 ) / 384;\r
- for( int i = num + 1; i <= num2 ; i++ )\r
+ int nCurrentMaxBar = this.formメインフォーム.mgr譜面管理者.n現在の最大の小節番号を返す(); // ★★拍子変更対応の場合、ここも修正しないとダメよ****************\r
+ UInt32 nMaxBar = cMIDI.pMIDIチップで一番遅い時間のチップを返す().n時間 * (192 / 4) / (UInt32) cMIDI.n分解能 / 384;\r
+ for ( int i = nCurrentMaxBar + 1; i <= nMaxBar; i++ )\r
{\r
this.formメインフォーム.mgr譜面管理者.dic小節.Add( i, new C小節( i ) );\r
}\r
\r
// チップ配置\r
- foreach ( CMIDIã\83\81ã\83\83ã\83\97 vMIDIチップ in cMIDI.lチップ )\r
+ foreach ( CMIDIã\82¤ã\83\99ã\83³ã\83\88 vMIDIチップ in cMIDI.lチップ )\r
{\r
if ( vMIDIチップ.b入力 )\r
{\r
- this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( vMIDIチップ.nレーン番号, vMIDIチップ.n時間 * (192 / 4) / cMIDI.n分解能, vMIDIチップ.nWAV, 0f, false );\r
+ vMIDIチップ.挿入( this.formメインフォーム, cMIDI.n分解能 );\r
}\r
}\r
this.formメインフォーム.mgr譜面管理者.tチップを配置または置換する( this.formメインフォーム.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" ), 0, 2, 0f, false );\r
- \r
-\r
}\r
- }\r
+ }\r
\r
// lMIDIWAVソート用\r
- static int nMIDIWAVSort( CMIDIã\83\81ã\83\83ã\83\97 a, CMIDIã\83\81ã\83\83ã\83\97 b )\r
+ static int nMIDIWAVSort( CMIDIã\82¤ã\83\99ã\83³ã\83\88 a, CMIDIã\82¤ã\83\99ã\83³ã\83\88 b )\r
{\r
if ( a.nレーン番号 > b.nレーン番号 ) return 1;\r
else if ( a.nレーン番号 < b.nレーン番号 ) return -1;\r
}\r
public void tMIDIインポート管理を開く()\r
{\r
- if ( this.formメインフォーム.t未保存なら保存する() == DialogResult.Cancel ) return;\r
- this.formメインフォーム.b未保存 = false;\r
- this.formメインフォーム.tシナリオ_新規作成();\r
-\r
CMIDIインポートダイアログ cMIDIインポートダイアログ = new CMIDIインポートダイアログ();\r
cMIDIインポートダイアログ.formメインフォーム = this.formメインフォーム;\r
cMIDIインポートダイアログ.tMIDI割り当て一覧を作成する();\r
\r
if (cMIDIインポートダイアログ.ShowDialog() == DialogResult.OK)\r
{\r
- cMIDIインポートダイアログ.tMIDIインポート結果を反映する();\r
+ if ( this.formメインフォーム.t未保存なら保存する() == DialogResult.Cancel ) return;\r
+ this.formメインフォーム.b未保存 = false;\r
+ this.formメインフォーム.tシナリオ_新規作成();\r
+\r
+ cMIDIインポートダイアログ.tMIDIインポート結果を反映する();\r
}\r
}\r
public void tMIDIインポート管理を開く(string strファイル名 )\r
{\r
- if ( this.formメインフォーム.t未保存なら保存する() == DialogResult.Cancel ) return;\r
- this.formメインフォーム.b未保存 = false;\r
- this.formメインフォーム.tシナリオ_新規作成();\r
-\r
CMIDIインポートダイアログ cMIDIインポートダイアログ = new CMIDIインポートダイアログ();\r
cMIDIインポートダイアログ.formメインフォーム = this.formメインフォーム;\r
cMIDIインポートダイアログ.tMIDI割り当て一覧を作成する();\r
cMIDIインポートダイアログ.tMIDIファイルを開く( strファイル名 );\r
if ( cMIDIインポートダイアログ.ShowDialog() == DialogResult.OK )\r
{\r
+ this.formメインフォーム.b未保存 = false;\r
+ this.formメインフォーム.tシナリオ_新規作成();\r
+\r
cMIDIインポートダイアログ.tMIDIインポート結果を反映する();\r
}\r
}\r
using System.Text;\r
using System.Threading.Tasks;\r
using System.Windows.Forms;\r
+using System.Diagnostics;\r
\r
namespace DTXCreator.MIDIインポート\r
{\r
while( true )\r
{\r
// デルタタイム計算\r
- int nデルタタイムLen = 0;\r
+ int nデルタタイムLen = 0;\r
UInt32 deltatime = 0;\r
- for ( int i = 0; i < 3; i++ ) // デルタタイムは最大4byte\r
+ for ( int i = 0; i < 4; i++ ) // デルタタイムは最大4byte\r
{\r
++nデルタタイムLen;\r
UInt32 b = this.byMIDIトラックバイナリ[ p + i ];\r
int nイベントLen = 3;\r
\r
// デルタタイムの直後がイベントじゃなかったら、前のイベントを継ぐ\r
- if ( nイベント < 128 && nイベントbefore >= 128 && nイベントbefore < 160 )\r
+ if ( nイベント < 0x80 )\r
{\r
nイベント = nイベントbefore;\r
p -= 1;\r
}\r
\r
// 8n - 9n ノートオフ・オン\r
- if ( nイベント >= 128 && nイベント < 160 )\r
+ if ( 0x80 <= nイベント && nイベント <= 0x9F )\r
{\r
int nData1 = this.byMIDIトラックバイナリ[p+nデルタタイムLen+1];\r
int nData2 = this.byMIDIトラックバイナリ[p+nデルタタイムLen+2];\r
- // ノートオン(9n)の時の値を取得\r
- if ( nイベント >= 144 )\r
+ // ノートオン(9n)の時の値を取得 (ノートオンでも、ベロシティ0の場合はノートオフの意味なので、無視する)\r
+ if ( nイベント >= 0x90 && nData2 > 0 )\r
{\r
- this.nチャンネル = nイベント - 144 + 1;\r
+ this.nチャンネル = nイベント - 0x90 + 1;\r
if ( this.nチャンネル == cMIDI.n読み込みCh )\r
{\r
- cMIDI.lチップ.Add( new CMIDIチップ( cMIDI, (int)nデルタタイム合計, nData1, nData2 ) );\r
- cMIDI.nドラム各ノート数[nData1] ++;\r
- //this.str解析内容 += "Drum / Tick: "+nデルタタイム合計.ToString().PadLeft(6)+" Note: "+nData1.ToString("X2")+"\r\n";\r
+ cMIDI.lチップ.Add( new CMIDINote( nデルタタイム合計, nData1, nData2 ) );\r
+ cMIDI.nドラム各ノート数[nData1]++;\r
+ //this.str解析内容 += "Drum / Tick: " + nデルタタイム合計.ToString().PadLeft( 6 ) + " Note: " + nData1.ToString( "X2" ) + "\r\n";\r
}\r
}\r
//this.str解析内容 += ((nイベント>=144)?"N-ON ":"N-OFF")+" "+p.ToString().PadLeft(6)+" "+nデルタタイム[0]+","+nData1.ToString("X2")+","+nData2.ToString("X2")+"\r\n";\r
nイベントLen = 3;\r
}\r
// A0 - EF コントロールチェンジ等\r
- else if ( nイベント >= 160 && nイベント < 240 )\r
+ else if ( 0xA0 <= nイベント && nイベント <= 0xEF )\r
{\r
int nData1 = this.byMIDIトラックバイナリ[p+nデルタタイムLen+1];\r
int nData2 = this.byMIDIトラックバイナリ[p+nデルタタイムLen+2];\r
\r
nイベントLen = 3;\r
- if ( nイベント >= 192 && nイベント < 224 ) nイベントLen = 2;\r
+ if ( 0xC0 <= nイベント && nイベント < 0xDF ) nイベントLen = 2;\r
\r
//this.str解析内容 += "CC / Tick: "+nデルタタイム合計.ToString().PadLeft(6)+" Type: "+nData1.ToString("X2")+"\r\n";\r
+\r
+ // 面倒なので、コントロールチェンジが3byteになる場合はとりあえず想定しない。相当レアだし。\r
}\r
// F0 システム?\r
else if ( nイベント.ToString("X2") == "F0" )\r
case "51" :\r
cMIDI.dBPM = Math.Round( (double) 60.0 * Math.Pow(10,6) / CMIDI.nBin2Int( this.byMIDIトラックバイナリ, p+nデルタタイムLen+3, 3 ), 2 );\r
nイベントLen = 6;\r
- break;\r
+ cMIDI.lチップ.Add( new CMIDIBPM( nデルタタイム合計, (float) cMIDI.dBPM) );\r
+ cMIDI.nドラム各ノート数[128] ++;\r
+ break;\r
\r
// FF 54\r
case "54" :\r
// FF 58\r
case "58" :\r
// 拍設定 格納だけして何もしてない\r
+ int n分子 = this.byMIDIトラックバイナリ[ p + nデルタタイムLen + 3 ];\r
+ int n分母 = this.byMIDIトラックバイナリ[ p + nデルタタイムLen + 4 ];\r
+ int nメトロノームクリックtick = this.byMIDIトラックバイナリ[ p + nデルタタイムLen + 5 ];\r
+ int nメトロノームクリック数内32分音符数 = this.byMIDIトラックバイナリ[ p + nデルタタイムLen + 6 ];\r
+\r
cMIDI.strTimeSignature = CMIDI.strBin2BinStr( this.byMIDIトラックバイナリ, p+nデルタタイムLen+3, 4 );\r
nイベントLen = 7;\r
+\r
+ cMIDI.lチップ.Add( new CMIDIBARLen( nデルタタイム合計, n分子, n分母 ) );\r
+ cMIDI.nドラム各ノート数[128] ++;\r
break;\r
\r
// FF 59\r