| 352 | } |
| 353 | |
| 354 | void SfxrNode::Sfxr::ResetSample(bool restart) |
| 355 | { |
| 356 | if (!restart) |
| 357 | phase = 0; |
| 358 | fperiod = 100.0 / (p_base_freq * p_base_freq + 0.001); |
| 359 | period = (int) fperiod; |
| 360 | fmaxperiod = 100.0 / (p_freq_limit * p_freq_limit + 0.001); |
| 361 | fslide = 1.0 - pow((double) p_freq_ramp, 3.0) * 0.01; |
| 362 | fdslide = -pow((double) p_freq_dramp, 3.0) * 0.000001; |
| 363 | square_duty = 0.5f - p_duty * 0.5f; |
| 364 | square_slide = -p_duty_ramp * 0.00005f; |
| 365 | if (p_arp_mod >= 0.0f) |
| 366 | arp_mod = 1.0 - pow((double) p_arp_mod, 2.0) * 0.9; |
| 367 | else |
| 368 | arp_mod = 1.0 + pow((double) p_arp_mod, 2.0) * 10.0; |
| 369 | arp_time = 0; |
| 370 | arp_limit = (int) (pow(1.0f - p_arp_speed, 2.0f) * 20000 + 32); |
| 371 | if (p_arp_speed == 1.0f) |
| 372 | arp_limit = 0; |
| 373 | if (!restart) |
| 374 | { |
| 375 | // reset filter |
| 376 | fltp = 0.0f; |
| 377 | fltdp = 0.0f; |
| 378 | fltw = pow(p_lpf_freq, 3.0f) * 0.1f; |
| 379 | fltw_d = 1.0f + p_lpf_ramp * 0.0001f; |
| 380 | fltdmp = 5.0f / (1.0f + pow(p_lpf_resonance, 2.0f) * 20.0f) * (0.01f + fltw); |
| 381 | if (fltdmp > 0.8f) fltdmp = 0.8f; |
| 382 | fltphp = 0.0f; |
| 383 | flthp = pow(p_hpf_freq, 2.0f) * 0.1f; |
| 384 | flthp_d = 1.0f + p_hpf_ramp * 0.0003f; |
| 385 | // reset vibrato |
| 386 | vib_phase = 0.0f; |
| 387 | vib_speed = pow(p_vib_speed, 2.0f) * 0.01f; |
| 388 | vib_amp = p_vib_strength * 0.5f; |
| 389 | // reset envelope |
| 390 | env_vol = 0.0f; |
| 391 | env_stage = 0; |
| 392 | env_time = 0; |
| 393 | env_length[0] = (int) (p_env_attack * p_env_attack * 100000.0f); |
| 394 | env_length[1] = (int) (p_env_sustain * p_env_sustain * 100000.0f); |
| 395 | env_length[2] = (int) (p_env_decay * p_env_decay * 100000.0f); |
| 396 | |
| 397 | fphase = pow(p_pha_offset, 2.0f) * 1020.0f; |
| 398 | if (p_pha_offset < 0.0f) fphase = -fphase; |
| 399 | fdphase = pow(p_pha_ramp, 2.0f) * 1.0f; |
| 400 | if (p_pha_ramp < 0.0f) fdphase = -fdphase; |
| 401 | iphase = abs((int) fphase); |
| 402 | ipp = 0; |
| 403 | for (int i = 0; i < 1024; i++) |
| 404 | phaser_buffer[i] = 0.0f; |
| 405 | |
| 406 | for (int i = 0; i < 32; i++) |
| 407 | noise_buffer[i] = frnd(2.0f) - 1.0f; |
| 408 | |
| 409 | rep_time = 0; |
| 410 | rep_limit = (int) (pow(1.0f - p_repeat_speed, 2.0f) * 20000 + 32); |
| 411 | if (p_repeat_speed == 0.0f) |