audio_stream 3.3.3 → 3.4.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.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 323737f59491d3d370ca863c47eb54a2bce18dad3e1bf97d29674725e9e4213d
4
- data.tar.gz: 4b1c734a8249a74f49a4a971535c4a2ed8c305de2e671ef4038a3766c17ab733
3
+ metadata.gz: 136133ba8dc91cfa246f44a7618198b2377f433fe9a8528b95a7fe75d2e95bd6
4
+ data.tar.gz: de85dc57a4838981d3af11d3a2b613c39834047c38df312f0e1d88ed135dbe12
5
5
  SHA512:
6
- metadata.gz: a0b928495b8a46798be15e08254216fc9abea9b88d361abd96a9de0ea5d9449328a64509932d592a3307906be3a643344b6a46a1671e6f499fcf7c2d987675f5
7
- data.tar.gz: bcc7884d895e368710535f8f265fdb1d4ba6080d14fcbd50195f3734a43a88518377a75111d6b00c51a6bb05bcba43997bd374537ce05d03998da8618c57f3d6
6
+ metadata.gz: 4b0313cd38430fcb8021f8de6ecf7293b272c2ff607829116895056a6c8c5aa42d9c6cb9a0cda8f020aa2d69caac8dbc3a06519e3442dbd528f55352043ccc83
7
+ data.tar.gz: d03fe6d92da4211215da683da3c65b6bbb03e513706cb0a534d9af32e621ed20e3a4aecff27d522cdf7e4d11eb1eb3a8b6bb48fa4e1bf0b959ab2d370abe2052
data/.gitignore CHANGED
@@ -6,3 +6,5 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ Gemfile.lock
10
+ .ipynb_checkpoints/
@@ -0,0 +1,89 @@
1
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
2
+
3
+ require 'benchmark'
4
+ require 'audio_stream'
5
+
6
+ include AudioStream
7
+ include AudioStream::Fx
8
+
9
+ n = 100
10
+
11
+ soundinfo = SoundInfo.new(
12
+ channels: 2,
13
+ samplerate: 44100,
14
+ window_size: 1024,
15
+ format: RubyAudio::FORMAT_WAV|RubyAudio::FORMAT_PCM_16
16
+ )
17
+
18
+ src0_arr = Array.new(1024) {|i| Random.rand}
19
+ src1_arr = Array.new(1024) {|i| Random.rand}
20
+
21
+ src0_vdsp = Vdsp::DoubleArray.create(src0_arr)
22
+ src1_vdsp = Vdsp::DoubleArray.create(src1_arr)
23
+ src = AudioStream::Buffer.new(src0_vdsp, src1_vdsp)
24
+
25
+
26
+ fxs = [
27
+ "Dynamics fx",
28
+ AGain.new(level: -6),
29
+ Panning.new(pan: 1.0),
30
+ Compressor.new(threshold: 0.5, ratio: 0.5),
31
+ NoiseGate.new(threshold: 0.001),
32
+
33
+ "Distortion fx",
34
+ Distortion.new(gain: 50, level: -20),
35
+
36
+ "Modulation fx",
37
+ Chorus.new(soundinfo, depth: 100, rate: 4),
38
+ Phaser.new(soundinfo, rate: 1.4, depth: 3.5, freq: 800, dry: -6, wet: -6),
39
+ Tremolo.new(soundinfo, freq: 5, depth: 0.2),
40
+ Delay.new(soundinfo, time: 0.2, level: -6, feedback: -15),
41
+ CombFilter.new(soundinfo, freq: 1000, q: 0.8),
42
+ SchroederReverb.new(soundinfo, dry: -1, wet: -10),
43
+ -> {
44
+ impulse = AudioInput.file(File.dirname(__FILE__)+"/impulse_shaker.wav", soundinfo: soundinfo)
45
+ .connect.to_a.map(&:stereo)
46
+ ConvolutionReverb.new(impulse, dry: -6, wet: -6)
47
+ }[],
48
+
49
+ "Window fx",
50
+ HanningWindow.instance,
51
+
52
+ "Filter fx",
53
+ LowPassFilter.create(soundinfo, freq: 440.0, q: BiquadFilter::DEFAULT_Q),
54
+ HighPassFilter.create(soundinfo, freq: 440.0, q: BiquadFilter::DEFAULT_Q),
55
+ LowShelfFilter.create(soundinfo, freq: 440.0, q: BiquadFilter::DEFAULT_Q, gain: 5),
56
+ HighShelfFilter.create(soundinfo, freq: 440.0, q: BiquadFilter::DEFAULT_Q, gain: 5),
57
+ BandPassFilter.create(soundinfo, freq: 440.0, bandwidth: 0.5),
58
+ PeakingFilter.create(soundinfo, freq: 440.0, bandwidth: 0.5, gain: 5),
59
+ AllPassFilter.create(soundinfo, freq: 440.0, q: BiquadFilter::DEFAULT_Q),
60
+
61
+ "Equalizer fx",
62
+ Equalizer2band.new(soundinfo, lowgain: 3, highgain: 5),
63
+ Equalizer3band.new(soundinfo, lowgain: 3, midgain: 1, highgain: 5),
64
+ GraphicEqualizer.new(soundinfo)
65
+ .add(freq: 100, gain: 8)
66
+ .add(freq: 200, gain: 4)
67
+ .add(freq: 400, gain: -4)
68
+ .add(freq: 800, gain: -8)
69
+ .add(freq: 1600, gain: 4)
70
+ .add(freq: 3200, gain: 8),
71
+ ]
72
+
73
+
74
+ fxs.each {|fx|
75
+ if String===fx
76
+ puts
77
+ puts "[#{fx}]"
78
+
79
+ else
80
+ time = Benchmark.realtime do
81
+ n.times {
82
+ fx.process(src)
83
+ }
84
+ end
85
+
86
+ name = fx.class.name.split('::').last
87
+ puts " #{name.ljust(20)} : #{time}"
88
+ end
89
+ }
Binary file
@@ -1,3 +1,5 @@
1
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
2
+
1
3
  require 'audio_stream'
