Table of contents
Playnote > Config
The config.toml file, generated after initial start-up, contains Playnote configuration. This file may be manually modified while the game is closed. To restore a setting to its default, remove it from the config; it will be regenerated with a default value the next time the game is closed. Until an in-game settings menu is added, this page explains the entries for manual editing. The order of sections and entries in the config file is arbitrary and may change at each start-up because the TOML format is not order-preserving.
Note
You may edit
config.tomlwhile Playnote is running. The file will be reloaded and the change applied immediately, if possible.
[system]
attach_console: Whether to create a console window for printing the logs into, in addition to the log file. Windows-only; Linux always prints logs to stdout/stderr.
[debug]
layout: Set to true to enable the layout debugging overlay.
The logging levels for each subsystem, for logs written into the console and the log file. Valid values are Trace, Debug, Info, Warning, Error and Critical.
global: Top-level messages.
input: Window messages, controller events.
render: GPU device, Vulkan, vuk, renderer.
audio: Audio device and mixer.
library: BMS chart library.
theme: Theme parser and loader.
reinstall_theme: If true, the default theme will be reinstalled each start-up even if it already exists.
[audio]
backend: The audio backend to use. Valid values are:
WASAPI: Built-in Windows audio. Compatible, but latency is usually relatively high.ASIO: A proprietary audio system by Steinberg that bypasses the Windows mixer. It offers very low latency, but requires a compatible driver.PipeWire: The modern Linux audio stack.Auto: On Windows, tries every available ASIO driver, then falls back to WASAPI. On Linux, selects PipeWire.
[pipewire]
buffer_size: Size of the audio buffer on Linux, in samples. Set it to the smallest value your system can handle without audio glitches to minimize audio latency. If you hear pops, buzzing, or pauses, increase the value. Approximate buffer latency is buffer_size / sample_rate * 1000 milliseconds; sample_rate is typically 44100 or 48000.
[wasapi]
exclusive_mode: Whether to use exclusive mode on Windows, rather than shared mode. Exclusive mode offers lower audio latency, but blocks all other applications from using the audio device. You will not hear OS notifications, IM pings, or voice calls. It's also harder to capture for recording or streaming.
use_custom_latency: Whether to honor the custom_latency setting. This requests a specific audio latency when initializing the audio client on Windows. If the value is outside of the valid range reported by the driver, a warning will be printed to the log file, and the value will be ignored as if use_custom_latency was false.
custom_latency_ms: The value to use if use_custom_latency is true. Please note that in shared mode, even if the value is accepted, the buffer size offered by the driver and reported in the log file may be larger.
[asio]
device: The name of the ASIO driver to use. If empty, the first one will be used that doesn't fail to initialize, and the list of drivers will be printed into the logs.
buffer_size: The buffer size to request, in samples. If outside of available range, will be clamped with a warning. If at the default value of 0, the "preferred" buffer size will be used; this is often the value set in the ASIO driver's settings.
[graphics]
window_width, window_height: Window size in pixels. If the game is resized at runtime, the new size will be saved into these values.
swapchain_image_count: The number of images to use for swapchain buffering. Values from 1 to 3 are commonly known as "single buffering", "double buffering" and "triple buffering", respectively. Decreasing this value improves video latency at the cost of performance. The windowing system might ignore this value, in which case a warning will be printed to the logs.
low_latency: Whether to sleep on the render thread in an attempt to prepare the visuals as close as possible to the next refresh, analogously to NVIDIA Reflex. Disable if experiencing stuttering or low framerates.
validation_enabled: Whether to enable Vulkan validation layers. Useful for debugging graphics issues.
subpixel_layout_override: By default, Playnote queries the OS for the display's subpixel layout and uses it for sharper rendering of all graphics. If the layout is wrong, or you do not like the minor color fringing, you can override it with this setting. Valid values are:
''(empty string): No override; ask the OS. The retrieved layout is reported in the logs.None: Do not use subpixel rendering.HorizontalRGB,HorizontalBGR,VerticalRGB,VerticalBGR: Currently supported subpixel layouts.
[ui]
content_scale: Sizes of text and some UI elements depend on screen DPI. To customize it further, increase this value beyond 1.0 to make everything bigger, and below 1.0 to make everything smaller.
theme: The theme package to load. The value of default loads the bundled default theme. Any other value attempts to load the installed theme folder themes/[value]/ from the config directory.
[controls]
kb_*: The entries here control keyboard configuration for each supported playstyle, and should be self-explanatory. The valid values are names of KeyCode enum values from lib/glfw.
con_*: These are controller button bindings. A value takes the form of GUID;Index;Button:
- GUID: The OS identifier of the controller, listed in the logs alongside controller names at start-up.
- Index: Starts at 0. If duplicate GUIDs exist - for example, because multiple controllers of the same model are connected - the number is incremented for each one. This number persists as controllers are reconnected during a single session, but might change if they are plugged in in a different order or into different ports.
- Button: The ID of the button, starting at 0.
Note
The volatility of the controller index is an unavoidable limitation of USB HID. The index is logged together with the GUID.
Example log entry:
12:17:15.251 [INF] [Global] Controller connected: "Konami Amusement beatmania IIDX controller premium model", ID: 03000000cf1c00004880000011010000;0
12:17:15.251 [INF] [Global] Controller connected: "Konami Amusement beatmania IIDX controller premium model", ID: 03000000cf1c00004880000011010000;1
Example bindings for these controllers:
con_14k_p1_1 = '03000000cf1c00004880000011010000;0;0'
con_14k_p1_2 = '03000000cf1c00004880000011010000;0;1'
con_14k_p1_3 = '03000000cf1c00004880000011010000;0;2'
# And so on...
con_14k_p2_1 = '03000000cf1c00004880000011010000;1;0'
con_14k_p2_2 = '03000000cf1c00004880000011010000;1;1'
con_14k_p2_3 = '03000000cf1c00004880000011010000;1;2'
# And so on...
con_*_analog: Controller bindings for analogue turntables. Same format as buttons, but the last value is the ID of the axis. For example:
con_7k_s_analog = '03000000cf1c00004880000011010000;0;0'
debounce_duration_ms: After an input happens, any further inputs for the same key are ignored for this duration. This helps prevent duplicate inputs from unreliable input devices, with zero effect on latency.
turntable_stop_timeout_ms: The amount of time it takes for an analogue turntable to be considered stopped. This helps prevent spurious inputs from loose turntables as they slow down and the axis value starts updating more slowly, or with rotations that were very slow to begin with.
[gameplay]
note_scroll_ms: The amount of time notes take to reach the bottom, at chart's main BPM.
note_offset_ms: A visual vertical offset applied to all notes. Can help mitigate video latency. Positive value moves notes up, negative value moves notes down.
judgment_timeout_ms: How quickly judgment text (GREAT, GOOD, etc.) should disappear after being shown.
p2_layout: Whether to use P2 side (turntable on the right) for 5K and 7K modes.