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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/examples/bench_fx.rb +89 -0
- data/examples/canon.wav +0 -0
- data/examples/example_options.rb +2 -0
- data/examples/{chorus.rb → fx_chorus.rb} +2 -7
- data/examples/fx_compressor.rb +34 -0
- data/examples/fx_convolution_reverb.rb +37 -0
- data/examples/fx_delay.rb +33 -0
- data/examples/{distortion.rb → fx_distortion.rb} +4 -8
- data/examples/fx_noise_gate.rb +33 -0
- data/examples/fx_phaser.rb +36 -0
- data/examples/fx_schroeder_reverb.rb +34 -0
- data/examples/fx_vocoder.rb +44 -0
- data/examples/impulse_shaker.wav +0 -0
- data/examples/impulse_shaker_bigroom.wav +0 -0
- data/examples/impulse_shaker_smallhall.wav +0 -0
- data/examples/tuner.rb +4 -3
- data/jupyter/band_pass_filter.ipynb +117 -0
- data/jupyter/biquad.ipynb +372 -0
- data/jupyter/equalizer.ipynb +198 -0
- data/lib/audio_stream/audio_input_device.rb +20 -3
- data/lib/audio_stream/audio_observable.rb +5 -0
- data/lib/audio_stream/audio_output_device.rb +20 -3
- data/lib/audio_stream/buffer.rb +22 -0
- data/lib/audio_stream/decibel.rb +8 -8
- data/lib/audio_stream/fx/a_gain.rb +2 -6
- data/lib/audio_stream/fx/all_pass_filter.rb +4 -2
- data/lib/audio_stream/fx/band_pass_filter.rb +4 -2
- data/lib/audio_stream/fx/biquad_filter.rb +8 -3
- data/lib/audio_stream/fx/chorus.rb +6 -5
- data/lib/audio_stream/fx/comb_filter.rb +4 -2
- data/lib/audio_stream/fx/convolution_reverb.rb +8 -5
- data/lib/audio_stream/fx/delay.rb +6 -5
- data/lib/audio_stream/fx/distortion.rb +4 -4
- data/lib/audio_stream/fx/equalizer_2band.rb +5 -3
- data/lib/audio_stream/fx/equalizer_3band.rb +7 -0
- data/lib/audio_stream/fx/graphic_equalizer.rb +4 -0
- data/lib/audio_stream/fx/hanning_window.rb +0 -9
- data/lib/audio_stream/fx/high_pass_filter.rb +4 -2
- data/lib/audio_stream/fx/high_shelf_filter.rb +6 -7
- data/lib/audio_stream/fx/low_pass_filter.rb +4 -2
- data/lib/audio_stream/fx/low_shelf_filter.rb +6 -7
- data/lib/audio_stream/fx/noise_gate.rb +5 -4
- data/lib/audio_stream/fx/panning.rb +2 -1
- data/lib/audio_stream/fx/peaking_filter.rb +6 -7
- data/lib/audio_stream/fx/phaser.rb +7 -6
- data/lib/audio_stream/fx/schroeder_reverb.rb +9 -10
- data/lib/audio_stream/fx/tremolo.rb +7 -5
- data/lib/audio_stream/rate.rb +30 -5
- data/lib/audio_stream/version.rb +1 -1
- metadata +23 -10
- data/examples/biquad.ipynb +0 -428
- data/examples/equalizer.ipynb +0 -233
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 136133ba8dc91cfa246f44a7618198b2377f433fe9a8528b95a7fe75d2e95bd6
|
4
|
+
data.tar.gz: de85dc57a4838981d3af11d3a2b613c39834047c38df312f0e1d88ed135dbe12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b0313cd38430fcb8021f8de6ecf7293b272c2ff607829116895056a6c8c5aa42d9c6cb9a0cda8f020aa2d69caac8dbc3a06519e3442dbd528f55352043ccc83
|
7
|
+
data.tar.gz: d03fe6d92da4211215da683da3c65b6bbb03e513706cb0a534d9af32e621ed20e3a4aecff27d522cdf7e4d11eb1eb3a8b6bb48fa4e1bf0b959ab2d370abe2052
|
data/.gitignore
CHANGED
@@ -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
|
+
}
|
data/examples/canon.wav
ADDED
Binary file
|
data/examples/example_options.rb
CHANGED
@@ -8,13 +8,11 @@ track1 = $input
|
|
8
8
|
|
9
9
|
# Fx
|
10
10
|
|
11
|
-
|
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(
|
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:
|
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
|
-
|
27
|
-
|
25
|
+
#.fx(noise_gate)
|
26
|
+
#.fx(compressor)
|
28
27
|
.fx(distortion)
|
29
|
-
.send_to(
|
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
|
Binary file
|
data/examples/tuner.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
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
|
|