Add a fractal signal on the track with an envelope:
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(tape_recorder), | intent(inout) | :: | tape | |||
| integer, | intent(in) | :: | track | |||
| real(kind=wp), | intent(in) | :: | t1 | |||
| real(kind=wp), | intent(in) | :: | t2 | |||
| real(kind=wp), | intent(in) | :: | f | |||
| real(kind=wp), | intent(in) | :: | Amp | |||
| type(ADSR_envelope), | intent(in), | optional | :: | envelope |
subroutine add_weierstrass(tape, track, t1, t2, f, Amp, envelope) type(tape_recorder), intent(inout) :: tape integer, intent(in) :: track real(wp), intent(in) :: t1, t2, f, Amp type(ADSR_envelope), optional, intent(in) :: envelope ! Pulsation (radians/second): real(wp) :: omega ! Time in seconds: real(wp) :: t ! ADSR Envelope value: real(wp) :: env real(wp) :: signal ! 0 < a < 1. real(wp), parameter :: a = 0.975_wp ! If a.b > 1 the function is fractal: real(wp), parameter :: b = 1._wp/.975_wp + 0.005_wp integer :: i env = 1._wp ! Default value if no envelope is passed omega = 2.0_wp * PI * f do concurrent(i = nint(t1*RATE) : min(nint(t2*RATE), tape%last)) t = (i - nint(t1*RATE)) * dt if (present(envelope)) env = envelope%get_level(t1+t, t1, t2) signal = Amp * weierstrass(a, b, omega*t) * env ! It is addd to the already present signal: tape%left(track, i) = tape%left(track, i) + signal tape%right(track, i) = tape%right(track, i) + signal end do end subroutine add_weierstrass