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
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