audio_stream 3.3.3 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/examples/bench_fx.rb +89 -0
  4. data/examples/canon.wav +0 -0
  5. data/examples/example_options.rb +2 -0
  6. data/examples/{chorus.rb → fx_chorus.rb} +2 -7
  7. data/examples/fx_compressor.rb +34 -0
  8. data/examples/fx_convolution_reverb.rb +37 -0
  9. data/examples/fx_delay.rb +33 -0
  10. data/examples/{distortion.rb → fx_distortion.rb} +4 -8
  11. data/examples/fx_noise_gate.rb +33 -0
  12. data/examples/fx_phaser.rb +36 -0
  13. data/examples/fx_schroeder_reverb.rb +34 -0
  14. data/examples/fx_vocoder.rb +44 -0
  15. data/examples/impulse_shaker.wav +0 -0
  16. data/examples/impulse_shaker_bigroom.wav +0 -0
  17. data/examples/impulse_shaker_smallhall.wav +0 -0
  18. data/examples/tuner.rb +4 -3
  19. data/jupyter/band_pass_filter.ipynb +117 -0
  20. data/jupyter/biquad.ipynb +372 -0
  21. data/jupyter/equalizer.ipynb +198 -0
  22. data/lib/audio_stream/audio_input_device.rb +20 -3
  23. data/lib/audio_stream/audio_observable.rb +5 -0
  24. data/lib/audio_stream/audio_output_device.rb +20 -3
  25. data/lib/audio_stream/buffer.rb +22 -0
  26. data/lib/audio_stream/decibel.rb +8 -8
  27. data/lib/audio_stream/fx/a_gain.rb +2 -6
  28. data/lib/audio_stream/fx/all_pass_filter.rb +4 -2
  29. data/lib/audio_stream/fx/band_pass_filter.rb +4 -2
  30. data/lib/audio_stream/fx/biquad_filter.rb +8 -3
  31. data/lib/audio_stream/fx/chorus.rb +6 -5
  32. data/lib/audio_stream/fx/comb_filter.rb +4 -2
  33. data/lib/audio_stream/fx/convolution_reverb.rb +8 -5
  34. data/lib/audio_stream/fx/delay.rb +6 -5
  35. data/lib/audio_stream/fx/distortion.rb +4 -4
  36. data/lib/audio_stream/fx/equalizer_2band.rb +5 -3
  37. data/lib/audio_stream/fx/equalizer_3band.rb +7 -0
  38. data/lib/audio_stream/fx/graphic_equalizer.rb +4 -0
  39. data/lib/audio_stream/fx/hanning_window.rb +0 -9
  40. data/lib/audio_stream/fx/high_pass_filter.rb +4 -2
  41. data/lib/audio_stream/fx/high_shelf_filter.rb +6 -7
  42. data/lib/audio_stream/fx/low_pass_filter.rb +4 -2
  43. data/lib/audio_stream/fx/low_shelf_filter.rb +6 -7
  44. data/lib/audio_stream/fx/noise_gate.rb +5 -4
  45. data/lib/audio_stream/fx/panning.rb +2 -1
  46. data/lib/audio_stream/fx/peaking_filter.rb +6 -7
  47. data/lib/audio_stream/fx/phaser.rb +7 -6
  48. data/lib/audio_stream/fx/schroeder_reverb.rb +9 -10
  49. data/lib/audio_stream/fx/tremolo.rb +7 -5
  50. data/lib/audio_stream/rate.rb +30 -5
  51. data/lib/audio_stream/version.rb +1 -1
  52. metadata +23 -10
  53. data/examples/biquad.ipynb +0 -428
  54. data/examples/equalizer.ipynb +0 -233
@@ -3,24 +3,23 @@ module AudioStream
3
3
  class SchroederReverb
4
4
 
5
5
  # @param soundinfo [AudioStream::SoundInfo]
6
- # @param time [AudioStream::Rate] reverb time
7
- # @param dry [AudioStream::Decibel] dry gain
8
- # @param wet [AudioStream::Decibel] wet gain
9
- def initialize(soundinfo, time:, dry: -1.0, wet: -20.0)
6
+ # @param dry [AudioStream::Decibel | Float] dry gain
7
+ # @param wet [AudioStream::Decibel | Float] wet gain
8
+ def initialize(soundinfo, dry: -1.0, wet: -20.0)
10
9
  @window_size = soundinfo.window_size
11
10
  @combs = [
12
- CombFilter.new(soundinfo, freq: time * (39.85 * 0.002), q: 0.871402),
13
- CombFilter.new(soundinfo, freq: time * (36.10 * 0.002), q: 0.882762),
14
- CombFilter.new(soundinfo, freq: time * (33.27 * 0.002), q: 0.891443),
15
- CombFilter.new(soundinfo, freq: time * (30.15 * 0.002), q: 0.901117),
11
+ CombFilter.new(soundinfo, freq: Rate.msec(39.85), q: 0.871402),
12
+ CombFilter.new(soundinfo, freq: Rate.msec(36.10), q: 0.882762),
13
+ CombFilter.new(soundinfo, freq: Rate.msec(33.27), q: 0.891443),
14
+ CombFilter.new(soundinfo, freq: Rate.msec(30.15), q: 0.901117),
16
15
  ]
17
16
  @allpasss = [
18
17
  AllPassFilter.create(soundinfo, freq: Rate.msec(5.0).freq(soundinfo), q: BiquadFilter::DEFAULT_Q),
19
18
  AllPassFilter.create(soundinfo, freq: Rate.msec(1.7).freq(soundinfo), q: BiquadFilter::DEFAULT_Q),
20
19
  ]
21
20
 