2
4
  require 'optparse'
3
5
 
@@ -8,13 +8,11 @@ track1 = $input
8
8
 
9
9
  # Fx
10
10
 
11
- compressor = Compressor.new(threshold: 0.3, ratio: 0.5)
12
- chorus = Chorus.new($soundinfo, depth: 100, rate: 0.25)
11
+ chorus = Chorus.new($soundinfo, depth: 100, rate: 4)
13
12
 
14
13
 
15
14
  # Bus
16
15
 
17
- bus1 = AudioBus.new
18
16
  stereo_out = AudioOutput.device(soundinfo: $soundinfo)
19
17
 
20
18
 
@@ -23,10 +21,7 @@ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
23
21
  track1
24
22
  .stereo
25
23
  .fx(chorus)
26
- .send_to(bus1, gain: 1.0, pan: 0.0)
27
-
28
- bus1
29
- .send_to(stereo_out)
24
+ .send_to(stereo_out, gain: -6)
30
25
 
31
26
 
32
27
  # start
@@ -0,0 +1,34 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ compressor = Compressor.new(threshold: 0.4, ratio: 0.2)
12
+
13
+
14
+ # Bus
15
+
16
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
17
+
18
+
19
+ # Mixer
20
+
21
+ track1
22
+ .stereo
23
+ .fx(compressor)
24
+ .send_to(stereo_out, gain: -6)
25
+
26
+
27
+ # start
28
+
29
+ conductor = Conductor.new(
30
+ input: track1,
31
+ output: stereo_out
32
+ )
33
+ conductor.connect
34
+ conductor.join
@@ -0,0 +1,37 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ #impulse = AudioInput.file(File.dirname(__FILE__)+"/impulse_shaker.wav", soundinfo: $soundinfo).connect
12
+ impulse = AudioInput.file(File.dirname(__FILE__)+"/impulse_shaker_smallhall.wav", soundinfo: $soundinfo).connect
13
+ #impulse = AudioInput.file(File.dirname(__FILE__)+"/impulse_shaker_bigroom.wav", soundinfo: $soundinfo).connect
14
+ pp impulse
15
+ reverb = ConvolutionReverb.new(impulse, dry: -6, wet: -6)
16
+
17
+
18
+ # Bus
19
+
20
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
21
+
22
+
23
+ # Mixer
24
+
25
+ track1
26
+ .fx(reverb)
27
+ .send_to(stereo_out)
28
+
29
+
30
+ # start
31
+
32
+ conductor = Conductor.new(
33
+ input: track1,
34
+ output: stereo_out
35
+ )
36
+ conductor.connect
37
+ conductor.join
@@ -0,0 +1,33 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ delay = Delay.new($soundinfo, time: 0.2, level: -6, feedback: -15)
12
+
13
+
14
+ # Bus
15
+
16
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
17
+
18
+
19
+ # Mixer
20
+
21
+ track1
22
+ .fx(delay)
23
+ .send_to(stereo_out, gain: -6)
24
+
25
+
26
+ # start
27
+
28
+ conductor = Conductor.new(
29
+ input: track1,
30
+ output: stereo_out
31
+ )
32
+ conductor.connect
33
+ conductor.join
@@ -10,26 +10,22 @@ track1 = $input
10
10
 
11
11
  noise_gate = Compressor.new(threshold: 0.1, ratio: 10.0)
12
12
  compressor = Compressor.new(threshold: 0.3, ratio: 0.5)
13
- distortion = Distortion.new(gain: 300, level:0.1)
13
+ distortion = Distortion.new(gain: 50, level: -20)
14
14
  eq_2band = Equalizer2band.new($soundinfo, lowgain: 0.0, highgain: -10.0)
15
15
 
16
16
 
17
17
  # Bus
18
18
 
19
- bus1 = AudioBus.new
20
19
  stereo_out = AudioOutput.device(soundinfo: $soundinfo)
21
20
 
22
21
 
23
22
  # Mixer
24
23
 
25
24
  track1
