+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Linq;\r
-using System.Text;\r
-using System.Threading.Tasks;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using System.Drawing;\r
-using System.Diagnostics;\r
-using DTXCreator.WAV_BMP_AVI;\r
-\r
-namespace DTXCreator.MIDIインポート\r
-{\r
- internal class CMIDI\r
- {\r
- public string strファイル名;\r
- public byte[] byMIDIバイナリ;\r
- public bool bMIDIファイル;\r
- public List<CMIDIトラック> lMIDIトラック;\r
- public List<CMIDIイベント> lMIDIイベント;\r
- public float f先頭BPM;\r
- public string strTimeSignature;\r
- public int[] nドラムチャンネルのキー毎のノート数;\r
- public int [] nチャンネル0to15毎のノート数;\r
- public int n分解能;\r
- public Cメインフォーム formメインフォーム;\r
- public List<CMIDIイベント> lMIDIWAV;\r
- public int n重複チップ数;\r
- public DataGridView dgvチャンネル一覧;\r
- public bool[] bドラムチャンネルと思われる;\r
-\r
- public int dトラック数\r
- {\r
- get\r
- {\r
- return lMIDIトラック.Count;\r
- }\r
- }\r
-\r
- public CMIDI( string _strファイル名 )\r
- {\r
- this.strファイル名 = _strファイル名;\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.lMIDIイベント = new List<CMIDIイベント>();\r
- this.nドラムチャンネルのキー毎のノート数 = new int[256];\r
- this.lMIDIWAV = new List<CMIDIイベント>();\r
- this.f先頭BPM = 0.0f;\r
- this.n重複チップ数 = 0;\r
- this.nチャンネル0to15毎のノート数 = new int[17];\r
- this.dgvチャンネル一覧 = null;\r
- this.bドラムチャンネルと思われる = new bool[ 16 * 4 ];\r
- this.bドラムチャンネルと思われる[ 10 - 1 ] = true;\r
- }\r
-\r
- // 解析処理 全バイナリを見てMTrkだけ抜き取る\r
- public void tMIDIを解析する()\r
- {\r
- // MThdが存在しなければ解析処理を行わない\r
- if ( !bMIDIファイル ) return;\r
- this.lMIDIWAV = new List<CMIDIイベント>();\r
-\r
- this.n分解能 = nBin2Int( this.byMIDIバイナリ, 12, 2 );\r
-\r
- for ( int i = 0; i<this.byMIDIバイナリ.Length; i++ )\r
- {\r
- // MTrkがあればトラックを追加する\r
- if ( strBin2BinStr(this.byMIDIバイナリ, i, 4) == "4D 54 72 6B" )\r
- {\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
- }\r
- }\r
- }\r
-\r
- // tMIDIチップをレーンに割り当てる()をCMIDIインポートダイアログに移動\r
-\r
-\r
- // バイナリの指定のバイト数分を、"FF FF FF..."の形で出力する\r
- static public string strBin2BinStr( byte[] byバイナリ, int d開始バイト, int dバイト数 )\r
- {\r
- string str文字列 = "";\r
-\r
- if ( dバイト数 <= 0 ) return "";\r
-\r
- for (int i = d開始バイト; i < d開始バイト + dバイト数; i++)\r
- {\r
- if ( i >= byバイナリ.Length ) break;\r
- str文字列 += byバイナリ[i].ToString("X2") + " ";\r
- }\r
-\r
- return str文字列.Substring( 0, str文字列.Length-1 );\r
- }\r
- \r
- // バイナリの指定のバイト数分を、文字列に変換して出力する\r
- static public string strBin2Str( byte[] byバイナリ, int d開始バイト, int dバイト数 )\r
- {\r
- string str文字列 = "";\r
-\r
- if ( dバイト数 <= 0 ) return "";\r
-\r
- byte[] by出力 = new byte[ dバイト数 + 1 ];\r
-\r
- for (int i = d開始バイト; i < d開始バイト + dバイト数; i++)\r
- {\r
- if ( i >= byバイナリ.Length ) break;\r
- by出力[i-d開始バイト] = byバイナリ[i];\r
- }\r
-\r
- if ( by出力[ 0 ] == 0 ) str文字列 = "";\r
-\r
- System.Text.Encoding enc = GetCode( by出力 ); //System.Text.Encoding.Default; //GetEncoding( "shift_jis" );\r
- if ( enc == null )\r
- {\r
- enc = System.Text.Encoding.Unicode;\r
- }\r
- str文字列 = enc.GetString( by出力 );\r
-\r
- return str文字列.Trim('\0');\r
- }\r
- \r
- // バイナリの指定のバイト数分を、数値に変換して出力する\r
- static public int nBin2Int( byte[] byバイナリ, int d開始バイト, int dバイト数 )\r
- {\r
- int d数値 = 0;\r
-\r
- if ( dバイト数 <= 0 ) return 0;\r
-\r
- for (int i = d開始バイト; i < d開始バイト + dバイト数; i++)\r
- {\r
- if ( i >= byバイナリ.Length ) break;\r
- d数値 += byバイナリ[i] * (int)Math.Pow( 256, dバイト数 - ( i - d開始バイト ) - 1 );\r
- }\r
-\r
- return d数値;\r
- }\r
-\r
- /// <summary>\r
- /// 文字コードを判別する\r
- /// </summary>\r
- /// <remarks>\r
- /// http://dobon.net/vb/dotnet/string/detectcode.html を少し修正したもの。\r
- /// Jcode.pmのgetcodeメソッドを移植したものです。\r
- /// Jcode.pm(http://openlab.ring.gr.jp/Jcode/index-j.html)\r
- /// Jcode.pmのCopyright: Copyright 1999-2005 Dan Kogai\r
- /// </remarks>\r
- /// <param name="bytes">文字コードを調べるデータ</param>\r
- /// <returns>適当と思われるEncodingオブジェクト。\r
- /// 判断できなかった時はnull。</returns>\r
- public static System.Text.Encoding GetCode( byte[] bytes )\r
- {\r
- const byte bEscape = 0x1B;\r
- const byte bAt = 0x40;\r
- const byte bDollar = 0x24;\r
- const byte bAnd = 0x26;\r
- const byte bOpen = 0x28; //'('\r
- const byte bB = 0x42;\r
- const byte bD = 0x44;\r
- const byte bJ = 0x4A;\r
- const byte bI = 0x49;\r
-\r
- int len = bytes.Length;\r
- if (bytes[ len - 1 ] == 0x00 )\r
- {\r
- --len;\r
- }\r
- byte b1, b2, b3, b4;\r
-\r
- bool ascii = true;\r
- for ( int i = 0; i < len; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- if ( !( b1 >= 0x20 && b1 <= 0x7E ) )\r
- {\r
- ascii = false;\r
- break;\r
- }\r
- }\r
- if ( ascii )\r
- {\r
- return System.Text.Encoding.ASCII;\r
- }\r
-\r
- //Encode::is_utf8 は無視\r
-\r
- bool isBinary = false;\r
- for ( int i = 0; i < len; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- if ( b1 <= 0x06 || b1 == 0x7F || b1 == 0xFF )\r
- {\r
- //'binary'\r
- isBinary = true;\r
- if ( b1 == 0x00 && i < len - 1 && bytes[ i + 1 ] <= 0x7F )\r
- {\r
- //smells like raw unicode\r
- return System.Text.Encoding.Unicode;\r
- }\r
- }\r
- }\r
- if ( isBinary )\r
- {\r
- return null;\r
- }\r
-\r
- //not Japanese\r
- bool notJapanese = true;\r
- for ( int i = 0; i < len; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- if ( b1 == bEscape || 0x80 <= b1 )\r
- {\r
- notJapanese = false;\r
- break;\r
- }\r
- }\r
- if ( notJapanese )\r
- {\r
- return System.Text.Encoding.ASCII;\r
- }\r
-\r
- for ( int i = 0; i < len - 2; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- b2 = bytes[ i + 1 ];\r
- b3 = bytes[ i + 2 ];\r
-\r
- if ( b1 == bEscape )\r
- {\r
- if ( b2 == bDollar && b3 == bAt )\r
- {\r
- //JIS_0208 1978\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- else if ( b2 == bDollar && b3 == bB )\r
- {\r
- //JIS_0208 1983\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- else if ( b2 == bOpen && ( b3 == bB || b3 == bJ ) )\r
- {\r
- //JIS_ASC\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- else if ( b2 == bOpen && b3 == bI )\r
- {\r
- //JIS_KANA\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- if ( i < len - 3 )\r
- {\r
- b4 = bytes[ i + 3 ];\r
- if ( b2 == bDollar && b3 == bOpen && b4 == bD )\r
- {\r
- //JIS_0212\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- if ( i < len - 5 &&\r
- b2 == bAnd && b3 == bAt && b4 == bEscape &&\r
- bytes[ i + 4 ] == bDollar && bytes[ i + 5 ] == bB )\r
- {\r
- //JIS_0208 1990\r
- //JIS\r
- return System.Text.Encoding.GetEncoding( 50220 );\r
- }\r
- }\r
- }\r
- }\r
-\r
- //should be euc|sjis|utf8\r
- //use of (?:) by Hiroki Ohzaki <ohzaki@iod.ricoh.co.jp>\r
- int sjis = 0;\r
- int euc = 0;\r
- int utf8 = 0;\r
- for ( int i = 0; i < len - 1; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- b2 = bytes[ i + 1 ];\r
- if ( ( ( 0x81 <= b1 && b1 <= 0x9F ) || ( 0xE0 <= b1 && b1 <= 0xFC ) ) &&\r
- ( ( 0x40 <= b2 && b2 <= 0x7E ) || ( 0x80 <= b2 && b2 <= 0xFC ) ) )\r
- {\r
- //SJIS_C\r
- sjis += 2;\r
- i++;\r
- }\r
- }\r
- for ( int i = 0; i < len - 1; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- b2 = bytes[ i + 1 ];\r
- if ( ( ( 0xA1 <= b1 && b1 <= 0xFE ) && ( 0xA1 <= b2 && b2 <= 0xFE ) ) ||\r
- ( b1 == 0x8E && ( 0xA1 <= b2 && b2 <= 0xDF ) ) )\r
- {\r
- //EUC_C\r
- //EUC_KANA\r
- euc += 2;\r
- i++;\r
- }\r
- else if ( i < len - 2 )\r
- {\r
- b3 = bytes[ i + 2 ];\r
- if ( b1 == 0x8F && ( 0xA1 <= b2 && b2 <= 0xFE ) &&\r
- ( 0xA1 <= b3 && b3 <= 0xFE ) )\r
- {\r
- //EUC_0212\r
- euc += 3;\r
- i += 2;\r
- }\r
- }\r
- }\r
- for ( int i = 0; i < len - 1; i++ )\r
- {\r
- b1 = bytes[ i ];\r
- b2 = bytes[ i + 1 ];\r
- if ( ( 0xC0 <= b1 && b1 <= 0xDF ) && ( 0x80 <= b2 && b2 <= 0xBF ) )\r
- {\r
- //UTF8\r
- utf8 += 2;\r
- i++;\r
- }\r
- else if ( i < len - 2 )\r
- {\r
- b3 = bytes[ i + 2 ];\r
- if ( ( 0xE0 <= b1 && b1 <= 0xEF ) && ( 0x80 <= b2 && b2 <= 0xBF ) &&\r
- ( 0x80 <= b3 && b3 <= 0xBF ) )\r
- {\r
- //UTF8\r
- utf8 += 3;\r
- i += 2;\r
- }\r
- }\r
- }\r
- //M. Takahashi's suggestion\r
- //utf8 += utf8 / 2;\r
-\r
- //Debug.WriteLine(\r
- // string.Format( "sjis = {0}, euc = {1}, utf8 = {2}", sjis, euc, utf8 ) );\r
- if ( euc > sjis && euc > utf8 )\r
- {\r
- //EUC\r
- return System.Text.Encoding.GetEncoding( 51932 );\r
- }\r
- else if ( sjis > euc && sjis > utf8 )\r
- {\r
- //SJIS\r
- return System.Text.Encoding.GetEncoding( 932 );\r
- }\r
- else if ( utf8 > euc && utf8 > sjis )\r
- {\r
- //UTF8\r
- return System.Text.Encoding.UTF8;\r
- }\r
-\r
- return null;\r
- }\r
- }\r
-\r
-}\r