#ifndef _KBTIM_SETTINGTIMIDITY_H
#define _KBTIM_SETTINGTIMIDITY_H

//設定のデフォルト値
//名前は INI ファイルのキー名に合わせる
//g_(キー名)_default
//順番は本家が自動生成する INI ファイルと同じくする
//(最新の TiMidity を実行して INI ファイルを見れば追加された設定をすぐに発見出来るので)
#define g_ConfigFile_default                 "" //CFG File
#define g_amplification_default              70 //音量(%)
#define g_antialiasing_allowed_default        0 //アンチエリアス
#define g_opt_buffer_fragments_default       -1 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_control_ratio_default               0 //制御レシオ
#define g_default_drumchannels_default 33554944 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_default_drumchannel_mask_default    0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_modulation_wheel_default        1 //モジュレーションホイール
#define g_opt_portamento_default              1 //ポルタメント
#define g_opt_nrpn_vibrato_default            1 //NRPN ビブラート
#define g_opt_channel_pressure_default        0 //汎用コントローラ
#define g_opt_trace_text_meta_event_default   0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_overlap_voice_allow_default     1 //同音連打
#define g_opt_default_mid_default          0x7e //デフォルト規格(0x7e=GM, 0x41=GS, 0x43=XG)(本家では、起動直後は 0 だが設定を一度でも適用すると 0x7e になる)
#define g_default_tonebank_default            0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_special_tonebank_default           -1 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_effect_lr_mode_default             -1 //L&R ディレイ(-1:なし 0:左 1:右 2:回転)
#define g_effect_lr_delay_msec_default       25 //ディレイタイム
#define g_opt_reverb_control_default          3 //リバーブ(0:リバーブなし 1:標準リバーブ(2:グローバル) 3:新リバーブ(4:グローバル)
#define g_opt_chorus_control_default          1 //コーラス(0:コーラスなし 1:標準コーラス)
#define g_opt_surround_chorus_default         0 //コーラス(0:なし 1:サラウンドコーラス)
#define g_opt_tva_attack_default              0 //アタック・タイム
#define g_opt_tva_decay_default               0 //ディケイ・タイム
#define g_opt_tva_release_default             0 //リリース・タイム
#define g_opt_delay_control_default           0 //ディレイ(0:ディレイなし 1:標準ディレイ)
#define g_opt_default_module_default          0 //音源モード(0: MODULE_TIMIDITY_DEFAULT 1: ...)
#define g_opt_lpf_def_default                 1 //LPF(0:フィルタなし 1:LPF(12dB/oct) 2:LPF(24dB/oct)
#define g_opt_drum_effect_default             0 //NRPN ドラム・エフェクト
#define g_opt_modulation_envelope_default     0 //モジュレーション・エンベロープ
#define g_opt_pan_delay_default               0 //サラウンド
#define g_opt_eq_control_default              0 //EQ
#define g_opt_insertion_effect_default        0 //インサーション・エフェクト
#define g_noise_sharp_type_default            4 //ノイズシェイピング
#define g_opt_evil_mode_default               0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_adjust_panning_immediately_default  0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_fast_decay_default                  0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_default_programN_default 0 //(N=0〜31)//kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_ctl_default                "wtad" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_drum_power_default            100 //ドラム音量補正
#define g_opt_amp_compensation_default        0 //音量自動調整
#define g_opt_realtime_playing_default        0 //演奏中に音色読込
#define g_reduce_voice_threshold_default     -1 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_playmode_default          "dSs1l" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_OutputName_default                 "" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_OutputDirName_default              "" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_auto_output_mode_default            0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_voices_default                    256 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_auto_reduce_polyphony_default       1 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_quietchannels_default               0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_temper_type_mute_default            0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_qsize_default          "5.0/100%" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_modify_release_default              0 //疑似リバーブ
#define g_allocate_cache_size_default   2097152 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_key_adjust_default                  0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_force_keysig_default            8 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_pure_intonation_default         0 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_opt_init_keysig_default             8 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_output_rate_default             44100 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_output_text_code_default       "SJIS" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_free_instruments_afterwards_default 1 //演奏毎に音色破棄
#define g_out_wrd_default                   "w" //kbtim.kpi では設定不可(常にデフォルト値)
#define g_data_block_bits_default            12 //kbtim.kpi では設定不可(常にデフォルト値)
#define g_data_block_num_default             64 //kbtim.kpi では設定不可(常にデフォルト値)
//kbtim.kpi 独自
#define g_resample_type_default               4 //Resample 補間(0:RESAMPLE_CSPLINE 1:RESAMPLE_LAGRANGE 2:RESAMPLE_GAUSS 3:RESAMPLE_NEWTON 4:RESAMPLE_LINEAR 5:RESAMPLE_NONE)


