synthesizer 1.4.0 → 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: 14d7146a5b2c57f02ce56e5fb831403b9b7a54595209e49128eda52632088248
4
- data.tar.gz: d4377976ce5f4cb871ca955346904bc23a59665e24a2ae0d29238bcd33654531
3
+ metadata.gz: 0abef47757011239dac5fe3bf5b746504491ba44eca05ce22fc6564fe00e390b
4
+ data.tar.gz: f34263d9c956a57a096987824371ea1baf69f0a4cbc87fc40059101b07ce436c
5
5
  SHA512:
6
- metadata.gz: '036904dc01a816f8229173105ab88ca289078ddba804b647abb54e943b1e3859a196c2b250e078c6efea5a274f446b2b565a28985abe68f431ef25be20b6fc9a'
7
- data.tar.gz: 5387eea5b5b5b2f4326b34598927ceb0be87229eb9b1c74100d254b827d68154339594a43f50cc0b28d7781833efff023a6977d8865faf774215fc485c9aca68
6
+ metadata.gz: 60974d1c179a679d67cd5c044378f64b31b000a83baf2c989937969165fd7d317b3ef2f8747734a75fad24d40fb1cd1de02137dd1f1ffff5e6b758968e5e9626
7
+ data.tar.gz: 97c4177887836a7a0d48165e6b6181eefe9e7993b53dd451f176e427620b42f8aed431d3b24e7fe33399a5e15c1e8479426054f21355001f5cd64898e5100896
@@ -6,10 +6,21 @@ module AudioStream
6
6
  super()
7
7
 
8
8
  @synth = synth
9
-
10
9
  @soundinfo = soundinfo
11
10
  end
12
11
 
12
+ def connect
13
+ self
14
+ end
15
+
16
+ def disconnect
17
+ self
18
+ end
19
+
20
+ def connected?
21
+ true
22
+ end
23
+
13
24
  def each(&block)
14
25
  Enumerator.new do |y|
