\83\89ã\83©ã\83 ã\82µã\82¦ã\83³ã\83\89.cs - RSS feed" href="/view?p=strokestylet/CsWin10Desktop3.git;a=rss;f=StrokeStyleT/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8/%E6%BC%94%E5%A5%8F/%C3%A3%C2%83%C2%89%C3%A3%C2%83%C2%A9%C3%A3%C2%83%C2%A0%C3%A3%C2%82%C2%B5%C3%A3%C2%82%C2%A6%C3%A3%C2%83%C2%B3%C3%A3%C2%83%C2%89.cs" type="application/rss+xml" /> \83\89ã\83©ã\83 ã\82µã\82¦ã\83³ã\83\89.cs - RSS feed (no merges)" href="/view?p=strokestylet/CsWin10Desktop3.git;a=rss;f=StrokeStyleT/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8/%E6%BC%94%E5%A5%8F/%C3%A3%C2%83%C2%89%C3%A3%C2%83%C2%A9%C3%A3%C2%83%C2%A0%C3%A3%C2%82%C2%B5%C3%A3%C2%82%C2%A6%C3%A3%C2%83%C2%B3%C3%A3%C2%83%C2%89.cs;opt=--no-merges" type="application/rss+xml" /> \83\89ã\83©ã\83 ã\82µã\82¦ã\83³ã\83\89.cs - Atom feed" href="/view?p=strokestylet/CsWin10Desktop3.git;a=atom;f=StrokeStyleT/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8/%E6%BC%94%E5%A5%8F/%C3%A3%C2%83%C2%89%C3%A3%C2%83%C2%A9%C3%A3%C2%83%C2%A0%C3%A3%C2%82%C2%B5%C3%A3%C2%82%C2%A6%C3%A3%C2%83%C2%B3%C3%A3%C2%83%C2%89.cs" type="application/atom+xml" /> \83\89ã\83©ã\83 ã\82µã\82¦ã\83³ã\83\89.cs - Atom feed (no merges)" href="/view?p=strokestylet/CsWin10Desktop3.git;a=atom;f=StrokeStyleT/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8/%E6%BC%94%E5%A5%8F/%C3%A3%C2%83%C2%89%C3%A3%C2%83%C2%A9%C3%A3%C2%83%C2%A0%C3%A3%C2%82%C2%B5%C3%A3%C2%82%C2%A6%C3%A3%C2%83%C2%B3%C3%A3%C2%83%C2%89.cs;opt=--no-merges" type="application/atom+xml" />

OSDN Git Service