22
- @dry = Decibel.create(dry).mag
23
- @wet = Decibel.create(wet).mag
21
+ @dry = Decibel.db(dry).mag
22
+ @wet = Decibel.db(wet).mag
24
23
  end
25
24
 
26
25
  def process(input)
@@ -1,23 +1,25 @@
1
1
  module AudioStream
2
2
  module Fx
3
3
  class Tremolo
4
+ # @param soundinfo [AudioStream::SoundInfo]
5
+ # @param freq [AudioStream::Rate | Float] Tremolo speed (0.0~)
6
+ # @param depth [Float] Tremolo depth (0.0~)
4
7
  def initialize(soundinfo, freq:, depth:)
5
- @samplerate = soundinfo.samplerate
6
- @freq = freq.to_f
8
+ @freq = Rate.freq(freq)
7
9
  @depth = depth.to_f
8
10
  @phase = 0
11
+ @period = @freq.sample_phase(soundinfo)
9
12
  end
10
13
 
11
14
  def process(input)
12
15
  window_size = input.window_size
13
- period = 2 * Math::PI * @freq / @samplerate
14
16
 
15
17
  streams = input.streams.map {|stream|
16
18
  stream.map.with_index {|f, i|
17
- f * (1.0 + @depth * Math.sin((i + @phase) * period))
19
+ f * (1.0 + @depth * Math.sin((i + @phase) * @period))
18
20
  }
19
21
  }
20
- @phase = (@phase + window_size) % (window_size / period)
22
+ @phase = (@phase + window_size) % (window_size / @period)
21
23
 
22
24
  Buffer.new(*streams)
23
25
  end
@@ -47,6 +47,11 @@ module AudioStream
47
47
  2.0 * Math::PI / sample(soundinfo)
48
48
  end
49
49
 
50
+ def add(other, soundinfo)
51
+ other = self.class.sec(other)
52
+ self.class.new(sec: self.sec(soundinfo) + other.sec(soundinfo))
53
+ end
54
+
50
55
  def *(other)
51
56
  other = other.to_f
52
57
 
@@ -68,23 +73,43 @@ module AudioStream
68
73
  end
69
74
 
70
75
  def self.sec(v)
71
- new(sec: v)
76
+ if self===v
77
+ v
78
+ else
79
+ new(sec: v)
80
+ end
72
81
  end
73
82
 
74
83
  def self.msec(v)
75
- new(sec: v*0.001)
84
+ if self===v
85
+ v
86
+ else
87
+ new(sec: v*0.001)
88
+ end
76
89
  end
77
90
 
78
91
  def self.sample(v)
79
- new(sample: v)
92
+ if self===v
93
+ v
94
+ else
95
+ new(sample: v)
96
+ end
80
97
  end
81
98
 
82
99
  def self.freq(v)
83
- new(freq: v)
100
+ if self===v
101
+ v
102
+ else
103
+ new(freq: v)
104
+ end
84
105
  end
85
106
 
86
107
  def self.sync(v)
87
- new(sync: v)
108
+ if self===v
109
+ v
110
+ else
111
+ new(sync: v)
112
+ end
88
113
  end
89
114
 
90
115
 
@@ -1,3 +1,3 @@
1
1
  module AudioStream
2
- VERSION = "3.3.3"
2
+ VERSION = "3.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audio_stream
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.3
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshida Tetsuya
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-04 00:00:00.000000000 Z
11
+ date: 2021-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -138,15 +138,28 @@ files:
138
138
  - audio_stream.gemspec
139
139
  - bin/console
140
140
  - bin/setup
141
- - examples/biquad.ipynb
142
- - examples/chorus.rb
143
- - examples/distortion.rb
144
- - examples/equalizer.ipynb
141
+ - examples/bench_fx.rb
142
+ - examples/canon.wav
145
143
  - examples/example_options.rb
144
+ - examples/fx_chorus.rb
145
+ - examples/fx_compressor.rb
146
+ - examples/fx_convolution_reverb.rb
147
+ - examples/fx_delay.rb
148
+ - examples/fx_distortion.rb
149
+ - examples/fx_noise_gate.rb
150
+ - examples/fx_phaser.rb
151
+ - examples/fx_schroeder_reverb.rb
152
+ - examples/fx_vocoder.rb
153
+ - examples/impulse_shaker.wav
154
+ - examples/impulse_shaker_bigroom.wav
155
+ - examples/impulse_shaker_smallhall.wav
146
156
  - examples/lpf.rb
147
157
  - examples/rec.rb
148
158
  - examples/tremolo.rb
149
159
  - examples/tuner.rb
160
+ - jupyter/band_pass_filter.ipynb
161
+ - jupyter/biquad.ipynb
162
+ - jupyter/equalizer.ipynb
150
163
  - lib/audio_stream.rb
151
164
  - lib/audio_stream/audio_bus.rb
152
165
  - lib/audio_stream/audio_input.rb
@@ -208,7 +221,7 @@ metadata:
208
221
  homepage_uri: https://github.com/yoshida-eth0/ruby-audio_stream
209
222
  source_code_uri: https://github.com/yoshida-eth0/ruby-audio_stream
210
223
  changelog_uri: https://github.com/yoshida-eth0/ruby-audio_stream
211
- post_install_message:
224
+ post_install_message:
212
225
  rdoc_options: []
213
226
  require_paths:
214
227
  - lib
@@ -223,8 +236,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
236
  - !ruby/object:Gem::Version
224
237
  version: '0'
225
238
  requirements: []
226
- rubygems_version: 3.0.3
227
- signing_key:
239
+ rubygems_version: 3.2.3
240
+ signing_key:
228
241
  specification_version: 4
229
242
  summary: AudioStream is a Digital Audio Workstation for CLI
230
243
  test_files: []