15
26
  loop {
@@ -10,5 +10,6 @@ require 'synthesizer/filter/parallel'
10
10
 
11
11
  module Synthesizer
12
12
  module Filter
13
+ DEFAULT_Q = AudioStream::Fx::BiquadFilter::DEFAULT_Q
13
14
  end
14
15
  end
@@ -1,7 +1,7 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class BandPassFilter
4
- def initialize(freq:, bandwidth:)
4
+ def initialize(freq:, bandwidth: 1.0)
5
5
  @freq = ModulationValue.create(freq)
6
6
  @bandwidth = ModulationValue.create(bandwidth)
7
7
  end
@@ -1,9 +1,9 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class HighPassFilter
4
- def initialize(freq:, q: nil)
4
+ def initialize(freq:, q: DEFAULT_Q)
5
5
  @freq = ModulationValue.create(freq)
6
- @q = ModulationValue.create(q || 1.0 / Math.sqrt(2))
6
+ @q = ModulationValue.create(q)
7
7
  end
8
8
 
9
9
  def generator(note_perform, framerate, &block)
@@ -1,9 +1,9 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class HighShelfFilter
4
- def initialize(freq:, q: nil, gain:)
4
+ def initialize(freq:, q: DEFAULT_Q, gain: 1.0)
5
5
  @freq = ModulationValue.create(freq)
6
- @q = ModulationValue.create(q || 1.0 / Math.sqrt(2))
6
+ @q = ModulationValue.create(q)
7
7
  @gain = ModulationValue.create(gain)
8
8
  end
9
9
 
@@ -1,9 +1,9 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class LowPassFilter
4
- def initialize(freq:, q: nil)
4
+ def initialize(freq:, q: DEFAULT_Q)
5
5
  @freq = ModulationValue.create(freq)
6
- @q = ModulationValue.create(q || 1.0 / Math.sqrt(2))
6
+ @q = ModulationValue.create(q)
7
7
  end
8
8
 
9
9
  def generator(note_perform, framerate, &block)
@@ -1,9 +1,9 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class LowShelfFilter
4
- def initialize(freq:, q: nil, gain:)
4
+ def initialize(freq:, q: DEFAULT_Q, gain: 1.0)
5
5
  @freq = ModulationValue.create(freq)
6
- @q = ModulationValue.create(q || 1.0 / Math.sqrt(2))
6
+ @q = ModulationValue.create(q)
7
7
  @gain = ModulationValue.create(gain)
8
8
  end
9
9
 
@@ -19,37 +19,15 @@ module Synthesizer
19
19
  end
20
20
 
21
21
  class Fx
22
- include AudioStream::Fx::BangProcess
23
-
24
22
  def initialize(fxs)
25
23
  @fxs = fxs
26
24
  end
27
25
 
28
- def process!(input)
29
- window_size = input.size
30
- channels = input.channels
31
- fx_size = @fxs.size
32
-
26
+ def process(input)
33
27
  outputs = @fxs.map {|fx|
34
28
  fx.process(input)
35
29
  }
36
-
37
- case channels
38
- when 1
39
- input.size.times {|i|
40
- input[i] = outputs.map{|buf| buf[i]}.sum / fx_size
41
- }
42
- when 2
43
- input.size.times {|i|
44
- samples = outputs.map{|buf| buf[i]}
45
- input[i] = [
46
- samples.map{|sval| sval[0]}.sum / fx_size,
47
- samples.map{|sval| sval[1]}.sum / fx_size
48
- ]
49
- }
50
- end
51
-
52
- input
30
+ AudioStream::Buffer.merge(outputs, average: true)
53
31
  end
54
32
  end
55
33
  end
@@ -1,7 +1,7 @@
1
1
  module Synthesizer
2
2
  module Filter
3
3
  class PeakingFilter
4
- def initialize(freq:, bandwidth: 1.0, gain:)
4
+ def initialize(freq:, bandwidth: 1.0, gain: 40.0)
5
5
  @freq = ModulationValue.create(freq)
6
6
  @bandwidth = ModulationValue.create(bandwidth)
7
7
  @gain = ModulationValue.create(gain)
@@ -19,15 +19,13 @@ module Synthesizer
19
19
  end
20
20
 
21
21
  class Fx
22
- include AudioStream::Fx::BangProcess
23
-
24
22
  def initialize(fxs)
25
23
  @fxs = fxs
26
24
  end
27
25
 
28
- def process!(input)
26
+ def process(input)
29
27
  @fxs.each {|fx|
30
- fx.process!(input)
28
+ input = fx.process(input)
31
29
  }
32
30
  input
33
31
  end
@@ -40,7 +40,7 @@ module Synthesizer
40
40
  @perform = nil
41
41
  end
42
42
  end
43
- buf || AudioStream::Buffer.float(@soundinfo.window_size, @soundinfo.channels)
43
+ buf || AudioStream::Buffer.create(@soundinfo.window_size, @soundinfo.channels)
44
44
  end
45
45
 
46
46
  # @param note [Synthesizer::Note]
@@ -37,9 +37,11 @@ module Synthesizer
37
37
  # delete released note performs
38
38
  @performs.delete_if {|note_num, perform| perform.released? }
39
39
 
40
- buf = bufs.inject(:+)
40
+ if 0<bufs.length
41
+ buf = AudioStream::Buffer.merge(bufs)
42
+ end
41
43
  end
42
- buf || AudioStream::Buffer.float(@soundinfo.window_size, @soundinfo.channels)
44
+ buf || AudioStream::Buffer.create(@soundinfo.window_size, @soundinfo.channels)
43
45
  end
44
46
 
45
47
  # @param note [Synthesizer::Note]
@@ -29,7 +29,8 @@ module Synthesizer
29
29
  case channels
30
30
  when 1
31
31
  loop {
32
- buf = AudioStream::Buffer.float(window_size, channels)
32
+ buf = AudioStream::Buffer.create_mono(window_size)
33
+ dst0 = buf.streams[0]
33
34
 
34
35
  window_size.times.each {|i|
35
36
  # Oscillator, Amplifier
@@ -49,14 +50,16 @@ module Synthesizer
49
50
  mval = filter_fx.process_mono(mval)
50
51
  end
51
52
 
52
- buf[i] = mval
53
+ dst0[i] = mval
53
54
  }
54
55
 
55
56
  y << buf
56
57
  }
57
58
  when 2
58
59
  loop {
59
- buf = AudioStream::Buffer.float(window_size, channels)
60
+ buf = AudioStream::Buffer.create_stereo(window_size)
61
+ dst0 = buf.streams[0]
62
+ dst1 = buf.streams[1]
60
63
 
61
64
  window_size.times.each {|i|
62
65
  # Oscillator, Amplifier
@@ -76,7 +79,8 @@ module Synthesizer
76
79
  sval = filter_fx.process_stereo(sval)
77
80
  end
78
81
 
79
- buf[i] = sval
82
+ dst0[i] = sval[0]
83
+ dst1[i] = sval[1]
80
84
  }
81
85
 
82
86
  y << buf
@@ -29,7 +29,8 @@ module Synthesizer
29
29
  case channels
30
30
  when 1
31
31
  loop {
32
- buf = AudioStream::Buffer.float(window_size, channels)
32
+ buf = AudioStream::Buffer.create_mono(window_size)
33
+ dst0 = buf.streams[0]
33
34
 
34
35
  # Oscillator, Amplifier
35
36
  volume = volume_mod.next * note_perform.velocity
@@ -41,20 +42,22 @@ module Synthesizer
41
42
 
42
43
  window_size.times.each {|i|
43
44
  val = unison.next(uni_num, uni_detune, volume, 0.0, tune_semis, tune_cents)
44
- buf[i] = (val[0] + val[1]) / 2.0
45
+ dst0[i] = (val[0] + val[1]) / 2.0
45
46
  }
46
47
 
47
48
  # Filter
48
49
  if filter_mod
49
50
  filter_fx = filter_mod.next
50
- filter_fx.process!(buf)
51
+ buf = filter_fx.process(buf)
51
52
  end
52
53
 
53
54
  y << buf
54
55
  }
55
56
  when 2
56
57
  loop {
57
- buf = AudioStream::Buffer.float(window_size, channels)
58
+ buf = AudioStream::Buffer.create_stereo(window_size)
59
+ dst0 = buf.streams[0]
60
+ dst1 = buf.streams[1]
58
61
 
59
62
  # Oscillator, Amplifier
60
63
  volume = volume_mod.next * note_perform.velocity
@@ -66,13 +69,15 @@ module Synthesizer
66
69
  uni_detune = uni_detune_mod.next
67
70
 
68
71
  window_size.times.each {|i|
69
- buf[i] = unison.next(uni_num, uni_detune, volume, pan, tune_semis, tune_cents)
72
+ val = unison.next(uni_num, uni_detune, volume, pan, tune_semis, tune_cents)
73
+ dst0[i] = val[0]
74
+ dst1[i] = val[1]
70
75
  }
71
76
 
72
77
  # Filter
73
78
  if filter_mod
74
79
  filter_fx = filter_mod.next
75
- filter_fx.process!(buf)
80
+ buf = filter_fx.process(buf)
76
81
  end
77
82
 
78
83
  y << buf
@@ -1,3 +1,3 @@
1
1
  module Synthesizer
2
- VERSION = "1.4.0"
2
+ VERSION = "2.0.0"
3
3
  end
data/synthesizer.gemspec CHANGED
@@ -30,5 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "rake", "~> 12.0"
31
31
  spec.add_development_dependency "minitest", "~> 5.0"
32
32
 
33
- spec.add_dependency "audio_stream", ">= 1.3.0"
33
+ spec.add_dependency "audio_stream", ">= 2.0.0"
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synthesizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshida Tetsuya
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-07-27 00:00:00.000000000 Z
11
+ date: 2019-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 1.3.0
61
+ version: 2.0.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 1.3.0
68
+ version: 2.0.0
69
69
  description: Synthesizer implemented in Ruby.
70
70
  email:
71
71
  - yoshida.eth0@gmail.com