インストーラでインストールした SSTFEditor を起動するとメッセージが規定(英語)になるミスを修正。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / ステージ / 演奏 / ã\83\89ã\83©ã\83 ã\82µã\82¦ã\83³ã\83\89.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using System.Xml.Linq;
7 using FDK.メディア;
8
9 namespace SST.ステージ.演奏
10 {
11         class ドラムサウンド : FDK.Activity
12         {
13                 public ドラムサウンド()
14                 {
15                 }
16
17                 protected override void On活性化( デバイスリソース dr )
18                 {
19                         this._KitXmlを読み込む();
20                 }
21
22                 protected override void On非活性化( デバイスリソース dr )
23                 {
24                         this._すべてのコンテキストを初期化する();
25                 }
26
27                 public void 発声する( SSTFormat.チップ種別 chipType, float 音量0to1 )
28                 {
29                         lock( this._スレッド間同期 )
30                         {
31                                 if( false == this._チップtoコンテキスト.ContainsKey( chipType ) )
32                                         return; // コンテキスト未登録のチップなら何もしない。
33                                 var context = this._チップtoコンテキスト[ chipType ];
34
35                                 // 現在発声中のサウンドを全部止めるチップ種別の場合は止める。
36                                 if( 0 != chipType.排他発声グループID() ) // ID = 0 は対象外。
37                                 {
38                                         // 消音対象のコンテキストの Sounds[] を select する。
39                                         var 停止するサウンド群 =
40                                                 from kvp in this._チップtoコンテキスト
41                                                 where ( chipType.直前のチップを消音する( kvp.Key ) )
42                                                 select kvp.Value.Sounds;
43
44                                         // 集めた Sounds[] をすべて停止する。
45                                         foreach( var sounds in 停止するサウンド群 )
46                                                 foreach( var sound in sounds )
47                                                         sound.Stop();
48                                 }
49
50                                 // 再生する。
51                                 if( null != context.Sounds[ context.次に再生するSound番号 ] )
52                                 {
53                                         context.Sounds[ context.次に再生するSound番号 ].Volume = 音量0to1;
54                                         context.Sounds[ context.次に再生するSound番号 ].Play();
55                                 }
56
57                                 // サウンドローテーション。
58                                 context.次に再生するSound番号++;
59                                 if( context.次に再生するSound番号 >= ドラムサウンド._多重度 )
60                                         context.次に再生するSound番号 = 0;
61                         }
62                 }
63
64                 private const int _多重度 = 2;
65
66                 private class Cコンテキスト : IDisposable
67                 {
68                         public FDK.メディア.サウンド.WASAPI.Sound[] Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ];
69                         public int 次に再生するSound番号 = 0;
70
71                         public void Dispose()
72                         {
73                                 if( null != this.Sounds )
74                                 {
75                                         for( int i = 0; i < this.Sounds.Length; i++ )
76                                         {
77                                                 this.Sounds[ i ].Stop();
78                                                 FDK.Utilities.解放する( ref this.Sounds[ i ] );
79                                         }
80                                 }
81                         }
82                 };
83
84                 private Dictionary<SSTFormat.チップ種別, Cコンテキスト> _チップtoコンテキスト = null;
85
86                 private readonly string _KitXmlファイルパス = @"$(Static)\sounds\Kit.xml";
87
88                 private readonly object _スレッド間同期 = new object();
89
90                 private void _すべてのコンテキストを初期化する()
91                 {
92                         // すでに存在しているなら解放する。
93                         if( null != this._チップtoコンテキスト )
94                         {
95                                 foreach( var kvp in this._チップtoコンテキスト )
96                                         ( (Cコンテキスト) kvp.Value ).Dispose();
97                         }
98
99                         // 生成する。
100                         this._チップtoコンテキスト = new Dictionary<SSTFormat.チップ種別, Cコンテキスト>();
101                 }
102
103                 private void _KitXmlを読み込む()
104                 {
105                         this._すべてのコンテキストを初期化する();
106
107                         string ファイルパス = FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this._KitXmlファイルパス );
108
109                         if( false == File.Exists( ファイルパス ) )
110                         {
111                                 FDK.Log.WARNING( $"Kit ファイルが存在しません。ドラムサウンドは生成されません。[{this._KitXmlファイルパス}]" );
112                                 return;
113                         }
114
115                         try
116                         {
117                                 var xml文書 = XDocument.Load( ファイルパス );
118
119                                 // <Root>
120                                 var Root要素 = xml文書.Element( nameof( XML.Root ) );
121                                 {
122                                         // <DrumKit>
123                                         var DrumKit要素 = Root要素.Element( nameof( XML.DrumKit ) );    // 最初の1つのみサポート。
124                                         var DrumKit要素のVersion属性 = DrumKit要素.Attribute( nameof( XML.Version ) );
125                                         var DrumKit要素のName属性 = DrumKit要素.Attribute( nameof( XML.Name ) );   // 現在は未使用。
126                                         if( "1.2" == DrumKit要素のVersion属性.Value )
127                                         {
128                                                 #region " DrumKit ver1.2 "
129                                                 //----------------
130                                                 foreach( var DrumKitの子要素 in DrumKit要素.Elements() )
131                                                 {
132                                                         switch( DrumKitの子要素.Name.LocalName )
133                                                         {
134                                                                 // <Sound>
135                                                                 case nameof( XML.Sound ):
136                                                                         // Name="..." 属性の値は、SSTFormat.チップ種別 の各メンバの名前に等しいものとする。
137                                                                         var Sound要素のName属性 = DrumKitの子要素.Attribute( nameof( XML.Name ) );
138                                                                         var チップ種別 = SSTFormat.チップ種別.Unknown;
139                                                                         if( Enum.TryParse( Sound要素のName属性.Value, out チップ種別 ) )
140                                                                         {
141                                                                                 string サウンドファイルパス = Path.Combine( StrokeStyleT.フォルダ.StaticFolder + @"\sounds\", DrumKitの子要素.Value );
142                                                                                 if( File.Exists( サウンドファイルパス ) )
143                                                                                 {
144                                                                                         // すでに辞書に存在してるなら、解放して削除する。
145                                                                                         if( this._チップtoコンテキスト.ContainsKey( チップ種別 ) )
146                                                                                         {
147                                                                                                 this._チップtoコンテキスト[ チップ種別 ]?.Dispose();
148                                                                                                 this._チップtoコンテキスト.Remove( チップ種別 );
149                                                                                         }
150
151                                                                                         // コンテキストを作成する。
152                                                                                         var context = new Cコンテキスト() {
153                                                                                                 Sounds = new FDK.メディア.サウンド.WASAPI.Sound[ ドラムサウンド._多重度 ],
154                                                                                                 次に再生するSound番号 = 0,
155                                                                                         };
156
157                                                                                         // 多重度分のサウンドを生成する。
158                                                                                         for( int i = 0; i < context.Sounds.Length; i++ )
159                                                                                                 context.Sounds[ i ] = StrokeStyleT.サウンドデバイス.CreateSound( サウンドファイルパス );
160                                                                                         
161                                                                                         // コンテキストを辞書に追加する。
162                                                                                         this._チップtoコンテキスト.Add( チップ種別, context );
163                                                                                 }
164                                                                                 else
165                                                                                 {
166                                                                                         FDK.Log.WARNING( $"サウンドファイル {FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( サウンドファイルパス )} が存在しません。[{this._KitXmlファイルパス}]" );
167                                                                                 }
168                                                                         }
169                                                                         else
170                                                                         {
171                                                                                 FDK.Log.WARNING( $"未知の要素 {Sound要素のName属性.Value} をスキップします。[{this._KitXmlファイルパス}]" );
172                                                                         }
173                                                                         break;
174                                                         }
175                                                 }
176                                                 //----------------
177                                                 #endregion
178                                         }
179                                 }
180                         }
181                         catch( Exception e )
182                         {
183                                 FDK.Log.ERROR( $"Kitファイルの読み込みに失敗しました。{e.Message}[{this._KitXmlファイルパス}]" );
184                         }
185                 }
186         }
187 }