/// <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();
Exemple #3
0
        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];