synth_blocks 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3822db2dd2af4580090c97ded8db14ee9654daec87b10134785af9d94a915c3
4
- data.tar.gz: 68a7879b69af50ee812cdcbb27ec642180f18b128fbb833f28c883aeb0c68517
3
+ metadata.gz: 3feea4e01983af0753f8fcc3c95d92a02d59af71ac8ac9c83373d4e150c0382d
4
+ data.tar.gz: d3cd62fa4294b4bb0ce334bc23439579316520f81493c93212af1c0fc6b8103e
5
5
  SHA512:
6
- metadata.gz: bf35a91c3e6d073bdab7dd0e198371dd386899a56e96fb13d144bf0c271a3a9aff3890a67d178d81c5645d81f530f16aa38de596b27e8be137beb66b8124c8fa
7
- data.tar.gz: d585dc04e7e58671a0942e51a5e2917e46ce265fb76f0f23905f19819de9683ffe42a736107ebc23e86265bc568c164fb69aa341b21824c509ec6082b90092bc
6
+ metadata.gz: 764c103a562dd360316176b555e4085f5b2ae4e9d636b6803b4e9bd797bd18512534383a88778aa1dd212d6606c6551c32c17e86df6a27ace5f4e269ceee090c
7
+ data.tar.gz: 7c50a642105d5bac45b205d5d1a2c0ea7d289b1796670bb136c4f7a18ff7e2fdd606fb04be0f38eea67b0db9e4f2658d494fb5edb1078875c751c6db9c80c6b9
@@ -1,4 +1,5 @@
1
1
  require_relative 'synth_blocks/core/sound'
2
+ # require_relative 'synth_blocks/mod/adsr'
2
3
  require_relative 'synth_blocks/mod/adsr'
3
4
  require_relative 'synth_blocks/fx/chorus'
4
5
  require_relative 'synth_blocks/fx/compressor'
@@ -1,8 +1,5 @@
1
1
  module SynthBlocks
2
2
  module Mod
3
- ##
4
- # Implementation of a linear ADSR envelope generator with a tracking
5
- # value so that envelope restarts don't click
6
3
  class Adsr
7
4
  ##
8
5
  # attack time in seconds
@@ -27,6 +24,9 @@ module SynthBlocks
27
24
  # sustain should be between 0 and 1
28
25
  def initialize(attack, decay, sustain, release)
29
26
  @value = 0
27
+ @start_time = 0
28
+ @last_t = 0
29
+ @done = false
30
30
  @start_value = 0
31
31
  @attack = attack
32
32
  @decay = decay
@@ -40,44 +40,31 @@ module SynthBlocks
40
40
  # if released is given (should be <= t), the envelope will enter the release stage
41
41
  # returns the current value between 0 and 1
42
42
  def run(t, released)
43
- attack_decay = attack + decay
44
- if !released
45
- if t < 0.0001 # initialize start value (slightly hacky, but works)
46
- @start_value = @value
47
- return @start_value
48
- end
49
- if t <= attack # attack
50
- return @value = linear(@start_value, 1, attack, t)
51
- end
52
- if t > attack && t < attack_decay # decay
53
- return @value = linear(1.0, sustain, decay, t - attack)
54
- end
55
- if t >= attack + decay # sustain
56
- return @value = sustain
57
- end
58
- else # release
59
- if released <= attack # when released in attack phase
60
- attack_level = linear(@start_value, 1, attack, released)
61
- return [linear(attack_level, 0, release, t - released), 0].max
43
+ delta = t - @last_t
44
+ @last_t = t
45
+ if released
46
+ return 0 if @done
47
+ @value += -(@sustain/@release) * (delta)
48
+ if @value <= 0
49
+ @value = 0
50
+ @done = true
62
51
  end
63
- if released > attack && released <= attack_decay # when released in decay phase
64
- decay_level = linear(1.0, sustain, decay, released - attack)
65
- return @value = [linear(decay_level, 0, release, t - released), 0].max
52
+ return @value
53
+ else
54
+ if t < 0.0001 # initialize start value (slightly hacky, but works)
55
+ @start_time = t
56
+ return @value
66
57
  end
