• R/O
  • HTTP
  • SSH
  • HTTPS

CsWin10Desktop3: Commit

Visual C# 7.0, Windows10 Desktop App


Commit MetaInfo

Revision92269bac742e704a22f10ef582ff5d9b583b27c0 (tree)
Time2017-01-10 19:03:53
Authorくまかみ工房 <kumakamikoubou@gmai...>
Commiterくまかみ工房

Log Message

入力管理クラスに、ポーリング時に全入力デバイスの入力をドラム様式入力に変換して1本のリストに登録する機能を追加。

入力種別 を ドラム様式入力種別 に改名。
InputEvent.ToString() を追加。デバッグ用。

Change Summary

Incremental Difference

--- a/FDK24/入力/InputEvent.cs
+++ b/FDK24/入力/InputEvent.cs
@@ -35,5 +35,14 @@ namespace FDK.入力
3535 /// 値の意味はデバイスに依存する。
3636 /// </summary>
3737 public int Velocity { get; set; }
38+
39+ /// <summary>
40+ /// 可読文字列形式に変換して返す。
41+ /// </summary>
42+ /// <returns></returns>
43+ public override string ToString()
44+ {
45+ return $"InputEvent[Key={Key},押された={押された},TimeStamp={TimeStamp},Velocity={Velocity}]";
46+ }
3847 }
3948 }
--- a/StrokeStyleT/StrokeStyleT.csproj
+++ b/StrokeStyleT/StrokeStyleT.csproj
@@ -102,7 +102,8 @@
102102 <Compile Include="ViewerMessage.cs" />
103103 <Compile Include="ステージ\コンソールフォント.cs" />
104104 <Compile Include="入力\キーバインディング.cs" />
105- <Compile Include="入力\入力種別.cs" />
105+ <Compile Include="入力\ドラム様式入力イベント.cs" />
106+ <Compile Include="入力\ドラム様式入力種別.cs" />
106107 <Compile Include="入力\操作コマンド種別.cs" />
107108 <Compile Include="入力\入力管理.cs" />
108109 <Compile Include="曲\タイトルテクスチャ.cs" />
--- a/StrokeStyleT/入力/キーバインディング.cs
+++ b/StrokeStyleT/入力/キーバインディング.cs
@@ -13,16 +13,16 @@ namespace SST.入力
1313 class キーバインディング : IExtensibleDataObject
1414 {
1515 [DataMember]
16- public Dictionary<操作コマンド種別, 入力種別[][]> 操作コマンドtoストロークシーケンス { get; protected set; }
16+ public Dictionary<操作コマンド種別, ドラム様式入力種別[][]> 操作コマンドtoストロークシーケンス { get; protected set; }
1717
1818 [DataMember]
19- public Dictionary<int, 入力種別> キーボードto入力 { get; protected set; }
19+ public Dictionary<int, ドラム様式入力種別> キーボードto入力 { get; protected set; }
2020
2121 /// <summary>
2222 /// Key は、MIDI-ID(0~7) × 1000 + Note 。
2323 /// </summary>
2424 [DataMember]
25- public Dictionary<int, 入力種別> MIDIto入力 { get; protected set; }
25+ public Dictionary<int, ドラム様式入力種別> MIDIto入力 { get; protected set; }
2626
2727 /// <summary>
2828 /// コンストラクタ。
@@ -120,83 +120,83 @@ namespace SST.入力
120120 [OnDeserializing]
121121 private void _初期化する( StreamingContext context )
122122 {
123- this.操作コマンドtoストロークシーケンス = new Dictionary<操作コマンド種別, 入力種別[][]>() {
123+ this.操作コマンドtoストロークシーケンス = new Dictionary<操作コマンド種別, ドラム様式入力種別[][]>() {
124124
125125 // 決定: シンバル類
126126 { 操作コマンド種別.決定, new [] {
127- new [] { 入力種別.LeftCrash },
128- new [] { 入力種別.Ride },
129- new [] { 入力種別.Ride_Cup },
130- new [] { 入力種別.China },
131- new [] { 入力種別.Splash }
127+ new [] { ドラム様式入力種別.LeftCrash },
128+ new [] { ドラム様式入力種別.Ride },
129+ new [] { ドラム様式入力種別.Ride_Cup },
130+ new [] { ドラム様式入力種別.China },
131+ new [] { ドラム様式入力種別.Splash }
132132 } },
133133
134134 // キャンセル: Bass×2
135- { 操作コマンド種別.キャンセル, new [] { new [] { 入力種別.Bass, 入力種別.Bass } } },
135+ { 操作コマンド種別.キャンセル, new [] { new [] { ドラム様式入力種別.Bass, ドラム様式入力種別.Bass } } },
136136
137137 // 上下左右: Snare,Tom
138- { 操作コマンド種別.上, new [] { new [] { 入力種別.Tom2 } } },
139- { 操作コマンド種別.下, new [] { new [] { 入力種別.Snare } } },
140- { 操作コマンド種別.左, new [] { new [] { 入力種別.Tom1 } } },
141- { 操作コマンド種別.右, new [] { new [] { 入力種別.Tom3 } } },
138+ { 操作コマンド種別.上, new [] { new [] { ドラム様式入力種別.Tom2 } } },
139+ { 操作コマンド種別.下, new [] { new [] { ドラム様式入力種別.Snare } } },
140+ { 操作コマンド種別.左, new [] { new [] { ドラム様式入力種別.Tom1 } } },
141+ { 操作コマンド種別.右, new [] { new [] { ドラム様式入力種別.Tom3 } } },
142142 };
143143
144- this.キーボードto入力 = new Dictionary<int, 入力種別>() {
145- { (int) Key.Q, 入力種別.LeftCrash },
146- { (int) Key.Return, 入力種別.LeftCrash },
147- { (int) Key.A, 入力種別.HiHat_Open },
148- { (int) Key.Z, 入力種別.HiHat_Close },
149- { (int) Key.X, 入力種別.Snare },
150- { (int) Key.C, 入力種別.Bass },
151- { (int) Key.Space, 入力種別.Bass },
152- { (int) Key.V, 入力種別.Tom1 },
153- { (int) Key.B, 入力種別.Tom2 },
154- { (int) Key.N, 入力種別.Tom3 },
155- { (int) Key.M, 入力種別.RightCrash },
156- { (int) Key.K, 入力種別.Ride },
144+ this.キーボードto入力 = new Dictionary<int, ドラム様式入力種別>() {
145+ { (int) Key.Q, ドラム様式入力種別.LeftCrash },
146+ { (int) Key.Return, ドラム様式入力種別.LeftCrash },
147+ { (int) Key.A, ドラム様式入力種別.HiHat_Open },
148+ { (int) Key.Z, ドラム様式入力種別.HiHat_Close },
149+ { (int) Key.X, ドラム様式入力種別.Snare },
150+ { (int) Key.C, ドラム様式入力種別.Bass },
151+ { (int) Key.Space, ドラム様式入力種別.Bass },
152+ { (int) Key.V, ドラム様式入力種別.Tom1 },
153+ { (int) Key.B, ドラム様式入力種別.Tom2 },
154+ { (int) Key.N, ドラム様式入力種別.Tom3 },
155+ { (int) Key.M, ドラム様式入力種別.RightCrash },
156+ { (int) Key.K, ドラム様式入力種別.Ride },
157157 };
158158
159- this.MIDIto入力 = new Dictionary<int, 入力種別>() {
159+ this.MIDIto入力 = new Dictionary<int, ドラム様式入力種別>() {
160160
161161 // とりあえず、DTXMania からベタ移植。
162162
163- { this.MidiKey( 0, 42 ), 入力種別.HiHat_Close },
164- { this.MidiKey( 0, 93 ), 入力種別.HiHat_Close },
165- { this.MidiKey( 0, 46 ), 入力種別.HiHat_Open },
166- { this.MidiKey( 0, 92 ), 入力種別.HiHat_Open },
167- { this.MidiKey( 0, 44 ), 入力種別.HiHat_Foot },
168- { this.MidiKey( 0, 255 ), 入力種別.HiHat_Control }, // FDK の MidiIn クラスは、FootControl を ノート 255 として扱う。
169- { this.MidiKey( 0, 25 ), 入力種別.Snare },
170- { this.MidiKey( 0, 26 ), 入力種別.Snare },
171- { this.MidiKey( 0, 27 ), 入力種別.Snare },
172- { this.MidiKey( 0, 28 ), 入力種別.Snare },
173- { this.MidiKey( 0, 29 ), 入力種別.Snare },
174- { this.MidiKey( 0, 31 ), 入力種別.Snare },
175- { this.MidiKey( 0, 32 ), 入力種別.Snare },
176- { this.MidiKey( 0, 34 ), 入力種別.Snare },
177- { this.MidiKey( 0, 37 ), 入力種別.Snare },
178- { this.MidiKey( 0, 38 ), 入力種別.Snare },
179- { this.MidiKey( 0, 40 ), 入力種別.Snare },
180- { this.MidiKey( 0, 113 ), 入力種別.Snare },
181- { this.MidiKey( 0, 33 ), 入力種別.Bass },
182- { this.MidiKey( 0, 35 ), 入力種別.Bass },
183- { this.MidiKey( 0, 36 ), 入力種別.Bass },
184- { this.MidiKey( 0, 112 ), 入力種別.Bass },
185- { this.MidiKey( 0, 48 ), 入力種別.Tom1 },
186- { this.MidiKey( 0, 50 ), 入力種別.Tom1 },
187- { this.MidiKey( 0, 47 ), 入力種別.Tom2 },
188- { this.MidiKey( 0, 41 ), 入力種別.Tom3 },
189- { this.MidiKey( 0, 43 ), 入力種別.Tom3 },
190- { this.MidiKey( 0, 45 ), 入力種別.Tom3 },
191- { this.MidiKey( 0, 49 ), 入力種別.RightCrash },
192- { this.MidiKey( 0, 52 ), 入力種別.RightCrash },
193- { this.MidiKey( 0, 55 ), 入力種別.RightCrash },
194- { this.MidiKey( 0, 57 ), 入力種別.RightCrash },
195- { this.MidiKey( 0, 91 ), 入力種別.RightCrash },
196- { this.MidiKey( 0, 51 ), 入力種別.Ride },
197- { this.MidiKey( 0, 53 ), 入力種別.Ride },
198- { this.MidiKey( 0, 59 ), 入力種別.Ride },
199- { this.MidiKey( 0, 89 ), 入力種別.Ride },
163+ { this.MidiKey( 0, 42 ), ドラム様式入力種別.HiHat_Close },
164+ { this.MidiKey( 0, 93 ), ドラム様式入力種別.HiHat_Close },
165+ { this.MidiKey( 0, 46 ), ドラム様式入力種別.HiHat_Open },
166+ { this.MidiKey( 0, 92 ), ドラム様式入力種別.HiHat_Open },
167+ { this.MidiKey( 0, 44 ), ドラム様式入力種別.HiHat_Foot },
168+ { this.MidiKey( 0, 255 ), ドラム様式入力種別.HiHat_Control }, // FDK の MidiIn クラスは、FootControl を ノート 255 として扱う。
169+ { this.MidiKey( 0, 25 ), ドラム様式入力種別.Snare },
170+ { this.MidiKey( 0, 26 ), ドラム様式入力種別.Snare },
171+ { this.MidiKey( 0, 27 ), ドラム様式入力種別.Snare },
172+ { this.MidiKey( 0, 28 ), ドラム様式入力種別.Snare },
173+ { this.MidiKey( 0, 29 ), ドラム様式入力種別.Snare },
174+ { this.MidiKey( 0, 31 ), ドラム様式入力種別.Snare },
175+ { this.MidiKey( 0, 32 ), ドラム様式入力種別.Snare },
176+ { this.MidiKey( 0, 34 ), ドラム様式入力種別.Snare },
177+ { this.MidiKey( 0, 37 ), ドラム様式入力種別.Snare },
178+ { this.MidiKey( 0, 38 ), ドラム様式入力種別.Snare },
179+ { this.MidiKey( 0, 40 ), ドラム様式入力種別.Snare },
180+ { this.MidiKey( 0, 113 ), ドラム様式入力種別.Snare },
181+ { this.MidiKey( 0, 33 ), ドラム様式入力種別.Bass },
182+ { this.MidiKey( 0, 35 ), ドラム様式入力種別.Bass },
183+ { this.MidiKey( 0, 36 ), ドラム様式入力種別.Bass },
184+ { this.MidiKey( 0, 112 ), ドラム様式入力種別.Bass },
185+ { this.MidiKey( 0, 48 ), ドラム様式入力種別.Tom1 },
186+ { this.MidiKey( 0, 50 ), ドラム様式入力種別.Tom1 },
187+ { this.MidiKey( 0, 47 ), ドラム様式入力種別.Tom2 },
188+ { this.MidiKey( 0, 41 ), ドラム様式入力種別.Tom3 },
189+ { this.MidiKey( 0, 43 ), ドラム様式入力種別.Tom3 },
190+ { this.MidiKey( 0, 45 ), ドラム様式入力種別.Tom3 },
191+ { this.MidiKey( 0, 49 ), ドラム様式入力種別.RightCrash },
192+ { this.MidiKey( 0, 52 ), ドラム様式入力種別.RightCrash },
193+ { this.MidiKey( 0, 55 ), ドラム様式入力種別.RightCrash },
194+ { this.MidiKey( 0, 57 ), ドラム様式入力種別.RightCrash },
195+ { this.MidiKey( 0, 91 ), ドラム様式入力種別.RightCrash },
196+ { this.MidiKey( 0, 51 ), ドラム様式入力種別.Ride },
197+ { this.MidiKey( 0, 53 ), ドラム様式入力種別.Ride },
198+ { this.MidiKey( 0, 59 ), ドラム様式入力種別.Ride },
199+ { this.MidiKey( 0, 89 ), ドラム様式入力種別.Ride },
200200 };
201201 }
202202
--- /dev/null
+++ b/StrokeStyleT/入力/ドラム様式入力イベント.cs
@@ -0,0 +1,27 @@
1+using System;
2+using System.Collections.Generic;
3+using System.Diagnostics;
4+using System.Linq;
5+using FDK.入力;
6+
7+namespace SST.入力
8+{
9+ class ドラム様式入力イベント
10+ {
11+ public ドラム様式入力種別 ドラム様式入力種別 { get; protected set; }
12+
13+ public InputEvent 入力イベント { get; protected set; }
14+
15+ public ドラム様式入力イベント() :base()
16+ {
17+ this.ドラム様式入力種別 = ドラム様式入力種別.Unknown;
18+ this.入力イベント = new InputEvent();
19+ }
20+
21+ public ドラム様式入力イベント( InputEvent 入力イベント, ドラム様式入力種別 ドラム様式入力種別 )
22+ {
23+ this.ドラム様式入力種別 = ドラム様式入力種別;
24+ this.入力イベント = 入力イベント;
25+ }
26+ }
27+}
--- a/StrokeStyleT/入力/入力種別.cs
+++ b/StrokeStyleT/入力/ドラム様式入力種別.cs
@@ -6,12 +6,12 @@ using System.Linq;
66 namespace SST.入力
77 {
88 /// <summary>
9- /// 入力データの定義。
9+ /// 入力データの種別を、ドラム様式で定義したもの。
1010 /// </summary>
1111 /// <remarks>
12- /// 入力デバイスの入力データは、すべてこの(ドラム様式の)入力種別へマッピングされる。
12+ /// 入力デバイスの入力データは、すべてこのドラム様式入力種別へマッピングされる。
1313 /// </remarks>
14- enum 入力種別
14+ enum ドラム様式入力種別
1515 {
1616 Unknown,
1717 LeftCrash,
--- a/StrokeStyleT/入力/入力管理.cs
+++ b/StrokeStyleT/入力/入力管理.cs
@@ -13,8 +13,28 @@ namespace SST.入力
1313 {
1414 class 入力管理 : IDisposable
1515 {
16+ /// <summary>
17+ /// 全デバイスの入力イベントをドラム様式入力イベントに変換し、集めたもの。
18+ /// </summary>
19+ /// <remarks>
20+ /// ポーリングのたびにクリアされ、前回のポーリング以降の入力イベントで再構築される。
21+ /// </remarks>
22+ public List<ドラム様式入力イベント> ドラム様式入力イベントリスト { get; protected set; }
23+
24+ /// <summary>
25+ /// キーボード入力デバイス。
26+ /// </summary>
27+ /// <remarks>
28+ /// ポーリング後、入力リストへ格納する前の入力データに直接アクセスできる。
29+ /// </remarks>
1630 public Keyboard キーボード入力 { get; protected set; }
1731
32+ /// <summary>
33+ /// MIDI入力デバイス。
34+ /// </summary>
35+ /// <remarks>
36+ /// ポーリング後、入力リストへ格納する前の入力データに直接アクセスできる。
37+ /// </remarks>
1838 public MidiIn MIDI入力 { get; protected set; }
1939
2040 /// <summary>
@@ -30,12 +50,14 @@ namespace SST.入力
3050 {
3151 Trace.Assert( 0 < 最大履歴数 );
3252
53+ this.ドラム様式入力イベントリスト = new List<ドラム様式入力イベント>();
54+
3355 this.キーボード入力 = new Keyboard( windowHandle );
3456 this.MIDI入力 = new MidiIn();
3557
36- this._最大履歴数 = 最大履歴数;
37- this._入力履歴 = new List<入力種別>( this._最大履歴数 );
38- this._前回の履歴追加時刻sec = null;
58+ this._入力履歴で保管する最大履歴数 = 最大履歴数;
59+ this._入力履歴 = new List<ドラム様式入力種別>( this._入力履歴で保管する最大履歴数 );
60+ this._前回の入力履歴の追加時刻sec = null;
3961
4062 this._キーバインディング = キーバインディング.読み込む( this._KeyBindingsXmlファイルパス );
4163 }
@@ -54,92 +76,29 @@ namespace SST.入力
5476 this.キーボード入力 = null;
5577 }
5678
79+ /// <summary>
80+ /// すべての入力デバイスのポーリングと、入力履歴の登録、ドラム様式入力イベントリストの再構築を行う。
81+ /// </summary>
5782 public void すべての入力デバイスをポーリングする( bool 入力履歴を記録する = true )
5883 {
59- // 履歴の記録が OFF → ON に変わった際には、履歴をクリアする。
60- if( 入力履歴を記録する && !this._入力履歴を記録中 )
84+ // 入力履歴の記録が OFF → ON に変わった際には、入力履歴をクリアする。
85+ if( 入力履歴を記録する && !this._現在入力履歴を記録中である )
6186 {
6287 this._入力履歴.Clear();
63- this._前回の履歴追加時刻sec = null;
88+ this._前回の入力履歴の追加時刻sec = null;
6489 }
65- this._入力履歴を記録中 = 入力履歴を記録する;
66-
67- // 追加の入力デバイスクラスを実装したら、ここにポーリングコードを追加すること。
90+ this._現在入力履歴を記録中である = 入力履歴を記録する;
6891
69- #region " キーボード入力 "
70- //----------------
71- this.キーボード入力?.ポーリングする();
92+ // ドラム様式入力イベントリストを再構築する。
93+ // 追加の入力デバイスクラスを実装したら、ここにコードを追加すること。
7294
73- if( 入力履歴を記録する )
74- {
75- for( int i = 0; i < 256; i++ )
76- {
77- InputEvent ev;
78- if( ( this.キーボード入力.キーが押された( i, out ev ) ) &&
79- ( this._キーバインディング.キーボードto入力.ContainsKey( ev.Key ) ) )
80- {
81- this.履歴に追加する(
82- this._キーバインディング.キーボードto入力[ ev.Key ],
83- QPCTimer.生カウント相対値を秒へ変換して返す( ev.TimeStamp ) ); // 相対だろうが絶対だろうが、どっちかに統一さえされていればいい。
84- }
85- }
86- }
87- //----------------
88- #endregion
95+ this.ドラム様式入力イベントリスト.Clear();
8996
90- #region " MIDI入力 "
91- //----------------
92- this.MIDI入力?.ポーリングする();
97+ this._入力デバイスをポーリングする( this.キーボード入力, this._キーバインディング.キーボードto入力, 入力履歴を記録する );
98+ this._入力デバイスをポーリングする( this.MIDI入力, this._キーバインディング.MIDIto入力, 入力履歴を記録する );
9399
94- if( 入力履歴を記録する )
95- {
96- for( int i = 0; i < 256; i++ )
97- {
98- InputEvent ev;
99- if( ( this.MIDI入力.キーが押された( i, out ev ) ) &&
100- ( this._キーバインディング.MIDIto入力.ContainsKey( ev.Key ) ) )
101- {
102- this.履歴に追加する(
103- this._キーバインディング.MIDIto入力[ ev.Key ],
104- QPCTimer.生カウント相対値を秒へ変換して返す( ev.TimeStamp ) ); // 相対だろうが絶対だろうが、どっちかに統一さえされていればいい。
105- }
106- }
107- }
108- //----------------
109- #endregion
110- }
111-
112- /// <summary>
113- /// 履歴に新しい入力データを追加する。
114- /// </summary>
115- /// <param name="入力">
116- /// 追加登録する入力。ただし、FootControl は追加の対象外となる。
117- /// </param>
118- /// <param name="入力時刻sec">
119- /// 追加登録する入力が発生した時刻。全入力で同じ時間軸であること。
120- /// </param>
121- public void 履歴に追加する( 入力種別 入力, double 入力時刻sec )
122- {
123- // FootControl は履歴に追加しない。(操作コマンドに関係ないうえに、大量に発生して履歴を汚すので。)
124- if( 入力 == 入力種別.HiHat_Control )
125- return;
126-
127- // 容量がいっぱいなら、古い履歴から削除する。
128- if( this._入力履歴.Count >= this._最大履歴数 )
129- this._入力履歴.RemoveRange( 0, ( this._入力履歴.Count - this._最大履歴数 + 1 ) );
130-
131- // 前回の追加登録時刻からの経過時間がオーバーしているなら、履歴をすべて破棄する。
132- if( null != this._前回の履歴追加時刻sec )
133- {
134- var 前回の登録からの経過時間sec = 入力時刻sec - this._前回の履歴追加時刻sec;
135-
136- if( _連続入力だとみなす最大の間隔sec < 前回の登録からの経過時間sec )
137- this._入力履歴.Clear();
138- }
139-
140- // 今回の入力を履歴に登録する。
141- this._入力履歴.Add( 入力 );
142- this._前回の履歴追加時刻sec = 入力時刻sec; // 更新。
100+ // TimeStamp の小さい順にソートする。
101+ this.ドラム様式入力イベントリスト.Sort( ( x, y ) => (int) ( x.入力イベント.TimeStamp - y.入力イベント.TimeStamp ) );
143102 }
144103
145104 /// <summary>
@@ -188,13 +147,73 @@ namespace SST.入力
188147
189148 private const double _連続入力だとみなす最大の間隔sec = 0.5;
190149
191- private int _最大履歴数;
150+ private int _入力履歴で保管する最大履歴数;
151+
152+ private List<ドラム様式入力種別> _入力履歴 = null;
153+
154+ private bool _現在入力履歴を記録中である = true;
155+
156+ private double? _前回の入力履歴の追加時刻sec = null; // null なら次が初回。
157+
158+ /// <summary>
159+ /// 単一入力デバイスのポーリングと、入力履歴の登録、ドラム様式入力イベントリストの再構築を行う。
160+ /// </summary>
161+ private void _入力デバイスをポーリングする( IInputDevice 入力デバイス, Dictionary<int, ドラム様式入力種別> デバイスto入力対応表, bool 入力履歴を記録する )
162+ {
163+ 入力デバイス?.ポーリングする();
164+
165+ // すべての InputEvent について……
166+ foreach( var ev in 入力デバイス.入力イベントリスト )
167+ {
168+ if( false == デバイスto入力対応表.ContainsKey( ev.Key ) )
169+ continue; // 使用しないキーである。
170+
171+ // 入力イベントをドラム様式入力へマッピングし、リストに登録する。
172+ var ドラム様式入力イベント = new ドラム様式入力イベント( ev, デバイスto入力対応表[ ev.Key ] );
173+ this.ドラム様式入力イベントリスト.Add( ドラム様式入力イベント );
174+
175+ // 指定があれば、入力履歴に追加する。
176+ if( 入力履歴を記録する && ev.押された )
177+ {
178+ this._入力履歴に追加する(
179+ ドラム様式入力イベント.ドラム様式入力種別,
180+ QPCTimer.生カウント相対値を秒へ変換して返す( ev.TimeStamp ) ); // 相対だろうが絶対だろうが、どっちかに統一さえされていればいい。
181+ }
182+ }
183+ }
184+
185+ /// <summary>
186+ /// 履歴に新しい入力データを追加する。
187+ /// </summary>
188+ /// <param name="入力">
189+ /// 追加登録する入力。ただし、FootControl は追加の対象外となる。
190+ /// </param>
191+ /// <param name="入力時刻sec">
192+ /// 追加登録する入力が発生した時刻。全入力で同じ時間軸であること。
193+ /// </param>
194+ private void _入力履歴に追加する( ドラム様式入力種別 入力, double 入力時刻sec )
195+ {
196+ // FootControl は履歴に追加しない。(操作コマンドに関係ないうえに、大量に発生して履歴を汚すので。)
197+ if( 入力 == ドラム様式入力種別.HiHat_Control )
198+ return;
192199
193- private List<入力種別> _入力履歴 = null;
200+ // 容量がいっぱいなら、古い履歴から削除する。
201+ if( this._入力履歴.Count >= this._入力履歴で保管する最大履歴数 )
202+ this._入力履歴.RemoveRange( 0, ( this._入力履歴.Count - this._入力履歴で保管する最大履歴数 + 1 ) );
194203
195- private bool _入力履歴を記録中 = true;
204+ // 前回の追加登録時刻からの経過時間がオーバーしているなら、履歴をすべて破棄する。
205+ if( null != this._前回の入力履歴の追加時刻sec )
206+ {
207+ var 前回の登録からの経過時間sec = 入力時刻sec - this._前回の入力履歴の追加時刻sec;
196208
197- private double? _前回の履歴追加時刻sec = null;
209+ if( _連続入力だとみなす最大の間隔sec < 前回の登録からの経過時間sec )
210+ this._入力履歴.Clear();
211+ }
212+
213+ // 今回の入力を履歴に登録する。
214+ this._入力履歴.Add( 入力 );
215+ this._前回の入力履歴の追加時刻sec = 入力時刻sec; // 更新。
216+ }
198217
199218 /// <summary>
200219 /// 現在の履歴において、指定した操作コマンド(ストロークシーケンス)が成立しているかを確認する。
@@ -210,7 +229,7 @@ namespace SST.入力
210229 /// 履歴内に複数存在している場合は、一番古いストロークシーケンスが対象となる。
211230 /// 成立した場合、そのシーケンスを含め、シーケンスより古い履歴はすべて削除される。
212231 /// </remarks>
213- private bool _操作コマンドが入力された( IEnumerable<入力種別> 操作コマンドのストロークシーケンス )
232+ private bool _操作コマンドが入力された( IEnumerable<ドラム様式入力種別> 操作コマンドのストロークシーケンス )
214233 {
215234 int ストローク数 = 操作コマンドのストロークシーケンス.Count();
216235
@@ -262,7 +281,7 @@ namespace SST.入力
262281 /// 履歴内に複数存在している場合は、一番古いストロークが対象となる。
263282 /// 成立した場合、そのシーケンスを含め、シーケンスより古い履歴はすべて削除される。
264283 /// </remarks>
265- private bool _操作コマンドが入力された( 入力種別 操作コマンドのストローク )
284+ private bool _操作コマンドが入力された( ドラム様式入力種別 操作コマンドのストローク )
266285 {
267286 int ストローク数 = 1; // 固定。
268287
Show on old repository browser