Table of contents
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 defaults, remove it from the config; it will be regenerated with a default value next time the game is closed. Until an in-game settings menu is added, the entries in the config.toml file will be explained here for manual editing. The order of sections and entries in the config file is arbitrary, and is likely to change each startup as the TOML format itself isn't order-preserving.
[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 usually relatively high.ASIO: a proprietary audio system by Steinberg that bypasses the Windows mixer. Offers very low latency, but requires a compatible driver to be installed.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 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. Audio latency is equal to 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 don't like the minor color fringing, you can override it with this setting. Valid values are:
''(empty string): No override; asks the OS. Retrieved layout will be reported in the logs.None: Don't 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 stylesheet to load. The value of default loads the bundled default theme. Any other value attempts to load themes/[value].pncss 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. They are listed in the logs alongside controller names at startup.
- Index: Starts at 0. If there are duplicate GUIDs (for example because multiple controllers of the same model are connected), the number is incremented for each one. This number will persist as controllers are reconnected during a single session, but might change if they are plugged in in a different order, or plugged into different ports. This is an unavoidable, fundamental limitation of USB HID. Logged together with the GUID.
- Button: The ID of the button, starting at 0.
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 quicky should judgment text (GREAT, GOOD, etc.) disappear after being shown.
p2_layout: Whether to use P2 side (turntable on the right) for 5K and 7K modes.