+++ /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.Drawing;\r
-using System.Diagnostics;\r
-using FDK;\r
-using System.IO;\r
-\r
-namespace DTXMania\r
-{\r
- public partial class CDTX\r
- {\r
- // クラス\r
-\r
- public class CAVI : IDisposable\r
- {\r
- public CAviDS avi;\r
- private bool bDispose済み;\r
-\r
- int n番号;\r
- string strコメント文 = "";\r
- string strファイル名 = "";\r
- double dbPlaySpeed = 1;\r
-\r
- public CAVI(int number, string filename, string comment, double playSpeed)\r
- {\r
- n番号 = number;\r
- strファイル名 = filename;\r
- strコメント文 = comment;\r
- dbPlaySpeed = playSpeed;\r
- }\r
-\r
- public void OnDeviceCreated()\r
- {\r
- #region [ strAVIファイル名の作成。]\r
- //-----------------\r
- string strAVIファイル名;\r
-\r
- if (CDTXMania.Instance.DTX != null && !Path.IsPathRooted(this.strファイル名)) // CDTX抜きでCAVI単体で使うことを考慮(選曲画面, リザルト画面)\r
- { // 演奏終了直後はCDTXオブジェクトが残っているので、ファイル名がフルパスかどうかでプレビュー判定する\r
- if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
- strAVIファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
- else\r
- strAVIファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
- }\r
- else\r
- {\r
- strAVIファイル名 = this.strファイル名;\r
- }\r
- //-----------------\r
- #endregion\r
-\r
- if (!File.Exists(strAVIファイル名))\r
- {\r
- Trace.TraceWarning("CAVI: ファイルが存在しません。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
- this.avi = null;\r
- return;\r
- }\r
-\r
- // AVI の生成。\r
-\r
- try\r
- {\r
- this.avi = new CAviDS(strAVIファイル名, this.dbPlaySpeed);\r
- Trace.TraceInformation("CAviDS: 動画を生成しました。({0})({1})({2}msec)", this.strコメント文, Path.GetFileName(strAVIファイル名), this.avi.GetDuration());\r
- }\r
- catch (Exception e)\r
- {\r
- Trace.TraceError(e.Message);\r
- Trace.TraceError("CAviDS: 動画の生成に失敗しました。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
- this.avi = null;\r
- }\r
- }\r
- public override string ToString()\r
- {\r
- return string.Format("CAVI{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
- }\r
-\r
- #region [ IDisposable 実装 ]\r
- //-----------------\r
- public void Dispose()\r
- {\r
- if (this.bDispose済み)\r
- return;\r
-\r
- if (this.avi != null)\r
- {\r
- #region [ strAVIファイル名 の作成。なぜDispose時にファイル名の生成をしているのかと思ったら、デバッグログ用でした。 ]\r
- //-----------------\r
- string strAVIファイル名;\r
- if (CDTXMania.Instance.DTX != null && !Path.IsPathRooted(this.strファイル名)) // CDTX抜きでCAVI単体で使うことを考慮(選曲画面, リザルト画面)\r
- { // 演奏終了直後はCDTXオブジェクトが残っているので、ファイル名がフルパスかどうかでプレビュー判定する\r
- if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
- strAVIファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
- else\r
- strAVIファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
- }\r
- else\r
- {\r
- strAVIファイル名 = this.strファイル名;\r
- }\r
- //-----------------\r
- #endregion\r
-\r
- this.avi.Dispose();\r
- this.avi = null;\r
-\r
- Trace.TraceInformation("動画を解放しました。({0})({1})", this.strコメント文, Path.GetFileName(strAVIファイル名));\r
- }\r
- this.bDispose済み = true;\r
- }\r
- //-----------------\r
- #endregion\r
- }\r
- public class CAVIPAN\r
- {\r
- public int nAVI番号;\r
- public int n移動時間ct;\r
- public int n番号;\r
- public Point pt動画側開始位置 = new Point(0, 0);\r
- public Point pt動画側終了位置 = new Point(0, 0);\r
- public Point pt表示側開始位置 = new Point(0, 0);\r
- public Point pt表示側終了位置 = new Point(0, 0);\r
- public Size sz開始サイズ = new Size(0, 0);\r
- public Size sz終了サイズ = new Size(0, 0);\r
-\r
- public override string ToString()\r
- {\r
- return string.Format("CAVIPAN{0}: AVI:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 動画側開始位置:{5}x{6}, 動画側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",\r
- CDTX.tZZ(this.n番号),\r
- this.sz開始サイズ.Width, this.sz開始サイズ.Height,\r
- this.sz終了サイズ.Width, this.sz終了サイズ.Height,\r
- this.pt動画側開始位置.X, this.pt動画側開始位置.Y,\r
- this.pt動画側終了位置.X, this.pt動画側終了位置.Y,\r
- this.pt表示側開始位置.X, this.pt表示側開始位置.Y,\r
- this.pt表示側終了位置.X, this.pt表示側終了位置.Y,\r
- this.n移動時間ct,\r
- CDTX.tZZ(this.nAVI番号));\r
- }\r
- }\r
- public class CBGA\r
- {\r
- public int nBMP番号;\r
- public int n番号;\r
- public Point pt画像側右下座標 = new Point(0, 0);\r
- public Point pt画像側左上座標 = new Point(0, 0);\r
- public Point pt表示座標 = new Point(0, 0);\r
-\r
- public override string ToString()\r
- {\r
- return string.Format("CBGA{0}, BMP:{1}, 画像側左上座標:{2}x{3}, 画像側右下座標:{4}x{5}, 表示座標:{6}x{7}",\r
- CDTX.tZZ(this.n番号),\r
- CDTX.tZZ(this.nBMP番号),\r
- this.pt画像側左上座標.X, this.pt画像側左上座標.Y,\r
- this.pt画像側右下座標.X, this.pt画像側右下座標.Y,\r
- this.pt表示座標.X, this.pt表示座標.Y);\r
- }\r
- }\r
- public class CBGAPAN\r
- {\r
- public int nBMP番号;\r
- public int n移動時間ct;\r
- public int n番号;\r
- public Point pt画像側開始位置 = new Point(0, 0);\r
- public Point pt画像側終了位置 = new Point(0, 0);\r
- public Point pt表示側開始位置 = new Point(0, 0);\r
- public Point pt表示側終了位置 = new Point(0, 0);\r
- public Size sz開始サイズ = new Size(0, 0);\r
- public Size sz終了サイズ = new Size(0, 0);\r
-\r
- public override string ToString()\r
- {\r
- return string.Format("CBGAPAN{0}: BMP:{14}, 開始サイズ:{1}x{2}, 終了サイズ:{3}x{4}, 画像側開始位置:{5}x{6}, 画像側終了位置:{7}x{8}, 表示側開始位置:{9}x{10}, 表示側終了位置:{11}x{12}, 移動時間:{13}ct",\r
- CDTX.tZZ(this.nBMP番号),\r
- this.sz開始サイズ.Width, this.sz開始サイズ.Height,\r
- this.sz終了サイズ.Width, this.sz終了サイズ.Height,\r
- this.pt画像側開始位置.X, this.pt画像側開始位置.Y,\r
- this.pt画像側終了位置.X, this.pt画像側終了位置.Y,\r
- this.pt表示側開始位置.X, this.pt表示側開始位置.Y,\r
- this.pt表示側終了位置.X, this.pt表示側終了位置.Y,\r
- this.n移動時間ct,\r
- CDTX.tZZ(this.nBMP番号));\r
- }\r
- }\r
- public class CBMP : CBMPbase, IDisposable\r
- {\r
- public CBMP()\r
- {\r
- b黒を透過する = true; // BMPでは、黒を透過色とする\r
- }\r
- public override void PutLog(string strテクスチャファイル名)\r
- {\r
- Trace.TraceInformation("テクスチャを生成しました。({0})({1})({2}x{3})", this.strコメント文, strテクスチャファイル名, this.n幅, this.n高さ);\r
- }\r
- public override string ToString()\r
- {\r
- return string.Format("CBMP{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
- }\r
-\r
- }\r
- public class CBMPTEX : CBMPbase, IDisposable\r
- {\r
- public CBMPTEX()\r
- {\r
- b黒を透過する = false; // BMPTEXでは、透過色はαで表現する\r
- }\r
- public override void PutLog(string strテクスチャファイル名)\r
- {\r
- Trace.TraceInformation("テクスチャを生成しました。({0})({1})(Gr:{2}x{3})(Tx:{4}x{5})", this.strコメント文, strテクスチャファイル名, this.tx画像.sz画像サイズ.Width, this.tx画像.sz画像サイズ.Height, this.tx画像.szテクスチャサイズ.Width, this.tx画像.szテクスチャサイズ.Height);\r
- }\r
- public override string ToString()\r
- {\r
- return string.Format("CBMPTEX{0}: File:{1}, Comment:{2}", CDTX.tZZ(this.n番号), this.strファイル名, this.strコメント文);\r
- }\r
- }\r
- public class CBMPbase : IDisposable\r
- {\r
- public bool bUse;\r
- public int n番号;\r
- public string strコメント文 = "";\r
- public string strファイル名 = "";\r
- public CTexture tx画像;\r
- public int n高さ\r
- {\r
- get\r
- {\r
- return this.tx画像.sz画像サイズ.Height;\r
- }\r
- }\r
- public int n幅\r
- {\r
- get\r
- {\r
- return this.tx画像.sz画像サイズ.Width;\r
- }\r
- }\r
- public bool b黒を透過する;\r
- public Bitmap bitmap;\r
-\r
- public string GetFullPathname\r
- {\r
- get\r
- {\r
- if (!string.IsNullOrEmpty(CDTXMania.Instance.DTX.PATH_WAV))\r
- return CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
- else\r
- return CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
- }\r
- }\r
-\r
- public void OnDeviceCreated()\r
- {\r
- #region [ strテクスチャファイル名 を作成。]\r
- string strテクスチャファイル名 = this.GetFullPathname;\r
- #endregion\r
-\r
- if (!File.Exists(strテクスチャファイル名))\r
- {\r
- Trace.TraceWarning("ファイルが存在しません。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
- this.tx画像 = null;\r
- return;\r
- }\r
-\r
- // テクスチャを作成。\r
- byte[] txData = File.ReadAllBytes(strテクスチャファイル名);\r
- this.tx画像 = TextureFactory.tテクスチャの生成(txData, b黒を透過する);\r
-\r
- if (this.tx画像 != null)\r
- {\r
- // 作成成功。\r
- if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
- PutLog(strテクスチャファイル名);\r
- txData = null;\r
- this.bUse = true;\r
- }\r
- else\r
- {\r
- // 作成失敗。\r
- Trace.TraceError("テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
- this.tx画像 = null;\r
- }\r
- }\r
- /// <summary>\r
- /// BGA画像のデコードをTexture()に渡す前に行う、OnDeviceCreate()\r
- /// </summary>\r
- /// <param name="bitmap">テクスチャ画像</param>\r
- /// <param name="strテクスチャファイル名">ファイル名</param>\r
- public void OnDeviceCreated(Bitmap bitmap, string strテクスチャファイル名)\r
- {\r
- if (bitmap != null && b黒を透過する)\r
- {\r
- bitmap.MakeTransparent(Color.Black); // 黒を透過色にする\r
- }\r
- this.tx画像 = TextureFactory.tテクスチャの生成(bitmap, b黒を透過する);\r
-\r
- if (this.tx画像 != null)\r
- {\r
- // 作成成功。\r
- if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
- PutLog(strテクスチャファイル名);\r
- this.bUse = true;\r
- }\r
- else\r
- {\r
- // 作成失敗。\r
- Trace.TraceError("テクスチャの生成に失敗しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
- this.tx画像 = null;\r
- }\r
- if (bitmap != null)\r
- {\r
- bitmap.Dispose();\r
- }\r
- }\r
-\r
- public virtual void PutLog(string strテクスチャファイル名)\r
- {\r
- }\r
-\r
- #region [ IDisposable 実装 ]\r
- //-----------------\r
- public void Dispose()\r
- {\r
- if (this.bDisposed済み)\r
- return;\r
-\r
- if (this.tx画像 != null)\r
- {\r
- #region [ strテクスチャファイル名 を作成。]\r
- //-----------------\r
- string strテクスチャファイル名 = this.GetFullPathname;\r
- //if( !string.IsNullOrEmpty( CDTXMania.Instance.DTX.PATH_WAV ) )\r
- // strテクスチャファイル名 = CDTXMania.Instance.DTX.PATH_WAV + this.strファイル名;\r
- //else\r
- // strテクスチャファイル名 = CDTXMania.Instance.DTX.strフォルダ名 + this.strファイル名;\r
- //-----------------\r
- #endregion\r
-\r
- TextureFactory.tテクスチャの解放(ref this.tx画像);\r
-\r
- if (CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
- Trace.TraceInformation("テクスチャを解放しました。({0})({1})", this.strコメント文, strテクスチャファイル名);\r
- }\r
- this.bUse = false;\r
-\r
- this.bDisposed済み = true;\r
- }\r
- //-----------------\r
- #endregion\r
- #region [ private ]\r
- //-----------------\r
- private bool bDisposed済み;\r
- //-----------------\r
- #endregion\r
- }\r
- public class CBPM\r
- {\r
- public double dbBPM値;\r
- public int n内部番号;\r
- public int n表記上の番号;\r
-\r
- public override string ToString()\r
- {\r
- StringBuilder builder = new StringBuilder(0x80);\r
- if (this.n内部番号 != this.n表記上の番号)\r
- {\r
- builder.Append(string.Format("CBPM{0}(内部{1})", CDTX.tZZ(this.n表記上の番号), this.n内部番号));\r
- }\r
- else\r
- {\r
- builder.Append(string.Format("CBPM{0}", CDTX.tZZ(this.n表記上の番号)));\r
- }\r
- builder.Append(string.Format(", BPM:{0}", this.dbBPM値));\r
- return builder.ToString();\r
- }\r
- }\r
- public class CWAV : IDisposable\r
- {\r
- public bool bBGMとして使う;\r
- public List<EChannel> listこのWAVを使用するチャンネル番号の集合 = new List<EChannel>(16);\r
- public int nチップサイズ = 100;\r
- public int n位置;\r
- public long[] n一時停止時刻 = new long[CDTXMania.Instance.ConfigIni.nPolyphonicSounds]; // 4\r
- public int n音量 = 100;\r
- public int n現在再生中のサウンド番号;\r
- public long[] n再生開始時刻 = new long[CDTXMania.Instance.ConfigIni.nPolyphonicSounds]; // 4\r
- public int n内部番号;\r
- public int n表記上の番号;\r
- public CSound[] rSound = new CSound[CDTXMania.Instance.ConfigIni.nPolyphonicSounds]; // 4\r
- public string strコメント文 = "";\r
- public string strファイル名 = "";\r
- public bool bBGMとして使わない\r
- {\r
- get\r
- {\r
- return !this.bBGMとして使う;\r
- }\r
- set\r
- {\r
- this.bBGMとして使う = !value;\r
- }\r
- }\r
- public bool bIsBassSound = false;\r
- public bool bIsGuitarSound = false;\r
- public bool bIsDrumsSound = false;\r
- public bool bIsSESound = false;\r
- public bool bIsBGMSound = false;\r
-\r
- public override string ToString()\r
- {\r
- var sb = new StringBuilder(128);\r
-\r
- if (this.n表記上の番号 == this.n内部番号)\r
- {\r
- sb.Append(string.Format("CWAV{0}: ", CDTX.tZZ(this.n表記上の番号)));\r
- }\r
- else\r
- {\r
- sb.Append(string.Format("CWAV{0}(内部{1}): ", CDTX.tZZ(this.n表記上の番号), this.n内部番号));\r
- }\r
- sb.Append(string.Format("音量:{0}, 位置:{1}, サイズ:{2}, BGM:{3}, File:{4}, Comment:{5}", this.n音量, this.n位置, this.nチップサイズ, this.bBGMとして使う ? 'Y' : 'N', this.strファイル名, this.strコメント文));\r
-\r
- return sb.ToString();\r
- }\r
-\r
- #region [ Dispose-Finalize パターン実装 ]\r
- //-----------------\r
- public void Dispose()\r
- {\r
- this.Dispose(true);\r
- GC.SuppressFinalize(this);\r
- }\r
- public void Dispose(bool bManagedリソースの解放も行う)\r
- {\r
- if (this.bDisposed済み)\r
- return;\r
-\r
- if (bManagedリソースの解放も行う)\r
- {\r
- for (int i = 0; i < CDTXMania.Instance.ConfigIni.nPolyphonicSounds; i++) // 4\r
- {\r
- if (this.rSound[i] != null)\r
- CDTXMania.Instance.Sound管理.tサウンドを破棄する(this.rSound[i]);\r
- this.rSound[i] = null;\r
-\r
- if ((i == 0) && CDTXMania.Instance.ConfigIni.bLogCreateRelease)\r
- Trace.TraceInformation("サウンドを解放しました。({0})({1})", this.strコメント文, this.strファイル名);\r
- }\r
- }\r
-\r
- this.bDisposed済み = true;\r
- }\r
- ~CWAV()\r
- {\r
- this.Dispose(false);\r
- }\r
- //-----------------\r
- #endregion\r
-\r
- #region [ private ]\r
- //-----------------\r
- private bool bDisposed済み;\r
- //-----------------\r
- #endregion\r
- }\r
-\r
-\r
- // 構造体\r
- public struct STRESULT\r
- {\r
- public string SS;\r
- public string S;\r
- public string A;\r
- public string B;\r
- public string C;\r
- public string D;\r
- public string E;\r
-\r
- public string this[int index]\r
- {\r
- get\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- return this.SS;\r
-\r
- case 1:\r
- return this.S;\r
-\r
- case 2:\r
- return this.A;\r
-\r
- case 3:\r
- return this.B;\r
-\r
- case 4:\r
- return this.C;\r
-\r
- case 5:\r
- return this.D;\r
-\r
- case 6:\r
- return this.E;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- set\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- this.SS = value;\r
- return;\r
-\r
- case 1:\r
- this.S = value;\r
- return;\r
-\r
- case 2:\r
- this.A = value;\r
- return;\r
-\r
- case 3:\r
- this.B = value;\r
- return;\r
-\r
- case 4:\r
- this.C = value;\r
- return;\r
-\r
- case 5:\r
- this.D = value;\r
- return;\r
-\r
- case 6:\r
- this.E = value;\r
- return;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- }\r
- }\r
- public struct STチップがある\r
- {\r
- public bool Drums;\r
- public bool Guitar;\r
- public bool Bass;\r
-\r
- public bool HHOpen;\r
- public bool Ride;\r
- public bool LeftCymbal;\r
- public bool OpenGuitar;\r
- public bool OpenBass;\r
-\r
- public bool BGA;\r
- public bool Movie;\r
-\r
- public bool LeftPedal;\r
- public bool LeftBassDrum;\r
-\r
- public bool this[EPart inst]\r
- {\r
- get\r
- {\r
- bool ret = false;\r
- if (inst == EPart.Drums)\r
- {\r
- ret = this.Drums;\r
- }\r
- else if (inst == EPart.Guitar)\r
- {\r
- ret = this.Guitar;\r
- }\r
- else if (inst == EPart.Bass)\r
- {\r
- ret = this.Bass;\r
- }\r
- return ret;\r
- }\r
- }\r
-\r
- public bool this[int index]\r
- {\r
- get\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- return this.Drums;\r
-\r
- case 1:\r
- return this.Guitar;\r
-\r
- case 2:\r
- return this.Bass;\r
-\r
- case 3:\r
- return this.HHOpen;\r
-\r
- case 4:\r
- return this.Ride;\r
-\r
- case 5:\r
- return this.LeftCymbal;\r
-\r
- case 6:\r
- return this.OpenGuitar;\r
-\r
- case 7:\r
- return this.OpenBass;\r
-\r
- case 8:\r
- return this.LeftPedal;\r
-\r
- case 9:\r
- return this.LeftBassDrum;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- set\r
- {\r
- switch (index)\r
- {\r
- case 0:\r
- this.Drums = value;\r
- return;\r
-\r
- case 1:\r
- this.Guitar = value;\r
- return;\r
-\r
- case 2:\r
- this.Bass = value;\r
- return;\r
-\r
- case 3:\r
- this.HHOpen = value;\r
- return;\r
-\r
- case 4:\r
- this.Ride = value;\r
- return;\r
-\r
- case 5:\r
- this.LeftCymbal = value;\r
- return;\r
-\r
- case 6:\r
- this.OpenGuitar = value;\r
- return;\r
-\r
- case 7:\r
- this.OpenBass = value;\r
- return;\r
-\r
- case 8:\r
- this.LeftPedal = value;\r
- return;\r
-\r
- case 9:\r
- this.LeftBassDrum = value;\r
- return;\r
- }\r
- throw new IndexOutOfRangeException();\r
- }\r
- }\r
- }\r
-\r
- }\r
-}\r