UNPKG

ts-easy-voicemeeter-remote

Version:
568 lines 29.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.VoiceMeeterGroupTypes = exports.VoiceMeeterRunError = exports.VoiceMeeterMidiError = exports.VoiceMeeterMacroButtonError = exports.VoiceMeeterLoginError = exports.VoiceMeeterLevelError = exports.VoiceMeeterInitializationError = exports.VoiceMeeterGetVersionError = exports.VoiceMeeterGetParametersError = exports.VoiceMeeterError = exports.VoiceMeeterDirtyError = exports.VoiceMeeterConnectionError = exports.VoiceMeeter = exports.InterfaceType = exports.VoiceMeeterType = void 0; var ffi_napi_1 = __importDefault(require("ffi-napi")); var winreg_1 = __importDefault(require("winreg")); var ref_napi_1 = __importDefault(require("ref-napi")); var ref_array_napi_1 = __importDefault(require("ref-array-napi")); var vmChannels_1 = __importDefault(require("./vmChannels")); var ioFuncs_1 = __importDefault(require("./ioFuncs")); var voiceMeeterConfig_1 = __importDefault(require("./voiceMeeterConfig")); var voiceMeeterUtils_1 = require("./voiceMeeterUtils"); var errors_1 = require("./errors"); // TODO: Can this be replaced? var CharArray = ref_array_napi_1.default(ref_napi_1.default.types.char); function getDLLPath() { return __awaiter(this, void 0, void 0, function () { var regKey; return __generator(this, function (_a) { regKey = new winreg_1.default({ hive: winreg_1.default.HKLM, key: '\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VB:Voicemeeter {17359A74-1236-5467}', }); return [2 /*return*/, new Promise(function (resolve) { regKey.values(function (err, items) { var _a; var uninstallerPath = (_a = items.find(function (i) { return i.name === 'UninstallString'; })) === null || _a === void 0 ? void 0 : _a.value; if (!uninstallerPath) { throw new errors_1.VoiceMeeterError('Could not find VoiceMeeter installation path'); } var fileNameIndex = uninstallerPath.lastIndexOf('\\'); resolve(uninstallerPath.slice(0, fileNameIndex)); }); })]; }); }); } var VoiceMeeterType; (function (VoiceMeeterType) { VoiceMeeterType[VoiceMeeterType["unknown"] = 0] = "unknown"; VoiceMeeterType[VoiceMeeterType["voiceMeeter"] = 1] = "voiceMeeter"; VoiceMeeterType[VoiceMeeterType["voiceMeeterBanana"] = 2] = "voiceMeeterBanana"; VoiceMeeterType[VoiceMeeterType["voiceMeeterPotato"] = 3] = "voiceMeeterPotato"; })(VoiceMeeterType = exports.VoiceMeeterType || (exports.VoiceMeeterType = {})); ; var InterfaceType; (function (InterfaceType) { InterfaceType["strip"] = "strip"; InterfaceType["bus"] = "bus"; })(InterfaceType = exports.InterfaceType || (exports.InterfaceType = {})); ; var VoiceMeeter = /** @class */ (function () { function VoiceMeeter() { this.isConnected = false; this.isInitialized = false; this.isLoggedIn = false; this.outputDevices = []; this.inputDevices = []; this.channels = vmChannels_1.default; this.type = VoiceMeeterType.unknown; this.version = ''; this.voiceMeeterConfig = voiceMeeterConfig_1.default[VoiceMeeterType.unknown]; } Object.defineProperty(VoiceMeeter.prototype, "libVoiceMeeter", { get: function () { if (!this.isInitialized || !this._libVoiceMeeter) { throw new errors_1.VoiceMeeterInitializationError(); } return this._libVoiceMeeter; }, set: function (value) { this._libVoiceMeeter = value; }, enumerable: false, configurable: true }); VoiceMeeter.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var _a, _b, _c, _d, _e; return __generator(this, function (_f) { switch (_f.label) { case 0: _b = (_a = console).debug; return [4 /*yield*/, getDLLPath()]; case 1: _b.apply(_a, [(_f.sent()) + '/VoicemeeterRemote64.dll']); _c = this; _e = (_d = ffi_napi_1.default).Library; return [4 /*yield*/, getDLLPath()]; case 2: _c.libVoiceMeeter = _e.apply(_d, [(_f.sent()) + '/VoicemeeterRemote64.dll', { 'VBVMR_Login': ['long', []], 'VBVMR_Logout': ['long', []], 'VBVMR_RunVoicemeeter': ['long', ['long']], 'VBVMR_GetVoicemeeterType': ['long', ['long *']], 'VBVMR_GetVoicemeeterVersion': ['long', ['long *']], 'VBVMR_IsParametersDirty': ['long', []], 'VBVMR_GetParameterFloat': ['long', [CharArray, 'float *']], 'VBVMR_GetParameterStringA': ['long', [CharArray, CharArray]], 'VBVMR_SetParameters': ['long', [CharArray]], 'VBVMR_Output_GetDeviceNumber': ['long', []], 'VBVMR_Output_GetDeviceDescA': ['long', ['long', 'long *', CharArray, CharArray]], 'VBVMR_Input_GetDeviceNumber': ['long', []], 'VBVMR_Input_GetDeviceDescA': ['long', ['long', 'long *', CharArray, CharArray]], 'VBVMR_GetLevel': ['long', ['long', 'long', 'float *']], 'VBVMR_GetMidiMessage': ['long', ['pointer', 'long']], 'VBVMR_MacroButton_IsDirty': ['long', []], 'VBVMR_MacroButton_GetStatus': ['long', ['long', 'float *', 'long']], 'VBVMR_MacroButton_SetStatus': ['long', ['long', 'float', 'long']], }]); this.isInitialized = true; return [2 /*return*/]; } }); }); }; VoiceMeeter.prototype.runVoiceMeeter = function (voiceMeeterType) { var retVal = this.libVoiceMeeter.VBVMR_RunVoicemeeter(voiceMeeterType); if (retVal === 0) { return; } throw new errors_1.VoiceMeeterRunError(retVal); }; // TODO: should only return a number VoiceMeeter.prototype.isParametersDirty = function () { var retVal = this.libVoiceMeeter.VBVMR_IsParametersDirty(); if (retVal < 0) { throw new errors_1.VoiceMeeterDirtyError(retVal); } return Boolean(retVal); }; VoiceMeeter.getStringParameter = function (voiceMeeter, parameterName) { var hardwareIdPtr = Buffer.alloc(parameterName.length + 1); hardwareIdPtr.write(parameterName); var namePtr = Buffer.alloc(512); var retVal = voiceMeeter.libVoiceMeeter.VBVMR_GetParameterStringA(hardwareIdPtr, namePtr); if (retVal !== 0) { throw new errors_1.VoiceMeeterGetParametersError(retVal, parameterName); } return namePtr.toString().replace(/\x00+$/g, ''); }; VoiceMeeter.getParameter = function (voiceMeeter, parameterName) { var hardwareIdPtr = Buffer.alloc(parameterName.length + 1); hardwareIdPtr.write(parameterName); var namePtr = ref_napi_1.default.alloc(ref_napi_1.default.types.float).ref(); var retVal = voiceMeeter.libVoiceMeeter.VBVMR_GetParameterFloat(hardwareIdPtr, namePtr); if (retVal !== 0) { throw new errors_1.VoiceMeeterGetParametersError(retVal, parameterName); } // TODO: Find out, must we use readFloatLE? // return namePtr[0]; return namePtr.readFloatLE(); }; VoiceMeeter.prototype._getVoiceMeeterType = function () { var typePtr = ref_napi_1.default.alloc(ref_napi_1.default.types.long).ref(); var retVal = this.libVoiceMeeter.VBVMR_GetVoicemeeterType(typePtr); if (retVal !== 0) { throw new errors_1.VoiceMeeterGetVersionError(retVal); } switch (typePtr.readInt32LE()) { case 1: // VoiceMeeter software return VoiceMeeterType.voiceMeeter; case 2: // VoiceMeeter Banana software return VoiceMeeterType.voiceMeeterBanana; case 3: // VoiceMeeter Potato software return VoiceMeeterType.voiceMeeterPotato; default: // unknown software return VoiceMeeterType.unknown; } }; VoiceMeeter.prototype._getVoiceMeeterVersion = function () { // Pointer on 32bit integer receiving the version (v1.v2.v3.v4) // v1 = (version & 0xFF000000)>>24; // v2 = (version & 0x00FF0000)>>16; // v3 = (version & 0x0000FF00)>>8; // v4 = version & 0x000000FF; var versionPtr = ref_napi_1.default.alloc(ref_napi_1.default.types.long).ref(); var retVal = this.libVoiceMeeter.VBVMR_GetVoicemeeterVersion(versionPtr); if (retVal !== 0) { throw new errors_1.VoiceMeeterGetVersionError(retVal); } var fullVer = versionPtr.readInt32LE(); var v4 = fullVer % Math.pow(2, 8); var v3 = (fullVer - v4) % Math.pow(2, 16) / Math.pow(2, 8); var v2 = ((fullVer - v3 * 256 - v4) % Math.pow(2, 24)) / Math.pow(2, 16); var v1 = (fullVer - v2 * 512 - v3 * 256 - v4) / Math.pow(2, 24); return v1 + "." + v2 + "." + v3 + "." + v4; }; VoiceMeeter.prototype.login = function () { if (!this.isInitialized) { throw new errors_1.VoiceMeeterInitializationError(); } if (this.isConnected || this.isLoggedIn) { return; } var retVal = this.libVoiceMeeter.VBVMR_Login(); // 0 = no error // 1 = connected but no application; if (retVal == 0) { this.isConnected = true; this.isLoggedIn = true; this.type = this._getVoiceMeeterType(); this.version = this._getVoiceMeeterVersion(); this.voiceMeeterConfig = voiceMeeterConfig_1.default[this.type]; return; } if (retVal == 1) { this.isLoggedIn = true; } this.isConnected = false; throw new errors_1.VoiceMeeterLoginError(retVal); }; // TODO: review this function and what it should do /** Test if we have an active connection to a running instance of VoiceMeeter */ VoiceMeeter.prototype.testConnection = function () { var comError = this.libVoiceMeeter.VBVMR_IsParametersDirty(); if (comError >= 0) { this.isConnected = true; this.type = this._getVoiceMeeterType(); this.version = this._getVoiceMeeterVersion(); this.voiceMeeterConfig = voiceMeeterConfig_1.default[this.type]; } return comError >= 0; }; VoiceMeeter.prototype.logout = function () { if (!this.isLoggedIn) { throw new errors_1.VoiceMeeterError('Not logged in'); } if (!this.isConnected) { throw new errors_1.VoiceMeeterConnectionError(); } if (this.libVoiceMeeter.VBVMR_Logout() === 0) { this.isConnected = false; this.isLoggedIn = false; return; } throw new errors_1.VoiceMeeterError('Logout failed unexpectedly'); }; VoiceMeeter.prototype.updateDeviceList = function () { if (!this.isConnected) { throw new errors_1.VoiceMeeterConnectionError(); } this.outputDevices = []; this.inputDevices = []; var outputDeviceNumber = this.libVoiceMeeter.VBVMR_Output_GetDeviceNumber(); for (var i = 0; i < outputDeviceNumber; i++) { var typePtr = ref_napi_1.default.alloc(ref_napi_1.default.types.long).ref(); var namePtr = Buffer.alloc(256); var hardwareIdPtr = Buffer.alloc(256); if (this.libVoiceMeeter.VBVMR_Output_GetDeviceDescA(i, typePtr, namePtr, hardwareIdPtr) !== 0) { throw new errors_1.VoiceMeeterError('Error getting output device'); } this.outputDevices.push({ name: namePtr.toString().replace(/\x00+$/g, ''), hardwareId: hardwareIdPtr.toString().replace(/\x00+$/g, ''), type: typePtr.readInt32LE(), }); } var inputDeviceNumber = this.libVoiceMeeter.VBVMR_Input_GetDeviceNumber(); for (var i = 0; i < inputDeviceNumber; i++) { var typePtr = ref_napi_1.default.alloc(ref_napi_1.default.types.long).ref(); var namePtr = Buffer.alloc(256); var hardwareIdPtr = Buffer.alloc(256); if (this.libVoiceMeeter.VBVMR_Input_GetDeviceDescA(i, typePtr, namePtr, hardwareIdPtr) !== 0) { throw new errors_1.VoiceMeeterError('Error getting output device'); } this.inputDevices.push({ name: namePtr.toString().replace(/\x00+$/g, ''), hardwareId: hardwareIdPtr.toString().replace(/\x00+$/g, ''), type: typePtr.readInt32LE(), }); } }; VoiceMeeter.prototype.sendRawParameterScript = function (scriptString) { var script = Buffer.alloc(scriptString.length + 1); script.fill(0); script.write(scriptString); var retVal = this.libVoiceMeeter.VBVMR_SetParameters(script); if (retVal !== 0) { // } return retVal; }; VoiceMeeter.prototype._setParameter = function (type, name, id, value) { if (typeof (value) === 'boolean') { value = value ? 1 : 0; } return this.sendRawParameterScript(type + "[" + id + "]." + name + "=" + value + ";"); }; VoiceMeeter.prototype.setStripParameter = function (name, id, value) { if (this.voiceMeeterConfig.strips.findIndex(function (strip) { return strip.id === id; }) === -1) { // TODO: replace with a better error throw new errors_1.VoiceMeeterError(InterfaceType[InterfaceType.strip] + " " + id + " not found"); } return this._setParameter(InterfaceType.strip, name, id, value); }; VoiceMeeter.prototype.setBusParameter = function (name, id, value) { if (this.voiceMeeterConfig.buses.findIndex(function (bus) { return bus.id === id; }) === -1) { // TODO: replace with a better error throw new errors_1.VoiceMeeterError(InterfaceType[InterfaceType.bus] + " " + id + " not found"); } return this._setParameter(InterfaceType.bus, name, id, value); }; VoiceMeeter.prototype.getLevel = function (type, channel) { if (!channel) { return 0; } var value = ref_napi_1.default.alloc(ref_napi_1.default.types.float).ref(); var retVal = this.libVoiceMeeter.VBVMR_GetLevel(type, channel, value); if (retVal !== 0) { throw new errors_1.VoiceMeeterLevelError(retVal); } return 20 * Math.log10(value.readFloatLE()) + 60; }; VoiceMeeter.prototype.getMidi = function () { var buffer = Buffer.alloc(1024); var retVal = this.libVoiceMeeter.VBVMR_GetMidiMessage(buffer, 1024); if (retVal < 0) { throw new errors_1.VoiceMeeterMidiError(retVal); } var unorg = Uint8Array.from(buffer); var org = []; for (var i = 0; i < unorg.length; i += 3) if (unorg[i]) org.push([unorg[i], unorg[i + 1], unorg[i + 2]]); return org; }; VoiceMeeter.prototype.getLevelByID = function (m, index) { var mode = m || 0; index = index || 0; var out = {}; var vmType = this._getVoiceMeeterType(); var vmChannelsByType = this.channels[vmType]; if (!vmChannelsByType) { // TODO: replace with a better error throw new errors_1.VoiceMeeterError('Invalid VoiceMeeter type'); } if (mode == 3) { var outChannels = vmChannelsByType.outputs[index]; out.l = this.getLevel(mode, outChannels.l); out.r = this.getLevel(mode, outChannels.r); out.fc = this.getLevel(mode, outChannels.fc); out.lfe = this.getLevel(mode, outChannels.lfe); out.sl = this.getLevel(mode, outChannels.sl); out.sr = this.getLevel(mode, outChannels.sr); out.bl = this.getLevel(mode, outChannels.bl); out.br = this.getLevel(mode, outChannels.br); return out; } else if (mode == 0 || 1 || 2) { var inChannels = vmChannelsByType.inputs[index]; var inputs = this.voiceMeeterConfig.strips; if (inputs[index].isVirtual) { out.l = this.getLevel(mode, inChannels.l); out.r = this.getLevel(mode, inChannels.r); out.fc = this.getLevel(mode, inChannels.fc); out.lfe = this.getLevel(mode, inChannels.lfe); out.sl = this.getLevel(mode, inChannels.sl); out.sr = this.getLevel(mode, inChannels.sr); out.bl = this.getLevel(mode, inChannels.bl); out.br = this.getLevel(mode, inChannels.br); } else { out.l = this.getLevel(mode, inChannels.l); out.r = this.getLevel(mode, inChannels.r); } return out; } }; VoiceMeeter.prototype._getGetParamType = function (prop) { var func = prop.type == 'float' ? VoiceMeeter.getParameter : VoiceMeeter.getStringParameter; return func; }; VoiceMeeter.prototype.getAllParameters = function () { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, rejects) { var data = { strips: [], buses: [], }; _this.voiceMeeterConfig.strips.forEach(function (element) { var inP = { type: InterfaceType[InterfaceType.strip], id: element.id, getVals: [], }; var out = { type: inP.type, id: element.id, name: element.name, }; for (var funcName in ioFuncs_1.default.strip) { var func = ioFuncs_1.default.strip[funcName]; var val = _this._getGetParamType(func)(_this, "Strip[" + element.id + "]." + func.val); if (typeof (val) != "string" || val) { out[func.out] = val; } } data.strips.push(out); }); _this.voiceMeeterConfig.buses.forEach(function (element) { var inP = { type: InterfaceType.bus, id: element.id, getVals: [], }; var out = { type: inP.type, id: element.id, name: element.name, }; for (var funcName in ioFuncs_1.default.bus) { var func = ioFuncs_1.default.bus[funcName]; var val = _this._getGetParamType(func)(_this, "Bus[" + element.id + "]." + func.val); if (typeof (val) != "string" || val) { out[func.out] = val; } } data.buses.push(out); }); resolve(data); })]; }); }); }; VoiceMeeter.prototype.getMultiParameter = function (param) { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, rejects) { var data = { strips: [], buses: [], }; param.forEach(function (paramElement) { var t = paramElement.type == InterfaceType.strip ? voiceMeeterUtils_1.VoiceMeeterGroupTypes.strips : voiceMeeterUtils_1.VoiceMeeterGroupTypes.buses; var out = { type: paramElement.type, id: paramElement.id, name: _this.voiceMeeterConfig[t][paramElement.id].name, }; // always include getting name val paramElement.getVals.push('name'); paramElement.getVals.forEach(function (element) { try { var func = ioFuncs_1.default[paramElement.type][element]; var val = _this._getGetParamType(func)(_this, paramElement.type + "[" + paramElement.id + "]." + func.val); if (typeof (val) != "string" || val) { out[func.out] = val; } } catch (error) { console.log(error); } }); if (paramElement.type == InterfaceType.strip) { data.strips.push(out); } else if (paramElement.type == InterfaceType.bus) { data.buses.push(out); } }); resolve(data); })]; }); }); }; VoiceMeeter.prototype.getVoiceMeeterInfo = function () { return { name: this.channels[this.type].name, type: this.type, version: this.version }; }; VoiceMeeter.prototype.isMacroButtonDirty = function () { var retVal = this.libVoiceMeeter.VBVMR_MacroButton_IsDirty(); if (retVal < 0) { throw new errors_1.VoiceMeeterDirtyError(retVal); } return retVal; }; VoiceMeeter.prototype.getMacroButtonStatus = function (index) { var pValue = ref_napi_1.default.alloc(ref_napi_1.default.types.float).ref(); // bitmode // 0 = push or release // 2 = change displayed state only // 3 = change Trigger state var retVal = this.libVoiceMeeter.VBVMR_MacroButton_GetStatus(index, pValue, 0); if (retVal < 0) { throw new errors_1.VoiceMeeterMacroButtonError(retVal); } return pValue.readFloatLE(); }; /** * * @param index The logical ID of the macro button * @param value Button state 0 or 1 * @returns 0 = success */ VoiceMeeter.prototype.setMacroButtonStatus = function (index, value) { var retVal = this.libVoiceMeeter.VBVMR_MacroButton_SetStatus(index, value, 0); if (retVal !== 0) { throw new errors_1.VoiceMeeterMacroButtonError(retVal); } return retVal; }; VoiceMeeter.prototype.toggleMacroButtonStatus = function (index) { if (this.getMacroButtonStatus(index) == 1) { return this.setMacroButtonStatus(index, 0); } else { return this.setMacroButtonStatus(index, 1); } }; return VoiceMeeter; }()); exports.VoiceMeeter = VoiceMeeter; var errors_2 = require("./errors"); Object.defineProperty(exports, "VoiceMeeterConnectionError", { enumerable: true, get: function () { return errors_2.VoiceMeeterConnectionError; } }); Object.defineProperty(exports, "VoiceMeeterDirtyError", { enumerable: true, get: function () { return errors_2.VoiceMeeterDirtyError; } }); Object.defineProperty(exports, "VoiceMeeterError", { enumerable: true, get: function () { return errors_2.VoiceMeeterError; } }); Object.defineProperty(exports, "VoiceMeeterGetParametersError", { enumerable: true, get: function () { return errors_2.VoiceMeeterGetParametersError; } }); Object.defineProperty(exports, "VoiceMeeterGetVersionError", { enumerable: true, get: function () { return errors_2.VoiceMeeterGetVersionError; } }); Object.defineProperty(exports, "VoiceMeeterInitializationError", { enumerable: true, get: function () { return errors_2.VoiceMeeterInitializationError; } }); Object.defineProperty(exports, "VoiceMeeterLevelError", { enumerable: true, get: function () { return errors_2.VoiceMeeterLevelError; } }); Object.defineProperty(exports, "VoiceMeeterLoginError", { enumerable: true, get: function () { return errors_2.VoiceMeeterLoginError; } }); Object.defineProperty(exports, "VoiceMeeterMacroButtonError", { enumerable: true, get: function () { return errors_2.VoiceMeeterMacroButtonError; } }); Object.defineProperty(exports, "VoiceMeeterMidiError", { enumerable: true, get: function () { return errors_2.VoiceMeeterMidiError; } }); Object.defineProperty(exports, "VoiceMeeterRunError", { enumerable: true, get: function () { return errors_2.VoiceMeeterRunError; } }); var voiceMeeterUtils_2 = require("./voiceMeeterUtils"); Object.defineProperty(exports, "VoiceMeeterGroupTypes", { enumerable: true, get: function () { return voiceMeeterUtils_2.VoiceMeeterGroupTypes; } }); //# sourceMappingURL=index.js.map