voicemeeter_api_ruby 4.2.0 → 4.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -1
- data/README.md +19 -0
- data/lib/voicemeeter/base.rb +3 -3
- data/lib/voicemeeter/bus.rb +4 -12
- data/lib/voicemeeter/button.rb +2 -2
- data/lib/voicemeeter/cbindings.rb +2 -2
- data/lib/voicemeeter/command.rb +2 -2
- data/lib/voicemeeter/configs.rb +1 -1
- data/lib/voicemeeter/device.rb +2 -2
- data/lib/voicemeeter/inst.rb +1 -1
- data/lib/voicemeeter/iremote.rb +2 -2
- data/lib/voicemeeter/kinds.rb +71 -69
- data/lib/voicemeeter/meta.rb +181 -179
- data/lib/voicemeeter/mixin.rb +61 -0
- data/lib/voicemeeter/recorder.rb +2 -2
- data/lib/voicemeeter/runvm.rb +24 -22
- data/lib/voicemeeter/strip.rb +8 -19
- data/lib/voicemeeter/vban.rb +3 -3
- data/lib/voicemeeter/version.rb +24 -2
- data/lib/voicemeeter.rb +8 -8
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4cc1526b0ea929bc7acecca20df4f497aeaacd1a7cca3549369304dec5599dc7
|
|
4
|
+
data.tar.gz: 8b4acc90968eff552c7b86194b45c513ca3d0fe6e9c1b29ca0a448f67f0fc877
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8ca033d3cfefdfd1120044cf8a44b105ca29f3eb32ae623cdd91a6b9bad98e2ccf7add3dae67c0407b2ff647eebb070429dfe9b85472ae2daa146ff945f528e9
|
|
7
|
+
data.tar.gz: f2fae61b46e6596337bbb9915d86c9e653cd2e145a3405d4f2ba9a1ac96f6a0be472f8012610aca237911e5935aa22a29ccc41ec646e196d86296d3a0ae15177
|
data/CHANGELOG.md
CHANGED
|
@@ -9,7 +9,24 @@ Before any major/minor/patch is released all unit tests will be run to verify th
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased] - These changes have not been added to RubyGems yet
|
|
11
11
|
|
|
12
|
-
- [ ]
|
|
12
|
+
- [ ]
|
|
13
|
+
|
|
14
|
+
## [4.3.0] - 2022-07-29
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Mixin module
|
|
19
|
+
- xy, fx parameters to strip/bus
|
|
20
|
+
- unit tests for xy, fx
|
|
21
|
+
- xy, fx to readme
|
|
22
|
+
- config tests added
|
|
23
|
+
- gemfile to obs example
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- moved gem files into voicemeeter/ dir
|
|
28
|
+
- update obs example
|
|
29
|
+
- using require_relative in case using direct download.
|
|
13
30
|
|
|
14
31
|
## [4.1.0] - 2022-07-19
|
|
15
32
|
|
data/README.md
CHANGED
|
@@ -98,6 +98,20 @@ The following properties are available.
|
|
|
98
98
|
- `bass`: float, from -12.0 to 12.0
|
|
99
99
|
- `mid`: float, from -12.0 to 12.0
|
|
100
100
|
- `treble`: float, from -12.0 to 12.0
|
|
101
|
+
- `reverb`: float, from 0.0 to 10.0
|
|
102
|
+
- `delay`: float, from 0.0 to 10.0
|
|
103
|
+
- `fx1`: float, from 0.0 to 10.0
|
|
104
|
+
- `fx2`: float, from 0.0 to 10.0
|
|
105
|
+
- `pan_x`: float, from -0.5 to 0.5
|
|
106
|
+
- `pan_y`: float, from 0.0 to 1.0
|
|
107
|
+
- `color_x`: float, from -0.5 to 0.5
|
|
108
|
+
- `color_y`: float, from 0.0 to 1.0
|
|
109
|
+
- `fx_x`: float, from -0.5 to 0.5
|
|
110
|
+
- `fx_y`: float, from 0.0 to 1.0
|
|
111
|
+
- `postreverb`: boolean
|
|
112
|
+
- `postdelay`: boolean
|
|
113
|
+
- `postfx1`: boolean
|
|
114
|
+
- `postfx2`: boolean
|
|
101
115
|
|
|
102
116
|
example:
|
|
103
117
|
|
|
@@ -164,6 +178,11 @@ The following properties are available.
|
|
|
164
178
|
- `label`: string
|
|
165
179
|
- `device`: string
|
|
166
180
|
- `sr`: int
|
|
181
|
+
- `returnreverb`: float, from 0.0 to 10.0
|
|
182
|
+
- `returndelay`: float, from 0.0 to 10.0
|
|
183
|
+
- `returnfx1`: float, from 0.0 to 10.0
|
|
184
|
+
- `returnfx2`: float, from 0.0 to 10.0
|
|
185
|
+
- `monitor`: boolean
|
|
167
186
|
|
|
168
187
|
example:
|
|
169
188
|
|
data/lib/voicemeeter/base.rb
CHANGED
data/lib/voicemeeter/bus.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "iremote"
|
|
2
2
|
|
|
3
3
|
module Voicemeeter
|
|
4
4
|
class Bus < IRemote
|
|
@@ -6,6 +6,8 @@ module Voicemeeter
|
|
|
6
6
|
Concrete Bus class
|
|
7
7
|
"
|
|
8
8
|
include Channel_Meta_Functions
|
|
9
|
+
include Mixin::Fades
|
|
10
|
+
include Mixin::Return
|
|
9
11
|
|
|
10
12
|
attr_accessor :mode, :levels
|
|
11
13
|
|
|
@@ -21,7 +23,7 @@ module Voicemeeter
|
|
|
21
23
|
|
|
22
24
|
def initialize(remote, i)
|
|
23
25
|
super
|
|
24
|
-
self.make_accessor_bool :mute, :mono, :eq, :sel
|
|
26
|
+
self.make_accessor_bool :mute, :mono, :eq, :eq_ab, :sel, :monitor
|
|
25
27
|
self.make_accessor_float :gain
|
|
26
28
|
self.make_accessor_string :label
|
|
27
29
|
|
|
@@ -32,16 +34,6 @@ module Voicemeeter
|
|
|
32
34
|
def identifier
|
|
33
35
|
"bus[#{@index}]"
|
|
34
36
|
end
|
|
35
|
-
|
|
36
|
-
def fadeto(target, time)
|
|
37
|
-
self.setter("FadeTo", "(#{target}, #{time})")
|
|
38
|
-
sleep(@remote.delay)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def fadeby(change, time)
|
|
42
|
-
self.setter("FadeBy", "(#{change}, #{time})")
|
|
43
|
-
sleep(@remote.delay)
|
|
44
|
-
end
|
|
45
37
|
end
|
|
46
38
|
|
|
47
39
|
class PhysicalBus < Bus
|
data/lib/voicemeeter/button.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require "ffi"
|
|
2
|
-
|
|
2
|
+
require_relative "inst"
|
|
3
3
|
|
|
4
4
|
module Voicemeeter
|
|
5
5
|
module CBindings
|
|
@@ -85,7 +85,7 @@ module Voicemeeter
|
|
|
85
85
|
:long
|
|
86
86
|
|
|
87
87
|
@@cdll =
|
|
88
|
-
lambda { |func, *args|
|
|
88
|
+
lambda { |func, *args| retval = [send("vm_#{func}", *args), func] }
|
|
89
89
|
|
|
90
90
|
def clear_polling = while pdirty? || mdirty?; end
|
|
91
91
|
|
data/lib/voicemeeter/command.rb
CHANGED
data/lib/voicemeeter/configs.rb
CHANGED
data/lib/voicemeeter/device.rb
CHANGED
data/lib/voicemeeter/inst.rb
CHANGED
data/lib/voicemeeter/iremote.rb
CHANGED
data/lib/voicemeeter/kinds.rb
CHANGED
|
@@ -1,77 +1,79 @@
|
|
|
1
|
-
module
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
module Voicemeeter
|
|
2
|
+
module Kinds
|
|
3
|
+
"
|
|
4
|
+
A Kind struct for each version of Voicemeeter
|
|
5
|
+
"
|
|
6
|
+
attr_reader :kind_map, :kinds_all
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
8
|
+
Kind = Struct.new(:name, :layout)
|
|
9
|
+
basic =
|
|
10
|
+
Kind.new(
|
|
11
|
+
"basic",
|
|
12
|
+
{
|
|
13
|
+
strip: {
|
|
14
|
+
p_in: 2,
|
|
15
|
+
v_in: 1
|
|
16
|
+
},
|
|
17
|
+
bus: {
|
|
18
|
+
p_out: 1,
|
|
19
|
+
v_out: 1
|
|
20
|
+
},
|
|
21
|
+
vban: {
|
|
22
|
+
instream: 4,
|
|
23
|
+
outstream: 4
|
|
24
|
+
},
|
|
25
|
+
mb: 80
|
|
26
|
+
}
|
|
27
|
+
)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
banana =
|
|
30
|
+
Kind.new(
|
|
31
|
+
"banana",
|
|
32
|
+
{
|
|
33
|
+
strip: {
|
|
34
|
+
p_in: 3,
|
|
35
|
+
v_in: 2
|
|
36
|
+
},
|
|
37
|
+
bus: {
|
|
38
|
+
p_out: 3,
|
|
39
|
+
v_out: 2
|
|
40
|
+
},
|
|
41
|
+
vban: {
|
|
42
|
+
instream: 8,
|
|
43
|
+
outstream: 8
|
|
44
|
+
},
|
|
45
|
+
mb: 80
|
|
46
|
+
}
|
|
47
|
+
)
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
49
|
+
potato =
|
|
50
|
+
Kind.new(
|
|
51
|
+
"potato",
|
|
52
|
+
{
|
|
53
|
+
strip: {
|
|
54
|
+
p_in: 5,
|
|
55
|
+
v_in: 3
|
|
56
|
+
},
|
|
57
|
+
bus: {
|
|
58
|
+
p_out: 5,
|
|
59
|
+
v_out: 3
|
|
60
|
+
},
|
|
61
|
+
vban: {
|
|
62
|
+
instream: 8,
|
|
63
|
+
outstream: 8
|
|
64
|
+
},
|
|
65
|
+
mb: 80
|
|
66
|
+
}
|
|
67
|
+
)
|
|
67
68
|
|
|
68
|
-
|
|
69
|
+
@kind_map = [basic, banana, potato].to_h { |kind| [kind.name, kind] }
|
|
69
70
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
def get_kind(kind_id)
|
|
72
|
+
@kind_map[kind_id]
|
|
73
|
+
end
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
@kinds_all = @kind_map.values
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
module_function :get_kind, :kind_map, :kinds_all
|
|
78
|
+
end
|
|
77
79
|
end
|
data/lib/voicemeeter/meta.rb
CHANGED
|
@@ -1,252 +1,254 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
module
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
true
|
|
10
|
-
|
|
11
|
-
false
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
require_relative "errors"
|
|
2
|
+
|
|
3
|
+
module Voicemeeter
|
|
4
|
+
module Conversions
|
|
5
|
+
module_function
|
|
6
|
+
|
|
7
|
+
def Boolean(value)
|
|
8
|
+
case value
|
|
9
|
+
when true, 1
|
|
10
|
+
true
|
|
11
|
+
when false, nil, 0
|
|
12
|
+
false
|
|
13
|
+
else
|
|
14
|
+
raise ArgumentError, "invalid value for Boolean(): \"#{value.inspect}\""
|
|
15
|
+
end
|
|
14
16
|
end
|
|
15
17
|
end
|
|
16
|
-
end
|
|
17
18
|
|
|
18
|
-
module Meta_Functions
|
|
19
|
-
|
|
19
|
+
module Meta_Functions
|
|
20
|
+
private
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
include Conversions
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
def make_accessor_bool(*params)
|
|
25
|
+
params.each do |param|
|
|
26
|
+
define_singleton_method("#{param}") do
|
|
27
|
+
return !(self.getter("#{param}")).zero?
|
|
28
|
+
end
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
define_singleton_method("#{param}=") do |value|
|
|
31
|
+
self.setter("#{param}", Boolean(value) ? 1 : 0)
|
|
32
|
+
end
|
|
31
33
|
end
|
|
32
34
|
end
|
|
33
|
-
end
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
def make_accessor_int(*params)
|
|
37
|
+
params.each do |param|
|
|
38
|
+
define_singleton_method("#{param}") do
|
|
39
|
+
return self.getter("#{param}").to_i
|
|
40
|
+
end
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
define_singleton_method("#{param}=") do |value|
|
|
43
|
+
self.setter("#{param}", value)
|
|
44
|
+
end
|
|
43
45
|
end
|
|
44
46
|
end
|
|
45
|
-
end
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
def make_accessor_float(*params)
|
|
49
|
+
params.each do |param|
|
|
50
|
+
define_singleton_method("#{param}") { return self.getter("#{param}") }
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
define_singleton_method("#{param}=") do |value|
|
|
53
|
+
self.setter("#{param}", value)
|
|
54
|
+
end
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
|
-
end
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
def make_accessor_string(*params)
|
|
59
|
+
params.each do |param|
|
|
60
|
+
define_singleton_method("#{param}") do
|
|
61
|
+
return self.getter("#{param}", true)
|
|
62
|
+
end
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
define_singleton_method("#{param}=") do |value|
|
|
65
|
+
self.setter("#{param}", value)
|
|
66
|
+
end
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
|
-
end
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
def make_reader_only(*params)
|
|
71
|
+
params.each do |param|
|
|
72
|
+
define_singleton_method("#{param}") { return self.getter("#{param}") }
|
|
73
|
+
end
|
|
72
74
|
end
|
|
73
|
-
end
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
def make_writer_only(*params)
|
|
77
|
+
params.each do |param|
|
|
78
|
+
define_singleton_method("#{param}=") do |value = 1|
|
|
79
|
+
self.setter("#{param}", value)
|
|
80
|
+
end
|
|
79
81
|
end
|
|
80
82
|
end
|
|
81
|
-
end
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
def make_channel_props(num_A, num_B)
|
|
85
|
+
(1..(num_A + num_B)).map { |i| i <= num_A ? "A#{i}" : "B#{i - num_A}" }
|
|
86
|
+
end
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
def make_action_prop(*params)
|
|
89
|
+
params.each do |param|
|
|
90
|
+
define_singleton_method("#{param}") { self.setter("#{param}", 1) }
|
|
91
|
+
end
|
|
90
92
|
end
|
|
91
93
|
end
|
|
92
|
-
end
|
|
93
94
|
|
|
94
|
-
module Channel_Meta_Functions
|
|
95
|
-
|
|
95
|
+
module Channel_Meta_Functions
|
|
96
|
+
private
|
|
96
97
|
|
|
97
|
-
|
|
98
|
+
include Meta_Functions
|
|
98
99
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
def make_accessor_bool(*params)
|
|
101
|
+
params.each do |param|
|
|
102
|
+
cmds = { eq: "EQ.on", eq_ab: "EQ.ab" }
|
|
103
|
+
if cmds.key? param
|
|
104
|
+
cmd = cmds[param]
|
|
105
|
+
else
|
|
106
|
+
cmd = param
|
|
107
|
+
end
|
|
107
108
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
define_singleton_method("#{param}") do
|
|
110
|
+
return !(self.getter("#{cmd}")).zero?
|
|
111
|
+
end
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
113
|
+
define_singleton_method("#{param}=") do |value|
|
|
114
|
+
self.setter("#{cmd}", Boolean(value) ? 1 : 0)
|
|
115
|
+
end
|
|
114
116
|
end
|
|
115
117
|
end
|
|
116
|
-
end
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
119
|
+
def make_reader_only(*params)
|
|
120
|
+
params.each do |param|
|
|
121
|
+
cmds = { device: "device.name", sr: "device.sr" }
|
|
122
|
+
if cmds.key? param
|
|
123
|
+
cmd = cmds[param]
|
|
124
|
+
else
|
|
125
|
+
cmd = param
|
|
126
|
+
end
|
|
126
127
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
128
|
+
define_singleton_method("#{param}") do
|
|
129
|
+
case param
|
|
130
|
+
when :device
|
|
131
|
+
return self.getter("#{cmd}", true)
|
|
132
|
+
when :sr
|
|
133
|
+
return self.getter("#{cmd}").to_i
|
|
134
|
+
end
|
|
133
135
|
end
|
|
134
136
|
end
|
|
135
137
|
end
|
|
136
|
-
end
|
|
137
138
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
def make_bus_modes(*params)
|
|
140
|
+
params.each do |param|
|
|
141
|
+
define_singleton_method("#{param}") do
|
|
142
|
+
@remote.clear_polling
|
|
143
|
+
return !(self.getter("#{param}")).zero?
|
|
144
|
+
end
|
|
144
145
|
|
|
145
|
-
|
|
146
|
-
|
|
146
|
+
define_singleton_method("#{param}=") do |value|
|
|
147
|
+
self.setter("#{param}", Boolean(value) ? 1 : 0)
|
|
148
|
+
end
|
|
147
149
|
end
|
|
148
150
|
end
|
|
149
151
|
end
|
|
150
|
-
end
|
|
151
152
|
|
|
152
|
-
module Vban_Meta_Functions
|
|
153
|
-
|
|
153
|
+
module Vban_Meta_Functions
|
|
154
|
+
private
|
|
154
155
|
|
|
155
|
-
|
|
156
|
+
include Meta_Functions
|
|
156
157
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
158
|
+
def make_reader_int(*params)
|
|
159
|
+
params.each do |param|
|
|
160
|
+
define_singleton_method("#{param}") do
|
|
161
|
+
case param
|
|
162
|
+
when :bit
|
|
163
|
+
return self.getter("#{param}").to_i == 1 ? 16 : 24
|
|
164
|
+
else
|
|
165
|
+
return self.getter("#{param}").to_i
|
|
166
|
+
end
|
|
165
167
|
end
|
|
166
168
|
end
|
|
167
169
|
end
|
|
168
|
-
end
|
|
169
170
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
171
|
+
def make_accessor_int(*params)
|
|
172
|
+
params.each do |param|
|
|
173
|
+
define_singleton_method("#{param}") do
|
|
174
|
+
case param
|
|
175
|
+
when :bit
|
|
176
|
+
return self.getter("#{param}").to_i == 1 ? 16 : 24
|
|
177
|
+
else
|
|
178
|
+
return self.getter("#{param}").to_i
|
|
179
|
+
end
|
|
178
180
|
end
|
|
179
|
-
end
|
|
180
181
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
182
|
+
opts = {
|
|
183
|
+
sr: [
|
|
184
|
+
11_025,
|
|
185
|
+
16_000,
|
|
186
|
+
22_050,
|
|
187
|
+
24_000,
|
|
188
|
+
32_000,
|
|
189
|
+
44_100,
|
|
190
|
+
48_000,
|
|
191
|
+
64_000,
|
|
192
|
+
88_200,
|
|
193
|
+
96_000
|
|
194
|
+
],
|
|
195
|
+
channel: (1..8),
|
|
196
|
+
bit: [16, 24],
|
|
197
|
+
quality: (0..4),
|
|
198
|
+
route: (0..8)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
define_singleton_method("#{param}=") do |value|
|
|
202
|
+
unless opts[param].member? value
|
|
203
|
+
raise OutOfBoundsErrors.new(opts[param])
|
|
204
|
+
end
|
|
205
|
+
case param
|
|
206
|
+
when :bit
|
|
207
|
+
self.setter("#{param}", value == 16 ? 1 : 2)
|
|
208
|
+
else
|
|
209
|
+
self.setter("#{param}", value)
|
|
210
|
+
end
|
|
209
211
|
end
|
|
210
212
|
end
|
|
211
213
|
end
|
|
212
214
|
end
|
|
213
|
-
end
|
|
214
215
|
|
|
215
|
-
module MacroButton_Meta_Functions
|
|
216
|
-
|
|
216
|
+
module MacroButton_Meta_Functions
|
|
217
|
+
private
|
|
217
218
|
|
|
218
|
-
|
|
219
|
+
include Conversions
|
|
219
220
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
221
|
+
def make_accessor_macrobutton(*params)
|
|
222
|
+
params.each do |param|
|
|
223
|
+
mode = { state: 1, stateonly: 2, trigger: 3 }
|
|
223
224
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
225
|
+
define_singleton_method("#{param}") do
|
|
226
|
+
return !(self.getter(mode[param])).zero?
|
|
227
|
+
end
|
|
227
228
|
|
|
228
|
-
|
|
229
|
-
|
|
229
|
+
define_singleton_method("#{param}=") do |value|
|
|
230
|
+
self.setter(Boolean(value) ? 1 : 0, mode[param])
|
|
231
|
+
end
|
|
230
232
|
end
|
|
231
233
|
end
|
|
232
234
|
end
|
|
233
|
-
end
|
|
234
235
|
|
|
235
|
-
module Commands_Meta_Functions
|
|
236
|
-
|
|
236
|
+
module Commands_Meta_Functions
|
|
237
|
+
private
|
|
237
238
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
239
|
+
include Meta_Functions
|
|
240
|
+
def make_writer_bool(*params)
|
|
241
|
+
params.each do |param|
|
|
242
|
+
cmds = { showvbanchat: "DialogShow.VBANCHAT" }
|
|
243
|
+
if cmds.key? param
|
|
244
|
+
cmd = cmds[param]
|
|
245
|
+
else
|
|
246
|
+
cmd = param
|
|
247
|
+
end
|
|
247
248
|
|
|
248
|
-
|
|
249
|
-
|
|
249
|
+
define_singleton_method("#{param}=") do |value|
|
|
250
|
+
self.setter("#{cmd}", Boolean(value) ? 1 : 0)
|
|
251
|
+
end
|
|
250
252
|
end
|
|
251
253
|
end
|
|
252
254
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Voicemeeter
|
|
2
|
+
module Mixin
|
|
3
|
+
module Fades
|
|
4
|
+
def fadeto(target, time)
|
|
5
|
+
self.setter("FadeTo", "(#{target}, #{time})")
|
|
6
|
+
sleep(@remote.delay)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def fadeby(change, time)
|
|
10
|
+
self.setter("FadeBy", "(#{change}, #{time})")
|
|
11
|
+
sleep(@remote.delay)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module Apps
|
|
16
|
+
def appgain(name, gain)
|
|
17
|
+
self.setter("AppGain", "(\"#{name}\", #{gain})")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def appmute(name, mute)
|
|
21
|
+
self.setter("AppMute", "(\"#{name}\", #{mute ? 1 : 0})")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
module Xy
|
|
26
|
+
include Channel_Meta_Functions
|
|
27
|
+
|
|
28
|
+
def initialize(remote, i)
|
|
29
|
+
super
|
|
30
|
+
self.make_accessor_float :pan_x,
|
|
31
|
+
:pan_y,
|
|
32
|
+
:color_x,
|
|
33
|
+
:color_y,
|
|
34
|
+
:fx_x,
|
|
35
|
+
:fx_y
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
module Fx
|
|
40
|
+
include Channel_Meta_Functions
|
|
41
|
+
|
|
42
|
+
def initialize(remote, i)
|
|
43
|
+
super
|
|
44
|
+
self.make_accessor_float :reverb, :delay, :fx1, :fx2
|
|
45
|
+
self.make_accessor_bool :postreverb, :postdelay, :postfx1, :postfx2
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
module Return
|
|
50
|
+
include Channel_Meta_Functions
|
|
51
|
+
|
|
52
|
+
def initialize(remote, i)
|
|
53
|
+
super
|
|
54
|
+
self.make_accessor_float :returnreverb,
|
|
55
|
+
:returndelay,
|
|
56
|
+
:returnfx1,
|
|
57
|
+
:returnfx2
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
data/lib/voicemeeter/recorder.rb
CHANGED
data/lib/voicemeeter/runvm.rb
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
require_relative "cbindings"
|
|
2
|
+
require_relative "kinds"
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
module Voicemeeter
|
|
5
|
+
module RunVM
|
|
6
|
+
"
|
|
7
|
+
Starts Voicemeeter of the Kind requested.
|
|
8
|
+
"
|
|
9
|
+
include CBindings
|
|
10
|
+
include Kinds
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def start(kind_id)
|
|
12
|
-
unless Kinds.kind_map.key? kind_id
|
|
13
|
-
raise VMRemoteErrors.new("Unknown Voicemeeter Kind.")
|
|
14
|
-
end
|
|
12
|
+
def start(kind_id)
|
|
13
|
+
unless Kinds.kind_map.key? kind_id
|
|
14
|
+
raise VMRemoteErrors.new("Unknown Voicemeeter Kind.")
|
|
15
|
+
end
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
enums =
|
|
18
|
+
Kinds.kinds_all.map.with_index do |kind, i|
|
|
19
|
+
if CBindings::OS_BITS == 64 && kind.name.to_s == "potato"
|
|
20
|
+
[kind.name.to_s, i + 4]
|
|
21
|
+
else
|
|
22
|
+
[kind.name.to_s, i + 1]
|
|
23
|
+
end
|
|
22
24
|
end
|
|
23
|
-
|
|
24
|
-
exes = enums.to_h { |k, v| [k, v.to_i] }
|
|
25
|
+
exes = enums.to_h { |k, v| [k, v.to_i] }
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
CBindings.vm_runvm(exes[kind_id])
|
|
28
|
+
sleep(1)
|
|
29
|
+
end
|
|
28
30
|
end
|
|
29
31
|
end
|
data/lib/voicemeeter/strip.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative "iremote"
|
|
2
|
+
require_relative "mixin"
|
|
2
3
|
|
|
3
4
|
module Voicemeeter
|
|
4
5
|
class Strip < IRemote
|
|
@@ -6,6 +7,7 @@ module Voicemeeter
|
|
|
6
7
|
Concrete Strip class
|
|
7
8
|
"
|
|
8
9
|
include Channel_Meta_Functions
|
|
10
|
+
include Mixin::Fades
|
|
9
11
|
|
|
10
12
|
attr_accessor :gainlayer, :levels
|
|
11
13
|
|
|
@@ -36,19 +38,12 @@ module Voicemeeter
|
|
|
36
38
|
def identifier
|
|
37
39
|
"strip[#{@index}]"
|
|
38
40
|
end
|
|
39
|
-
|
|
40
|
-
def fadeto(target, time)
|
|
41
|
-
self.setter("FadeTo", "(#{target}, #{time})")
|
|
42
|
-
sleep(@remote.delay)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def fadeby(change, time)
|
|
46
|
-
self.setter("FadeBy", "(#{change}, #{time})")
|
|
47
|
-
sleep(@remote.delay)
|
|
48
|
-
end
|
|
49
41
|
end
|
|
50
42
|
|
|
51
43
|
class PhysicalStrip < Strip
|
|
44
|
+
include Mixin::Xy
|
|
45
|
+
include Mixin::Fx
|
|
46
|
+
|
|
52
47
|
def initialize(remote, i)
|
|
53
48
|
super
|
|
54
49
|
self.make_accessor_float :comp, :gate, :audibility
|
|
@@ -57,20 +52,14 @@ module Voicemeeter
|
|
|
57
52
|
end
|
|
58
53
|
|
|
59
54
|
class VirtualStrip < Strip
|
|
55
|
+
include Mixin::Apps
|
|
56
|
+
|
|
60
57
|
def initialize(remote, i)
|
|
61
58
|
super
|
|
62
59
|
self.make_accessor_bool :mc
|
|
63
60
|
self.make_accessor_int :k
|
|
64
61
|
self.make_accessor_float :bass, :mid, :treble
|
|
65
62
|
end
|
|
66
|
-
|
|
67
|
-
def appgain(name, gain)
|
|
68
|
-
self.setter("AppGain", "(\"#{name}\", #{gain})")
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def appmute(name, mute)
|
|
72
|
-
self.setter("AppMute", "(\"#{name}\", #{mute ? 1 : 0})")
|
|
73
|
-
end
|
|
74
63
|
end
|
|
75
64
|
|
|
76
65
|
class GainLayer < IRemote
|
data/lib/voicemeeter/vban.rb
CHANGED
data/lib/voicemeeter/version.rb
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
-
module
|
|
2
|
-
|
|
1
|
+
module Voicemeeter
|
|
2
|
+
module Version
|
|
3
|
+
module_function
|
|
4
|
+
|
|
5
|
+
def major
|
|
6
|
+
4
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def minor
|
|
10
|
+
3
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def patch
|
|
14
|
+
0
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_a
|
|
18
|
+
[major, minor, patch]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def to_s
|
|
22
|
+
to_a.join(".")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
3
25
|
end
|
data/lib/voicemeeter.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
require_relative "voicemeeter/base"
|
|
2
|
+
require_relative "voicemeeter/strip"
|
|
3
|
+
require_relative "voicemeeter/bus"
|
|
4
|
+
require_relative "voicemeeter/button"
|
|
5
|
+
require_relative "voicemeeter/vban"
|
|
6
|
+
require_relative "voicemeeter/command"
|
|
7
|
+
require_relative "voicemeeter/recorder"
|
|
8
|
+
require_relative "voicemeeter/device"
|
|
9
9
|
|
|
10
10
|
module Voicemeeter
|
|
11
11
|
include RunVM
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: voicemeeter_api_ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- onyx_online
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-07-
|
|
11
|
+
date: 2022-07-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: ffi
|
|
@@ -97,6 +97,7 @@ files:
|
|
|
97
97
|
- lib/voicemeeter/iremote.rb
|
|
98
98
|
- lib/voicemeeter/kinds.rb
|
|
99
99
|
- lib/voicemeeter/meta.rb
|
|
100
|
+
- lib/voicemeeter/mixin.rb
|
|
100
101
|
- lib/voicemeeter/recorder.rb
|
|
101
102
|
- lib/voicemeeter/runvm.rb
|
|
102
103
|
- lib/voicemeeter/strip.rb
|