using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Drawing; using DTXCreator.WAV_BMP_AVI; namespace DTXCreator.MIDIインポート { internal class CMIDI { public string strファイル名; public byte[] byMIDIバイナリ; public bool bMIDIファイル; public List lMIDIトラック; public List lチップ; public float f先頭BPM; public string strTimeSignature; public int[] nドラム各ノート数; public int n分解能; public Cメインフォーム formメインフォーム; public List lMIDIWAV; public int n読み込みCh; public int dトラック数 { get { return lMIDIトラック.Count; } } public CMIDI( string _strファイル名 ) { this.strファイル名 = _strファイル名; this.byMIDIバイナリ = File.ReadAllBytes( this.strファイル名 ); this.bMIDIファイル = ( strBin2BinStr(this.byMIDIバイナリ, 0, 4) == "4D 54 68 64" ); this.lMIDIトラック = new List(); this.lチップ = new List(); this.nドラム各ノート数 = new int[256]; this.lMIDIWAV = new List(); this.f先頭BPM = 0.0f; } // 解析処理 全バイナリを見てMTrkだけ抜き取る public void tMIDIを解析する() { // MThdが存在しなければ解析処理を行わない if ( !bMIDIファイル ) return; this.lMIDIWAV = new List(); this.n分解能 = nBin2Int( this.byMIDIバイナリ, 12, 2 ); for ( int i = 0; i(); foreach ( CMIDIイベント vMIDIチップ in this.lチップ ) { // WAVリストで、同じ内容(キーとベロシティ)が無ければ挿入する bool bMIDIWAV_AddFlag = true; foreach ( CMIDIイベント vMIDIWAV in this.lMIDIWAV ) { if ( vMIDIWAV.strWAV重複チェック == vMIDIチップ.strWAV重複チェック ) { bMIDIWAV_AddFlag = false; break; } } if (bMIDIWAV_AddFlag) { this.lMIDIWAV.Add( vMIDIチップ ); } } } // レーン割り当て後に呼ぶこと public int nMIDI重複チップ数を返す() { if (this.lチップ.Count == 0) return 0; int nMIDIチップ同時刻同レーン重複 = 0; foreach ( CMIDIイベント vMIDIチップ1 in this.lチップ ) { foreach ( CMIDIイベント vMIDIチップ2 in this.lチップ ) { if ( vMIDIチップ1.nキー != vMIDIチップ2.nキー && vMIDIチップ1.nレーン番号 == vMIDIチップ2.nレーン番号 && vMIDIチップ1.n時間 == vMIDIチップ2.n時間 ) { nMIDIチップ同時刻同レーン重複 ++; } } } return nMIDIチップ同時刻同レーン重複/2; } //public CMIDIイベント pMIDIチップで一番遅い時間のチップを返す() //{ // if (this.lチップ.Count == 0) return null; // CMIDIイベント cMIDIチップ = null; // foreach ( CMIDIイベント vMIDIチップ in this.lチップ ) // { // if ( cMIDIチップ == null || cMIDIチップ.n時間 <= vMIDIチップ.n時間 ) // { // cMIDIチップ = vMIDIチップ; // } // } // return cMIDIチップ; //} // バイナリの指定のバイト数分を、"FF FF FF..."の形で出力する static public string strBin2BinStr( byte[] byバイナリ, int d開始バイト, int dバイト数 ) { string str文字列 = ""; if ( dバイト数 <= 0 ) return ""; for (int i = d開始バイト; i < d開始バイト + dバイト数; i++) { if ( i >= byバイナリ.Length ) break; str文字列 += byバイナリ[i].ToString("X2") + " "; } return str文字列.Substring( 0, str文字列.Length-1 ); } // バイナリの指定のバイト数分を、文字列に変換して出力する static public string strBin2Str( byte[] byバイナリ, int d開始バイト, int dバイト数 ) { string str文字列 = ""; char[] by出力 = new char[128]; if ( dバイト数 <= 0 ) return ""; for (int i = d開始バイト; i < d開始バイト + dバイト数; i++) { if ( i >= byバイナリ.Length ) break; by出力[i-d開始バイト] = (char)byバイナリ[i]; } str文字列 = new string(by出力); if ( by出力[0] == 0 ) str文字列 = ""; return str文字列.Trim('\0'); } // バイナリの指定のバイト数分を、数値に変換して出力する static public int nBin2Int( byte[] byバイナリ, int d開始バイト, int dバイト数 ) { int d数値 = 0; if ( dバイト数 <= 0 ) return 0; for (int i = d開始バイト; i < d開始バイト + dバイト数; i++) { if ( i >= byバイナリ.Length ) break; d数値 += byバイナリ[i] * (int)Math.Pow( 256, dバイト数 - ( i - d開始バイト ) - 1 ); } return d数値; } } }