Cocktail Cab Project
-
@Clyde Very nice!
-
@theissdev Back to back? You mean like the old Nintendo "red tent" cabinets? Those are cool.
-
@IanDaemon For everyone who doesn't know them:
-
Whoaaaaaa. Talk about a throwback. I haven't seen one of those in forever!
-
Nice build!
I wonder if you have explored true cocktail settings in MAME for the vertical games. This would eliminate mirroring and no longer supply room for bezels, but it is how these were meant to be played and why the cocktail cabinet exists. The game dominates the screen, and when it is player 2’s turn, the video auto-rotates. Just an idea. I have all of my classic vertical games setup this way and it works great, provided the game was designed to use that feature (MAME DIP switches).
-
Sir, your really impressed me!!, excellent work!!!, let me know (msg me to the FB page) when you are ready to set LEDSpicer, so I can give you a hand with the configuration, I wrote some documentation on the sourceforge wiki page that may be helpful, but anyway you can ask me anything.
-
@caver01 Ya, I still have to wire the controls (dad time). was definitely planning on exploring throwing games that support cocktail mode into cocktail mode. Hopefully I'll have this thing completely done before a year has elapsed this December! =D
@MeduZaPaT Thanks! I really appreciate it. I've got it installed, but obviously can't do anything until the LED controller is wired. Quick reading on your documentation seems pretty straightforward. Will definitely reach out if I run into issues.
-
@MeduZaPaT I've gotten the bottom of the control panels built w/ hinges and locks and am now ready to finish up the rest of this - the wiring. I'm about done w/ the controls themselves and have a question about the LED wiring for LEDSpicer support:
I've got a PacLED64 (https://www.ultimarc.com/output/led-and-output-controllers/pacled64/) that I'm planning on using. I was going to use a couple of spare ground chains on a few of the + terminals of the PacLED64. All of my button LEDs are single-color.
It feels like everything's in sets of (+, R, G, B). Will LEDSpicer support a configuration of using all of the RGB pins for individual LEDs (Button 1 - 1R, Button 2 - 1G, Button 3 - 1B, Button 4 - 2R, Button 5 - 2G, etc.) or do I need to wire each button to a common pin, (like all buttons are wired to 1R, 2R, 3R, etc.). Is doing either way easier in config later?
Whether I end up soldering the wiring directly to the PacLED64 pins or using some of the leftover contact pins to plug into the plastic harness pieces, reverting may not be so easy, so thought I'd ask b4 I get to that point. Thanks for your help!
-
@theissdev said in Cocktail Cab Project:
@MeduZaPaT I've gotten the bottom of the control panels built w/ hinges and locks and am now ready to finish up the rest of this - the wiring. I'm about done w/ the controls themselves and have a question about the LED wiring for LEDSpicer support:
I've got a PacLED64 (https://www.ultimarc.com/output/led-and-output-controllers/pacled64/) that I'm planning on using. I was going to use a couple of spare ground chains on a few of the + terminals of the PacLED64. All of my button LEDs are single-color.
It feels like everything's in sets of (+, R, G, B). Will LEDSpicer support a configuration of using all of the RGB pins for individual LEDs (Button 1 - 1R, Button 2 - 1G, Button 3 - 1B, Button 4 - 2R, Button 5 - 2G, etc.) or do I need to wire each button to a common pin, (like all buttons are wired to 1R, 2R, 3R, etc.). Is doing either way easier in config later?
Whether I end up soldering the wiring directly to the PacLED64 pins or using some of the leftover contact pins to plug into the plastic harness pieces, reverting may not be so easy, so thought I'd ask b4 I get to that point. Thanks for your help!
Yes, LEDSpicer can handle RGB or single color elements, when creating the elements instead of using red/green/blue, use led like this:
<element name="ELEMENT NAME" led="PIN NUMBER" />
For more details read this section of the wiki
On my cab, I have RGB and Single LED elements, I just wire 1 pin to the LED and that works perfect.
-
@MeduZaPaT Sweet. Thank you sir!
-
@theissdev I very recommend you to don't solder the pins to the pac64 directly, get a cheap Crimping Tool and some pins, is really easy to do, and in no time you will get a really good interface that is easy to maintain.
I used something like this:
Crimping tool
Jumper connectors -
@MeduZaPaT You expect a wise man to come around this time of year. =D
-
@MeduZaPaT So, I've got all the lights wired up - used your connectors and the molex connectors that came w/ the pacled64. I've got button groups mapped and profiles for all the system combos. Everything is working great (and looks sooooo cool) for all the roms that don't have parentheses in their names. The ones that do (which is unfortunately most of them) throw an error and return to emulationStation on running the runcommand intermediary:
sh: 1: Syntax error: "(" unexpected
It's definitely related to the parentheses in the rom names (there are none in the paths). It's all the '(U)' etc. stuff.
I've tried wrapping all instances of the rom names in double quotes in the es_system.cfg command as well as the refs in the intermediary .sh that lights the buttons then calls runcommand.
runcommand.sh doesn't have any issues w/ the parentheses b4 hijack. I went in and copied the clean_name function from there and wrapped the $ROM in that and still having the error.
My runEmulator.sh (for the non-arcade systems):
#!/bin/bash EMU=$1 ROM=$2 RAW=$3 SYS=$4 emitter LoadProfile $EMU > /dev/null 2>&1 /opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ $EMU "$ROM"
I split the finish call to a new runcommand-onend.sh:
#!/bin/bash emitter FinishLastProfile > /dev/null 2>&1
Sample from my es_systems.cfg:
<system> <name>atari2600</name> <fullname>Atari 2600</fullname> <path>/home/pi/RetroPie/roms/atari2600</path> <extension>.7z .a26 .bin .rom .zip .gz .7Z .A26 .BIN .ROM .ZIP .GZ</extension> <command>/opt/retropie/supplementary/runcommand/runEmulator.sh atari2600 %ROM% %BASENAME% atari2600</command> <platform>atari2600</platform> <theme>atari2600</theme> </system>
Again, everything is great if there's no parentheses in the rom name. Just can't seem to figure out how to work around that and I shudder at the thought of having to strip those from all the configs and the filenames...
Any suggestions? Thanks and sorry my bash is weak. =(
-
@theissdev In the bash, you either need to "escape" special characters with a leading backslash
\(example\)
or put the whole command in either single or double quotation marks. See https://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash for the difference between them.I have not much practical experience in Bash-Fu, but for a start, I'd try to put your command in quotes:
<command>"/opt/retropie/supplementary/runcommand/runEmulator.sh atari2600 %ROM% %BASENAME% atari2600"</command>
-
@Clyde Ah. I'd tried wrapping the %ROM% in quotes, but didn't the %BASENAME% which would have the parentheses as well. Good idea for just wrapping the whole command. I'll give that a shot. Thanks!
edit: Bah. Still the same. Only place it could appear in the runEmulator.sh is already wrapped in double quotes. I may dig into how to do something like a string.replace('(', '(') in bash on that path and leave the command wrapped in quotes. Since the command is actually a param being parsed and then called, not 100% sure those quotes are being honored either...
Wrapping the %ROM% and %BASENAME% in quotes individually didn't work either. Since the original runcommand call in es_systems didn't seem to have any issue with parentheses and all the hijack script is doing is calling emitter and firing off that original runcommand, i may try just making the command in es_systems the emitter call && runcommand call and bypass the intermediate script. Since i'm not really getting a valid line number in the error, def. think the issue is w/ the argument passing.
-
@Clyde Woot! So this works:
<command>emitter LoadProfile atari2600 && /opt/retropie/supplementary/runcommand/runcommand.sh 0 _SYS_ atari2600 %ROM%</command>
Thanks for the help and inspiration!
-
I just wanted to post a quick update. There's been some changes to the cab and wanted to report them here in case someone needs it. Saw a thread about cocktail cabinets this week and thought having some more info here would be helpful for others.
For the cocktail split, I started using the cocktail shader here https://github.com/RetroPie/common-shaders/tree/master/misc but I realized it didn't cover everything. I started down the rabbit hole trying to create shaders for all the bazillion variants of aspect ratios, then realized I could come up w/ just a few that gets everything "close enough", leaving a small amt of black space here or there, but nothing really noticeable.
I ended up with 4 shaders. 2 for vert, 2 for horizontal. The vert and horizontal shaders also needed flipped variants as some of the games would show up upside down. Keep in mind I'm running all retroarch engines w/ rotation set to 1.
Here's those shaders if anyone's interested:
http://metalmutts.com/cab/cocktail-cab-portrait-flipped.glsl
http://metalmutts.com/cab/cocktail-cab-portrait-vert-flipped.glsl
http://metalmutts.com/cab/cocktail-cab-portrait-vert.glsl
http://metalmutts.com/cab/cocktail-cab-portrait.glsl
These should live somewhere in your /opt/retropie/configs/all/retroarch/shaders dir.These of course are only useful for games that have 2p simultaneous play. If the game is vert, there's a small amount of space to the left and right of the game. If it's running in lr-mame2003plus, I can run artwork. So I change the custom aspect ratio from 0,0,1920,1080 to 0,-230,1920,1540 and use this artwork (for ikari warriors in this case) which seems to look and work nice:
It's daytime, so sorry for the glare. If you want to use this artwork as a template, it's here: http://metalmutts.com/cab/ikari.zip
Note that this artwork needs to be in ~/Retropie/BIOS/mame2003-plus/artwork.For 1p games or 2p alternating, I went with full screen. Full screen works well, with the game centered in the view. If cocktail mode is available, I flipped that on and that works great. There's a lot of dead space when you do that though. Since this cab is artwork-forward, I decided to fill that space where I could (lr-mame2003plus engine, 1p or 2p alternating):
The artwork file is slightly different if the game is vertical or horizontal aspect.
The artwork for vertical (for a template) is here: http://metalmutts.com/cab/galaga.zip and for horizontal: http://metalmutts.com/cab/gtg2.zip
Note that if you previously changed the aspect, these overlays require the full aspect (0,0,1920,1080).
Since the cocktail versions of these have the marquees mirrored, you don't notice anything when the cocktail mode flips the screen. For 1p games, the artwork obviously doesn't flip, but it's also semi-random which orientation you get (you may need to adjust the artwork as needed). I've also seen cases where the artwork is actually reversed (not sure how that works, but you can reverse it in the artwork file and retry it).
Also, keep in mind that since we're running the libretro cores rotated, the artwork wants to be rotated as well (at least for me). So when you're working on an overlay to fill out the top and bottom of a vertical game, the artwork file is offset 90° as well (if you look at the image in that galaga artwork file, you'll see the marquees are on the left and right). Just something to be aware of. Running rotated can create some... challenges. =D
Now this worked great for a while, but I hated having to select games w/ the menu not rotated (remember I'm running the libretro cores w/ rotation 1 (90°). I started w/ a slightly tweaked version @alphatoanant 's gorgeous artbook theme (again, this cab is all about the art). Eventually I decided trying to set emulationstation to run 90° and thus I needed a vertical version of the theme. I came up with this:
and
I think it worked out great, giving max space to artwork where available. Marquee and fliers on arcade, box art on consoles. Plenty of space for description, vid and game data w/o sacrificing art space.I've heard differing takes on whether or not it's better to run the whole pi rotated or individually here (libretro cores and emulationstation). Individually seems to work great w/ no noticeable slowdown. Unfortunately, for non-mame2003 arcade cores, I just have black space wherever that appears, but I've tried to focus mostly on lr-mame2003plus and use lr-fbn or lr-2010 when I'm not able to have 2003 (glitches or whatnot).
Anywhoo.... This was my first retropie cab. It's sitting here waiting for the RP4 upgrade. Hoping the majority of these files will transfer cleanly. Again, just wanted to document my experience and share files I ended up with in case it helps anyone. Another big shout out to this community. There's no way I would've figured some of this stuff out w/o you guys! <3
-
You have so given me something to aim for, this is just an awesome bit of kit.
-
So I am working on a cocktail setup and I have a few q's.
- Did you use a hdtv or a monitor? My main q is that I cant get emulation station to come up in vertical and it wont always run at all at this point. Ive edited the config.txt and it will display a vertical startup then either freeze up or run emulationstation in a horizontal configuration.
- Can you post your config.txt?
Thanks!
-
@j_infamous Sorry for the 2d response. Work's been crazy. =(
I used a 1920x1080 monitor. I've got rotation called out in a couple of places, probably not the best setup, but I kinda worked it as I went.
The overall machine is running non-rotated. I'm just rotating emulationstation and also the retroarch cores (of which all the emulators are lr-x to get the rotation as well as the split-screen shaders).
I rotate emulationstation from /opt/retropie/configs/all/autostart.sh:
emulationstation --screensize 1080 1920 --screenoffset 0 0 --screenrotate 3 #auto
The master retroarch.cfg (/opt/retropie/configs/all/retroarch.cfg) calls out the rotation for all the retroarch cores as well as sets a custom aspect ratio to set up the full screen display that the cocktail shaders above need - the default shader is cocktail-cab-portrait.glsl as that seems to be the most common for arcade and almost all the console (4:3 mirrored)). Full config:
## Skeleton config file for RetroArch # If set to a directory, the content history playlist will be saved # to this directory. # content_history_dir = # Automatically saves a savestate at the end of RetroArch's lifetime. # The path is $SRAM_PATH.auto. # RetroArch will automatically load any savestate with this path on startup if savestate_auto_load is set. savestate_auto_save = false savestate_auto_load = false # Load libretro from a dynamic location for dynamically built RetroArch. # This option is mandatory. # Path to a libretro implementation. # libretro_path = "/path/to/libretro.so" # Sets log level for libretro cores (GET_LOG_INTERFACE). # If a log level issued by a libretro core is below libretro_log_level, it is ignored. # DEBUG logs are always ignored unless verbose mode is activated (--verbose). # DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3. # libretro_log_level = 0 # Enable or disable verbosity level of frontend. # log_verbosity = false # If this option is enabled, every content file loaded in RetroArch will be # automatically added to a history list. history_list_enable = true # Enable performance counters # perfcnt_enable = false # Path to core options config file. # This config file is used to expose core-specific options. # It will be written to by RetroArch. # A default path will be assigned if not set. core_options_path = "/opt/retropie/configs/all/retroarch-core-options.cfg" # Path to content history file. # RetroArch keeps track of all content loaded in the menu and from CLI directly for convenient quick loading. # A default path will be assigned if not set. # content_history_path = # Path to music content history file (optional). # RetroArch keeps track of all music content loaded in the menu and from CLI directly for convenient quick loading. # A default path will be assigned if not set. # content_music_history_path = # Path to image content history file (optional). # RetroArch keeps track of all image content loaded in the menu and from CLI directly for convenient quick loading. # A default path will be assigned if not set. # content_image_history_path = # Path to video content history file (optional). # RetroArch keeps track of all video content loaded in the menu and from CLI directly for convenient quick loading. # A default path will be assigned if not set. # content_video_history_path = # Number of entries that will be kept in content history file. content_history_size = 25 # Content directory. Interacts with RETRO_ENVIRONMENT_GET_CONTENT_DIRECTORY. # Usually set by developers who bundle libretro/RetroArch apps to point to assets. # content_directory = # Sets start directory for menu config browser. # rgui_config_directory = # Show startup screen in menu. # Is automatically set to false when seen for the first time. # This is only updated in config if config_save_on_exit is set to true, however. rgui_show_start_screen = "false" # Flushes config to disk on exit. Useful for menu as settings can be modified. # Overwrites the config. #include's and comments are not preserved. config_save_on_exit = "false" # Shows hidden files and folders in directory listings. # show_hidden_files = false #### Driver # Input driver. Depending on video driver, it might force a different input driver. # input_driver = sdl # Joypad driver. ("udev", "linuxraw", "paraport", "sdl2", "hid", "dinput") input_joypad_driver = "udev" # Video driver to use. "gl", "xvideo", "sdl", "d3d" # video_driver = "gl" # Which context implementation to use. # Possible ones for desktop are: glx, x-egl, kms-egl, sdl-gl, wgl. # By default, tries to use first suitable driver. # video_context_driver = # Audio driver backend. Depending on configuration possible candidates are: alsa, pulse, oss, jack, rsound, roar, openal, sdl, xaudio. # audio_driver = # Audio resampler driver backend. Which audio resampler to use. # Default will use "sinc". # audio_resampler = # Camera driver. # camera_driver = # Location driver. # location_driver = # Menu driver to use. ("rgui", "xmb", "glui") menu_driver = "rgui" # Record driver. Used when recording video. # record_driver = #### Video # Suspends the screensaver if set to true. Is a hint that does not necessarily have to be honored # by video driver. suspend_screensaver_enable = true # Display framerate. # fps_show = false # Display memory. # memory_show = false # Display total number of frames rendered. (only displays if fps_show is enabled) # framecount_show = # Which monitor to prefer. 0 (default) means no particular monitor is preferred, 1 and up (1 being first monitor), # suggests RetroArch to use that particular monitor. # video_monitor_index = 0 # Start in fullscreen. Can be changed at runtime. video_fullscreen = "true" # If fullscreen, prefer using a windowed fullscreen mode. video_windowed_fullscreen = true # Fullscreen resolution. Resolution of 0 uses the resolution of the desktop. video_fullscreen_x = 0 video_fullscreen_y = 0 # Video refresh rate of your CRT monitor. # Used to calculate a suitable audio input rate. # crt_video_refresh_rate = 59.94 # Video refresh rate of your monitor. # Used to calculate a suitable audio input rate. # video_refresh_rate = 59.94 # Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows # have video problems with sRGB FBO support enabled. # video_force_srgb_disable = false # If this is true and video_aspect_ratio is not set, # aspect ratio is decided by libretro implementation. # If this is false, 1:1 PAR will always be assumed if video_aspect_ratio is not set. video_aspect_ratio_auto = "true" # A floating point value for video aspect ratio (width / height). # If this is not set, aspect ratio is assumed to be automatic. # Behavior then is defined by video_aspect_ratio_auto. # video_aspect_ratio = # Windowed x resolution scale and y resolution scale # (Real x res: base_size * xscale * aspect_ratio, real y res: base_size * yscale) # video_scale = 3.0 # Percentage of opacity to use for the window (100 is completely opaque). # video_window_opacity = 100 # Whether to enable the default window decorations like border, titlebar etc. # video_window_show_decorations = true # Forcibly disable composition. Only works in Windows Vista/7 for now. # video_disable_composition = false # Video vsync. video_vsync = true # Interval at which a Vsync swap is performed. # 1 is normal, 2 is doubled frames, 3 is tripled frames, etc. video_swap_interval = 1 # Max amount of swapchain images. # Single buffering = 1, Double buffering = 2, 3 = Triple buffering # video_max_swapchain_images = 3 # Attempts to hard-synchronize CPU and GPU. Can reduce latency at cost of performance. video_hard_sync = false # Sets how many frames CPU can run ahead of GPU when using video_hard_sync. # Maximum is 3. video_hard_sync_frames = 0 # Sets how many milliseconds to delay after VSync before running the core. # Can reduce latency at cost of higher risk of stuttering. # Maximum is 15. video_frame_delay = 0 # Inserts a black frame inbetween frames. # Useful for 120 Hz monitors who want to play 60 Hz material with eliminated ghosting. # video_refresh_rate should still be configured as if it is a 60 Hz monitor (divide refresh rate by 2). video_black_frame_insertion = false # Use threaded video driver. Using this might improve performance at possible cost of latency and more video stuttering. video_threaded = "true" # Use a shared context for HW rendered libretro cores. # Avoids having to assume HW state changes inbetween frames. video_shared_context = false # Smoothens picture with bilinear filtering. Should be disabled if using pixel shaders. # video_smooth = true # Forces rendering area to stay equal to content aspect ratio or as defined in video_aspect_ratio. video_force_aspect = true # Only scales video in integer steps. # The base size depends on system-reported geometry and aspect ratio. # If video_force_aspect is not set, X/Y will be integer scaled independently. video_scale_integer = false # Index of the aspect ratio selection in the menu. # 19 = Config, 20 = 1:1 PAR, 21 = Core Provided, 22 = Custom Aspect Ratio aspect_ratio_index = 23 custom_viewport_height = 1080 custom_viewport_width = 1920 custom_viewport_x = 0 custom_viewport_y = 0 # Forces cropping of overscanned frames. # Exact behavior of this option is implementation specific. video_crop_overscan = true # Path to shader. Shader can be either Cg, CGP (Cg preset) or GLSL, GLSLP (GLSL preset) video_shader = "/opt/retropie/configs/all/retroarch/shaders/misc/cocktail-cab-portrait.glsl" # Load video_shader on startup. # Other shaders can still be loaded later in runtime. video_shader_enable = "true" # CPU-based video filter. Path to a dynamic library. # video_filter = # Path to a font used for rendering messages. This path must be defined to enable fonts. # Do note that the _full_ path of the font is necessary! # video_font_path = # Size of the font rendered in points. video_font_size = "12" # Enable usage of OSD messages. video_font_enable = true # Offset for where messages will be placed on screen. Values are in range 0.0 to 1.0 for both x and y values. # [0.0, 0.0] maps to the lower left corner of the screen. # video_message_pos_x = 0.05 # video_message_pos_y = 0.05 # Color for message. The value is treated as a hexadecimal value. # It is a regular RGB hex number, i.e. red is "ff0000". # video_message_color = ffff00 # Background color for OSD messages. Red/Green/Blue values are from 0 to 255 and opacity is 0.0 to 1.0. # video_message_bgcolor_enable = false # video_message_bgcolor_red = 0 # video_message_bgcolor_green = 0 # video_message_bgcolor_blue = 0 # video_message_bgcolor_opacity = 1.0 # Allows libretro cores to set rotation modes. # Setting this to false will honor, but ignore this request. # This is useful for vertically oriented content where one manually rotates the monitor. video_allow_rotate = true # Forces a certain rotation of the video. # The rotation is added to rotations which the libretro core sets (see video_allow_rotate). # The angle is <value> * 90 degrees counter-clockwise. video_rotation = 1 # Forces a certain orientation of the screen from the operating system. # The angle is <value> * 90 degrees counter-clockwise. # screen_orientation = 0 #### Audio # Enable audio. # audio_enable = true # Enable menu audio sounds. # audio_enable_menu = false # audio_enable_menu_ok = false # audio_enable_menu_cancel = false # audio_enable_menu_notice = false # audio_enable_menu_bgm = false # Mutes audio. audio_mute_enable = false # Mutes audio mixer volume globally. audio_mixer_mute_enable = false # Audio output samplerate. # audio_out_rate = 48000 # Override the default audio device the audio_driver uses. This is driver dependant. E.g. ALSA wants a PCM device, OSS wants a path (e.g. /dev/dsp), Jack wants portnames (e.g. system:playback1,system:playback_2), and so on ... # audio_device = # Audio DSP plugin that processes audio before it's sent to the driver. Path to a dynamic library. # audio_dsp_plugin = # Will sync (block) on audio. Recommended. audio_sync = true # Desired audio latency in milliseconds. Might not be honored if driver can't provide given latency. audio_latency = 64 # Enable audio rate control. audio_rate_control = true # Controls audio rate control delta. Defines how much input rate can be adjusted dynamically. # Input rate = in_rate * (1.0 +/- audio_rate_control_delta) audio_rate_control_delta = 0.005 # Controls maximum audio timing skew. Defines the maximum change in input rate. # Input rate = in_rate * (1.0 +/- max_timing_skew) audio_max_timing_skew = 0.05 # Audio volume. Volume is expressed in dB. # 0 dB is normal volume. No gain will be applied. # Gain can be controlled in runtime with input_volume_up/input_volume_down. audio_volume = 0.0 # Audio mixer volume. Volume is expressed in dB. # 0 dB is normal volume. No gain will be applied. audio_mixer_volume = 0.0 #### Overlay # Enable the overlay. input_overlay_enable = true # Hide the current overlay from appearing inside the menu. input_overlay_hide_in_menu = true # Path to input overlay. # input_overlay = # Opacity of all the UI elements of the overlay. input_overlay_opacity = 0.7 # Scale of all UI elements of the overlay. input_overlay_scale = 1.0 #### Input # Path to input remapping file. # input_remapping_path = # Input bind timer timeout. # Amount of seconds to wait until proceeding to the next bind. Default: 5, minimum: 1 # input_bind_timeout = 1 # If enabled, overrides the input binds with the remapped binds set for the current core. input_remap_binds_enable = true # Maximum amount of users supported by RetroArch. input_max_users = 4 # Keyboard layout for input driver if applicable (udev/evdev for now). # Syntax is either just layout (e.g. "no"), or a layout and variant separated with colon ("no:nodeadkeys"). # input_keyboard_layout = # Defines axis threshold. Possible values are [0.0, 1.0] # input_axis_threshold = 0.5 # input_analog_deadzone = 0.0 # input_analog_sensitivity = 1.0 # Enable input auto-detection. Will attempt to autoconfigure # joypads, Plug-and-Play style. input_autodetect_enable = "true" # Show the input descriptors set by the core instead of the # default ones. input_descriptor_label_show = true # Hide input descriptors that were not set by the core. input_descriptor_hide_unbound = false # Influence how input polling is done inside RetroArch. # 0 : Early - Input polling is performed before call to retro_run. # 1 : Normal - Input polling is performed when retro_input_poll is # requested. # 2 : Late - Input polling is performed on first call to retro_input_state # per frame # # Setting it to 0 or 2 can result in less latency depending on # your configuration. # # When netplay is enabled, the default polling behavior (1) will # be used regardless of the value set here. input_poll_type_behavior = 2 # Sets which libretro device is used for a user. # Devices are indentified with a number. # This is normally saved by the menu. # Device IDs are found in libretro.h. # These settings are overridden by explicit command-line arguments which refer to input devices. # None: 0 # Joypad (RetroPad): 1 # Mouse: 2 # Keyboard: 3 # Generic Lightgun: 4 # Joypad w/ Analog (RetroPad + Analog sticks): 5 # Multitap (SNES specific): 257 # Super Scope (SNES specific): 260 # Justifier (SNES specific): 516 # Justifiers (SNES specific): 772 # input_libretro_device_p1 = 3 # input_libretro_device_p2 = 3 # input_libretro_device_p3 = 5 # input_libretro_device_p4 = 5 # input_libretro_device_p5 = # input_libretro_device_p6 = # input_libretro_device_p7 = # input_libretro_device_p8 = # Keyboard input. Will recognize letters ("a" to "z") and the following special keys (where "kp_" # is for keypad keys): # # left, right, up, down, enter, kp_enter, tab, insert, del, end, home, # rshift, shift, ctrl, alt, space, escape, add, subtract, kp_plus, kp_minus, # f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, # num0, num1, num2, num3, num4, num5, num6, num7, num8, num9, pageup, pagedown, # keypad0, keypad1, keypad2, keypad3, keypad4, keypad5, keypad6, keypad7, keypad8, keypad9, # period, capslock, numlock, backspace, multiply, divide, print_screen, scroll_lock, # tilde, backquote, pause, quote, comma, minus, slash, semicolon, equals, leftbracket, # backslash, rightbracket, kp_period, kp_equals, rctrl, ralt # # Keyboard input, Joypad and Joyaxis will all obey the "nul" bind, which disables the bind completely, # rather than relying on a default. input_player1_a = "space" input_player1_b = "alt" input_player1_y = "x" input_player1_x = "c" input_player1_start = "num1" input_player1_select = "num5" input_player1_l = "shift" input_player1_r = "ctrl" input_player1_left = "left" input_player1_right = "right" input_player1_up = "up" input_player1_down = "down" input_player1_l2 = "v" input_player1_r2 = "z" input_player1_mouse_index = 1 input_player2_a = "q" input_player2_b = "w" input_player2_y = "l" input_player2_x = "j" input_player2_start = "num2" input_player2_select = "num6" input_player2_l = "k" input_player2_r = "i" input_player2_left = "d" input_player2_right = "g" input_player2_up = "r" input_player2_down = "f" input_player2_l2 = "s" input_player2_r2 = "a" input_player2_mouse_index = 3 # input_player1_l3 = # input_player1_r3 = # input_player2_l3 = # input_player2_r3 = # Two analog sticks (DualShock-esque). # Bound as usual, however, if a real analog axis is bound, # it can be read as a true analog. # Positive X axis is right, Positive Y axis is down. # input_player1_l_x_plus = # input_player1_l_x_minus = # input_player1_l_y_plus = # input_player1_l_y_minus = # input_player1_r_x_plus = # input_player1_r_x_minus = # input_player1_r_y_plus = # input_player1_r_y_minus = # If desired, it is possible to override which joypads are being used for user 1 through 8. # First joypad available is 0. # input_player1_joypad_index = 0 # input_player2_joypad_index = 0 # input_player3_joypad_index = 2 # input_player4_joypad_index = 3 # input_player5_joypad_index = 4 # input_player6_joypad_index = 5 # input_player7_joypad_index = 6 # input_player8_joypad_index = 7 # Input device buttons. # Figure these out by using RetroArch-Phoenix or retroarch-joyconfig. # You can use joypad hats with hnxx, where n is the hat, and xx is a string representing direction. # E.g. "h0up" # input_player1_a_btn = # input_player1_b_btn = # input_player1_y_btn = # input_player1_x_btn = # input_player1_start_btn = # input_player1_select_btn = # input_player1_l_btn = # input_player1_r_btn = # input_player1_left_btn = # input_player1_right_btn = # input_player1_up_btn = # input_player1_down_btn = # input_player1_l2_btn = # input_player1_r2_btn = # input_player1_l3_btn = # input_player1_r3_btn = # Menu buttons. # menu_search_btn = # menu_info_btn = # menu_default_btn = # menu_scroll_down_btn = # menu_scroll_up_btn = # Swap buttons for OK/Cancel menu_swap_ok_cancel_buttons = "false" # Axis for RetroArch D-Pad. # Needs to be either '+' or '-' in the first character signaling either positive or negative direction of the axis, then the axis number. # Do note that every other input option has the corresponding _btn and _axis binds as well; they are omitted here for clarity. # input_player1_left_axis = # input_player1_right_axis = # input_player1_up_axis = # input_player1_down_axis = # Holding the turbo while pressing another button will let the button enter a turbo mode # where the button state is modulated with a periodic signal. # The modulation stops when the button itself (not turbo button) is released. input_player1_turbo = "y" # Describes the period and how long of that period a turbo-enabled button should behave. # Numbers are described in frames. # input_turbo_period = 6 # input_turbo_duty_cycle = 3 # This goes all the way to user 8 (*_player2_*, *_player3_*, etc), but omitted for clarity. # All input binds have corresponding binds for keyboard (none), joykeys (_btn) and joyaxes (_axis) as well. # Toggles fullscreen. # input_toggle_fullscreen = f # Saves state. input_save_state = "rightbracket" # Loads state. input_load_state = "leftbracket" # State slots. With slot set to 0, save state name is *.state (or whatever defined on commandline). # When slot is != 0, path will be $path%d, where %d is slot number. input_state_slot_increase = "add" input_state_slot_decrease = "subtract" # Toggles between fast-forwarding and normal speed. # input_toggle_fast_forward = space # Hold for fast-forward. Releasing button disables fast-forward. # input_hold_fast_forward = l # Key to exit RetroArch cleanly. # Killing it in any hard way (SIGKILL, etc) will terminate RetroArch without saving RAM, etc. # On Unix-likes, SIGINT/SIGTERM allows a clean deinitialization. input_exit_emulator = "period" # Applies next and previous shader in directory. # input_shader_next = "m" # input_shader_prev = "n" # Hold button down to rewind. Rewinding must be enabled. # input_rewind = "r" # Toggle between recording and not. # input_movie_record_toggle = o # Toggle between paused and non-paused state input_pause_toggle = "quote" # Frame advance when content is paused # input_frame_advance = k # Reset the content. # input_reset = h # Cheats. # input_cheat_index_plus = y # input_cheat_index_minus = t # input_cheat_toggle = u # Mute/unmute audio input_audio_mute = "comma" # Take screenshot # input_screenshot = f8 # Netplay flip users. # input_netplay_flip_players = i # Hold for slowmotion. # input_slowmotion = e # Enable other hotkeys. # If this hotkey is bound to either keyboard, joybutton or joyaxis, # all other hotkeys will be disabled unless this hotkey is also held at the same time. # This is useful for RETRO_KEYBOARD centric implementations # which query a large area of the keyboard, where it is not desirable # that hotkeys get in the way. # Alternatively, all hotkeys for keyboard could be disabled by the user. # input_enable_hotkey_btn = # Increases audio volume. # input_volume_up = kp_plus # Decreases audio volume. # input_volume_down = kp_minus # Toggles to next overlay. Wraps around. # input_overlay_next = # Toggles eject for disks. Used for multiple-disk content. # input_disk_eject_toggle = # Cycles through disk images. Use after ejecting. # Complete by toggling eject again. # input_disk_next = # Toggles menu. input_menu_toggle = "semicolon" # RetroPad button combination to toggle menu # 0 = none, 1 = L + R + Y + D-Pad Down, 2 = L3 + R3, 3 = Start + Select # input_menu_toggle_gamepad_combo = 0 # allow any RetroPad to control the menu all_users_control_menu = "true" # Toggles mouse grab. When mouse is grabbed, RetroArch hides the mouse, # and keeps the mouse pointer inside the window to allow relative mouse input # to work better. # input_grab_mouse_toggle = f11 #### Menu # If disabled, will hide 'Online Updater' inside the menu. menu_show_online_updater = "false" # If disabled, will hide the ability to update cores (and core info files) inside the menu. menu_show_core_updater = "false" # If disabled, the libretro core will keep running in the background when we # are in the menu. # menu_pause_libretro = false # If disabled, we use separate controls for menu operation. menu_unified_controls = "true" # Enable mouse controls inside the menu. # menu_mouse_enable = false # Enable touch controls inside the menu. # menu_pointer_enable = false # Shows current date and/or time inside menu. # menu_timedate_enable = true # Shows current battery level inside menu. # menu_battery_level_enable = true # Shows current core inside menu. # menu_core_enable = true # Path to an image to set as menu wallpaper. # menu_wallpaper = # Dynamically load a new wallpaper depending on context. # menu_dynamic_wallpaper_enable = false # Type of thumbnail to display. 0 = none, 1 = snaps, 2 = titles, 3 = boxarts # menu_thumbnails = 0 # menu_left_thumbnails = 0 # Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically. # menu_navigation_wraparound_enable = false # Filter files being shown in filebrowser by supported extensions. # menu_navigation_browser_filter_supported_extensions_enable = true # Collapse subgroup settings into main group to create one big listing of settings # per category. menu_collapse_subgroups_enable = false #### Core # # Prevent libretro cores from closing RetroArch on exit by loading a dummy core. # load_dummy_on_core_shutdown = "true" # Check for firmware requirement(s) before loading a content. # check_firmware_before_loading = "false" #### User Interface # Start UI companion driver's interface on boot (if available). # ui_companion_start_on_boot = true # Toggle companion UI on startup (currently only used to show the WIMP UI) # ui_companion_toggle = false # Only init the WIMP UI for this session if this is enabled # desktop_menu_enable = true #### Camera # Override the default camera device the camera driver uses. This is driver dependant. # camera_device = # Override the default privacy permission for cores that want to access camera services. Is "false" by default. # camera_allow = false #### Location # Override the default privacy permission for cores that want to access location services. Is "false" by default. # location_allow = false #### Core Updater # URL to core update directory on buildbot. # core_updater_buildbot_url = "http://buildbot.libretro.com" # URL to assets update directory on buildbot. # core_updater_buildbot_assets_url = "http://buildbot.libretro.com/assets/" # After downloading, automatically extract archives that the downloads are contained inside. # core_updater_auto_extract_archive = true #### Network # When being client over netplay, use keybinds for user 1. # netplay_client_swap_input = false # The username of the person running RetroArch. This will be used for playing online, for instance. # netplay_nickname = # The amount of delay frames to use for netplay. Increasing this value will increase # performance, but introduce more latency. # netplay_delay_frames = 0 # Netplay mode for the current user. # false is Server, true is Client. # netplay_mode = false # Enable or disable spectator mode for the user during netplay. # netplay_spectator_mode_enable = false # The IP Address of the host to connect to. # netplay_ip_address = # The port of the host IP Address. Can be either a TCP or UDP port. # netplay_ip_port = 55435 # Force game hosting to go through a man-in-the-middle server to get around firewalls and NAT/UPnP problems. # netplay_use_mitm_server = false # The requested MITM server to use. # netplay_mitm_server = "nyc" #### Directory # Sets the System/BIOS directory. # Implementations can query for this directory to load BIOSes, system-specific configs, etc. system_directory = "/home/pi/RetroPie/BIOS" # Save all downloaded files to this directory. # core_assets_directory = # Assets directory. This location is queried by default when menu interfaces try to look for # loadable assets, etc. # assets_directory = # Dynamic wallpapers directory. The place to store the wallpapers dynamically # loaded by the menu depending on context. # dynamic_wallpapers_directory = # Thumbnails directory. To store thumbnail files. # thumbnails_directory = # File browser directory. Sets start directory for menu file browser. rgui_browser_directory = "/home/pi/RetroPie/roms" # Core directory for libretro core implementations. # libretro_directory = # Core info directory for libretro core information. # libretro_info_path = # Path to content database directory. # content_database_path = # Saved queries are stored to this directory. # cursor_directory = # Path to cheat database directory. # cheat_database_path = # Defines a directory where CPU-based video filters are kept. # video_filter_dir = # Directory where DSP plugins are kept. # audio_filter_dir = # Defines a directory where shaders (Cg, CGP, GLSL) are kept for easy access. video_shader_dir = "~/.config/retroarch/shaders" # Recording output directory. Where recordings are saved. # recording_output_directory = # Recording config directory. Where recording settings are kept. # recording_config_directory = # Overlay directory. Where overlays are kept for easy access. # overlay_directory = # Directory to dump screenshots to. # screenshot_directory = # Directory for joypad autoconfigs. # If a joypad is plugged in, that joypad will be autoconfigured if a config file # corresponding to that joypad is present in joypad_autoconfig_dir. # Input binds which are made explicit (input_playerN_*_btn/axis) will take priority over autoconfigs. # Autoconfigs can be created with retroarch-joyconfig, manually, or with a frontend. # Requires input_autodetect_enable to be enabled. # joypad_autoconfig_dir = # Save all remapped controls to this directory. # input_remapping_directory = # Save all playlists/collections to this directory. # playlist_directory = # Save all save files (*.srm) to this directory. This includes related files like .bsv, .rtc, .psrm, etc ... # This will be overridden by explicit command line options. # savefile_directory = # Save all save states (*.state) to this directory. # This will be overridden by explicit command line options. # savestate_directory = # If set to a directory, content which is temporarily extracted # will be extracted to this directory. cache_directory = "/tmp/retroarch" #### Misc # Enable rewinding. This will take a performance hit when playing, so it is disabled by default. rewind_enable = "false" # Rewinding buffer size in megabytes. Bigger rewinding buffer means you can rewind longer. # The buffer should be approx. 20MB per minute of buffer time. rewind_buffer_size = "10" # Rewind granularity. When rewinding defined number of frames, you can rewind several frames at a time, increasing the rewinding speed. rewind_granularity = "2" # Pause gameplay when window focus is lost. # pause_nonactive = true # Autosaves the non-volatile SRAM at a regular interval. This is disabled by default unless set otherwise. # The interval is measured in seconds. A value of 0 disables autosave. autosave_interval = 0 # Records video after CPU video filter. video_post_filter_record = false # Records output of GPU shaded material if available. video_gpu_record = false # Screenshots output of GPU shaded material if available. video_gpu_screenshot = "true" # Watch content shader files for changes and auto-apply as necessary. video_shader_watch_files = false # Block SRAM from being overwritten when loading save states. # Might potentially lead to buggy games. # block_sram_overwrite = false # When saving a savestate, save state index is automatically increased before # it is saved. # Also, when loading content, the index will be set to the highest existing index. # There is no upper bound on the index. # savestate_auto_index = false # Slowmotion ratio. When slowmotion, content will slow down by factor. # slowmotion_ratio = 3.0 # The maximum rate at which content will be run when using fast forward. (E.g. 5.0 for 60 fps content => 300 fps cap). # RetroArch will go to sleep to ensure that the maximum rate will not be exceeded. # Do not rely on this cap to be perfectly accurate. # If this is set at 0, then fastforward ratio is unlimited (no FPS cap) # fastforward_ratio = 0.0 # Enable stdin/network command interface. # network_cmd_enable = false # network_cmd_port = 55355 # stdin_cmd_enable = false # Enable Sustained Performance Mode in Android 7.0+ # sustained_performance_mode = true # File format to use when writing playlists to disk # playlist_use_old_format = false # Keep track of how long each core+content has been running for over time # content_runtime_log = false # vibrate_on_keypress = false # Enable device vibration for supported cores # enable_device_vibration = false input_enable_hotkey = "f7" auto_remaps_enable = "true" #rgui_aspect_ratio_lock = "2" menu_show_restart_retroarch = "false" xmb_show_add = "false" xmb_show_history = "false" xmb_show_images = "false" xmb_show_music = "false" xmb_shadows_enable = "false" quit_press_twice = "false" game_specific_options = "true"
Of course, you probably want to cherry pick what you need from here. Esp. w/ inputs, I'm running a ton of btns through an iPac4, so all the input is custom coded to keyboard.
Hope that gets you going. Let me know if you have any other questions. Happy to help!
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.