increase_volumeメソッドと、decrease_volumeメソッドの引数で任意の量だけ増減させることができる。
on_pressメソッド内のkeyboard.Key.f18とkeyboard.Key.f19を変更すれば、任意のキーで増減させることができる。
from pynput import keyboard
from ctypes import *
class VoiceMeeterController:
def __init__(self, dll_path):
self.vbc = cdll.LoadLibrary(dll_path)
self.vbc.VBVMR_Login.restype = c_long
self.vbc.VBVMR_Logout.restype = c_long
self.vbc.VBVMR_SetParameterFloat.restype = c_long
self.vbc.VBVMR_GetParameterFloat.restype = c_long
self.current_volume = 0.0
def login(self):
result = self.vbc.VBVMR_Login()
if result != 0:
raise Exception("VoiceMeeter login failed")
print("VoiceMeeter login successful")
def logout(self):
self.vbc.VBVMR_Logout()
print("VoiceMeeter logout successful")
def set_volume(self, volume):
self.vbc.VBVMR_SetParameterFloat(b"Bus[0].Gain", c_float(volume))
self.current_volume = volume
def increase_volume(self, increment=0.5):
new_volume = self.current_volume + increment
if new_volume > 12.0:
new_volume = 12.0
self.set_volume(new_volume)
def decrease_volume(self, decrement=0.5):
new_volume = self.current_volume - decrement
if new_volume < -60.0:
new_volume = -60.0
self.set_volume(new_volume)
def on_press(key, controller):
try:
if key ==
:
controller.increase_volume()
elif key == keyboard.Key.f19:
controller.decrease_volume()
except AttributeError:
pass
def main():
dll_path = "C:\\\\Program Files (x86)\\\\VB\\\\Voicemeeter\\\\VoiceMeeterRemote64.dll"
controller = VoiceMeeterController(dll_path)
controller.login()
try:
with keyboard.Listener(on_press=lambda key: on_press(key, controller)) as listener:
listener.join()
except KeyboardInterrupt:
pass
finally:
controller.logout()
if __name__ == "__main__":
main()
from pynput import keyboard
from ctypes import *
import tkinter as tk
from threading import Thread
from time import sleep
class VoiceMeeterController:
def __init__(self, dll_path):
self.vbc = cdll.LoadLibrary(dll_path)
self.vbc.VBVMR_Login.restype = c_long
self.vbc.VBVMR_Logout.restype = c_long
self.vbc.VBVMR_SetParameterFloat.restype = c_long
self.vbc.VBVMR_GetParameterFloat.restype = c_long
self.current_volume = -14.0
self.root = tk.Tk()
self.root.overrideredirect(1)
self.root.geometry("200x50+860+860") # ウィンドウサイズと表示位置を設定
self.label = tk.Label(self.root, font=("Helvetica", 16))
self.label.pack(expand=True) # ラベルを中央に配置
self.root.withdraw() # 初期状態ではウィンドウを非表示に
self.hide_timer = None # タイマーIDを保持する変数
def login(self, max_retries=1800, retry_delay=2):
attempt = 0
while attempt < max_retries:
result = self.vbc.VBVMR_Login()
if result == 0:
# print("VoiceMeeter login successful")
return True
else:
# print(f"VoiceMeeter login failed, attempt {attempt + 1}/{max_retries}. Retrying in {retry_delay} seconds...")
sleep(retry_delay)
attempt += 1
# raise Exception("VoiceMeeter login failed after multiple attempts")
raise
def logout(self):
self.vbc.VBVMR_Logout()
# print("VoiceMeeter logout successful")
self.root.quit()
def set_volume(self, volume):
self.vbc.VBVMR_SetParameterFloat(b"Bus[0].Gain", c_float(volume))
self.current_volume = volume
self.show_volume()
# print(f"Set volume to: {volume}")
def increase_volume(self, increment=0.5):
new_volume = self.current_volume + increment
if new_volume > 12.0:
new_volume = 12.0
self.set_volume(new_volume)
# print(f"Volume Up: {new_volume}")
def decrease_volume(self, decrement=0.5):
new_volume = self.current_volume - decrement
if new_volume < -60.0:
new_volume = -60.0
self.set_volume(new_volume)
# print(f"Volume Down: {new_volume}")
def show_volume(self):
self.label.config(text=f"Volume: {self.current_volume:.1f}")
self.root.deiconify() # ウィンドウを表示
if self.hide_timer is not None:
self.root.after_cancel(self.hide_timer) # 以前のタイマーをキャンセル
self.hide_timer = self.root.after(2000, self.root.withdraw) # 新しいタイマーを設定
def on_press(key, controller):
try:
if key == keyboard.Key.f18:
controller.increase_volume()
elif key == keyboard.Key.f19:
controller.decrease_volume()
except AttributeError:
pass
def main():
dll_path = "C:\\\\Program Files (x86)\\\\VB\\\\Voicemeeter\\\\VoiceMeeterRemote64.dll"
controller = VoiceMeeterController(dll_path)
controller.login()
# 別スレッドで音量制御を実行
def volume_control():
try:
with keyboard.Listener(on_press=lambda key: on_press(key, controller)) as listener:
listener.join()
except KeyboardInterrupt:
pass
finally:
controller.logout()
control_thread = Thread(target=volume_control)
control_thread.start()
# メインスレッドでTkinterのイベントループを実行
controller.root.mainloop()
if __name__ == "__main__":
main()