/*
* This file is part of libEmuSC, a Sound Canvas emulator library
* Copyright (C) 2023-2024 HÃ¥kon Skjelten
*
* libEmuSC is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libEmuSC is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with libEmuSC. If not, see .
*/
#ifndef __SETTINGS_H__
#define __SETTINGS_H__
#include "control_rom.h"
#include "params.h"
#include
#include
#include
namespace EmuSC {
class Settings
{
public:
Settings(ControlRom & ctrlRom);
~Settings();
// Sound Canvas modes
enum class Mode {
GS, // Standard GS mode. Default.
MT32, // MT32 mode
SC55 // SC-55 mode for SC-88 TODO
// TODO: What about GM mode?
};
// Interpolation modes
enum class InterpMode {
Nearest = 0,
Linear = 1,
Cubic = 2
};
// Retrieve settings from Config paramters
uint8_t get_param(enum SystemParam sp);
uint8_t* get_param_ptr(enum SystemParam sp);
uint32_t get_param_uint32(enum SystemParam sp);
uint16_t get_param_32nib(enum SystemParam sp);
uint8_t get_param(enum PatchParam pp, int8_t part = -1);
uint8_t* get_param_ptr(enum PatchParam pp, int8_t part = -1);
uint16_t get_param_uint14(enum PatchParam pp, int8_t part = -1);
uint16_t get_param_uint16(enum PatchParam pp, int8_t part = -1);
uint8_t get_param_nib16(enum PatchParam pp, int8_t part = -1);
uint8_t get_patch_param(uint16_t address, int8_t part = -1);
uint8_t get_param(enum DrumParam, uint8_t map, uint8_t key);
int8_t* get_param_ptr(enum DrumParam, uint8_t map);
// Set settings from Config paramters
void set_param(enum SystemParam sp, uint8_t value);
void set_param(enum SystemParam sp, const uint8_t *data, uint8_t size);
void set_param_uint32(enum SystemParam sp, uint32_t value);
void set_param_32nib(enum SystemParam sp, uint16_t value);
void set_system_param(uint16_t address, const uint8_t *data, uint8_t size = 1);
void set_param(enum PatchParam pp, uint8_t value, int8_t part = -1);
void set_param(enum PatchParam pp, const uint8_t *data, uint8_t size = 1,
int8_t part = -1);
void set_param_uint14(enum PatchParam pp, uint16_t value, int8_t part = -1);
void set_param_nib16(enum PatchParam pp, uint8_t value, int8_t part = -1);
void set_patch_param(uint16_t address, const uint8_t *data, uint8_t size = 1);
void set_patch_param(uint16_t address, uint8_t value, int8_t part = -1);
void set_param(enum DrumParam dp, uint8_t map, uint8_t key, uint8_t value);
void set_param(enum DrumParam dp, uint8_t map, const uint8_t *data, uint8_t length);
void set_drum_param(uint16_t address, const uint8_t *data, uint8_t size = 1);
int update_drum_set(uint8_t map, uint8_t bank);
// Store settings paramters to file (aka battery backup)
bool load(std::string filePath);
bool save(std::string filePath);
// Reset all settings to default GS mode
void reset();
void set_gm_mode(void);
void set_map_mt32(void);
// Temporary solution
// Figure out the need for a common way with all controllers
void update_pitchBend_factor(int8_t part);
float get_pitchBend_factor(int8_t part) { return _PBController[part]; }
static int8_t convert_from_roland_part_id(int8_t part);
void set_sample_rate(int sampleRate) { _sampleRate = sampleRate; }
inline int sample_rate(void) { return _sampleRate; }
void set_channels(int channels) { _channels = channels; }
inline int channels(void) { return _channels; }
void set_interpolation_mode(enum InterpMode im) { _interpMode = im; }
inline enum InterpMode interpolation_mode(void) { return _interpMode; }
private:
std::array _systemParams; // Both SysEx and non-SysEx data
std::array _patchParams;
std::array _drumParams;
ControlRom &_ctrlRom;
// Non-native parameters
int _sampleRate;
int _channels;
InterpMode _interpMode;
void _initialize_system_params(enum Mode = Mode::GS);
void _initialize_patch_params(enum Mode = Mode::GS);
void _initialize_drumSet_params();
// BE / LE conversion
inline bool _le_native(void) { uint16_t n = 1; return (*(const uint8_t *) & n); }
uint8_t _to_native_endian_nib16(const uint8_t *ptr);
uint16_t _to_native_endian_uint14(const uint8_t *ptr);
uint16_t _to_native_endian_uint16(const uint8_t *ptr);
uint32_t _to_native_endian_uint32(const uint8_t *ptr);
// Macros for certain settings
void _run_macro_chorus(uint8_t value);
void _run_macro_reverb(uint8_t value);
// Update accumulated controller inputs
void _update_controller_input(enum PatchParam pp, uint8_t value, int8_t part);
void _update_controller_input_acc(enum PatchParam pp, int8_t part);
void _accumulate_controller_values(enum PatchParam ctm, enum PatchParam acc,
int8_t partm, int min, int max, bool center);
// Temporary storage for pitchbend
float _PBController[16];
static constexpr std::array _convert_to_roland_part_id_LUT =
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 13, 14, 15 };
static constexpr std::array _convert_from_roland_part_id_LUT =
{ 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15 };
};
}
#endif // __SETTINGS_H__