{"id":29741819,"url":"https://github.com/onyx-and-iris/voicemeeter","last_synced_at":"2026-01-12T01:41:47.393Z","repository":{"id":37994101,"uuid":"506384738","full_name":"onyx-and-iris/voicemeeter","owner":"onyx-and-iris","description":"A Go wrapper around the Voiceemeter Remote API ","archived":false,"fork":false,"pushed_at":"2024-07-02T09:54:40.000Z","size":169,"stargazers_count":14,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2025-07-26T06:49:59.639Z","etag":null,"topics":["voicemeeter","voicemeeter-api","voicemeeter-go","voicemeeter-golang","voicemeeter-remote"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/onyx-and-iris.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-06-22T19:45:19.000Z","updated_at":"2025-04-09T10:21:51.000Z","dependencies_parsed_at":"2023-12-05T12:31:56.834Z","dependency_job_id":"361f1c6c-6915-46a5-a6cc-12615cb7a37a","html_url":"https://github.com/onyx-and-iris/voicemeeter","commit_stats":{"total_commits":146,"total_committers":3,"mean_commits":"48.666666666666664","dds":"0.21232876712328763","last_synced_commit":"418d04a08e7a50e6fe631a379f8ce0538c2e3427"},"previous_names":["onyx-and-iris/voicemeeter-api-go"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/onyx-and-iris/voicemeeter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onyx-and-iris%2Fvoicemeeter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onyx-and-iris%2Fvoicemeeter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onyx-and-iris%2Fvoicemeeter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onyx-and-iris%2Fvoicemeeter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/onyx-and-iris","download_url":"https://codeload.github.com/onyx-and-iris/voicemeeter/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/onyx-and-iris%2Fvoicemeeter/sbom","scorecard":{"id":707861,"data":{"date":"2025-08-11","repo":{"name":"github.com/onyx-and-iris/voicemeeter","commit":"0bfc1e62ba60aa83d0bccc6f0e9c0ec89f48ade3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'dev'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v2.1.0 not signed: https://api.github.com/repos/onyx-and-iris/voicemeeter/releases/163486139","Warn: release artifact v2.0.0 not signed: https://api.github.com/repos/onyx-and-iris/voicemeeter/releases/86099857","Warn: release artifact v2.1.0 does not have provenance: https://api.github.com/repos/onyx-and-iris/voicemeeter/releases/163486139","Warn: release artifact v2.0.0 does not have provenance: https://api.github.com/repos/onyx-and-iris/voicemeeter/releases/86099857"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T07:14:36.012Z","repository_id":37994101,"created_at":"2025-08-22T07:14:36.012Z","updated_at":"2025-08-22T07:14:36.012Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28331253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T00:36:25.062Z","status":"ssl_error","status_checked_at":"2026-01-12T00:36:15.229Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["voicemeeter","voicemeeter-api","voicemeeter-go","voicemeeter-golang","voicemeeter-remote"],"created_at":"2025-07-26T01:34:59.570Z","updated_at":"2026-01-12T01:41:47.388Z","avatar_url":"https://github.com/onyx-and-iris.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Go Reference](https://pkg.go.dev/badge/github.com/onyx-and-iris/voicemeeter.svg)](https://pkg.go.dev/github.com/onyx-and-iris/voicemeeter/v2)\n\n# A Go Wrapper for the Voicemeeter API\n\nFor an outline of past/future changes refer to: [CHANGELOG](CHANGELOG.md)\n\n## Tested against\n\n- Basic 1.1.1.1\n- Banana 2.1.1.1\n- Potato 3.1.1.1\n\n## Requirements\n\n- [Voicemeeter](https://voicemeeter.com/)\n- Go 1.18 or greater\n\n## Installation\n\nInitialize your own module then `go get`\n\n```\ngo mod init github.com/x/y\ngo get github.com/onyx-and-iris/voicemeeter/v2\n```\n\n## `Use`\n\n#### `main.go`\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/onyx-and-iris/voicemeeter/v2\"\n)\n\nfunc main() {\n\tvm, err := vmConnect()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer vm.Logout()\n\n\tvm.Strip[0].SetLabel(\"rode podmic\")\n\tvm.Strip[0].SetMute(true)\n\tfmt.Printf(\"Strip 0 (%s) mute was set to %v\\n\", vm.Strip[0].Label(), vm.Strip[0].Mute())\n}\n\nfunc vmConnect() (*voicemeeter.Remote, error) {\n\tvm, err := voicemeeter.NewRemote(\"banana\", 20)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = vm.Login()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn vm, nil\n}\n```\n\n## `voicemeeter.NewRemote(\u003ckindId\u003e, \u003cdelay\u003e, opts ...Option)`\n\n### `kindId`\n\nPass the kind of Voicemeeter as an argument. kindId may be:\n\n- `basic`\n- `banana`\n- `potato`\n\n### `delay`\n\nPass a delay in milliseconds to force the getters to wait for dirty parameters to clear.\n\nUseful if not listening for event updates.\n\n### `voicemeeter.WithTimeout(timeout int)`\n\nSet a login timeout, defaults to 2 seconds. For example to set it to 1s:\n\n`voicemeeter.NewRemote(\"banana\", 20, voicemeeter.WithTimeout(1))`\n\n### `voicemeeter.WithBits(bits int)`\n\nOverride the type of Voicemeeter GUI to launch on 64 bit systems. For example, to force 32 bit GUI:\n\n`voicemeeter.NewRemote(\"banana\", 20, voicemeeter.WithBits(32))`\n\n## `Remote Type`\n\n#### `vm.Strip`\n\n[]t_strip slice containing both physicalStrip and virtualStrip types\n\n#### `vm.Bus`\n\n[]t_bus slice containing both physicalBus and virtualBus types\n\n#### `vm.Button`\n\n[]button slice containing button types, one for each macrobutton\n\n#### `vm.Command`\n\npointer to command type, represents action type functions\n\n#### `vm.Vban`\n\npointer to vban type, containing both vbanInStream and vbanOutStream slices\n\n#### `vm.Device`\n\npointer to device type, represents physical input/output hardware devices\n\n#### `vm.Recorder`\n\npointer to recorder type, represents the recorder\n\n#### `vm.Midi`\n\npointer to midi type, represents a connected midi device\n\n#### `vm.Type()`\n\nreturns the type of Voicemeeter as a string\n\n#### `vm.Version()`\n\nreturns the version of Voicemeeter as a string\n\n#### `vm.GetFloat(\u003cparam\u003e)`\n\ngets a float parameter value\n\n#### `vm.SetFloat(\u003cparam\u003e, \u003cvalue\u003e)`\n\nsets a float parameter value eg. vm.SetFloat(\"strip[0].mute\", 1)\n\n#### `vm.GetString(\u003cparam\u003e)`\n\ngets a string parameter value\n\n#### `vm.SetString(\u003cparam\u003e, \u003cvalue\u003e)`\n\nsets a string parameter value eg. vm.SetString(\"strip[0].label\", \"podmic\")\n\n#### `vm.SendText(\u003cscript\u003e)`\n\nsets many parameters in script format eg. (\"Strip[0].Mute=1;Bus[3].Gain=3.6\")\n\n#### `vm.Register(o observer)`\n\nregister an observer type as an observer\n\n#### `vm.Deregister(o observer)`\n\nderegister an observer type as an observer\n\n#### `vm.EventAdd(\u003cevents\u003e)`\n\nadds a single or multiple events to the pooler. Accepts a string or slice of strings.\n\n#### `vm.EventRemove(\u003cevents\u003e)`\n\nremoves a single or multiple events from the pooler. Accepts a string or slice of strings.\n\n#### `vm.Pdirty()`\n\nreturns True iff a GUI parameter has changed\n\n#### `vm.Mdirty()`\n\nreturns True iff a macrobutton parameter has changed\n\n#### `vm.Sync()`\n\nUse this to force dirty parameters to clear after a delay in milliseconds.\n\n## `Available commands`\n\n### Strip\n\nThe following methods are available\n\n- `Mute() bool`\n- `SetMute(val bool)`\n- `Mono() bool`\n- `SetMono(val bool)`\n- `Solo() bool`\n- `SetSolo(val bool)`\n- `Limit() int`\n- `SetLimit(val int)` from -40 to 12\n- `Label() string`\n- `SetLabel(val string)`\n- `Gain() float64`\n- `SetGain(val float64)` from -60.0 to 12.0\n- `Mc() bool`\n- `SetMc(val bool)`\n- `Audibility() float64`\n- `SetAudibility(val float64)` from 0.0 to 10.0\n- `A1() bool - A5() bool`\n- `SetA1(val bool) - SetA5(val bool)`\n- `B1() bool - B3() bool`\n- `SetB1(val bool) bool - SetB3(val bool) bool`\n- `AppGain(name string, gain float64)`\n- `AppMute(name string, val bool)`\n\nexample:\n\n```go\nvm.Strip[3].SetGain(3.7)\nfmt.Println(vm.Strip[0].Label())\nvm.Strip[4].SetA1(true)\n\nvm.Strip[5].AppGain(\"Spotify\", 0.5)\nvm.Strip[5].AppMute(\"Spotify\", true)\n```\n\n##### Comp\n\n- `vm.Strip[i].Comp()`\n\nThe following methods are available\n\n- `Knob() float64`\n- `SetKnob(val float64)` from 0.0 to 10.0\n- `GainIn() float64`\n- `SetGainIn(val float64)` from -24.0 to 24.0\n- `Ratio() float64`\n- `SetRatio(val float64)` from 1.0 to 8.0\n- `Threshold() float64`\n- `SetThreshold(val float64)` from -40.0 to -3.0\n- `Attack() float64`\n- `SetAttack(val float64)` from 0.0 to 200.0\n- `Release() float64`\n- `SetRelease(val float64)` from 0.0 to 5000.0\n- `Knee() float64`\n- `SetKnee(val float64)` from 0.0 to 1.0\n- `GainOut() float64`\n- `SetGainOut(val float64)` from -24.0 to 24.0\n- `MakeUp() bool`\n- `SetMakeUp(val bool)`\n\nexample:\n\n```go\nvm.Strip[3].Comp().SetRatio(3.5)\n```\n\n##### Gate\n\n- `vm.Strip[i].Gate()`\n\nThe following methods are available\n\n- `Knob() float64`\n- `SetKnob(val float64)` from 0.0 to 10.0\n- `Threshold() float64`\n- `SetThreshold(val float64)` from -60.0 to -10.0\n- `Damping() float64`\n- `SetDamping(val float64)` from -60.0 to -10.0\n- `BPSidechain() int`\n- `SetBPSidechain(val int)` from 100 to 4000\n- `Attack() float64`\n- `SetAttack(val float64)` from 0.0 to 1000.0\n- `Hold() float64`\n- `SetHold(val float64)` from 0.0 to 5000.0\n- `Release() float64`\n- `SetRelease(val float64)` from 0.0 to 5000.0\n\nexample:\n\n```go\nfmt.Println(vm.Strip[4].Gate().Attack())\n```\n\n##### Denoiser\n\n- `vm.Strip[i].Denoiser()`\n\nThe following methods are available\n\n- `Knob() float64`\n- `SetKnob(val float64)` from 0.0 to 10.0\n\nexample:\n\n```go\nvm.Strip[1].Denoiser().SetKnob(4.2)\n```\n\n##### Gainlayer\n\n- `vm.Strip[i].Gainlayer()[j]`\n\nThe following methods are available\n\n- `Get() float64`\n- `Set(val float64)`\n\nexample:\n\n```go\nvm.Strip[6].GainLayer()[3].Set(-13.6)\n```\n\n##### Levels\n\n- `vm.Strip[i].Levels()`\n\nThe following methods are available\n\n- `PreFader() []float64`\n- `PostFader() []float64`\n- `PostMute() []float64`\n\nexample:\n\n```go\nfmt.Println(vm.Strip[5].Levels().PreFader())\n```\n\n### Bus\n\nThe following methods are available\n\n- `String() string`\n- `Mute() bool`\n- `SetMute(val bool)`\n- `Mono() bool`\n- `SetMono(val bool)`\n- `Label() string`\n- `SetLabel(val string)`\n- `Gain() float64`\n- `SetGain(val float64)` from -60.0 to 12.0\n\nexample:\n\n```go\nvm.Bus[3].SetEq(true)\nfmt.Println(vm.Bus[0].Label())\n```\n\n##### Modes\n\n- `vm.Bus[i].Mode()`\n\nThe following methods are available\n\n- `SetNormal(val bool)`\n- `Normal() bool`\n- `SetAmix(val bool)`\n- `Amix() bool`\n- `SetBmix(val bool)`\n- `Bmix() bool`\n- `SetRepeat(val bool)`\n- `Repeat() bool`\n- `SetComposite(val bool)`\n- `Composite() bool`\n- `SetTvMix(val bool)`\n- `TvMix() bool`\n- `SetUpMix21(val bool)`\n- `UpMix21() bool`\n- `SetUpMix41(val bool)`\n- `UpMix41() bool`\n- `SetUpMix61(val bool)`\n- `UpMix61() bool`\n- `SetCenterOnly(val bool)`\n- `CenterOnly() bool`\n- `SetLfeOnly(val bool)`\n- `LfeOnly() bool`\n- `SetRearOnly(val bool)`\n- `RearOnly() bool`\n\nexample:\n\n```go\nvm.Bus[3].Mode().SetAmix(true)\nvm.Bus[4].Mode().SetCenterOnly(true)\n```\n\n##### Levels\n\n- `vm.Bus[i].Levels()`\n\nThe following methods are available\n\n- `All() []float64`\n\nexample:\n\n```go\nfmt.Println(vm.Bus[1].Levels().All())\n```\n\n### Strip | Bus\n\n##### EQ\n\n- `vm.Strip[i].Eq()` `vm.Bus[i].Eq()`\n\nThe following methods are available.\n\n- `On() bool`\n- `SetOn(val bool)`\n- `Ab() bool`\n- `SetAb(val bool)`\n\nexample:\n\n```go\nvm.Strip[1].Eq().SetOn(true)\nfmt.Println(vm.Bus[3].Eq().Ab())\n```\n\nThe following methods are available.\n\n- `FadeTo(target float64, time_ int)`: float, int\n- `FadeBy(change float64, time_ int)`: float, int\n\nModify gain to or by the selected amount in db over a time interval in ms.\n\nexample:\n\n```go\nvm.Strip[3].FadeBy(-8.3, 500)\nvm.Bus[3].FadeTo(-12.8, 500)\n```\n\n### Button\n\nThe following methods are available\n\n- `State() bool`\n- `SetState(val bool)`\n- `StateOnly() bool`\n- `SetStateOnly(val bool)`\n- `Trigger() bool`\n- `SetTrigger(val bool)`\n\nexample:\n\n```go\nvm.Button[37].SetState(true)\nfmt.Println(vm.Button[64].StateOnly())\n```\n\n### Command\n\nThe following methods are available\n\n- `Show()` Show Voicemeeter GUI if it's hidden\n- `Hide()` Hide Voicemeeter GUI if it's shown\n- `Shutdown()` Shuts down the GUI\n- `Restart()` Restart the audio engine\n- `Lock(val bool)` Lock the Voicemeeter GUI\n\nexample:\n\n```go\nvm.Command.Restart()\nvm.Command.Show()\n```\n\n### VBAN\n\n- `vm.Vban.Enable()` `vm.Vban.Disable()` Turn VBAN on or off\n\n##### Instream | Outstream\n\n- `vm.Vban.InStream[i]` `vm.Vban.OutStream[i]`\n\nThe following methods are available\n\n- `On() bool`\n- `SetOn(val bool)`\n- `Name() string`\n- `SetName(val string)`\n- `Ip() string`\n- `SetIp(val string)`\n- `Port() int`\n- `SetPort(val int)` from 1024 to 65535\n- `Sr() int`\n- `SetSr(val int)` (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)\n- `Channel() int`\n- `SetChannel(val int)` from 1 to 8\n- `Bit() int`\n- `SetBit(val int)` 16 or 24\n- `Quality() int`\n- `SetQuality(val int)` from 0 to 4\n- `Route() int`\n- `SetRoute(val int)` from 0 to 8\n\nexample:\n\n```go\n# turn VBAN on\nvm.Vban.Enable()\n\n// turn on vban instream 0\nvm.Vban.InStream[0].SetOn(true)\n\n// set bit property for outstream 3 to 24\nvm.Vban.OutStream[3].SetBit(24)\n```\n\n### Device\n\nThe following methods are available\n\n- `Ins()`\n- `Outs()`\n- `Input(val int)`\n- `Output(val int)`\n\nexample:\n\n```go\nfor i := 0; i \u003c int(vm.Device.Ins()); i++ {\n\tfmt.Println(vm.Device.Input(i))\n}\n```\n\n### Recorder\n\nThe following methods are available\n\n- `Play()`\n- `Stop()`\n- `Pause()`\n- `Replay()`\n- `Record()`\n- `Ff()`\n- `Rew()`\n\nexample:\n\n```go\nvm.Recorder.Play()\nvm.Recorder.Stop()\n\n# Enable loop play\nvm.Recorder.Loop(true)\n\n# Disable recorder out channel B2\nvm.Recorder.SetB2(false)\n```\n\n### Midi\n\nThe following methods are available\n\n- `Channel()` returns the current midi channel\n- `Current()` returns the most recently pressed midi button\n- `Get(\u003cbutton\u003e)` returns the value in cache for the midi button\n\nexample:\n\n```go\nvar current = vm.Midi.Current()\nvar val = vm.Midi.Get(current)\n```\n\n### Events\n\nBy default level updates are disabled. Any event may be enabled or disabled. The following events exist:\n\n- `pdirty` parameter updates\n- `mdirty` macrobutton updates\n- `midi` midi updates\n- `ldirty` level updates\n\nexample:\n\n```go\nevents := []string{\"ldirty\", \"mdirty\", \"pdirty\"}\n\nvm.EventAdd(events...)\n\nvm.EventRemove(events...)\n```\n\n### Run tests\n\nTo run all tests:\n\n```\ngo test ./...\n```\n\n### Official Documentation\n\n- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/main/VoicemeeterRemoteAPI.pdf)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonyx-and-iris%2Fvoicemeeter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fonyx-and-iris%2Fvoicemeeter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fonyx-and-iris%2Fvoicemeeter/lists"}