increase_volumeメソッドと、decrease_volumeメソッドの引数で任意の量だけ増減させることができる。

on_pressメソッド内のkeyboard.Key.f18keyboard.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()

GUI付き

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()