/// <summary> /// 指定した番号のWAVを、指定したチップ種別として発声する。 /// </summary> /// <param name="音量">0:無音~1:原音</param> public void 発声する(int WAV番号, チップ種別 chipType, bool 発声前に消音する, 消音グループ種別 muteGroupType, bool BGM以外も再生する, float 音量 = 1f, double 再生開始時刻sec = 0.0) { if (!(this._WAV情報リスト.ContainsKey(WAV番号)) || (!(BGM以外も再生する) && !(this._WAV情報リスト[WAV番号].BGMである))) { return; } // 消音する(必要あれば)。 if (発声前に消音する && muteGroupType != 消音グループ種別.Unknown) { // 発生時に指定された消音グループ種別に属するWAVサウンドをすべて停止する。 var 停止するWavContexts = this._WAV情報リスト.Where((kvp) => (kvp.Value.最後に発声したときの消音グループ種別 == muteGroupType)); foreach (var kvp in 停止するWavContexts) { kvp.Value.発声を停止する(); } } // 発声する。 this._WAV情報リスト[WAV番号].発声する(muteGroupType, 音量, 再生開始時刻sec); }
public ドラムサウンドコンテキスト(ISampleSource sampleSource, int 多重度 = 4) { this._多重度 = 多重度; this.SampleSource = sampleSource; this.Sounds = new Sound[多重度]; this.最後に発声したときの消音グループ種別 = 消音グループ種別.Unknown; }
/// <summary> /// 指定したチップ種別扱いでWAVサウンドを発声する。 /// </summary> /// <param name="音量">0:無音~1:原音</param> public void 発声する(消音グループ種別 muteGroupType, float 音量, double 再生開始時刻sec = 0.0) { this.最後に発声したときの消音グループ種別 = muteGroupType; // 発声。 音量 = (0f > 音量) ? 0f : (1f < 音量) ? 1f : 音量; this.Sounds[this._次に再生するSound番号].Volume = 音量; this.Sounds[this._次に再生するSound番号].Play(再生開始時刻sec); // サウンドローテーション。 this._次に再生するSound番号 = (this._次に再生するSound番号 + 1) % this.Sounds.Length; }
public void 発声する(消音グループ種別 type, float 音量) { this.最後に発声したときの消音グループ種別 = type; // サウンドを再生する。 if (null != this.Sounds[this._次に再生するSound番号]) { this.Sounds[this._次に再生するSound番号].Volume = (0f > 音量) ? 0f : (1f < 音量) ? 1f : 音量; this.Sounds[this._次に再生するSound番号].Play(); } // サウンドローテーション。 this._次に再生するSound番号 = (this._次に再生するSound番号 + 1) % this._多重度; }
/// <summary> /// 指定したチップ種別扱いでWAVサウンドを発声する。 /// </summary> /// <param name="音量">0:無音~1:原音</param> public void 発声する(消音グループ種別 muteGroupType, float 音量, double 再生開始時刻sec = 0.0) { var sound = this.Sounds[this._次に再生するSound番号]; if (sound.Length <= 再生開始時刻sec) { return; // 再生範囲外なので無視 } this.最後に発声したときの消音グループ種別 = muteGroupType; // 発声。 sound.Volume = Math.Clamp(音量, min: 0f, max: 1f); sound.Play(再生開始時刻sec); // サウンドローテーション。 this._現在再生中のSound番号 = this._次に再生するSound番号; this._次に再生するSound番号 = (this._次に再生するSound番号 + 1) % this.Sounds.Length; }
/// <summary> /// 指定した番号のWAVを、指定したチップ種別として発声する。 /// </summary> /// <param name="音量">0:無音~1:原音</param> public void 発声する(int WAV番号, bool 発声前に消音する, 消音グループ種別 muteGroupType, bool BGM以外も再生する, float 音量 = 1f, double 再生開始時刻sec = 0.0) { if (!(this._WAV情報リスト.ContainsKey(WAV番号))) { return; // 未使用のWAV番号は無視。 } if (!(BGM以外も再生する) && !(this._WAV情報リスト[WAV番号].BGMである)) { return; // BGM以外を再生しない場合、BGM以外のWAV番号は無視。 } // 指定があれば消音する。 if (発声前に消音する && muteGroupType != 消音グループ種別.Unknown) { // 発声時に指定された消音グループ種別に属するWAVサウンドをすべて停止する。 var 停止するWavContexts = this._WAV情報リスト .Where((kvp) => (kvp.Value.最後に発声したときの消音グループ種別 == muteGroupType)); foreach (var kvp in 停止するWavContexts) { kvp.Value.発声を停止する(); } } // 発声する。 if (this._WAV情報リスト[WAV番号].BGMである) { // BGM なら BGMAdjust を適用する。 再生開始時刻sec += Global.App.演奏譜面.譜面.BGMAdjust / 1000.0; 再生開始時刻sec = Math.Max(0.0, 再生開始時刻sec); } this._WAV情報リスト[WAV番号].発声する(muteGroupType, 音量, 再生開始時刻sec); }
/// <summary> /// 指定したチップ種別・サブチップIDの組に対応するドラムサウンドを再生する。 /// </summary> /// <remarks> /// <paramref name="発声前に消音する"/> を true にすると、ドラムサウンドは多重再生されなくなる。 /// この場合、現在再生しているサウンドを停止(消音)してから再生することになるが、 /// <paramref name="消音グループ種別"/> で指定されたグループ種別と同じグループ種別に属する /// ドラムサウンドが停止の対象となる。 /// </remarks> public void 発声する(チップ種別 chipType, int subChipId, bool 発声前に消音する = false, 消音グループ種別 消音グループ種別 = 消音グループ種別.Unknown, float 音量0to1 = 1f) { lock (this._Sound利用権) { if (this._チップtoコンテキスト.TryGetValue((chipType, subChipId), out ドラムサウンド情報 context)) { // 必要あれば消音する。 if (発声前に消音する && 消音グループ種別 != 消音グループ種別.Unknown) { // 指定された消音グループ種別に属するドラムサウンドをすべて停止する。 var 停止するSoundContexts = this._チップtoコンテキスト.Where((kvp) => (kvp.Value.最後に発声したときの消音グループ種別 == 消音グループ種別)); foreach (var wavContext in 停止するSoundContexts) { foreach (var sound in wavContext.Value.Sounds) { sound.Stop(); } } } // 発声する。 context.発声する(消音グループ種別, 音量0to1); }