// これにより、数ms程度ながらここでのソートも高速化されている。\r
double barlength = 1.0;\r
int nEndOfSong = (this.listChip[this.listChip.Count - 1].n発声位置 + 384) - (this.listChip[this.listChip.Count - 1].n発声位置 % 384);\r
+ bool bClickOffBeat = (CDTXMania.Instance.ConfigIni.eClickType == EClickType.OffBeat); // 裏拍でメトロノーム再生\r
for (int tick384 = 0; tick384 <= nEndOfSong; tick384 += 384) // 小節線の挿入 (後に出てくる拍子線とループをまとめようとするなら、forループの終了条件の微妙な違いに注意が必要)\r
{\r
CChip chip = new CChip(tick384, 36 * 36 - 1, EChannel.BarLine);\r
}\r
nChipNo_BarLength++;\r
}\r
+\r
+ // 小節線上のクリック音の挿入\r
+ int deltaOffBeat = (int) ( 384.0 / 8 / barlength );\r
+ if ( !bClickOffBeat ) // 裏拍でのメトロノーム再生の設定でなければ(Off設定であっても)\r
+ {\r
+ this.listChip.Add( new CChip( tick384, 1, EChannel.Click ) ); // 小節線上に、表拍のクリック音を挿入\r
+ }\r
+ else if ( tick384 + 384 / 8 <= nEndOfSong ) // 裏拍設定で、かつ曲長内に収まるなら\r
+ {\r
+ this.listChip.Add( new CChip( tick384 + deltaOffBeat, 1, EChannel.Click ) ); // 小節線から8分音符だけ後に、裏拍のクリック音を挿入\r
+ }\r
+\r
+\r
for (int i = 0; i < 100; i++) // 拍線の挿入\r
{\r
int tickBeat = (int)(((double)(384 * i)) / (4.0 * barlength));\r
{\r
CChip chip = new CChip(tick384 + (tickBeat + n発声位置_C1_同一小節内), 36 * 36 - 1, EChannel.BeatLine);\r
this.listChip.Add(chip);\r
+ if ( !bClickOffBeat ) // メトロノーム設定が裏拍設定でなければ、拍音を挿入\r
+ {\r
+ this.listChip.Add( new CChip( tick384 + ( tickBeat + n発声位置_C1_同一小節内 ), 2, EChannel.Click ) );\r
+ }\r
+ else if ( ( tickBeat + deltaOffBeat + n発声位置_C1_同一小節内 ) < 384 ) // 裏拍設定、かつ小節内に収まっていれば、拍音を挿入\r
+ {\r
+ this.listChip.Add( new CChip( tick384 + ( tickBeat + deltaOffBeat + n発声位置_C1_同一小節内 ), 2, EChannel.Click ) );\r
+ }\r
+ \r
}\r
}\r
}\r
public int nRisky; // #23559 2011.6.20 yyagi 0=OFF, 1-10=Risky\r
public string 最終更新日時;\r
public bool bギターとベースを入れ替えた; // #35417 2015.08.30 chnmr0 add\r
+ public EClickType eMetronome; // #24159 2016.8.2 yyagi\r
\r
public C演奏記録()\r
{\r
this.レーン9モード = true;\r
this.nRisky = 0; // #23559 2011.6.20 yyagi\r
this.bギターとベースを入れ替えた = false; // #35417 2015.08.30 chnmr0 add\r
+ this.eMetronome = EClickType.Off;\r
}\r
\r
public bool bフルコンボじゃない\r
c演奏記録.bSTAGEFAILED有効 = C変換.bONorOFF(para[0]);\r
}\r
#endregion\r
+ #region [ Metronome ]\r
+ else if (item.Equals("Metronome"))\r
+ {\r
+ switch ( int.Parse( para ) )\r
+ {\r
+ case 0:\r
+ {\r
+ c演奏記録.eMetronome = EClickType.Off;\r
+ continue;\r
+ }\r
+ case 1:\r
+ {\r
+ c演奏記録.eMetronome = EClickType.OnBeat;\r
+ continue;\r
+ }\r
+ case 2:\r
+ {\r
+ c演奏記録.eMetronome = EClickType.OffBeat;\r
+ continue;\r
+ }\r
+ }\r
+ throw new Exception( "Metronome の値が無効です。" );\r
+ }\r
+ #endregion\r
else\r
{\r
#region [ DamageLevel ]\r
writer.WriteLine("Drums={0}", sect.bDrums有効 ? 1 : 0);\r
writer.WriteLine("StageFailed={0}", sect.bSTAGEFAILED有効 ? 1 : 0);\r
writer.WriteLine("DamageLevel={0}", (int)sect.eダメージレベル);\r
+ writer.WriteLine("Metronome={0}", (int)sect.eMetronome);\r
writer.WriteLine("UseKeyboard={0}", sect.b演奏にキーボードを使用した ? 1 : 0);\r
writer.WriteLine("UseMIDIIN={0}", sect.b演奏にMIDI入力を使用した ? 1 : 0);\r
writer.WriteLine("UseJoypad={0}", sect.b演奏にジョイパッドを使用した ? 1 : 0);\r
STDGBSValue<COptionLabel> KeyAssignMenu;\r
STDGBSValue<COptionLabel> DisplayMenu;\r
STDGBSValue<COptionLabel> EDrumsMenu;\r
+ COptionLabel SoundMenu;\r
COptionLabel HitRangeMenu;\r
COptionStringList skins;\r
\r
{\r
t項目リストの設定(Eメニュー種別.System);\r
}\r
+ else if ( this.eメニュー種別 == Eメニュー種別.SoundSettings)\r
+ {\r
+ t項目リストの設定(Eメニュー種別.System);\r
+ }\r
}\r
\r
public bool tEnter押下()\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nRisky);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.eActiveInst);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPlaySpeed);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bTimeStretch);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepPerFrameMs);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSleepUnfocusMs);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bForceHighPowerPlan);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bStageFailed);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bRandSubBox);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bWaveAdjust);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreSoundWeightMs);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPreImageWeightMs);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBGMPlay);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bAudience);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.eDamageLevel);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bScoreIni);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.nChipVolume);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bBufferedInput);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLog);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadSoundSpeed);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.nSoundDeviceType);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.strASIODevice );\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.bUseOSTimer);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.nMasterVolume);\r
- list項目リスト.Add(CDTXMania.Instance.ConfigIni.nPolyphonicSounds);\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bLoadDTXDetail);// #36177 2016.7.30 ikanick\r
list項目リスト.Add(CDTXMania.Instance.ConfigIni.bUseBoxDefSkin);\r
list項目リスト.Add(skins);\r
+ list項目リスト.Add(SoundMenu);\r
list項目リスト.Add(DisplayMenu.System);\r
list項目リスト.Add(HitRangeMenu);\r
list項目リスト.Add(KeyAssignMenu.System);\r
CDTXMania.Instance.actEnumSongs.On活性化();\r
};\r
}\r
- else if (eMenu == Eメニュー種別.Drums)\r
+ else if ( eMenu == Eメニュー種別.SoundSettings )\r
+ {\r
+ list項目リスト.Add( ReturnToMenu.System );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bTimeStretch );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bWaveAdjust );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bBGMPlay );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bAudience );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nChipVolume );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nAutoVolume );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nSoundDeviceType );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nWASAPIBufferSizeMs );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bEventDrivenWASAPI );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.strASIODevice );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.bUseOSTimer );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nMasterVolume );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nPolyphonicSounds );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.eClickType );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickHighVolume );\r
+ list項目リスト.Add( CDTXMania.Instance.ConfigIni.nClickLowVolume );\r
+ }\r
+ else if ( eMenu == Eメニュー種別.Drums )\r
{\r
list項目リスト.Add(ReturnToMenu.Drums);\r
COptionEnum<EThreeState> AllAuto = new COptionEnum<EThreeState>(EThreeState.X);\r
\r
EDrumsMenu[ EPart.Drums ] = new COptionLabel( "strCfgEDrumsOption" );\r
HitRangeMenu = new COptionLabel( "strCfgHitRangeOption" );\r
+ SoundMenu = new COptionLabel( "strCfgSoundOption" );\r
\r
DisplayMenu.Drums.OnEnterDelegate = () =>\r
{\r
{\r
t項目リストの設定(Eメニュー種別.DisplaySystem);\r
};\r
-\r
KeyAssignMenu.Drums.OnEnterDelegate = () =>\r
{\r
t項目リストの設定(Eメニュー種別.KeyAssignDrums);\r
{\r
t項目リストの設定( Eメニュー種別.HitRangeSettings );\r
};\r
+ SoundMenu.OnEnterDelegate = () =>\r
+ {\r
+ t項目リストの設定( Eメニュー種別.SoundSettings );\r
+ };\r
\r
#region [ スキン選択肢と、現在選択中のスキン(index)の準備 #28195 2012.5.2 yyagi ]\r
int ns = (CDTXMania.Instance.Skin.strSystemSkinSubfolders == null) ? 0 : CDTXMania.Instance.Skin.strSystemSkinSubfolders.Length;\r
}\r
#endregion\r
\r
+ #region [ メトロノーム音 音量設定 ]\r
+ CDTXMania.Instance.Skin.soundClickHigh.n音量 = CDTXMania.Instance.ConfigIni.nClickHighVolume;\r
+ CDTXMania.Instance.Skin.soundClickLow.n音量 = CDTXMania.Instance.ConfigIni.nClickLowVolume;\r
+ #endregion\r
+\r
#region [ サウンドのタイムストレッチモード変更 ]\r
\r
FDK.CSound管理.bIsTimeStretch = CDTXMania.Instance.ConfigIni.bUseOSTimer;\r
DisplayBass,\r
EDrumsSettings,\r
HitRangeSettings,\r
+ SoundSettings,\r
Unknown\r
}\r
\r
// #24820 2013.1.17 yyagi ASIOデバイス\r
public COptionStringList strASIODevice;\r
\r
+ [DataMember( Order = 106 )]\r
+ public COptionEnum<EClickType> eClickType;\r
+ [DataMember( Order = 106 )]\r
+ public COptionInteger nClickHighVolume;\r
+ [DataMember( Order = 106 )]\r
+ public COptionInteger nClickLowVolume;\r
+\r
+\r
[DataMember]\r
public STDGBSValue<COptionBool> bLight;\r
[DataMember]\r
[DataMember]\r
public STDGBSValue<COptionBool> bDisplayJudge;\r
\r
+\r
+ \r
/// <summary>\r
/// 楽器左端座標。ここを基準に各パーツを配置する。\r
/// </summary>\r
nMasterVolume = new COptionInteger(100);\r
nPolyphonicSounds = new COptionInteger(4);\r
\r
+ eClickType = new COptionEnum<EClickType>(EClickType.Off);\r
+ nClickHighVolume = new COptionInteger(100);\r
+ nClickLowVolume = new COptionInteger(100);\r
+\r
// dgb\r
bEmphasizePlaySound = new STDGBSValue<COptionBool>();\r
bReverse = new STDGBSValue<COptionBool>();\r
eActiveInst.Initialize( "strCfgSysPlayMode", typeof(EActiveInstrument));\r
nShowLagType.Initialize( "strCfgSysShowLagType", typeof(EShowLagType));\r
\r
+ eClickType.Initialize( "strCfgSysClickType", typeof( EClickType ) );\r
+ nClickHighVolume.Initialize( "strCfgSysClickHighVolume", 0, 101 );\r
+ nClickLowVolume.Initialize( "strCfgSysClickLowVolume", 0, 101 );\r
+\r
+\r
// integer\r
nSleepPerFrameMs.Initialize( "strCfgSysSleepPerFrame", -1, 33 );\r
nSleepUnfocusMs.Initialize( "strCfgSysSleepUnfocus", 0, 33 );\r
Drums.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;\r
Drums.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;\r
Drums.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;\r
+ Drums.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;\r
Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;\r
Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;\r
Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;\r
Guitar.bDrums有効 = CDTXMania.Instance.ConfigIni.bDrums有効;\r
Guitar.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;\r
Guitar.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;\r
+ Guitar.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;\r
Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;\r
Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;\r
Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;\r
Bass.bSTAGEFAILED有効 = CDTXMania.Instance.ConfigIni.bStageFailed;\r
Bass.eダメージレベル = CDTXMania.Instance.ConfigIni.eDamageLevel;\r
// #24280 2011.1.29 yyagi\r
+ Bass.eMetronome = CDTXMania.Instance.ConfigIni.eClickType;\r
Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;\r
Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;\r
Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;\r
}\r
}\r
}\r
- else if (!pChip.bHit && (pChip.nバーからの距離dot.Drums < 0))\r
+ else if ( pChip[ EChannel.Click ] && !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
+ {\r
+ pChip.bHit = true;\r
+ if ( CDTXMania.Instance.ConfigIni.eClickType != EClickType.Off )\r
+ {\r
+ switch (pChip.n整数値)\r
+ {\r
+ case 1:\r
+ CDTXMania.Instance.Skin.soundClickHigh.t再生する();\r
+ break;\r
+ case 2:\r
+ CDTXMania.Instance.Skin.soundClickLow.t再生する();\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ else if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
{\r
// other chips\r
pChip.bHit = true;\r
}\r
}\r
\r
+ public int n音量\r
+ {\r
+ set\r
+ {\r
+ for ( int i = 0; i < this.rSound.GetLength( 0 ); i++ )\r
+ {\r
+ CSound sound = this.rSound[ i ];\r
+ if ( sound != null )\r
+ sound.n音量 = value;\r
+ }\r
+ }\r
+ }\r
+\r
public int n音量_現在のサウンド\r
{\r
get\r
public Cシステムサウンド sound決定音 = null;\r
public Cシステムサウンド sound取消音 = null;\r
public Cシステムサウンド sound変更音 = null;\r
- public readonly int nシステムサウンド数 = (int)Eシステムサウンド.Count;\r
+ public Cシステムサウンド soundClickHigh = null;\r
+ public Cシステムサウンド soundClickLow = null;\r
+ public readonly int nシステムサウンド数 = (int) Eシステムサウンド.Count;\r
public Cシステムサウンド this[Eシステムサウンド sound]\r
{\r
get\r
case Eシステムサウンド.SOUNDタイトル音:\r
return this.soundタイトル音;\r
\r
+ case Eシステムサウンド.SOUNDClickHigh:\r
+ return this.soundClickHigh;\r
+\r
+ case Eシステムサウンド.SOUNDClickLow:\r
+ return this.soundClickLow;\r
+\r
case Eシステムサウンド.BGM起動画面:\r
return this.bgm起動画面;\r
\r
{\r
switch (index)\r
{\r
- case 0:\r
+ case (int) Eシステムサウンド.SOUNDカーソル移動音:\r
return this.soundカーソル移動音;\r
\r
- case 1:\r
+ case (int) Eシステムサウンド.SOUND決定音:\r
return this.sound決定音;\r
\r
- case 2:\r
+ case (int) Eシステムサウンド.SOUND変更音:\r
return this.sound変更音;\r
\r
- case 3:\r
+ case (int) Eシステムサウンド.SOUND取消音:\r
return this.sound取消音;\r
\r
- case 4:\r
+ case (int) Eシステムサウンド.SOUND歓声音:\r
return this.sound歓声音;\r
\r
- case 5:\r
+ case (int) Eシステムサウンド.SOUNDステージ失敗音:\r
return this.soundSTAGEFAILED音;\r
\r
- case 6:\r
+ case (int) Eシステムサウンド.SOUNDゲーム開始音:\r
return this.soundゲーム開始音;\r
\r
- case 7:\r
+ case (int) Eシステムサウンド.SOUNDゲーム終了音:\r
return this.soundゲーム終了音;\r
\r
- case 8:\r
+ case (int) Eシステムサウンド.SOUNDステージクリア音:\r
return this.soundステージクリア音;\r
\r
- case 9:\r
+ case (int) Eシステムサウンド.SOUNDフルコンボ音:\r
return this.soundフルコンボ音;\r
\r
- case 10:\r
+ case (int) Eシステムサウンド.SOUND曲読込開始音:\r
return this.sound曲読込開始音;\r
\r
- case 11:\r
+ case (int) Eシステムサウンド.SOUNDタイトル音:\r
return this.soundタイトル音;\r
\r
- case 12:\r
+ case (int) Eシステムサウンド.BGM起動画面:\r
return this.bgm起動画面;\r
\r
- case 13:\r
+ case (int) Eシステムサウンド.BGMオプション画面:\r
return this.bgmオプション画面;\r
\r
- case 14:\r
+ case (int) Eシステムサウンド.BGMコンフィグ画面:\r
return this.bgmコンフィグ画面;\r
\r
- case 15:\r
+ case (int) Eシステムサウンド.BGM選曲画面:\r
return this.bgm選曲画面;\r
+\r
+ case (int) Eシステムサウンド.SOUNDClickHigh:\r
+ return this.soundClickHigh;\r
+\r
+ case (int) Eシステムサウンド.SOUNDClickLow:\r
+ return this.soundClickLow;\r
}\r
throw new IndexOutOfRangeException();\r
}\r
this.soundフルコンボ音 = new Cシステムサウンド(@"Sounds\Full combo.ogg", false, false, true);\r
this.sound曲読込開始音 = new Cシステムサウンド(@"Sounds\Now loading.ogg", false, true, true);\r
this.soundタイトル音 = new Cシステムサウンド(@"Sounds\Title.ogg", false, true, false);\r
- this.bgm起動画面 = new Cシステムサウンド(@"Sounds\Setup BGM.ogg", true, true, false);\r
+ this.soundClickHigh = new Cシステムサウンド( @"Sounds\Click_High.wav", false, false, false );\r
+ this.soundClickLow = new Cシステムサウンド( @"Sounds\Click_Low.wav", false, false, false );\r
+ this.bgm起動画面 = new Cシステムサウンド( @"Sounds\Setup BGM.ogg", true, true, false );\r
this.bgmオプション画面 = new Cシステムサウンド(@"Sounds\Option BGM.ogg", true, true, false);\r
this.bgmコンフィグ画面 = new Cシステムサウンド(@"Sounds\Config BGM.ogg", true, true, false);\r
this.bgm選曲画面 = new Cシステムサウンド(@"Sounds\Select BGM.ogg", true, true, false);\r
//nouse_e9 = 0xE9,\r
//nouse_ea = 0xEA,\r
//nouse_eb = 0xEB,\r
- //nouse_ec = 0xEC,\r
+ Click = 0xEC, // metronome click\r
//nouse_ed = 0xED,\r
//nouse_ee = 0xEE,\r
//nouse_ef = 0xEF,\r
SOUND決定音,\r
SOUND取消音,\r
SOUND変更音,\r
+ SOUNDClickHigh,\r
+ SOUNDClickLow,\r
Count // システムサウンド総数の計算用\r
}\r
\r
}\r
\r
[DataContract]\r
+ public enum EClickType\r
+ {\r
+ [EnumMember]\r
+ Off,\r
+ [EnumMember]\r
+ OnBeat, // 表拍\r
+ [EnumMember]\r
+ OffBeat // 裏拍\r
+// [EnumMember]\r
+// Triplet // 3連符\r
+ }\r
+\r
+ [DataContract]\r
public class STPadValue<T>\r
{\r
[DataMember]\r