67
- if released > attack_decay # normal release
68
- return @value = [linear(sustain, 0, release, t - released), 0].max
58
+ if t <= @attack
59
+ return @value += 1/@attack * delta
60
+ elsif t <= @attack + @decay
61
+ return @value += -(1-@sustain)/@decay * delta
62
+ else
63
+ return @value = @sustain
69
64
  end
70
- end
71
- 0.0
72
- end
73
-
74
- private
75
-
76
- def linear(start, target, length, time)
77
- return start if time == 0
78
- return target if length == 0
79
- (target - start) / length * time + start
65
+ end
66
+ @a_s = 1 / @attack
80
67
  end
81
68
  end
82
69
  end
83
- end
70
+ end
@@ -0,0 +1,83 @@
1
+ module SynthBlocks
2
+ module Mod
3
+ ##
4
+ # Implementation of a linear ADSR envelope generator with a tracking
5
+ # value so that envelope restarts don't click
6
+ class AdsrOld
7
+ ##
8
+ # attack time in seconds
9
+ attr_accessor :attack
10
+
11
+ ##
12
+ # decay time in seconds
13
+ attr_accessor :decay
14
+ ##
15
+ # sustain level (0.0-1.0)
16
+ attr_accessor :sustain
17
+
18
+ ##
19
+ # release time in seconds
20
+ attr_accessor :release
21
+
22
+ ##
23
+ # Creates new ADSR envelope
24
+ #
25
+ # attack, decay and release are times in seconds (as float)
26
+ #
27
+ # sustain should be between 0 and 1
28
+ def initialize(attack, decay, sustain, release)
29
+ @value = 0
30
+ @start_value = 0
31
+ @attack = attack
32
+ @decay = decay
33
+ @sustain = sustain
34
+ @release = release
35
+ end
36
+
37
+ ##
38
+ # run the envelope.
39
+ #
40
+ # if released is given (should be <= t), the envelope will enter the release stage
41
+ # returns the current value between 0 and 1
42
+ def run(t, released)
43
+ attack_decay = attack + decay
44
+ if !released
45
+ if t < 0.0001 # initialize start value (slightly hacky, but works)
46
+ @start_value = @value
47
+ return @start_value
48
+ end
49
+ if t <= attack # attack
50
+ return @value = linear(@start_value, 1, attack, t)
51
+ end
52
+ if t > attack && t < attack_decay # decay
53
+ return @value = linear(1.0, sustain, decay, t - attack)
54
+ end
55
+ if t >= attack + decay # sustain
56
+ return @value = sustain
57
+ end
58
+ else # release
59
+ if released <= attack # when released in attack phase
60
+ attack_level = linear(@start_value, 1, attack, released)
61
+ return [linear(attack_level, 0, release, t - released), 0].max
62
+ end
63
+ if released > attack && released <= attack_decay # when released in decay phase
64
+ decay_level = linear(1.0, sustain, decay, released - attack)
65
+ return @value = [linear(decay_level, 0, release, t - released), 0].max
66
+ end
67
+ if released > attack_decay # normal release
68
+ return @value = [linear(sustain, 0, release, t - released), 0].max
69
+ end
70
+ end
71
+ 0.0
72
+ end
73
+
74
+ private
75
+
76
+ def linear(start, target, length, time)
77
+ return start if time == 0
78
+ return target if length == 0
79
+ (target - start) / length * time + start
80
+ end
81
+ end
82
+ end
83
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synth_blocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Krutisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-11 00:00:00.000000000 Z
11
+ date: 2020-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -81,6 +81,7 @@ files:
81
81
  - lib/synth_blocks/mixer/mixer_channel.rb
82
82
  - lib/synth_blocks/mixer/send_channel.rb
83
83
  - lib/synth_blocks/mod/adsr.rb
84
+ - lib/synth_blocks/mod/adsr_old.rb
84
85
  - lib/synth_blocks/mod/envelope.rb
85
86
  - lib/synth_blocks/sequencer/sequencer_dsl.rb
86
87
  - lib/synth_blocks/synth/monosynth.rb
@@ -90,7 +91,7 @@ homepage: https://rubysynth.fun
90
91
  licenses:
91
92
  - AGPL-3.0-only
92
93
  metadata:
93
- source_code_uri: https://github.com/halfbyte/synth_blocks
94
+ source_code_uri: https://github.com/halfbyte/ruby_synth_blocks
94
95
  post_install_message:
95
96
  rdoc_options: []
96
97
  require_paths: