synth_blocks 1.0.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: