synthesizer 1.4.0 → 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: 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