OSDN Git Service

Merge branch 'feature/37178_プロジェクトとソリューションファイルの英語化' into develop
[dtxmania/dtxmania.git] / FDK / コード / 02.入力 / CInputJoystick.cs
diff --git a/FDK/コード/02.入力/CInputJoystick.cs b/FDK/コード/02.入力/CInputJoystick.cs
new file mode 100644 (file)
index 0000000..f90a302
--- /dev/null
@@ -0,0 +1,754 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Diagnostics;
+using SharpDX;
+using SharpDX.DirectInput;
+
+namespace FDK
+{
+       public class CInputJoystick : IInputDevice, IDisposable
+       {
+               // コンストラクタ
+
+               public CInputJoystick( IntPtr hWnd, DeviceInstance di, DirectInput directInput )
+               {
+                       this.e入力デバイス種別 = E入力デバイス種別.Joystick;
+                       this.GUID = di.InstanceGuid.ToString();
+                       this.ID = 0;
+                       try
+                       {
+                               this.devJoystick = new Joystick( directInput, di.InstanceGuid );
+                               this.devJoystick.SetCooperativeLevel( hWnd, CooperativeLevel.Foreground | CooperativeLevel.Exclusive );
+                               this.devJoystick.Properties.BufferSize = 32;
+                               Trace.TraceInformation( this.devJoystick.Information.InstanceName + "を生成しました。" );
+                       }
+                       catch
+                       {
+                               if( this.devJoystick != null )
+                               {
+                                       this.devJoystick.Dispose();
+                                       this.devJoystick = null;
+                               }
+                               Trace.TraceError( this.devJoystick.Information.InstanceName, new object[] { " の生成に失敗しました。" } );
+                               throw;
+                       }
+                       foreach( DeviceObjectInstance instance in this.devJoystick.GetObjects() )
+                       {
+                               if( ( instance.ObjectId.Flags & DeviceObjectTypeFlags.Axis ) != DeviceObjectTypeFlags.All )
+                               {
+                                       this.devJoystick.GetObjectPropertiesById( instance.ObjectId ).Range = new InputRange( -1000, 1000 );
+                                       this.devJoystick.GetObjectPropertiesById( instance.ObjectId ).DeadZone = 5000;          // 50%をデッドゾーンに設定
+                                                                                                                                                                                                                               // 軸をON/OFFの2値で使うならこれで十分
+                               }
+                       }
+                       try
+                       {
+                               this.devJoystick.Acquire();
+                       }
+                       catch
+                       {
+                       }
+
+                       for( int i = 0; i < this.bButtonState.Length; i++ )
+                               this.bButtonState[ i ] = false;
+                       for ( int i = 0; i < this.nPovState.Length; i++ )
+                               this.nPovState[ i ] = -1;
+
+                       //this.timer = new CTimer( CTimer.E種別.MultiMedia );
+
+                       this.list入力イベント = new List<STInputEvent>( 32 );
+               }
+               
+               
+               // メソッド
+               
+               public void SetID( int nID )
+               {
+                       this.ID = nID;
+               }
+
+               #region [ IInputDevice 実装 ]
+               //-----------------
+               public E入力デバイス種別 e入力デバイス種別
+               { 
+                       get;
+                       private set;
+               }
+               public string GUID
+               {
+                       get;
+                       private set;
+               }
+               public int ID
+               { 
+                       get; 
+                       private set;
+               }
+               public List<STInputEvent> list入力イベント 
+               {
+                       get;
+                       private set; 
+               }
+
+               public void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する )
+               {
+                       #region [ bButtonフラグ初期化 ]
+                       for ( int i = 0; i < 256; i++ )
+                       {
+                               this.bButtonPushDown[ i ] = false;
+                               this.bButtonPullUp[ i ] = false;
+                       }
+                       #endregion
+
+                       if ( bWindowがアクティブ中 )
+                       {
+                               this.devJoystick.Acquire();
+                               this.devJoystick.Poll();
+
+                               // this.list入力イベント = new List<STInputEvent>( 32 );
+                               this.list入力イベント.Clear();                                            // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();
+
+
+                               if( bバッファ入力を使用する )
+                               {
+                                       #region [ a.バッファ入力 ]
+                                       //-----------------------------
+                                       var bufferedData = this.devJoystick.GetBufferedData();
+                                       //if( Result.Last.IsSuccess && bufferedData != null )
+                                       {
+                                               foreach ( JoystickUpdate data in bufferedData )
+                                               {
+#if false
+//if ( 0 < data.X && data.X < 128 && 0 < data.Y && data.Y < 128 && 0 < data.Z && data.Z < 128 )
+{
+Trace.TraceInformation( "TS={0}: offset={4}, X={1},Y={2},Z={3}", data.TimeStamp, data.X, data.Y, data.Z, data.JoystickDeviceType);
+if ( data.JoystickDeviceType == (int) JoystickDeviceType.POV0 ||
+        data.JoystickDeviceType == (int) JoystickDeviceType.POV1 ||
+        data.JoystickDeviceType == (int) JoystickDeviceType.POV2 ||
+        data.JoystickDeviceType == (int) JoystickDeviceType.POV3) {
+
+//if ( data.JoystickDeviceType== (int)JoystickDeviceType.POV0 )
+//{
+        Debug.WriteLine( "POV0です!!" );
+}
+//Trace.TraceInformation( "TS={0}: X={1},Y={2},Z={3}", data.TimeStamp, data.X, data.Y, data.Z );
+string pp = "";
+int[] pp0 = data.GetPointOfViewControllers();
+for ( int ii = 0; ii < pp0.Length; ii++ )
+{
+pp += pp0[ ii ];
+}
+Trace.TraceInformation( "TS={0}: povs={1}", data.TimeStamp, pp );
+string pp2 = "", pp3 = "";
+for ( int ii = 0; ii < 32; ii++ )
+{
+pp2 += ( data.IsPressed( ii ) ) ? "1" : "0";
+pp3 += ( data.IsReleased( ii ) ) ? "1" : "0";
+}
+Trace.TraceInformation( "TS={0}: IsPressed={1}, IsReleased={2}", data.TimeStamp, pp2, pp3 );
+}
+#endif
+                                                       switch ( data.Offset )
+                                                       {
+                                                               case JoystickOffset.X:
+                                                                       #region [ X軸- ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 0, 1 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       #region [ X軸+ ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 1, 0 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       break;
+                                                               case JoystickOffset.Y:
+                                                                       #region [ Y軸- ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 2, 3 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       #region [ Y軸+ ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 3, 2 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       break;
+                                                               case JoystickOffset.Z:
+                                                                       #region [ Z軸- ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 4, 5 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       #region [ Z軸+ ]
+                                                                       //-----------------------------
+                                                                       bButtonUpDown( data, data.Value, 5, 4 );
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       break;
+                                                               // #24341 2011.3.12 yyagi: POV support
+                                                               // #26880 2011.12.6 yyagi: improve to support "pullup" of POV buttons
+                                                               case JoystickOffset.PointOfViewControllers0:
+                                                                       #region [ POV HAT 4/8way ]
+                                                                       POVの処理( 0, data.Value );
+                                                                       #endregion
+                                                                       break;
+                                                               case JoystickOffset.PointOfViewControllers1:
+                                                                       #region [ POV HAT 4/8way ]
+                                                                       POVの処理( 1, data.Value );
+                                                                       #endregion
+                                                                       break;
+                                                               case JoystickOffset.PointOfViewControllers2:
+                                                                       #region [ POV HAT 4/8way ]
+                                                                       POVの処理( 2, data.Value );
+                                                                       #endregion
+                                                                       break;
+                                                               case JoystickOffset.PointOfViewControllers3:
+                                                                       #region [ POV HAT 4/8way ]
+                                                                       POVの処理( 3, data.Value );
+                                                                       #endregion
+                                                                       break;
+                                                               default:
+                                                                       #region [ ボタン ]
+                                                                       //-----------------------------
+
+                                                                       //for ( int i = 0; i < 32; i++ )
+                                                                       if( data.Offset >= JoystickOffset.Buttons0 && data.Offset <= JoystickOffset.Buttons31 )
+                                                                       {
+                                                                               int i = data.Offset - JoystickOffset.Buttons0;
+
+                                                                               if ( ( data.Value & 0x80 ) != 0 )
+                                                                               {
+                                                                                       STInputEvent e = new STInputEvent()
+                                                                                       {
+                                                                                               nKey = 6 + i,
+                                                                                               b押された = true,
+                                                                                               b離された = false,
+                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),
+                                                                                               nVelocity = CInput管理.n通常音量
+                                                                                       };
+                                                                                       this.list入力イベント.Add( e );
+
+                                                                                       this.bButtonState[ 6 + i ] = true;
+                                                                                       this.bButtonPushDown[ 6 + i ] = true;
+                                                                               }
+                                                                               else //if ( ( data.Value & 0x80 ) == 0 )
+                                                                               {
+                                                                                       var ev = new STInputEvent()
+                                                                                       {
+                                                                                               nKey = 6 + i,
+                                                                                               b押された = false,
+                                                                                               b離された = true,
+                                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),
+                                                                                               nVelocity = CInput管理.n通常音量,
+                                                                                       };
+                                                                                       this.list入力イベント.Add( ev );
+
+                                                                                       this.bButtonState[ 6 + i ] = false;
+                                                                                       this.bButtonPullUp[ 6 + i ] = true;
+                                                                               }
+                                                                       }
+                                                                       //-----------------------------
+                                                                       #endregion
+                                                                       break;
+                                                       }
+
+                                                       #region [ ローカル関数 ]
+                                                       void POVの処理( int p, int nPovDegree )
+                                                       {
+                                                               STInputEvent e = new STInputEvent();
+                                                               int nWay = ( nPovDegree + 2250 ) / 4500;
+                                                               if( nWay == 8 ) nWay = 0;
+                                                               //Debug.WriteLine( "POVS:" + povs[ 0 ].ToString( CultureInfo.CurrentCulture ) + ", " +stevent.nKey );
+                                                               //Debug.WriteLine( "nPovDegree=" + nPovDegree );
+                                                               if( nPovDegree == -1 )
+                                                               {
+                                                                       e.nKey = 6 + 128 + this.nPovState[ p ];
+                                                                       this.nPovState[ p ] = -1;
+                                                                       //Debug.WriteLine( "POVS離された" + data.TimeStamp + " " + e.nKey );
+                                                                       e.b押された = false;
+                                                                       e.nVelocity = 0;
+                                                                       this.bButtonState[ e.nKey ] = false;
+                                                                       this.bButtonPullUp[ e.nKey ] = true;
+                                                               }
+                                                               else
+                                                               {
+                                                                       this.nPovState[ p ] = nWay;
+                                                                       e.nKey = 6 + 128 + nWay;
+                                                                       e.b押された = true;
+                                                                       e.nVelocity = CInput管理.n通常音量;
+                                                                       this.bButtonState[ e.nKey ] = true;
+                                                                       this.bButtonPushDown[ e.nKey ] = true;
+                                                                       //Debug.WriteLine( "POVS押された" + data.TimeStamp + " " + e.nKey );
+                                                               }
+                                                               //e.nTimeStamp = data.TimeStamp;
+                                                               e.nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp );
+                                                               this.list入力イベント.Add( e );
+                                                       }
+                                                       #endregion
+                                               }
+                                       }
+                                       //-----------------------------
+                                       #endregion
+                               }
+                               else
+                               {
+                                       #region [ b.状態入力 ]
+                                       //-----------------------------
+                                       JoystickState currentState = this.devJoystick.GetCurrentState();
+                                       //if( Result.Last.IsSuccess && currentState != null )
+                                       {
+                                               #region [ X軸- ]
+                                               //-----------------------------
+                                               if( currentState.X < -500 )
+                                               {
+                                                       if( this.bButtonState[ 0 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 0,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 0 ] = true;
+                                                               this.bButtonPushDown[ 0 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 0 ] == true )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 0,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 0 ] = false;
+                                                               this.bButtonPullUp[ 0 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ X軸+ ]
+                                               //-----------------------------
+                                               if( currentState.X > 500 )
+                                               {
+                                                       if( this.bButtonState[ 1 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 1,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 1 ] = true;
+                                                               this.bButtonPushDown[ 1 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 1 ] == true )
+                                                       {
+                                                               STInputEvent event7 = new STInputEvent()
+                                                               {
+                                                                       nKey = 1,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( event7 );
+
+                                                               this.bButtonState[ 1 ] = false;
+                                                               this.bButtonPullUp[ 1 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ Y軸- ]
+                                               //-----------------------------
+                                               if( currentState.Y < -500 )
+                                               {
+                                                       if( this.bButtonState[ 2 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 2,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 2 ] = true;
+                                                               this.bButtonPushDown[ 2 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 2 ] == true )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 2,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 2 ] = false;
+                                                               this.bButtonPullUp[ 2 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ Y軸+ ]
+                                               //-----------------------------
+                                               if( currentState.Y > 500 )
+                                               {
+                                                       if( this.bButtonState[ 3 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 3,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 3 ] = true;
+                                                               this.bButtonPushDown[ 3 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 3 ] == true )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 3,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 3 ] = false;
+                                                               this.bButtonPullUp[ 3 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ Z軸- ]
+                                               //-----------------------------
+                                               if( currentState.Z < -500 )
+                                               {
+                                                       if( this.bButtonState[ 4 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 4,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 4 ] = true;
+                                                               this.bButtonPushDown[ 4 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 4 ] == true )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 4,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 4 ] = false;
+                                                               this.bButtonPullUp[ 4 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ Z軸+ ]
+                                               //-----------------------------
+                                               if( currentState.Z > 500 )
+                                               {
+                                                       if( this.bButtonState[ 5 ] == false )
+                                                       {
+                                                               STInputEvent ev = new STInputEvent()
+                                                               {
+                                                                       nKey = 5,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( ev );
+
+                                                               this.bButtonState[ 5 ] = true;
+                                                               this.bButtonPushDown[ 5 ] = true;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       if( this.bButtonState[ 5 ] == true )
+                                                       {
+                                                               STInputEvent event15 = new STInputEvent()
+                                                               {
+                                                                       nKey = 5,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( event15 );
+
+                                                               this.bButtonState[ 5 ] = false;
+                                                               this.bButtonPullUp[ 5 ] = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               #region [ ボタン ]
+                                               //-----------------------------
+                                               bool bIsButtonPressedReleased = false;
+                                               bool[] buttons = currentState.Buttons;
+                                               for( int j = 0; ( j < buttons.Length ) && ( j < 128 ); j++ )
+                                               {
+                                                       if( this.bButtonState[ 6 + j ] == false && buttons[ j ] )
+                                                       {
+                                                               STInputEvent item = new STInputEvent()
+                                                               {
+                                                                       nKey = 6 + j,
+                                                                       b押された = true,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( item );
+
+                                                               this.bButtonState[ 6 + j ] = true;
+                                                               this.bButtonPushDown[ 6 + j ] = true;
+                                                               bIsButtonPressedReleased = true;
+                                                       }
+                                                       else if( this.bButtonState[ 6 + j ] == true && !buttons[ j ] )
+                                                       {
+                                                               STInputEvent item = new STInputEvent()
+                                                               {
+                                                                       nKey = 6 + j,
+                                                                       b押された = false,
+                                                                       nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                       nVelocity = CInput管理.n通常音量
+                                                               };
+                                                               this.list入力イベント.Add( item );
+
+                                                               this.bButtonState[ 6 + j ] = false;
+                                                               this.bButtonPullUp[ 6 + j ] = true;
+                                                               bIsButtonPressedReleased = true;
+                                                       }
+                                               }
+                                               //-----------------------------
+                                               #endregion
+                                               // #24341 2011.3.12 yyagi: POV support
+                                               #region [ POV HAT 4/8way (only single POV switch is supported)]
+                                               int[] povs = currentState.PointOfViewControllers;
+                                               if ( povs != null )
+                                               {
+                                                       if ( povs[ 0 ] >= 0 )
+                                                       {
+                                                               int nPovDegree = povs[ 0 ];
+                                                               int nWay = ( nPovDegree + 2250 ) / 4500;
+                                                               if ( nWay == 8 ) nWay = 0;
+
+                                                               if ( this.bButtonState[ 6 + 128 + nWay ] == false )
+                                                               {
+                                                                       STInputEvent stevent = new STInputEvent()
+                                                                       {
+                                                                               nKey = 6 + 128 + nWay,
+                                                                               //Debug.WriteLine( "POVS:" + povs[ 0 ].ToString( CultureInfo.CurrentCulture ) + ", " +stevent.nKey );
+                                                                               b押された = true,
+                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                               nVelocity = CInput管理.n通常音量
+                                                                       };
+                                                                       this.list入力イベント.Add( stevent );
+
+                                                                       this.bButtonState[ stevent.nKey ] = true;
+                                                                       this.bButtonPushDown[ stevent.nKey ] = true;
+                                                               }
+                                                       }
+                                                       else if ( bIsButtonPressedReleased == false )   // #xxxxx 2011.12.3 yyagi 他のボタンが何も押され/離されてない=POVが離された
+                                                       {
+                                                               int nWay = 0;
+                                                               for ( int i = 6 + 0x80; i < 6 + 0x80 + 8; i++ )
+                                                               {                                                                                       // 離されたボタンを調べるために、元々押されていたボタンを探す。
+                                                                       if ( this.bButtonState[ i ] == true )   // DirectInputを直接いじるならこんなことしなくて良いのに、あぁ面倒。
+                                                                       {                                                                               // この処理が必要なために、POVを1個しかサポートできない。無念。
+                                                                               nWay = i;
+                                                                               break;
+                                                                       }
+                                                               }
+                                                               if ( nWay != 0 )
+                                                               {
+                                                                       STInputEvent stevent = new STInputEvent()
+                                                                       {
+                                                                               nKey = nWay,
+                                                                               b押された = false,
+                                                                               nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
+                                                                               nVelocity = 0
+                                                                       };
+                                                                       this.list入力イベント.Add( stevent );
+
+                                                                       this.bButtonState[ nWay ] = false;
+                                                                       this.bButtonPullUp[ nWay ] = true;
+                                                               }
+                                                       }
+                                               }
+                                               #endregion
+                                       }
+                                       //-----------------------------
+                                       #endregion
+                               }
+                       }
+               }
+
+               public bool bキーが押された( int nButton )
+               {
+                       return this.bButtonPushDown[ nButton ];
+               }
+               public bool bキーが押されている( int nButton )
+               {
+                       return this.bButtonState[ nButton ];
+               }
+               public bool bキーが離された( int nButton )
+               {
+                       return this.bButtonPullUp[ nButton ];
+               }
+               public bool bキーが離されている( int nButton )
+               {
+                       return !this.bButtonState[ nButton ];
+               }
+               //-----------------
+               #endregion
+
+               #region [ IDisposable 実装 ]
+               //-----------------
+               public void Dispose()
+               {
+                       if( !this.bDispose完了済み )
+                       {
+                               if( this.devJoystick != null )
+                               {
+                                       this.devJoystick.Dispose();
+                                       this.devJoystick = null;
+                               }
+                               //if( this.timer != null )
+                               //{
+                               //    this.timer.Dispose();
+                               //    this.timer = null;
+                               //}
+                               if ( this.list入力イベント != null )
+                               {
+                                       this.list入力イベント = null;
+                               }
+                               this.bDispose完了済み = true;
+                       }
+               }
+               //-----------------
+               #endregion
+
+
+               // その他
+
+               #region [ private ]
+               //-----------------
+               private bool[] bButtonPullUp = new bool[ 0x100 ];
+               private bool[] bButtonPushDown = new bool[ 0x100 ];
+               private bool[] bButtonState = new bool[ 0x100 ];                // 0-5: XYZ, 6 - 0x128+5: buttons, 0x128+6 - 0x128+6+8: POV/HAT
+               private int[] nPovState = new int[ 4 ];                                 // POVの現在値を保持
+               private bool bDispose完了済み;
+               private Joystick devJoystick;
+               //private CTimer timer;
+
+               private void bButtonUpDown( JoystickUpdate data, int axisdata, int target, int contrary )       // #26871 2011.12.3 軸の反転に対応するためにリファクタ
+               {
+                       int targetsign = ( target < contrary ) ? -1 : 1;
+                       if ( Math.Abs( axisdata ) > 500 && ( targetsign == Math.Sign( axisdata ) ) )                    // 軸の最大値の半分を超えていて、かつ
+                       {
+                               if ( bDoUpDownCore( target, data, false ) )                                                                                     // 直前までは超えていなければ、今回ON
+                               {
+                                       //Debug.WriteLine( "X-ON " + data.TimeStamp + " " + axisdata );
+                               }
+                               else
+                               {
+                                       //Debug.WriteLine( "X-ONx " + data.TimeStamp + " " + axisdata );
+                               }
+                               bDoUpDownCore( contrary, data, true );                                                                                          // X軸+ == ON から X軸-のONレンジに来たら、X軸+はOFF
+                       }
+                       else if ( ( axisdata <= 0 && targetsign <= 0 ) || ( axisdata >= 0 && targetsign >= 0 ) )        // 軸の最大値の半分を超えておらず、かつ  
+                       {
+                               //Debug.WriteLine( "X-OFF? " + data.TimeStamp + " " + axisdata );
+                               if ( bDoUpDownCore( target, data, true ) )                                                                                      // 直前までは超えていたのならば、今回OFF
+                               {
+                                       //Debug.WriteLine( "X-OFF " + data.TimeStamp + " " + axisdata );
+                               }
+                               else if ( bDoUpDownCore( contrary, data, true ) )                                                                       // X軸+ == ON から X軸-のOFFレンジにきたら、X軸+はOFF
+                               {
+                                       //Debug.WriteLine( "X-OFFx " + data.TimeStamp + " " + axisdata );
+                               }
+                       }
+               }
+
+               /// <summary>
+               /// 必要に応じて軸ボタンの上げ下げイベントを発生する
+               /// </summary>
+               /// <param name="target">軸ボタン番号 0=-X 1=+X ... 5=+Z</param>
+               /// <param name="data"></param>
+               /// <param name="currentMode">直前のボタン状態 true=押されていた</param>
+               /// <returns>上げ下げイベント発生時true</returns>
+               private bool bDoUpDownCore( int target, JoystickUpdate data, bool lastMode )
+               {
+                       if ( this.bButtonState[ target ] == lastMode )
+                       {
+                               STInputEvent e = new STInputEvent()
+                               {
+                                       nKey = target,
+                                       b押された = !lastMode,
+                                       nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),
+                                       nVelocity = ( lastMode ) ? 0 : CInput管理.n通常音量
+                               };
+                               this.list入力イベント.Add( e );
+
+                               this.bButtonState[ target ] = !lastMode;
+                               if ( lastMode )
+                               {
+                                       this.bButtonPullUp[ target ] = true;
+                               }
+                               else
+                               {
+                                       this.bButtonPushDown[ target ] = true;
+                               }
+                               return true;
+                       }
+                       return false;
+               }
+               //-----------------
+               #endregion
+       }
+}