feat: ignore some values in auto random
This commit is contained in:
@@ -12,6 +12,16 @@ unsigned int arr_uint_index_of(UintArray array, unsigned int value) {
|
||||
return ARRAY_NOT_FOUND;
|
||||
}
|
||||
|
||||
bool arr_string_match(StringArray array, const char *needle) {
|
||||
for (unsigned int i = 0; i < array.length; i++) {
|
||||
if (strncmp(array.values[i], needle, strlen(array.values[i])) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int arr_uint_remap_index(UintArray offsets, unsigned int *index) {
|
||||
if (offsets.length == 0) {
|
||||
return 0;
|
||||
|
||||
@@ -7,4 +7,6 @@ unsigned int arr_uint_index_of(UintArray array, unsigned int value);
|
||||
|
||||
unsigned int arr_uint_remap_index(UintArray offsets, unsigned int *index);
|
||||
|
||||
bool arr_string_match(StringArray array, const char *needle);
|
||||
|
||||
#endif /* ARR_H */
|
||||
|
||||
+57
-5
@@ -98,11 +98,15 @@ static void randomize(Context *context, StateConfig state_config) {
|
||||
l = state_config.values_offsets.values[part] +
|
||||
k * state_config.group_counts.values[part] + j;
|
||||
|
||||
if (arr_uint_index_of(state_config.fader_codes,
|
||||
state_config.codes.values[i]) != ARRAY_NOT_FOUND) {
|
||||
context->values[l][i % 3] = (float)rand_uint(MIDI_MAX + 1) / MIDI_MAX;
|
||||
} else {
|
||||
context->values[l][i % 3] = rand_uint(2) == 1 ? 1 : 0;
|
||||
if (arr_uint_index_of(state_config.random_ignored, (l * 3) + (i % 3)) ==
|
||||
ARRAY_NOT_FOUND) {
|
||||
if (arr_uint_index_of(state_config.fader_codes,
|
||||
state_config.codes.values[i]) !=
|
||||
ARRAY_NOT_FOUND) {
|
||||
context->values[l][i % 3] = (float)rand_uint(MIDI_MAX + 1) / MIDI_MAX;
|
||||
} else {
|
||||
context->values[l][i % 3] = rand_uint(2) == 1 ? 1 : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -271,6 +275,8 @@ void state_parse_config(StateConfig *state_config, const ConfigFile *config) {
|
||||
unsigned int offset;
|
||||
unsigned int count;
|
||||
unsigned int length;
|
||||
unsigned int value_offset;
|
||||
StringArray ignored_codes;
|
||||
char name[STR_LEN];
|
||||
|
||||
length = config_file_get_int(config, "SELECT_PAGE_COUNT", 0);
|
||||
@@ -312,6 +318,18 @@ void state_parse_config(StateConfig *state_config, const ConfigFile *config) {
|
||||
config_file_get_int(config, name, UNSET_MIDI_CODE);
|
||||
}
|
||||
|
||||
length = config_file_get_int(config, "ARI_COUNT", 0);
|
||||
if (length > ARRAY_SIZE) {
|
||||
length = ARRAY_SIZE;
|
||||
}
|
||||
ignored_codes.length = length;
|
||||
|
||||
for (unsigned int i = 0; i < ignored_codes.length; i++) {
|
||||
snprintf(name, STR_LEN, "ARI_%d", i + 1);
|
||||
strlcpy(ignored_codes.values[i],
|
||||
config_file_get_str(config, name, "unkown"), STR_LEN);
|
||||
}
|
||||
|
||||
length = config_file_get_int(config, "GROUP_COUNT", 0);
|
||||
if (length > ARRAY_SIZE) {
|
||||
length = ARRAY_SIZE;
|
||||
@@ -361,26 +379,60 @@ void state_parse_config(StateConfig *state_config, const ConfigFile *config) {
|
||||
length = ARRAY_SIZE;
|
||||
}
|
||||
state_config->codes.length = count * 3;
|
||||
state_config->random_ignored.length = 0;
|
||||
|
||||
for (unsigned int i = 0; i < state_config->group_counts.length; i++) {
|
||||
offset = state_config->group_offsets.values[i];
|
||||
value_offset = state_config->values_offsets.values[i];
|
||||
for (unsigned int j = 0; j < state_config->group_counts.values[i]; j++) {
|
||||
if ((offset + j) * 3 < ARRAY_SIZE) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_X", i + 1, j + 1);
|
||||
state_config->codes.values[(offset + j) * 3] =
|
||||
config_file_get_int(config, name, UNSET_MIDI_CODE);
|
||||
for (unsigned int k = 0;
|
||||
k < state_config->group_active_counts.values[i]; k++) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_X_%d", i + 1, j + 1, k + 1);
|
||||
if (arr_string_match(ignored_codes, name)) {
|
||||
state_config->random_ignored
|
||||
.values[state_config->random_ignored.length++] =
|
||||
(value_offset + k * state_config->group_counts.values[i] + j) *
|
||||
3;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((offset + j) * 3 + 1 < ARRAY_SIZE) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_Y", i + 1, j + 1);
|
||||
state_config->codes.values[(offset + j) * 3 + 1] =
|
||||
config_file_get_int(config, name, UNSET_MIDI_CODE);
|
||||
for (unsigned int k = 0;
|
||||
k < state_config->group_active_counts.values[i]; k++) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_Y_%d", i + 1, j + 1, k + 1);
|
||||
if (arr_string_match(ignored_codes, name)) {
|
||||
state_config->random_ignored
|
||||
.values[state_config->random_ignored.length++] =
|
||||
(value_offset + k * state_config->group_counts.values[i] + j) *
|
||||
3 +
|
||||
1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((offset + j) * 3 + 2 < ARRAY_SIZE) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_Z", i + 1, j + 1);
|
||||
state_config->codes.values[(offset + j) * 3 + 2] =
|
||||
config_file_get_int(config, name, UNSET_MIDI_CODE);
|
||||
for (unsigned int k = 0;
|
||||
k < state_config->group_active_counts.values[i]; k++) {
|
||||
snprintf(name, STR_LEN, "GROUP_%d_%d_Z_%d", i + 1, j + 1, k + 1);
|
||||
if (arr_string_match(ignored_codes, name)) {
|
||||
state_config->random_ignored
|
||||
.values[state_config->random_ignored.length++] =
|
||||
(value_offset + k * state_config->group_counts.values[i] + j) *
|
||||
3 +
|
||||
2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,6 +251,7 @@ typedef struct StateConfig {
|
||||
UintArray codes;
|
||||
UintArray fader_codes;
|
||||
UintArray values_offsets;
|
||||
UintArray random_ignored;
|
||||
|
||||
unsigned int value_count;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user