voicemeeter 0.0.1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/README.md +19 -14
- data/lib/voicemeeter/base.rb +2 -2
- data/lib/voicemeeter/bus.rb +26 -30
- data/lib/voicemeeter/command.rb +3 -5
- data/lib/voicemeeter/event.rb +14 -12
- data/lib/voicemeeter/fx.rb +6 -8
- data/lib/voicemeeter/iremote.rb +3 -4
- data/lib/voicemeeter/meta.rb +22 -22
- data/lib/voicemeeter/mixins.rb +20 -29
- data/lib/voicemeeter/option.rb +10 -15
- data/lib/voicemeeter/patch.rb +3 -2
- data/lib/voicemeeter/recorder.rb +7 -8
- data/lib/voicemeeter/remote.rb +3 -3
- data/lib/voicemeeter/strip.rb +29 -38
- data/lib/voicemeeter/vban.rb +6 -14
- data/lib/voicemeeter/version.rb +1 -1
- data/lib/voicemeeter/worker.rb +4 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07bc7810c8539267babd1a0ac6c1dc929e37b237f8b65b96d60ee2d6a823a0b5
|
4
|
+
data.tar.gz: 79c662a5e0b36a3787f4eb27d90892624a0990d3347165d7a6e036ee031ae9cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5819aac96ad967b7da5195b8ada670825be2720a57ff70a540718c53cde98814f51154aec79ffa903269f39a12e12f27a87bd682f83545946119320203b65c58
|
7
|
+
data.tar.gz: 3c248695fcd6ab4f47582dc77c1bb2ad7d66dd08ef152261cdcacd268d7a65ed15c92749f3dafdf21256f044772b2a1dd90e767d9bf152edfee30c909afaf8ff
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
Before any major/minor/patch is released all unit tests will be run to verify they pass.
|
9
|
+
|
10
|
+
## [Unreleased] - These changes have not been added to RubyGems yet
|
11
|
+
|
12
|
+
- [ ]
|
13
|
+
|
14
|
+
## [1.0.1] - 2023-09-14
|
15
|
+
|
16
|
+
### Added
|
17
|
+
|
18
|
+
- BusDevice added to Bus class.
|
19
|
+
|
20
|
+
## [1.0.0] - 2023-09-01
|
21
|
+
|
22
|
+
### Added
|
23
|
+
|
24
|
+
- Bindings and abstraction classes are implemented
|
25
|
+
- An event system:
|
26
|
+
- `pdirty`: parameter updates on the main Voicemeeter GUI
|
27
|
+
- `mdirty`: macrobutton updates
|
28
|
+
- `midi`: incoming data from a connected midi device
|
29
|
+
- `ldirty`: channel level updates
|
30
|
+
- An entry point for fetching a Remote class for each kind of Voicemeeter (basic, banana, potato)
|
31
|
+
- Logging system for reading messages sent by getters and setters.
|
32
|
+
- String class refinement in util.rb. It's scope should be limited to the CBindings module.
|
33
|
+
- rbs type signatures but some of them need updating.
|
34
|
+
- example user profile configs included with repo.
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
[![Gem Version][gem version]](https://badge.fury.io/rb/voicemeeter)
|
1
2
|
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)][license]
|
2
|
-
[![Ruby Code Style]
|
3
|
+
[![Ruby Code Style][code style]](https://github.com/standardrb/standard)
|
3
4
|
|
4
5
|
# Ruby Wrapper Around the Voicemeeter Remote API
|
5
6
|
|
@@ -197,7 +198,7 @@ The following attributes are available.
|
|
197
198
|
example:
|
198
199
|
|
199
200
|
```ruby
|
200
|
-
vm.strip[0].eq.ab =
|
201
|
+
vm.strip[0].eq.ab = true
|
201
202
|
```
|
202
203
|
|
203
204
|
Strip EQ parameters are defined for PhysicalStrips, potato version only.
|
@@ -457,7 +458,7 @@ vm.command.showvbanchat = true
|
|
457
458
|
example:
|
458
459
|
|
459
460
|
```ruby
|
460
|
-
vm.run { (0...vm.device.ins).each { puts vm.device.input(_1) } }
|
461
|
+
vm.run { |vm| (0...vm.device.ins).each { puts vm.device.input(_1) } }
|
461
462
|
```
|
462
463
|
|
463
464
|
### FX
|
@@ -491,7 +492,7 @@ vm.patch.postfxinsert = false
|
|
491
492
|
|
492
493
|
##### asio[i]
|
493
494
|
|
494
|
-
- `get
|
495
|
+
- `get`: int
|
495
496
|
- `set(patch_in)`: int, valid range determined by connected device.
|
496
497
|
|
497
498
|
example:
|
@@ -504,7 +505,7 @@ i, from 0 to 10
|
|
504
505
|
|
505
506
|
##### A2[i] - A5[i]
|
506
507
|
|
507
|
-
- `get
|
508
|
+
- `get`: int
|
508
509
|
- `set(patch_out)`: int, valid range determined by connected device.
|
509
510
|
|
510
511
|
example:
|
@@ -517,7 +518,7 @@ i, from 0 to 8.
|
|
517
518
|
|
518
519
|
##### composite[i]
|
519
520
|
|
520
|
-
- `get
|
521
|
+
- `get`: int
|
521
522
|
- `set(channel)`: int, from 0 up to number of channels depending on version.
|
522
523
|
|
523
524
|
example:
|
@@ -572,7 +573,7 @@ vm.option.buffer.wdm = 512
|
|
572
573
|
|
573
574
|
##### delay[i]
|
574
575
|
|
575
|
-
- `get
|
576
|
+
- `get`: int
|
576
577
|
- `set(delay)`: int, from 0 to 500
|
577
578
|
|
578
579
|
example:
|
@@ -702,9 +703,9 @@ The following methods are available:
|
|
702
703
|
example:
|
703
704
|
|
704
705
|
```ruby
|
705
|
-
vm.event.add(%
|
706
|
+
vm.event.add(%i[pdirty mdirty midi ldirty])
|
706
707
|
|
707
|
-
vm.event.remove(%
|
708
|
+
vm.event.remove(%i[pdirty mdirty midi ldirty])
|
708
709
|
|
709
710
|
# get a list of currently subscribed
|
710
711
|
p vm.event.get
|
@@ -712,8 +713,6 @@ p vm.event.get
|
|
712
713
|
|
713
714
|
## `Voicemeeter Module`
|
714
715
|
|
715
|
-
### Remote class
|
716
|
-
|
717
716
|
#### Voicemeeter::Remote
|
718
717
|
|
719
718
|
You may pass the following optional keyword arguments:
|
@@ -745,9 +744,13 @@ vm.set("Strip[0].Gain", -3.6)
|
|
745
744
|
|
746
745
|
### Errors
|
747
746
|
|
748
|
-
- `Errors::VMError`:
|
749
|
-
- `Errors::
|
750
|
-
|
747
|
+
- `Errors::VMError`: Base Voicemeeter error class.
|
748
|
+
- `Errors::VMInstallError`: Raised when errors occur during installation.
|
749
|
+
- `Errors::VMCAPIError`: Raised when the C-API returns error codes.
|
750
|
+
- The following attributes are available:
|
751
|
+
- `fn_name`: name of the C-API function that failed.
|
752
|
+
- `code`: error code.
|
753
|
+
- For a full list of error codes [check the VoicemeeterRemote header file][voicemeeter remote header].
|
751
754
|
|
752
755
|
### Logging
|
753
756
|
|
@@ -773,3 +776,5 @@ Bundle exec rake
|
|
773
776
|
|
774
777
|
[license]: https://github.com/onyx-and-iris/voicemeeter-rb/blob/dev/LICENSE
|
775
778
|
[voicemeeter remote header]: https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/update-docs/VoicemeeterRemote.h
|
779
|
+
[code style]: https://img.shields.io/badge/code_style-standard-violet.svg
|
780
|
+
[gem version]: https://badge.fury.io/rb/voicemeeter.svg
|
data/lib/voicemeeter/base.rb
CHANGED
@@ -207,9 +207,9 @@ module Voicemeeter
|
|
207
207
|
data.each do |key, hash|
|
208
208
|
case key.to_s.split("-")
|
209
209
|
in [/strip|bus|button/ => kls, /^[0-9]+$/ => index]
|
210
|
-
target =
|
210
|
+
target = public_send(kls)
|
211
211
|
in ["vban", /in|instream|out|oustream/ => dir, /^[0-9]+$/ => index]
|
212
|
-
target = vban.
|
212
|
+
target = vban.public_send("#{dir.chomp("stream")}stream")
|
213
213
|
else
|
214
214
|
raise KeyError, "invalid config key '#{key}'"
|
215
215
|
end
|
data/lib/voicemeeter/bus.rb
CHANGED
@@ -5,8 +5,12 @@ module Voicemeeter
|
|
5
5
|
include IRemote
|
6
6
|
include Mixins::Fades
|
7
7
|
include Mixins::Return
|
8
|
+
extend MetaFunctions
|
8
9
|
|
9
|
-
attr_reader :eq, :mode, :levels
|
10
|
+
attr_reader :eq, :mode, :levels, :device
|
11
|
+
attr_accessor_bool :mute, :mono, :sel, :monitor
|
12
|
+
attr_accessor_float :gain
|
13
|
+
attr_accessor_string :label
|
10
14
|
|
11
15
|
def self.make(remote, i)
|
12
16
|
(i < remote.kind.phys_out) ? PhysicalBus.new(remote, i) : VirtualBus.new(remote, i)
|
@@ -14,13 +18,10 @@ module Voicemeeter
|
|
14
18
|
|
15
19
|
def initialize(remote, i)
|
16
20
|
super
|
17
|
-
make_accessor_bool :mute, :mono, :sel, :monitor
|
18
|
-
make_accessor_float :gain
|
19
|
-
make_accessor_string :label
|
20
|
-
|
21
21
|
@eq = BusEq.new(remote, i)
|
22
22
|
@mode = BusModes.new(remote, i)
|
23
23
|
@levels = BusLevels.new(remote, i)
|
24
|
+
@device = BusDevice.new(remote, i)
|
24
25
|
end
|
25
26
|
|
26
27
|
def identifier
|
@@ -36,11 +37,9 @@ module Voicemeeter
|
|
36
37
|
|
37
38
|
class BusEq
|
38
39
|
include IRemote
|
40
|
+
extend MetaFunctions
|
39
41
|
|
40
|
-
|
41
|
-
super
|
42
|
-
make_accessor_bool :on, :ab
|
43
|
-
end
|
42
|
+
attr_accessor_bool :on, :ab
|
44
43
|
|
45
44
|
def identifier
|
46
45
|
"bus[#{@index}].eq"
|
@@ -49,22 +48,20 @@ module Voicemeeter
|
|
49
48
|
|
50
49
|
class BusModes
|
51
50
|
include IRemote
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
:rearonly
|
67
|
-
end
|
51
|
+
extend MetaFunctions
|
52
|
+
|
53
|
+
attr_accessor_bool :normal,
|
54
|
+
:amix,
|
55
|
+
:bmix,
|
56
|
+
:repeat,
|
57
|
+
:composite,
|
58
|
+
:tvmix,
|
59
|
+
:upmix21,
|
60
|
+
:upmix41,
|
61
|
+
:upmix61,
|
62
|
+
:centeronly,
|
63
|
+
:lfeonly,
|
64
|
+
:rearonly
|
68
65
|
|
69
66
|
def identifier
|
70
67
|
"bus[#{@index}].mode"
|
@@ -115,12 +112,11 @@ module Voicemeeter
|
|
115
112
|
|
116
113
|
class BusDevice
|
117
114
|
include IRemote
|
115
|
+
extend MetaFunctions
|
118
116
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
make_writer_only :wdm, :ks, :mme, :asio
|
123
|
-
end
|
117
|
+
attr_reader_int :sr
|
118
|
+
attr_reader_string :name
|
119
|
+
attr_writer_string :wdm, :ks, :mme, :asio
|
124
120
|
|
125
121
|
def identifier
|
126
122
|
"bus[#{@index}].device"
|
data/lib/voicemeeter/command.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
module Voicemeeter
|
2
2
|
class Command
|
3
3
|
include IRemote
|
4
|
+
extend MetaFunctions
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
make_action_method :show, :restart, :shutdown
|
8
|
-
make_writer_bool :showvbanchat, :lock
|
9
|
-
end
|
6
|
+
attr_action_method :show, :restart, :shutdown
|
7
|
+
attr_writer_bool :showvbanchat, :lock
|
10
8
|
|
11
9
|
def identifier
|
12
10
|
:command
|
data/lib/voicemeeter/event.rb
CHANGED
@@ -27,11 +27,22 @@ module Voicemeeter
|
|
27
27
|
class Tracker
|
28
28
|
include Logging
|
29
29
|
|
30
|
-
|
30
|
+
class << self
|
31
|
+
private def attr_accessor_events(*params)
|
32
|
+
params.each do |param|
|
33
|
+
attr_reader param
|
31
34
|
|
32
|
-
|
33
|
-
|
35
|
+
define_method("#{param}=") do |value|
|
36
|
+
instance_variable_set("@#{param}", value)
|
37
|
+
info("#{param} #{value ? "added to" : "removed from"}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_accessor_events :pdirty, :mdirty, :midi, :ldirty
|
34
44
|
|
45
|
+
def initialize(**kwargs)
|
35
46
|
kwargs.each do |key, value|
|
36
47
|
instance_variable_set("@#{key}", value || false)
|
37
48
|
end
|
@@ -51,15 +62,6 @@ module Voicemeeter
|
|
51
62
|
logger.info info_msg.join(" ")
|
52
63
|
end
|
53
64
|
|
54
|
-
private def make_writer_methods(*params)
|
55
|
-
params.each do |param|
|
56
|
-
define_singleton_method("#{param}=") do |value|
|
57
|
-
instance_variable_set("@#{param}", value)
|
58
|
-
info("#{param} #{value ? "added to" : "removed from"}")
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
65
|
def get
|
64
66
|
%i[pdirty mdirty midi ldirty].reject { |ev| !send(ev) }
|
65
67
|
end
|
data/lib/voicemeeter/fx.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Voicemeeter
|
2
2
|
class Fx
|
3
3
|
include IRemote
|
4
|
+
extend MetaFunctions
|
5
|
+
|
4
6
|
attr_reader :reverb, :delay
|
5
7
|
|
6
8
|
def initialize(remote)
|
@@ -16,11 +18,9 @@ module Voicemeeter
|
|
16
18
|
|
17
19
|
class FxReverb
|
18
20
|
include IRemote
|
21
|
+
extend MetaFunctions
|
19
22
|
|
20
|
-
|
21
|
-
super
|
22
|
-
make_accessor_bool :on, :ab
|
23
|
-
end
|
23
|
+
attr_accessor_bool :on, :ab
|
24
24
|
|
25
25
|
def identifier
|
26
26
|
"fx.reverb"
|
@@ -29,11 +29,9 @@ module Voicemeeter
|
|
29
29
|
|
30
30
|
class FxDelay
|
31
31
|
include IRemote
|
32
|
+
extend MetaFunctions
|
32
33
|
|
33
|
-
|
34
|
-
super
|
35
|
-
make_accessor_bool :on, :ab
|
36
|
-
end
|
34
|
+
attr_accessor_bool :on, :ab
|
37
35
|
|
38
36
|
def identifier
|
39
37
|
"fx.delay"
|
data/lib/voicemeeter/iremote.rb
CHANGED
@@ -2,7 +2,6 @@ module Voicemeeter
|
|
2
2
|
# Common interface with the base Remote class.
|
3
3
|
module IRemote
|
4
4
|
include Logging
|
5
|
-
include MetaFunctions
|
6
5
|
|
7
6
|
def initialize(remote, i = nil)
|
8
7
|
@remote = remote
|
@@ -38,12 +37,12 @@ module Voicemeeter
|
|
38
37
|
def apply(params)
|
39
38
|
params.each do |key, val|
|
40
39
|
if val.is_a? Hash
|
41
|
-
target =
|
40
|
+
target = public_send(key)
|
42
41
|
target.apply(val)
|
43
42
|
elsif key == :mode
|
44
|
-
mode.
|
43
|
+
mode.public_send("#{val}=", true)
|
45
44
|
else
|
46
|
-
|
45
|
+
public_send("#{key}=", val)
|
47
46
|
end
|
48
47
|
end
|
49
48
|
end
|
data/lib/voicemeeter/meta.rb
CHANGED
@@ -3,72 +3,72 @@ module Voicemeeter
|
|
3
3
|
private
|
4
4
|
|
5
5
|
# Accessor methods
|
6
|
-
def
|
6
|
+
def attr_accessor_bool(*params)
|
7
7
|
params.each do |param|
|
8
|
-
|
8
|
+
define_method(param) { getter(param).to_i == 1 }
|
9
9
|
|
10
|
-
|
10
|
+
define_method("#{param}=") do |value|
|
11
11
|
setter(param, value && 1 || 0)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
16
|
+
def attr_accessor_string(*params)
|
17
17
|
params.each do |param|
|
18
|
-
|
18
|
+
define_method(param) { getter(param, true) }
|
19
19
|
|
20
|
-
|
20
|
+
define_method("#{param}=") { |value| setter(param, value) }
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def attr_accessor_int(*params)
|
25
25
|
params.each do |param|
|
26
|
-
|
26
|
+
define_method(param) { getter(param).to_i }
|
27
27
|
|
28
|
-
|
28
|
+
define_method("#{param}=") { |value| setter(param, value) }
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
32
|
+
def attr_accessor_float(*params)
|
33
33
|
params.each do |param|
|
34
|
-
|
34
|
+
define_method(param) { getter(param) }
|
35
35
|
|
36
|
-
|
36
|
+
define_method("#{param}=") { |value| setter(param, value) }
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
# reader methods
|
41
|
-
def
|
41
|
+
def attr_reader_string(*params)
|
42
42
|
params.each do |param|
|
43
|
-
|
43
|
+
define_method(param) { getter(param, true) }
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def attr_reader_int(*params)
|
48
48
|
params.each do |param|
|
49
|
-
|
49
|
+
define_method(param) { getter(param).to_i }
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
# writer methods
|
54
|
-
def
|
54
|
+
def attr_writer_bool(*params)
|
55
55
|
params.each do |param|
|
56
|
-
|
56
|
+
define_method("#{param}=") do |value|
|
57
57
|
setter(param, value && 1 || 0)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
def
|
62
|
+
def attr_writer_string(*params)
|
63
63
|
params.each do |param|
|
64
|
-
|
64
|
+
define_method("#{param}=") { |value| setter(param, value) }
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
# methods for performing certain actions as opposed to setting values
|
69
|
-
def
|
69
|
+
def attr_action_method(*params)
|
70
70
|
params.each do |param|
|
71
|
-
|
71
|
+
define_method(param) { setter(param, 1) }
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
data/lib/voicemeeter/mixins.rb
CHANGED
@@ -13,10 +13,8 @@ module Voicemeeter
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module Return
|
16
|
-
|
17
|
-
|
18
|
-
make_accessor_float :returnreverb, :returndelay, :returnfx1, :returnfx2
|
19
|
-
end
|
16
|
+
extend MetaFunctions
|
17
|
+
attr_accessor_float :returnreverb, :returndelay, :returnfx1, :returnfx2
|
20
18
|
end
|
21
19
|
|
22
20
|
module Apps
|
@@ -30,47 +28,40 @@ module Voicemeeter
|
|
30
28
|
end
|
31
29
|
|
32
30
|
module Outputs
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
def make_attr_outputs(num_a, num_b)
|
32
|
+
(1..(num_a + num_b)).each do |i|
|
33
|
+
param = (i <= num_a) ? :"A#{i}" : :"B#{i - num_a}"
|
34
|
+
define_singleton_method(param) do
|
35
|
+
getter(param).to_i == 1
|
36
|
+
end
|
37
|
+
define_singleton_method("#{param}=") do |value|
|
38
|
+
setter(param, value && 1 || 0)
|
40
39
|
end
|
41
|
-
|
40
|
+
end
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
module Xy
|
46
45
|
module Pan
|
47
|
-
|
48
|
-
|
49
|
-
make_accessor_float :pan_x, :pan_y
|
50
|
-
end
|
46
|
+
extend MetaFunctions
|
47
|
+
attr_accessor_float :pan_x, :pan_y
|
51
48
|
end
|
52
49
|
|
53
50
|
module Color
|
54
|
-
|
55
|
-
|
56
|
-
make_accessor_float :color_x, :color_y
|
57
|
-
end
|
51
|
+
extend MetaFunctions
|
52
|
+
attr_accessor_float :color_x, :color_y
|
58
53
|
end
|
59
54
|
|
60
55
|
module Fx
|
61
|
-
|
62
|
-
|
63
|
-
make_accessor_float :fx_x, :fx_y
|
64
|
-
end
|
56
|
+
extend MetaFunctions
|
57
|
+
attr_accessor_float :fx_x, :fx_y
|
65
58
|
end
|
66
59
|
end
|
67
60
|
|
68
61
|
module Fx
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
make_accessor_bool :postreverb, :postdelay, :postfx1, :postfx2
|
73
|
-
end
|
62
|
+
extend MetaFunctions
|
63
|
+
attr_accessor_float :reverb, :delay, :fx1, :fx2
|
64
|
+
attr_accessor_bool :postreverb, :postdelay, :postfx1, :postfx2
|
74
65
|
end
|
75
66
|
|
76
67
|
module LevelEnum
|
data/lib/voicemeeter/option.rb
CHANGED
@@ -2,13 +2,14 @@ module Voicemeeter
|
|
2
2
|
module Option
|
3
3
|
class Base
|
4
4
|
include IRemote
|
5
|
+
extend MetaFunctions
|
6
|
+
|
5
7
|
attr_reader :delay, :buffer, :mode
|
8
|
+
attr_accessor_int :sr
|
9
|
+
attr_accessor_bool :asiosr, :monitoronsel, :slidermode
|
6
10
|
|
7
11
|
def initialize(remote)
|
8
12
|
super
|
9
|
-
make_accessor_int :sr
|
10
|
-
make_accessor_bool :asiosr, :monitoronsel, :slidermode
|
11
|
-
|
12
13
|
@delay = (0...remote.kind.phys_out).map { OptionDelay.new(remote, _1) }
|
13
14
|
@buffer = OptionBuffer.new(remote)
|
14
15
|
@mode = OptionMode.new(remote)
|
@@ -21,11 +22,9 @@ module Voicemeeter
|
|
21
22
|
|
22
23
|
class OptionDelay
|
23
24
|
include IRemote
|
25
|
+
extend MetaFunctions
|
24
26
|
|
25
|
-
|
26
|
-
super
|
27
|
-
make_accessor_bool :on, :ab
|
28
|
-
end
|
27
|
+
attr_accessor_bool :on, :ab
|
29
28
|
|
30
29
|
def identifier
|
31
30
|
"option.delay"
|
@@ -42,11 +41,9 @@ module Voicemeeter
|
|
42
41
|
|
43
42
|
class OptionBuffer
|
44
43
|
include IRemote
|
44
|
+
extend MetaFunctions
|
45
45
|
|
46
|
-
|
47
|
-
super
|
48
|
-
make_accessor_int :mme, :wdm, :ks, :asio
|
49
|
-
end
|
46
|
+
attr_accessor_int :mme, :wdm, :ks, :asio
|
50
47
|
|
51
48
|
def identifier
|
52
49
|
"option.buffer"
|
@@ -55,11 +52,9 @@ module Voicemeeter
|
|
55
52
|
|
56
53
|
class OptionMode
|
57
54
|
include IRemote
|
55
|
+
extend MetaFunctions
|
58
56
|
|
59
|
-
|
60
|
-
super
|
61
|
-
make_accessor_bool :exclusif, :swift
|
62
|
-
end
|
57
|
+
attr_accessor_bool :exclusif, :swift
|
63
58
|
|
64
59
|
def identifier
|
65
60
|
"option.mode"
|
data/lib/voicemeeter/patch.rb
CHANGED
@@ -3,12 +3,13 @@ module Voicemeeter
|
|
3
3
|
# Base class for Patch
|
4
4
|
class Base
|
5
5
|
include IRemote
|
6
|
+
extend MetaFunctions
|
7
|
+
|
6
8
|
attr_reader :asio, :A2, :A3, :A4, :A5, :composite, :insert
|
9
|
+
attr_accessor_bool :postfadercomposite, :postfxinsert
|
7
10
|
|
8
11
|
def initialize(remote)
|
9
12
|
super
|
10
|
-
make_accessor_bool :postfadercomposite, :postfxinsert
|
11
|
-
|
12
13
|
asio_in, asio_out = remote.kind.asio
|
13
14
|
@asio = (0...asio_in).map { PatchAsioIn.new(remote, _1) }
|
14
15
|
%i[A2 A3 A4 A5].each do |param|
|
data/lib/voicemeeter/recorder.rb
CHANGED
@@ -11,15 +11,16 @@ module Voicemeeter
|
|
11
11
|
class Base
|
12
12
|
include IRemote
|
13
13
|
include Mixins::Outputs
|
14
|
+
extend MetaFunctions
|
14
15
|
|
15
16
|
attr_reader :mode, :armstrip, :armbus
|
17
|
+
attr_action_method :play, :stop, :pause, :replay, :record, :ff, :rew
|
18
|
+
attr_accessor_int :bitresolution, :channel, :kbps
|
19
|
+
attr_accessor_float :gain
|
16
20
|
|
17
21
|
def initialize(remote)
|
18
22
|
super
|
19
|
-
|
20
|
-
make_accessor_int :bitresolution, :channel, :kbps
|
21
|
-
make_accessor_float :gain
|
22
|
-
|
23
|
+
make_attr_outputs(*remote.kind.outs)
|
23
24
|
@mode = RecorderMode.new(remote)
|
24
25
|
@armstrip = (0...remote.kind.num_strip).map { RecorderArmStrip.new(remote, _1) }
|
25
26
|
@armbus = (0...remote.kind.num_bus).map { RecorderArmBus.new(remote, _1) }
|
@@ -51,11 +52,9 @@ module Voicemeeter
|
|
51
52
|
|
52
53
|
class RecorderMode
|
53
54
|
include IRemote
|
55
|
+
extend MetaFunctions
|
54
56
|
|
55
|
-
|
56
|
-
super
|
57
|
-
make_accessor_bool :recbus, :playonload, :loop, :multitrack
|
58
|
-
end
|
57
|
+
attr_accessor_bool :recbus, :playonload, :loop, :multitrack
|
59
58
|
|
60
59
|
def identifier
|
61
60
|
"recorder.mode"
|
data/lib/voicemeeter/remote.rb
CHANGED
@@ -54,10 +54,10 @@ module Voicemeeter
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
# Represents a
|
57
|
+
# Represents a Basic Remote
|
58
58
|
class RemoteBasic < Remote; end
|
59
59
|
|
60
|
-
# Represents a
|
60
|
+
# Represents a Banana Remote
|
61
61
|
class RemoteBanana < Remote
|
62
62
|
public attr_reader :recorder, :patch
|
63
63
|
|
@@ -66,7 +66,7 @@ module Voicemeeter
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
# Represents a
|
69
|
+
# Represents a Potato Remote
|
70
70
|
class RemotePotato < Remote
|
71
71
|
public attr_reader :recorder, :patch, :fx
|
72
72
|
|
data/lib/voicemeeter/strip.rb
CHANGED
@@ -5,8 +5,13 @@ module Voicemeeter
|
|
5
5
|
include IRemote
|
6
6
|
include Mixins::Outputs
|
7
7
|
include Mixins::Fades
|
8
|
+
extend MetaFunctions
|
8
9
|
|
9
10
|
attr_reader :gainlayer, :levels
|
11
|
+
attr_accessor_bool :solo, :mute, :mono
|
12
|
+
attr_accessor_float :gain
|
13
|
+
attr_accessor_int :limit
|
14
|
+
attr_accessor_string :label
|
10
15
|
|
11
16
|
def self.make(remote, i)
|
12
17
|
(i < remote.kind.phys_in) ? PhysicalStrip.new(remote, i) : VirtualStrip.new(remote, i)
|
@@ -14,11 +19,7 @@ module Voicemeeter
|
|
14
19
|
|
15
20
|
def initialize(remote, i)
|
16
21
|
super
|
17
|
-
|
18
|
-
make_accessor_float :gain
|
19
|
-
make_accessor_int :limit
|
20
|
-
make_accessor_string :label
|
21
|
-
|
22
|
+
make_attr_outputs(*remote.kind.outs)
|
22
23
|
@gainlayer = (0...8).map { GainLayer.new(remote, i, _1) }
|
23
24
|
@levels = StripLevels.new(remote, i)
|
24
25
|
end
|
@@ -34,13 +35,13 @@ module Voicemeeter
|
|
34
35
|
include Mixins::Xy::Color
|
35
36
|
include Mixins::Xy::Fx
|
36
37
|
include Mixins::Fx
|
38
|
+
extend MetaFunctions
|
37
39
|
|
38
40
|
attr_reader :comp, :gate, :denoiser, :eq, :device
|
41
|
+
attr_accessor_float :audibility
|
39
42
|
|
40
43
|
def initialize(remote, i)
|
41
44
|
super
|
42
|
-
make_accessor_float :audibility
|
43
|
-
|
44
45
|
@comp = StripComp.new(remote, i)
|
45
46
|
@gate = StripGate.new(remote, i)
|
46
47
|
@denoiser = StripDenoiser.new(remote, i)
|
@@ -51,18 +52,16 @@ module Voicemeeter
|
|
51
52
|
|
52
53
|
class StripComp
|
53
54
|
include IRemote
|
55
|
+
extend MetaFunctions
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
:gainout
|
64
|
-
make_accessor_bool :makeup
|
65
|
-
end
|
57
|
+
attr_accessor_float :gainin,
|
58
|
+
:ratio,
|
59
|
+
:threshold,
|
60
|
+
:attack,
|
61
|
+
:release,
|
62
|
+
:knee,
|
63
|
+
:gainout
|
64
|
+
attr_accessor_bool :makeup
|
66
65
|
|
67
66
|
def identifier
|
68
67
|
"strip[#{@index}].comp"
|
@@ -79,12 +78,10 @@ module Voicemeeter
|
|
79
78
|
|
80
79
|
class StripGate
|
81
80
|
include IRemote
|
81
|
+
extend MetaFunctions
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
make_accessor_float :threshold, :damping, :attack, :hold, :release
|
86
|
-
make_accessor_int :bpsidechain
|
87
|
-
end
|
83
|
+
attr_accessor_float :threshold, :damping, :attack, :hold, :release
|
84
|
+
attr_accessor_int :bpsidechain
|
88
85
|
|
89
86
|
def identifier
|
90
87
|
"strip[#{@index}].gate"
|
@@ -117,11 +114,9 @@ module Voicemeeter
|
|
117
114
|
|
118
115
|
class StripEq
|
119
116
|
include IRemote
|
117
|
+
extend MetaFunctions
|
120
118
|
|
121
|
-
|
122
|
-
super
|
123
|
-
make_accessor_bool :on, :ab
|
124
|
-
end
|
119
|
+
attr_accessor_bool :on, :ab
|
125
120
|
|
126
121
|
def identifier
|
127
122
|
"strip[#{@index}].eq"
|
@@ -130,13 +125,11 @@ module Voicemeeter
|
|
130
125
|
|
131
126
|
class StripDevice
|
132
127
|
include IRemote
|
128
|
+
extend MetaFunctions
|
133
129
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
make_reader_string :name
|
138
|
-
make_writer_string :wdm, :ks, :mme, :asio
|
139
|
-
end
|
130
|
+
attr_reader_int :sr
|
131
|
+
attr_reader_string :name
|
132
|
+
attr_writer_string :wdm, :ks, :mme, :asio
|
140
133
|
|
141
134
|
def identifier
|
142
135
|
"strip[#{@index}].device"
|
@@ -147,12 +140,10 @@ module Voicemeeter
|
|
147
140
|
class VirtualStrip < Base
|
148
141
|
include Mixins::Xy::Pan
|
149
142
|
include Mixins::Apps
|
143
|
+
extend MetaFunctions
|
150
144
|
|
151
|
-
|
152
|
-
|
153
|
-
make_accessor_bool :mc
|
154
|
-
make_accessor_int :karaoke
|
155
|
-
end
|
145
|
+
attr_accessor_bool :mc
|
146
|
+
attr_accessor_int :karaoke
|
156
147
|
|
157
148
|
def bass
|
158
149
|
round(getter("EQGain1"), 1)
|
data/lib/voicemeeter/vban.rb
CHANGED
@@ -3,13 +3,11 @@ module Voicemeeter
|
|
3
3
|
# Base class for Vban In/Out Streams
|
4
4
|
class VbanStream
|
5
5
|
include IRemote
|
6
|
+
extend MetaFunctions
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
make_accessor_string :name, :ip
|
11
|
-
make_accessor_int :quality, :route
|
12
|
-
end
|
8
|
+
attr_accessor_bool :on
|
9
|
+
attr_accessor_string :name, :ip
|
10
|
+
attr_accessor_int :quality, :route
|
13
11
|
|
14
12
|
def identifier
|
15
13
|
"vban.#{direction}stream[#{@index}]"
|
@@ -22,10 +20,7 @@ module Voicemeeter
|
|
22
20
|
|
23
21
|
# Represents a Vban InStream
|
24
22
|
class VbanInstream < VbanStream
|
25
|
-
|
26
|
-
super
|
27
|
-
make_reader_int :sr, :channel, :bit
|
28
|
-
end
|
23
|
+
attr_reader_int :sr, :channel, :bit
|
29
24
|
|
30
25
|
def direction
|
31
26
|
:in
|
@@ -43,10 +38,7 @@ module Voicemeeter
|
|
43
38
|
|
44
39
|
# Represents a Vban OutStream
|
45
40
|
class VbanOutstream < VbanStream
|
46
|
-
|
47
|
-
super
|
48
|
-
make_accessor_int :sr, :channel, :bit
|
49
|
-
end
|
41
|
+
attr_accessor_int :sr, :channel, :bit
|
50
42
|
|
51
43
|
def direction
|
52
44
|
:out
|
data/lib/voicemeeter/version.rb
CHANGED
data/lib/voicemeeter/worker.rb
CHANGED
@@ -7,8 +7,7 @@ module Voicemeeter
|
|
7
7
|
def init_producer(que)
|
8
8
|
@producer = Thread.new do
|
9
9
|
Thread.current.name = "producer"
|
10
|
-
|
11
|
-
while Thread.current[:running]
|
10
|
+
while @running
|
12
11
|
que << :pdirty if event.pdirty
|
13
12
|
que << :mdirty if event.mdirty
|
14
13
|
que << :midi if event.midi
|
@@ -16,7 +15,7 @@ module Voicemeeter
|
|
16
15
|
sleep(@ratelimit)
|
17
16
|
end
|
18
17
|
logger.debug "closing #{Thread.current.name} thread"
|
19
|
-
que <<
|
18
|
+
que << @running
|
20
19
|
end
|
21
20
|
end
|
22
21
|
|
@@ -51,12 +50,13 @@ module Voicemeeter
|
|
51
50
|
|
52
51
|
def init_event_threads
|
53
52
|
que = Queue.new
|
53
|
+
@running = true
|
54
54
|
init_worker(que) and init_producer(que)
|
55
55
|
end
|
56
56
|
|
57
57
|
def end_event_threads
|
58
58
|
if running?
|
59
|
-
@
|
59
|
+
@running = false
|
60
60
|
@producer.join
|
61
61
|
end
|
62
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voicemeeter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- onyx_online
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -92,8 +92,10 @@ executables: []
|
|
92
92
|
extensions: []
|
93
93
|
extra_rdoc_files:
|
94
94
|
- README.md
|
95
|
+
- CHANGELOG.md
|
95
96
|
- LICENSE
|
96
97
|
files:
|
98
|
+
- CHANGELOG.md
|
97
99
|
- LICENSE
|
98
100
|
- README.md
|
99
101
|
- lib/voicemeeter.rb
|