| 414 | } |
| 415 | |
| 416 | void stepBlock() { |
| 417 | // Ramps |
| 418 | |
| 419 | marbles::Ramps ramps; |
| 420 | ramps.master = ramp_master; |
| 421 | ramps.external = ramp_external; |
| 422 | ramps.slave[0] = ramp_slave[0]; |
| 423 | ramps.slave[1] = ramp_slave[1]; |
| 424 | |
| 425 | float deja_vu = clamp(params[DEJA_VU_PARAM].getValue() + inputs[DEJA_VU_INPUT].getVoltage() / 5.f, 0.f, 1.f); |
| 426 | static const int loop_length[] = { |
| 427 | 1, 1, 1, 2, 2, |
| 428 | 2, 2, 2, 3, 3, |
| 429 | 3, 3, 4, 4, 4, |
| 430 | 4, 4, 5, 5, 6, |
| 431 | 6, 6, 7, 7, 8, |
| 432 | 8, 8, 10, 10, 12, |
| 433 | 12, 12, 14, 14, 16, |
| 434 | 16 |
| 435 | }; |
| 436 | float deja_vu_length_index = params[DEJA_VU_LENGTH_PARAM].getValue() * (LENGTHOF(loop_length) - 1); |
| 437 | int deja_vu_length = loop_length[(int) roundf(deja_vu_length_index)]; |
| 438 | |
| 439 | // Set up TGenerator |
| 440 | |
| 441 | bool t_external_clock = inputs[T_CLOCK_INPUT].isConnected(); |
| 442 | |
| 443 | t_generator.set_model((marbles::TGeneratorModel) t_mode); |
| 444 | t_generator.set_range((marbles::TGeneratorRange) t_range); |
| 445 | float t_rate = 60.f * (params[T_RATE_PARAM].getValue() + inputs[T_RATE_INPUT].getVoltage() / 5.f); |
| 446 | t_generator.set_rate(t_rate); |
| 447 | float t_bias = clamp(params[T_BIAS_PARAM].getValue() + inputs[T_BIAS_INPUT].getVoltage() / 5.f, 0.f, 1.f); |
| 448 | t_generator.set_bias(t_bias); |
| 449 | float t_jitter = clamp(params[T_JITTER_PARAM].getValue() + inputs[T_JITTER_INPUT].getVoltage() / 5.f, 0.f, 1.f); |
| 450 | t_generator.set_jitter(t_jitter); |
| 451 | t_generator.set_deja_vu(t_deja_vu ? deja_vu : 0.f); |
| 452 | t_generator.set_length(deja_vu_length); |
| 453 | // TODO |
| 454 | t_generator.set_pulse_width_mean(0.f); |
| 455 | t_generator.set_pulse_width_std(0.f); |
| 456 | |
| 457 | t_generator.Process(t_external_clock, t_clocks, ramps, gates, BLOCK_SIZE); |
| 458 | |
| 459 | // Set up XYGenerator |
| 460 | |
| 461 | marbles::ClockSource x_clock_source = (marbles::ClockSource) x_clock_source_internal; |
| 462 | if (inputs[X_CLOCK_INPUT].isConnected()) |
| 463 | x_clock_source = marbles::CLOCK_SOURCE_EXTERNAL; |
| 464 | |
| 465 | marbles::GroupSettings x; |
| 466 | x.control_mode = (marbles::ControlMode) x_mode; |
| 467 | x.voltage_range = (marbles::VoltageRange) x_range; |
| 468 | // TODO Fix the scaling |
| 469 | float note_cv = 0.5f * (params[X_SPREAD_PARAM].getValue() + inputs[X_SPREAD_INPUT].getVoltage() / 5.f); |
| 470 | float u = note_filter.Process(0.5f * (note_cv + 1.f)); |
| 471 | x.register_mode = external; |
| 472 | x.register_value = u; |
| 473 | |