#pragma pack(push, 1) //1バイト境界
struct KbSettingTimidity
{//interface/w32g_util.h の SETTING_TIMIDITY_ に相当する
 //変数名は INI ファイルのキー名に合わせる
 //順番は設定画面のタブ順(ただし、チェックボックス(bool 型)は最後)
    char szTemplateName[64];    //テンプレート名
    char ConfigFile[MAX_PATH*2];//CFG File
    int opt_reverb_control;  //リバーブ(0:リバーブなし 1:標準リバーブ(2:グローバル) 3:新リバーブ(4:グローバル)
    int opt_chorus_control;  //コーラス(0:コーラスなし 1:標準コーラス)
    int opt_surround_chorus; //コーラス(0:なし 1:サラウンドコーラス)(コーラス・レベルはサラウンドコーラスには無効?)
    int opt_delay_control;   //ディレイ(0:ディレイなし 1:標準ディレイ)
    int opt_lpf_def;         //LPF(0:フィルタなし 1:LPF(12dB/oct) 2:LPF(24dB/oct)
    int noise_sharp_type;    //ノイズシェイピング
    int effect_lr_mode;      //L&R ディレイ(-1:なし 0:左 1:右 2:回転)
    int effect_lr_delay_msec;//ディレイタイム
    int modify_release;      //疑似リバーブ
    int opt_default_module;  //音源モード(0: MODULE_TIMIDITY_DEFAULT 1: ...)
    int resample_type;       //Resample 補間(0:RESAMPLE_CSPLINE 1:RESAMPLE_LAGRANGE 2:RESAMPLE_GAUSS 3:RESAMPLE_NEWTON 4:RESAMPLE_LINEAR 5:RESAMPLE_NONE)
    int voices;              //ボイス
    int amplification;       //音量(%)
    int opt_default_mid;     //デフォルト規格(0x7e=GM, 0x41=GS, 0x43=XG)
    int control_ratio;       //制御レシオ
    int opt_drum_power;      //ドラム音量補正
    union{
        struct{//チェックボックスで指定する設定
            //bReverb, bChorus, bLRDelay はそれぞれ
            //opt_reverb_control, opt_chorus_control, effect_lr_mode に連動して設定される
            bool opt_modulation_wheel;   //CheckBox1 //モジュレーションホイール
            bool opt_portamento;         //        2 //ポルタメント
            bool opt_channel_pressure;   //        3 //汎用コントローラ
            bool opt_drum_effect;        //        4 //NRPN ドラム・エフェクト
            bool opt_nrpn_vibrato;       //        5 //NRPN ビブラート
            bool opt_tva_attack;         //        6 //アタック・タイム
            bool opt_tva_decay;          //        7 //ディケイ・タイム
            bool opt_tva_release;        //        8 //リリース・タイム
            bool opt_eq_control;         //        9 //EQ
            bool opt_insertion_effect;   //        10//インサーション・エフェクト
            bool bReverb;                //        11//リバーブ・レベル(kbtimsetup.exe 用)
            bool bChorus;                //        12//コーラス・レベル(kbtimsetup.exe 用)
            bool opt_overlap_voice_allow;//        13//同音連打
            bool opt_modulation_envelope;//        14//モジュレーション・エンベロープ
            bool opt_pan_delay;          //        15//サラウンド
            bool bLRDelay;               //        16//L&R ディレイ(kbtimsetup.exe 用)
            bool antialiasing_allowed;   //        17//アンチエリアス
            bool opt_realtime_playing;   //        18//演奏中に音色読込
            bool free_instruments_afterwards;//    19//演奏毎に音色破棄
            bool opt_amp_compensation;   //        20//音量自動調整
        }b;
        bool bBoolValues[20];
    };
    BOOL bNew;//新規作成直後
    KbSettingTimidity(void);
    void __fastcall DoCheckParameter(void);
    void __fastcall SetReverb(int nReverb);
    void __fastcall SetReverbLevel(int nType, int nLevel);
    void __fastcall SetChorus(int nChorus, int nSurroundChorus);
    void __fastcall SetChorusLevel(int nType, int nLevel);
    void __fastcall GetReverbLevel(int *pType, int *pLevel);
    void __fastcall GetChorusLevel(int *pType, int *pLevel);
    void __fastcall SetLRDelay(int nMode, int nMS);
    void __fastcall SetResampleType(int nType);
    void __fastcall LoadOrSaveSettings(const char *cszIniFile, BOOL bLoad);
    void __fastcall LoadSettings(const char *cszIniFile){LoadOrSaveSettings(cszIniFile, TRUE);}
    void __fastcall SaveSettings(const char *cszIniFile){LoadOrSaveSettings(cszIniFile, FALSE);}
    //opt_default_module 用
    static const char * __fastcall GetModuleNameFromIndex(int nIndex);//見つからない場合は NULL を返す
    static int __fastcall GetModuleFromIndex(int nIndex); //見つからない場合はデフォルトのモジュール(g_opt_default_module_default)を返す
    static int __fastcall GetIndexFromModule(int nModule);//見つからない場合はデフォルトのモジュールに相当するインデックス(0)を返す
};
#pragma pack(pop)

#endif
