/// <summary> /// 指定されたシステムサウンドを生成する。 /// </summary> /// <remarks> /// 既に生成済みのサウンドは再生成しない。 /// </remarks> public void 読み込む(システムサウンド種別 type) { // 既に生成済みなら何もしない。 if (this._種別toサウンドマップ.ContainsKey(type)) { return; } // ファイル名は、<Alias>.ogg とする。 var path = new VariablePath($@"$(SystemSounds)\{type.GetAlias()}.ogg"); // ファイルがないなら無視。 if (!File.Exists(path.数なしパス)) { Log.ERROR($"システムサウンドファイルが見つかりません。スキップします。[{path.変数付きパス}]"); return; } if (this._SoundDevice.TryGetTarget(out var device)) { // サンプルソースを読み込む。 var sampleSource = SampleSourceFactory.Create(device, path.数なしパス, 1.0) ?? // システムサウンドは常に再生速度 = 1.0 throw new Exception($"システムサウンドの読み込みに失敗しました。[{path.変数付きパス}]"); // サウンドを生成してマップに登録。 var sound = new PolySound(device, sampleSource, 2); this._種別toサウンドマップ[type] = (sampleSource, sound); } Log.Info($"システムサウンドを読み込みました。[{path.変数付きパス}]"); }
public void すべて生成する(SoundDevice device) { using var _ = new LogBlock(Log.現在のメソッド名); this._すべて解放する(); lock (this._Sound利用権) { // SSTの既定のサウンドを、subChipId = 0 としてプリセット登録する。 var soundList = new List <(SSTF.チップ種別 type, VariablePath path)>() { (SSTF.チップ種別.LeftCrash, @"$(DrumSounds)\LeftCrash.wav"), (SSTF.チップ種別.Ride, @"$(DrumSounds)\Ride.wav"), (SSTF.チップ種別.Ride_Cup, @"$(DrumSounds)\RideCup.wav"), (SSTF.チップ種別.China, @"$(DrumSounds)\China.wav"), (SSTF.チップ種別.Splash, @"$(DrumSounds)\Splash.wav"), (SSTF.チップ種別.HiHat_Open, @"$(DrumSounds)\HiHatOpen.wav"), (SSTF.チップ種別.HiHat_HalfOpen, @"$(DrumSounds)\HiHatHalfOpen.wav"), (SSTF.チップ種別.HiHat_Close, @"$(DrumSounds)\HiHatClose.wav"), (SSTF.チップ種別.HiHat_Foot, @"$(DrumSounds)\HiHatFoot.wav"), (SSTF.チップ種別.Snare, @"$(DrumSounds)\Snare.wav"), (SSTF.チップ種別.Snare_OpenRim, @"$(DrumSounds)\SnareOpenRim.wav"), (SSTF.チップ種別.Snare_ClosedRim, @"$(DrumSounds)\SnareClosedRim.wav"), (SSTF.チップ種別.Snare_Ghost, @"$(DrumSounds)\SnareGhost.wav"), (SSTF.チップ種別.Bass, @"$(DrumSounds)\Bass.wav"), (SSTF.チップ種別.Tom1, @"$(DrumSounds)\Tom1.wav"), (SSTF.チップ種別.Tom1_Rim, @"$(DrumSounds)\Tom1Rim.wav"), (SSTF.チップ種別.Tom2, @"$(DrumSounds)\Tom2.wav"), (SSTF.チップ種別.Tom2_Rim, @"$(DrumSounds)\Tom2Rim.wav"), (SSTF.チップ種別.Tom3, @"$(DrumSounds)\Tom3.wav"), (SSTF.チップ種別.Tom3_Rim, @"$(DrumSounds)\Tom3Rim.wav"), (SSTF.チップ種別.RightCrash, @"$(DrumSounds)\RightCrash.wav"), (SSTF.チップ種別.LeftCymbal_Mute, @"$(DrumSounds)\LeftCymbalMute.wav"), (SSTF.チップ種別.RightCymbal_Mute, @"$(DrumSounds)\RightCymbalMute.wav"), }; foreach (var sound in soundList) { var path = new VariablePath(Folder.カルチャを考慮した絶対パスを返す(sound.path.数なしパス)); if (!File.Exists(sound.path.数なしパス)) { Log.ERROR($"サウンドファイルが存在しません。[{path.変数付きパス}]"); continue; } // サウンドファイルを読み込んでデコードする。 var sampleSource = SampleSourceFactory.Create(device, path.数なしパス, 1.0); // ドラムサウンドは常に 1.0 if (sampleSource is null) { Log.ERROR($"サウンドの生成に失敗しました。[{path.変数付きパス}]"); continue; } // コンテキストを作成する。 var context = new ドラムサウンドコンテキスト(sampleSource, ドラムサウンド.多重度); // 多重度分のサウンドを生成する。 for (int i = 0; i < context.Sounds.Length; i++) { context.Sounds[i] = new Sound(device, context.SampleSource); } // コンテキストを辞書に追加する。 if (this._チップtoコンテキスト.ContainsKey((sound.type, 0))) { // すでに辞書に存在してるなら、解放してから削除する。 this._チップtoコンテキスト[(sound.type, 0)].Dispose();
private void _進行描画のメインループを実行する(App app, IntPtr hWindow) { try { #region " 初期化 " //---------------- this._パイプラインサーバを起動する(); UserConfig.最新版にバージョンアップする(); ScoreDB.最新版にバージョンアップする(); RecordDB.最新版にバージョンアップする(); ScorePropertiesDB.最新版にバージョンアップする(); Global.生成する( app, hWindow, 設計画面サイズ: new SharpDX.Size2F(1920f, 1080f), 物理画面サイズ: new SharpDX.Size2F(this.ClientSize.Width, this.ClientSize.Height)); 画像.全インスタンスで共有するリソースを作成する(Global.GraphicResources.D3D11Device1, @"$(Images)\TextureVS.cso", @"$(Images)\TexturePS.cso"); this.システムサウンド = new システムサウンド(this.サウンドデバイス); // 個々のサウンドの生成は後工程で。 this.ドラムサウンド = new ドラムサウンド(this.サウンドデバイス); // 〃 this.WAVキャッシュ = new CacheStore <CSCore.ISampleSource>() { ファイルからデータを生成する = (path) => SampleSourceFactory.Create(this.サウンドデバイス, path, this.ログオン中のユーザ.再生速度), }; this._ユーザリストにユーザを登録する(); this.アイキャッチ管理 = new アイキャッチ管理(); this.ドラム入力 = new ドラム入力(this.KeyboardHID, this.GameControllersHID, this.MidiIns); // 最初のステージを生成する。 Log.Header("起動ステージ"); this.ステージ = new 起動.起動ステージ(); //---------------- #endregion var スワップチェーン表示タスク = new PresentSwapChainVSync(); var tick = new ManualResetEvent(false); TaskMessage?終了指示メッセージ = null; while (true) { tick.WaitOne(1); #region " 自分宛のメッセージが届いていたら、すべて処理する。" //---------------- foreach (var msg in Global.TaskMessageQueue.Get(TaskMessage.タスク名.進行描画)) { switch (msg.内容) { case TaskMessage.内容名.終了指示: 終了指示メッセージ = msg; break; case TaskMessage.内容名.サイズ変更: { var newSize = (System.Drawing.Size)msg.引数 ![0];