26
- .fx(noise_gate)
27
- .fx(compressor)
25
+ #.fx(noise_gate)
26
+ #.fx(compressor)
28
27
  .fx(distortion)
29
- .send_to(bus1)
30
-
31
- bus1
32
- .send_to(stereo_out)
28
+ .send_to(stereo_out, gain: -6)
33
29
 
34
30
 
35
31
  # start
@@ -0,0 +1,33 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ noise_gate = NoiseGate.new(threshold: 0.001)
12
+
13
+
14
+ # Bus
15
+
16
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
17
+
18
+
19
+ # Mixer
20
+
21
+ track1
22
+ .fx(noise_gate)
23
+ .send_to(stereo_out)
24
+
25
+
26
+ # start
27
+
28
+ conductor = Conductor.new(
29
+ input: track1,
30
+ output: stereo_out
31
+ )
32
+ conductor.connect
33
+ conductor.join
@@ -0,0 +1,36 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ phaser1 = Phaser.new($soundinfo, rate: 1.4, depth: 3.5, freq: 800, dry: -6, wet: -6)
12
+ phaser2 = Phaser.new($soundinfo, rate: 1.83, depth: 3.5, freq: 1357, dry: -6, wet: -6)
13
+
14
+
15
+ # Bus
16
+
17
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
18
+
19
+
20
+ # Mixer
21
+
22
+ track1
23
+ .mono
24
+ .fx(phaser1)
25
+ .fx(phaser2)
26
+ .send_to(stereo_out, gain: -1)
27
+
28
+
29
+ # start
30
+
31
+ conductor = Conductor.new(
32
+ input: track1,
33
+ output: stereo_out
34
+ )
35
+ conductor.connect
36
+ conductor.join
@@ -0,0 +1,34 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ track1 = $input
7
+
8
+
9
+ # Fx
10
+
11
+ reverb = SchroederReverb.new($soundinfo, dry: -1, wet: -10)
12
+ #reverb = CombFilter.new($soundinfo, freq: 30.15 / 1000 * 44100, q: 0.7)
13
+
14
+
15
+ # Bus
16
+
17
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
18
+
19
+
20
+ # Mixer
21
+
22
+ track1
23
+ .fx(reverb)
24
+ .send_to(stereo_out, gain: -6)
25
+
26
+
27
+ # start
28
+
29
+ conductor = Conductor.new(
30
+ input: track1,
31
+ output: stereo_out
32
+ )
33
+ conductor.connect
34
+ conductor.join
@@ -0,0 +1,44 @@
1
+ require_relative 'example_options'
2
+
3
+
4
+ # Track
5
+
6
+ modulator = $input
7
+ #modulator = AudioInput.file(File.dirname(__FILE__)+"/modulator.wav", soundinfo: $soundinfo).connect
8
+ #carrier = AudioInput.file(File.dirname(__FILE__)+"/canon.wav", soundinfo: $soundinfo).connect.seek(1024*4)
9
+ carrier = AudioInput.file(File.dirname(__FILE__)+"/canon.wav", soundinfo: $soundinfo).connect
10
+
11
+
12
+ # Fx
13
+
14
+ vocoder = Vocoder.new($soundinfo)
15
+ compressor = Compressor.new(threshold: 0.4, ratio: 0.2)
16
+
17
+
18
+ # Bus
19
+
20
+ bus1 = AudioBus.new
21
+ stereo_out = AudioOutput.device(soundinfo: $soundinfo)
22
+ #stereo_out = AudioOutput.file("vocoder_out.wav", soundinfo: $soundinfo)
23
+
24
+
25
+ # Mixer
26
+
27
+ modulator
28
+ .fx(compressor)
29
+ .send_to(bus1)
30
+
31
+ carrier
32
+ .fx(vocoder, side: bus1)
33
+ .fx(compressor)
34
+ .send_to(stereo_out, gain: -1)
35
+
36
+
37
+ # start
38
+
39
+ conductor = Conductor.new(
40
+ input: [modulator, carrier],
41
+ output: stereo_out
42
+ )
43
+ conductor.connect
44
+ conductor.join
Binary file
Binary file
data/examples/tuner.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'audio_stream'
1
+ require_relative 'example_options'
2
2
 
3
3
  include AudioStream
4
4
  include AudioStream::Fx
@@ -14,7 +14,8 @@ soundinfo = SoundInfo.new(
14
14
  # Track
15
15
 
16
16
  #track1 = AudioInput.sin(454.0, 100, 2048, soundinfo: soundinfo)
17
- track1 = AudioInput.device(soundinfo: soundinfo)
17
+ #track1 = AudioInput.device(soundinfo: soundinfo)
18
+ track1 = $input
18
19
 
19
20
 
20
21
  # Audio FX
@@ -58,7 +59,7 @@ track1
58
59
  print "\r% 4.3fhz % 5s% 2d %s % 2.3f" % [tone.freq, tone.note, tone.octave, bar, tone.diff]
59
60
 
60
61
  else
61
- print "\r ---.---hz NOINPUT"
62
+ print "\r ---.---hz NOINPUT "
62
63
  end
63
64
  }
64
65