{"id":15366447,"url":"https://github.com/freezy/dmd-extensions","last_synced_at":"2025-04-04T08:03:44.540Z","repository":{"id":6977908,"uuid":"55844338","full_name":"freezy/dmd-extensions","owner":"freezy","description":"A toolbox for virtual pinball dot matrix displays.","archived":false,"fork":false,"pushed_at":"2025-02-14T20:26:13.000Z","size":37262,"stargazers_count":138,"open_issues_count":72,"forks_count":54,"subscribers_count":24,"default_branch":"master","last_synced_at":"2025-03-28T07:02:14.391Z","etag":null,"topics":["dmd","pinball","pinball-arcade","pinball-fx2","pro-pinball","vpinmame"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freezy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-04-09T12:57:41.000Z","updated_at":"2025-03-05T13:48:42.000Z","dependencies_parsed_at":"2024-05-18T20:36:15.185Z","dependency_job_id":"fe2a8ddd-3ca6-4868-be94-a90a78cf72b7","html_url":"https://github.com/freezy/dmd-extensions","commit_stats":{"total_commits":1345,"total_committers":27,"mean_commits":49.81481481481482,"dds":0.3115241635687732,"last_synced_commit":"c461fd4a4420c16e0628cc575075c371a62dc177"},"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freezy%2Fdmd-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freezy%2Fdmd-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freezy%2Fdmd-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freezy%2Fdmd-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freezy","download_url":"https://codeload.github.com/freezy/dmd-extensions/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247136781,"owners_count":20889742,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dmd","pinball","pinball-arcade","pinball-fx2","pro-pinball","vpinmame"],"created_at":"2024-10-01T13:18:48.573Z","updated_at":"2025-04-04T08:03:44.514Z","avatar_url":"https://github.com/freezy.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DMD Extensions\r\n\r\n*A toolbox for digital pinball and dot matrix displays.*\r\n\r\nThis project aims to connect digital pinball games with the physical DMDs that are widespread in the community. It also\r\ncomes with pretty monitor output, supports frame-by-frame colorization, and can even stream over the network.\r\n\r\n## Table of Contents\r\n\r\n- [Table of Contents](#table-of-contents)\r\n- [Features](#features)\r\n  - [Supported Games](#supported-games)\r\n  - [Supported Displays](#supported-displays)\r\n  - [High-Resolution DMD for Monitors](#high-resolution-dmd-for-monitors)\r\n  - [Segment Display Rendering](#segment-display-rendering)\r\n  - [Frame Colorization](#frame-colorization)\r\n  - [Network Streaming](#network-streaming)\r\n  - [Scaling](#scaling)\r\n- [Install Instructions](#install-instructions)\r\n- [Usage](#usage)\r\n  - [Test](#test)\r\n  - [Pinball FX2](#pinball-fx2)\r\n  - [Pinball FX3](#pinball-fx3)\r\n  - [Pinball FX](#pinball-fx)\r\n  - [The Pinball Arcade](#the-pinball-arcade)\r\n  - [Pro Pinball Ultra](#pro-pinball-ultra)\r\n  - [Visual PinMAME](#visual-pinmame)\r\n  - [Future Pinball](#future-pinball)\r\n  - [Media](#media)\r\n  - [Pinup Player](#pinup-player)\r\n  - [PinballX](#pinballx)\r\n  - [Frame Dumping](#frame-dumping)\r\n- [Configuration](#configuration)\r\n  - [Output Configuration](#output-configuration)\r\n  - [Command Line Configuration](#command-line-configuration)\r\n  - [ZeDMD](#zedmd)\r\n  - [Colorization](#colorization)\r\n- [Breaking Changes](#breaking-changes)\r\n  - [v2.2.2](#v222)\r\n  - [v2.1.1](#v211)\r\n  - [v1.8.0](#v180)\r\n- [Troubleshooting](#troubleshooting)\r\n  - [Flickering with PinDMDv3](#flickering-with-pindmdv3)\r\n  - [Still flickering?](#still-flickering)\r\n  - [DmdDevice.ini Ignored?](#dmddeviceini-ignored)\r\n  - [Slow rendering on certain ROMs with VPM?](#slow-rendering-on-certain-roms-with-vpm)\r\n  - [Weird positioning or no DMD visible at all?](#weird-positioning-or-no-dmd-visible-at-all)\r\n  - [Unable to load DLL 'serum.dll'](#unable-to-load-dll-serumdll)\r\n  - [Backglass covers segment displays](#backglass-covers-segment-displays)\r\n- [Reporting Bugs](#reporting-bugs)\r\n- [Manual Installation](#manual-installation)\r\n- [Game Names](#game-names)\r\n  - [x64 vs x86](#x64-vs-x86)\r\n- [Build Instructions](#build-instructions)\r\n- [Credits](#credits)\r\n- [License](#license)\r\n\r\n## Features\r\n\r\n### Supported Games\r\n\r\nDMD Extensions adds real DMD support to the following games:\r\n\r\n- [**Pinball FX2**](#pinball-fx2) through frame grabbing from screen\r\n- [**Pinball FX3**](#pinball-fx3) by reading the DMD texture data from memory\r\n- [**Pinball FX**](#pinball-fx) by officially supporting `DmdDevice.dll` (thanks, Zen!) \r\n- [**The Pinball Arcade**](#the-pinball-arcade) by Farsight, through grabbing the DMD texture from memory\r\n- [**Pro Pinball Timeshock**](#pro-pinball-ultra) through their message queue\r\n- [**Visual PinMAME**](#visual-pinmame) through `DmdDevice.dll`\r\n- [**Future Pinball**](#future-pinball) through using Macro's FP Intercept that sends DMD frames through a pipe.\r\n\r\nThe command line tool can also display image files on the DMD device and render\r\nframes to bitmap files. Many features like this are described in the command\r\nline options below, so have a close look at those as well.\r\n\r\n### Supported Displays\r\n\r\nCurrently supported hardware displays:\r\n\r\n- **PinDMD v3**, full RGB support\r\n- **PinDMD v2**, 4 bit (16 shades) support\r\n- **PinDMD v1**, 2 bit (4 shades) support\r\n- **PIN2DMD**, full RGB support\r\n- **Pixelcade**, full RGB support\r\n- **ZeDMD** / **PinDMD v3.1***, full RGB support\r\n\r\n_* The display from VirtuaPin marketed as [PinDMD v3.1](https://virtuapin.net/index.php?main_page=product_info\u0026products_id=283) is\r\na [ZeDMD](https://github.com/PPUC/ZeDMD) under the hood._\r\n\r\n### High-Resolution DMD for Monitors\r\n\r\nDMD Extensions includes a complex shader with awesome effects for monitor users. For more info, find the documentation [here](https://github.com/freezy/dmd-extensions/tree/master/LibDmd/Output/Virtual/Dmd#readme).\r\n\r\n\u003cimage src=\"https://user-images.githubusercontent.com/70426/109708090-3ee0cf80-7b9b-11eb-9fdd-83523aa265f9.png\" width=\"350\" /\u003e\r\n\r\n### Segment Display Rendering\r\n\r\nDMD Extensions supports high-resolution rendering of segmented alpha-numeric displays:\r\n\r\n\u003cimage src=\"https://user-images.githubusercontent.com/70426/50459439-5f81bf00-096b-11e9-9f75-f70387f2c9cc.png\" width=\"350\"/\u003e\r\n\r\nDocumentation how to enable and customize this feature can be found [here](https://github.com/freezy/dmd-extensions/tree/master/LibDmd/Output/Virtual/AlphaNumeric#readme).\r\n\r\n### Frame Colorization\r\n\r\nDMD Extensions includes support for Serum colorizations, as well as the VNI/PAL/PAC format, originally used on PIN2DMD \r\ndevices.\r\n\r\nColorization is enabled for most games, including Pinball FX(3), The Pinball Arcade, and Visual PinMAME.\r\n\r\n\u003cimage src=\"https://user-images.githubusercontent.com/57115343/151871089-5f958122-f9db-47d2-a133-f29e964eb8e4.jpg\" width=\"350\" /\u003e\r\n\r\n### Network Streaming\r\n\r\nDMD Extensions can also receive frames from the network and output them to any device. Likewise, it can stream frames\r\nfrom any source over the network. Documentation of this feature can be found [here](Console/Server).\r\n\r\nAdditionally, DMD Extensions can act as a web server where any number of clients can connect to, and see the DMD in real\r\ntime in the web browser.\r\n\r\n### Scaling\r\n\r\nMost of the time, your DMD will match the resolution of the game, which is 128x32. There are however two cases where \r\nscaling comes into play.\r\n\r\n1. The game has a different resolution than 128x32. If the resolution is higher, the frames will be **scaled down**, \r\n   using scaling algorithm defined by the `resize` option (*stretch*, *fill*, and *fit*). If the resolution is lower, the \r\n   frames will be centered on the DMD, with black borders around it.\r\n2. You're using a high-resolution DMD, like a PIN2DMD XL or ZeDMD HD, running at 256x64. In this case, frames can be\r\n   be **scaled up**, using either a \"doubler\" or \"[scale2x](http://www.scale2x.it/)\" algorithm. Note that your physical \r\n   display must be at least double the size of the source frame size.\r\n\r\nThe above mainly applies to hardware displays, which are limited to a fixed resolution. However, it's also possible to\r\nupscale frames to the virtual DMD. In order to do that, set `scalermode` so to either `doubler` or `scale2x`. \r\n\r\n## Install Instructions\r\n\r\n[Download the installer](https://github.com/freezy/dmd-extensions/releases) and\r\nrun it. A few notes:\r\n\r\n- The installer will overwrite any existing `dmddevice.dll` in your VPM folder\r\n  if you choose to install it (existing INI files are untouched).\r\n- If you're on Windows x64, you probably want to install both 32 and 64-bit\r\n  versions. They can live happily next to each other.\r\n- The reason for installing both versions is that your VPM is probably 32-bit,\r\n  so you'll need the 32-bit `DmdDevice.dll` and if you're using `dmdext.exe`\r\n  with the 64-bit version of Pro Pinball, it will only work with the 64-bit\r\n  version.\r\n- However, if you don't have Pro Pinball, just 32-bit will do fine, and if you\r\n  don't use VPM then just 64-bit will do fine as well. And if you're on a 32-bit\r\n  Windows, then just take the 32-bit version.\r\n- The installer will add the install folder of `dmdext.exe` to the `PATH`\r\n  environment variable, but only if the platform is the same:\r\n\t- DMD Extensions (64-bit) on Windows x64 is added to `PATH`\r\n\t- DMD Extensions (32-bit) on Windows 32-bit is added to `PATH`\r\n\t- All other combinations aren't added to `PATH`\r\n- The installer will set the `DMDDEVICE_CONFIG` environment variable to the\r\n  location of your `DmdDevice.ini`. That means from wherever you launch\r\n  `DmdDevice.dll` (or run `dmdext.exe` with `--use-ini`), the same\r\n  `DmdDevice.ini` will be used.\r\n- If you re-install and your VPM installation folder changed since the last\r\n  installation, a new `DmdDevice.ini` will be copied to the new location (if it\r\n  doesn't exist), and the `DMDDEVICE_CONFIG` environment variable will be updated\r\n  accordingly.\r\n- During installation, when a feature is deactivated, that means the installer\r\n  couldn't find the host program. For VPM that means that you haven't registered\r\n  `VPinMAME.dll`. For Pro Pinball it means it's not installed via Steam, and\r\n  you'll need to select its installation folder manually.\r\n\r\nIf you don't trust the installer and want to do it manually, [see below](#manual-installation).\r\n\r\n## Usage\r\n\r\n### Test\r\n\r\n1. Open a command prompt ([Windows]+[R], `cmd`, [enter])\r\n2. Type `dmdext test -d auto` [enter]\r\n\r\nYou should see a test image on your DMD as well as on a virtual DMD.\r\n\r\n### Pinball FX2\r\n\r\n1. Enable cabinet options in Pinball FX2\r\n2. Resize the DMD to:\r\n\t- Width: `520`\r\n\t- Height: `136`\r\n3. Move the DMD to somewhere hidden like off-screen or behind the playfield\r\n   (usually at `0`/`0`).\r\n4. Open a command prompt ([Windows]+[R], `cmd`, [enter])\r\n5. Type `dmdext mirror --source=pinballfx2 --no-virtual` [enter] (or\r\n   `pinballfx3` for FX3)\r\n6. Start Pinball FX2/3\r\n\r\nFor further tweaking, see options below.\r\n\r\n### Pinball FX3\r\n\r\nThe DMD from Pinball FX3 is pulled directly from the memory.\r\n\r\n1. Open a command line prompt ([Windows], type `cmd`, [enter])\r\n2. Type `dmdext mirror --source=pinballfx3 --no-virtual` [enter]\r\n3. Start Pinball FX3 and play a game.\r\n\r\nIt doesn't matter whether Pinball FX3 is started before or after `dmdext`, and\r\nit works with or without cabinet mode.\r\n\r\nNote that while the current memory grabber code should also work for future\r\nPinball FX3 versions, we obviously can't guarantee it. If a new version breaks\r\n`dmdext`, you should still be able to fall back to the legacy screen grabber\r\nthat is used by Pinball FX2 by using the `--fx3-legacy` flag.\r\n\r\n### Pinball FX\r\n\r\nSince mid-June 2023, Pinball FX officially supports DMD Extensions through `DmdDevice.dll`. Note however that Pinball FX \r\nruns on 64 bit, so it's technically `DmdDevice64.dll`, which comes with the 64-bit version of DMD Extensions.\r\n\r\nIf you don't have Visual PinMAME installed, you'll have to set the `DMDDEVICE_CONFIG` environment variable to point to\r\n`DmdDevice.ini`, given you keep `DmdDevice64.dll` in the same directory.\r\n\r\nTo do that:\r\n\r\n1. Press the `[Windows]` key, type \"env\" and select *Edit the system environment variables*.\r\n2. Click *Environment Variables...*.\r\n3. Under *System variables*, click *New...*.\r\n4. Enter `DMDDEVICE_CONFIG` as variable name and the full path to `DmdDevice.ini` as variable value.\r\n\r\nIf you have done that, or you do have VPM installed, simply enable the external DMD in Pinball FX:\r\n\r\n1. Start Pinball FX\r\n2. Open the settings menu (gears icon at the top right)\r\n3. Choose *Cabinet Support*\r\n4. Choose *Dotmatrix Window*\r\n5. Under *Dotmatrix Window*, select *External DMD Device*.\r\n\r\nFor customizing games in `DmdDevice.ini`, see [this list of IDs](PinMameDevice/PinballFX_IDs.md) for all supported games.\r\n\r\n### The Pinball Arcade\r\n\r\nFor TPA we're pulling frames off the DMD texture from TPA's memory.\r\n\r\n1. Open a command-line prompt ([Windows], type `cmd`, [enter])\r\n2. Type `dmdext mirror --source=pinballarcade --no-virtual` [enter]\r\n3. Start the DX11 version of The Pinball Arcade.\r\n4. Select and **start** a game (*only then* it starts mirroring, during attract\r\n   mode it doesn't, even though TPA does display the DMD).\r\n\r\nCurrently re-running `dmdext` while TPA is running doesn't work and will be\r\naddressed soon.\r\n\r\nAlso note that currently only 128x32 DMD games are supported, that means no\r\nEM games neither Frankenstein which has a different resolution.\r\n\r\nIf you happen switch tables often and the last DMD frame gets stuck on your DMD\r\nwhen changing to an EM game, you can use the `--idle-after` option to clear the\r\nscreen.\r\n\r\n### Pro Pinball Ultra\r\n\r\nIn version 1.2.1, Barnstorm Games added support for external hardware through\r\na message queue. To get it running, do the following:\r\n\r\n1. Make sure you have `dmdext.exe` in your `PATH`\r\n2. Copy `ProPinballSlave.bat` to the Pro Pinball installation folder\r\n   (usually at `%PROGRAMFILES(X86)%\\Steam\\SteamLibrary\\steamapps\\common\\Pro Pinball Ultra`)\r\n3. Add the following command line parameters when launching `ProPinball.exe`:\r\n   `m3 dProPinballSlave`\r\n\r\nNote that this currently works only with the 64-bit version of Pro Pinball. 32\r\nbit binaries will be provided with a later release. If you want to change the\r\noptions (e.g. show the virtual DMD), edit `ProPinballSlave.bat` and adopt\r\naccordingly.\r\n\r\n### Visual PinMAME\r\n\r\nVPM introduced the possibility of delegating DMD rendering to an external DLL.\r\nThe main motivation is being able to ship a single build instead of having to\r\nrelease multiple binaries for multiple DMDs.\r\n\r\nBe sure to use at least PinMAME v3.4. You can download the latest version [here](https://github.com/vpinball/pinmame/releases).\r\n\r\n### Future Pinball\r\n\r\nCopy `Future Pinball/OpenGL32.dll` to your Future Pinball folder, i.e. where\r\n`Future Pinball.exe` is located. Now, you can send frames to your DMD by running:\r\n\r\n```bash\r\ndmdext mirror -s futurepinball\r\n```\r\n\r\nNote that:\r\n- The `-q` toggle works here, so instead of killing the process you could make it\r\n  exit automatically when the table closes.\r\n- With `-g \u003cname\u003e`, you can set the game's name, which will, when used along\r\n  `--use-ini`, read the game-specific settings.\r\n\r\nFor more details check out TerryRed's guide [here](https://vpuniverse.com/forums/topic/4928-dmdext-freezy-and-future-pinball-real-and-virtual-dmd-support/).\r\n\r\n### Media\r\n\r\nDMD Extensions can also play videos and images. Here are a few examples:\r\n\r\n```bash\r\ndmdext play -f \"ACDC (Stern 2012).gif\"\r\ndmdext play -f \"Tron Legacy (Stern 2011).png\"\r\n```\r\n\r\n### Pinup Player\r\n\r\nDMD Extensions can send unprocessed frames and scene events detected by supported colorizers to Pinup Player, which\r\nis then used to trigger videos.\r\n\r\nTo enable event triggering, you'll need a recent version of `dmddevicePUP.dll` and `dmddevicePUP64.dll`. You can download the latest version\r\n[here](https://www.nailbuster.com/wikipinup/doku.php?id=release_notes).\r\n\r\nThen, enable the Pinup Player output in `DmdDevice.ini`:\r\n\r\n```ini\r\n[pinup]\r\nenabled = true\r\n```\r\n\r\n### PinballX\r\n\r\nDMD Extensions can be used in [PinballX](https://www.pinballx.com/), the frontend for virtual pinball cabinets. In order \r\nto do so, copy `DmdDevice64.dll` to the PinballX's installation folder, and delete or rename `PinDMD.dll`. Then, activate\r\nthe DMD output through the Settings app, and you should be good to go.\r\n\r\n### Frame Dumping\r\n\r\nDMD Extensions can also dump frames to disk. This is needed when colorizing a new game, since both the Serum as well as\r\nthe Pin2Color editor use them as the basis for the colorization.\r\n\r\nVisual PinMAME has a built-in frame dumper, which is enabled when the `dmddump` folder exists, and both *Use external DMD*\r\nand *Show DMD Window* are active for a ROM. However, this doesn't work for the DMD rendering of alphanumeric games.\r\n\r\nDmdext's frame dumping not only works for those games, but can also be used to dump frames from Pinball FX and all the\r\nother games where VPM isn't involved.\r\n\r\nTo enable it, update `DmdDevice.ini`:\r\n\r\n```ini\r\n[rawoutput]\r\nenabled = true\r\n```\r\n\r\nFor dumping frames through `dmdext.exe`, use the following command line:\r\n\r\n```bash\r\ndmdext mirror -s \u003csource\u003e --dump-frames\r\n```\r\n\r\nThe frames will be dumped to the `dmddump` folder, which is located where PinMAME is installed. If PinMAME isn't found,\r\na `dmddump` folder is created in the current working directory. Existing dump files are appended to.\r\n\r\nNote however that the frame dumper needs a source that provides a game name. Tested sources are:\r\n\r\n- VPX/VPM\r\n- Pinball FX\r\n- Pinball FX3\r\n- The Pinball Arcade\r\n- Pro Pinball Ultra (add `--dump-frames` to `ProPinballSlave.bat`)\r\n\r\n## Configuration\r\n\r\nSince `DmdDevice.dll` is called by VPM, we can't pass any configuration\r\nparameters to it. Instead, we use `DmdDevice.ini` which must be located\r\nin the same folder as `VPinMAME.dll` or at the path where the `DMDDEVICE_CONFIG`\r\nenvironment variable is pointing to.\r\n\r\nNote however that it's also possible to make `dmdext.exe` use the ini instead of\r\ncommand line parameters (using the `--use-ini` parameter).\r\n\r\n### Output Configuration\r\n\r\nYou can also tell `dmdext.exe` to read the output configuration from `DmdDevice.ini`\r\ninstead of passing them as command line arguments. The options are described below.\r\n\r\nThe output are described by block below.\r\n\r\n| Command Line                   | DmdDevice.ini                                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\r\n|--------------------------------|------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\r\n| `-r`, `--resize`               | [global]\u003cbr\u003eresize                             | How to downscale SEGA 192x64 or other high-resolution games to smaller displays. Can have three values:\u003cul\u003e  \u003cli\u003e`stretch` - Just fill the available space and ignore the aspect ratio\u003c/li\u003e  \u003cli\u003e`fill` - Fill it up so the whole DMD is filled while keeping aspect ratio intact. Pixels will be cropped off.\u003c/li\u003e  \u003cli\u003e`fit` - Scale it so the whole image fits on the DMD while keeping aspect ratio intact. There will be white space (uh, more like black space).\u003c/li\u003e |\r\n| `--flip-x`                     | [global]\u003cbr\u003efliphorizontally                   | Flips the image horizontally (left/right)                                                                                                                                                                                                                                                                                                                                                                                                                                   |\r\n| `--flip-y`                     | [global]\u003cbr\u003eflipvertically                     | Flips the image vertically (top/down)                                                                                                                                                                                                                                                                                                                                                                                                                                       |\r\n| `--colorize`                   | [global]\u003cbr\u003ecolorize                           | Enable or disable frame-by-frame colorization (inactive in VPX bundle)                                                                                                                                                                                                                                                                                                                                                                                                      |\r\n| `--plugin`                     | [global]\u003cbr\u003eplugin{n}.path[64]                 | Enable a third party plugin. See [Plugin Configuration](#plugin-configuration)                                                                                                                                                                                                                                                                                                                                                                                              |\r\n| `--plugin-passthrough`         | [global]\u003cbr\u003eplugin{n}.passthrough              | Enable the plugin to always receive frames. See [Plugin Configuration](#plugin-configuration)                                                                                                                                                                                                                                                                                                                                                                               |\r\n| `-d virtual`\u003cbr\u003e`--no-virtual` | [virtualdmd]\u003cbr\u003eenabled                        | Shows a virtual DMD that renders on the computer screen somewhat nicely                                                                                                                                                                                                                                                                                                                                                                                                     |\r\n| `--virtual-stay-on-top`        | [virtualdmd]\u003cbr\u003estayontop                      | Virtual DMD stays on top of most other windows                                                                                                                                                                                                                                                                                                                                                                                                                              |\r\n| *n/a*                          | [virtualdmd]\u003cbr\u003eignorear                       | If true, allow free resizing of the virtual DMD, otherwise the aspect ratio is locked to the DMD's.                                                                                                                                                                                                                                                                                                                                                                         |\r\n| *n/a*                          | [virtualdmd]\u003cbr\u003euseregistry                    | If true, read the virtual DMD position from VPM's registry.                                                                                                                                                                                                                                                                                                                                                                                                                 |\r\n| `--virtual-position`           | [virtualdmd]\u003cbr\u003eleft\u003cbr\u003etop\u003cbr\u003ewidth\u003cbr\u003eheight | Position of the virtual DMD. Command line takes in all four in the shown order, where the last (height) is optional.                                                                                                                                                                                                                                                                                                                                                        |\r\n| `--virtual-dotsize`            | [virtualdmd]\u003cbr\u003edotsize                        | Scale dot size. Use `0.8` for previous default setting.                                                                                                                                                                                                                                                                                                                                                                                                                     |\r\n| `-d pindmdv1`                  | [pindmd1]\u003cbr\u003eenabled                           | Enables the 2-bit pinDMD display.                                                                                                                                                                                                                                                                                                                                                                                                                                           |\r\n| `-d pindmdv2`                  | [pindmd2]\u003cbr\u003eenabled                           | Enables the 4-bit pinDMD2 display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| `-d pindmdv3`                  | [pindmd3]\u003cbr\u003eenabled                           | Enables the RGB24 pinDMDv3 display.                                                                                                                                                                                                                                                                                                                                                                                                                                         |\r\n| `--port`                       | [pindmd3]\u003cbr\u003eport                              | COM port, e.g. `COM3`.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\r\n| `-d pin2dmd`                   | [pin2dmd]\u003cbr\u003eenabled                           | Enables the RGB24 PIN2DMD display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| *n/a*                          | [pin2dmd]\u003cbr\u003edelay                             | Delay in milliseconds to wait after loading a palette.                                                                                                                                                                                                                                                                                                                                                                                                                      |\r\n| `-d zedmd`                     | [zedmd]\u003cbr\u003eenabled                             | Enables the RGB24 ZeDMD display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| `-d zedmdhd`                   | [zedmdhd]\u003cbr\u003eenabled                           | Enables the RGB24 ZeDMD HD display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| `-d zedmdwifi`                 | [zedmdwifi]\u003cbr\u003eenabled                         | Enables the RGB24 ZeDMD WiFi display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| `-d zedmdhdwifi`               | [zedmdhdwifi]\u003cbr\u003eenabled                       | Enables the RGB24 ZeDMD HD WiFi display.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\r\n| `--zedmd-debug`                | [zedmd]\u003cbr\u003edebug                               | Let any ZeDMD show its debug informations.                                                                                                                                                                                                                                                                                                                                                                                                                                         |\r\n| `--zedmd-brightness`           | [zedmd]\u003cbr\u003ebrightness                          | Change any ZeDMD brightness between 0 and 15.                                                                                                                                                                                                                                                                                                                                                                                                                                        |\r\n| `--zedmd-wifi-address`         | [zedmdwifi]\u003cbr\u003ewifi.address                    | Connect to ZeDMD (HD) WiFi using this IP address. If not provided, a connection to zedmd-wifi.local will be established.                                                                                                                                                                                                                                                                                                                                                                                                                                       |\r\n| *n/a*                          | [video]\u003cbr\u003eenabled                             | Enables creating an .avi video from the DMD frames.                                                                                                                                                                                                                                                                                                                                                                                                                         |\r\n| *n/a*                          | [video]\u003cbr\u003epath                                | Path to folder or .avi file. If a folder is given, it will create a file named after the current game.                                                                                                                                                                                                                                                                                                                                                                      |\r\n| *n/a*                          | [browserstream]\u003cbr\u003eenabled                     | Enables streaming the DMD in real time to your browser in your LAN.                                                                                                                                                                                                                                                                                                                                                                                                         |\r\n| *n/a*                          | [browserstream]\u003cbr\u003eport                        | Port of the web server to listen on                                                                                                                                                                                                                                                                                                                                                                                                                                         |\r\n| `--pinup`                      | [pinup]\u003cbr\u003eenable                              | Enables output to PinUP.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\r\n| `--scaler-mode`                | [global]\u003cbr\u003escalermode                         | Use to upscale \u003cstrong\u003eall\u003c/strong\u003e frames.\u003cbr\u003e\u003cbr\u003eCan have three values:\u003cul\u003e\u003cli\u003e`none` - No upscaling.\u003c/li\u003e \u003cli\u003e`doubler` - Double all pixels.\u003c/li\u003e  \u003cli\u003e`scale2x` - Use Scale2x algorithm.\u003c/li\u003e                                                                                                                                                                                                                                                                           |\r\n| `--scaler-mode`                | [global]\u003cbr\u003evni.scalermode                     | Scaler mode for VNI/PAC colorizations. \u003cstrong\u003eNote:\u003c/strong\u003e This only applies to 256x64 colorized content files.\u003cbr\u003e\u003cbr\u003eCan have two scaling modes:\u003cul\u003e\u003cli\u003e`doubler` - Double all pixels.\u003c/li\u003e  \u003cli\u003e`scale2x` - Use Scale2x algorithm.\u003c/li\u003e                                                                                                                                                                                                                               |\r\n| `--skip-analytics`             | [global]\u003cbr\u003eskipanalytics                      | If true, Don't send anonymous usage statistics to the developer. More info [here](https://github.com/freezy/dmd-extensions/wiki/Analytics).                                                                                                                                                                                                                                                                                                                                 |\r\n\r\nYou can also override all options per game by using the game's name as section\r\nname and pre-fixing options with the name of the section (apart from `[global]`\r\noptions, which aren't prefixed). For example if you have a PinDMD2 and don't\r\nwant to use it for Baywatch which has a different resolution, you would create\r\na section like this:\r\n\r\n```\r\n[baywatch]\r\npindmd2 enabled = false\r\nvirtualdmd enabled = true\r\nvirtualdmd left = 2500\r\nvirtualdmd top = 800\r\nvirtualdmd width = 1024\r\nvirtualdmd height = 256\r\n```\r\n\r\nThis is also useful if you just want to fit the virtual DMD onto different\r\nbackglasses which have slightly different positions.\r\n\r\nAlso note that dmdext can retrieve the DMD's position from VPM's registry\r\nsetting. That means you can use VPM to position the DMD and dmdext will take\r\nthe same setting for each game. This behavior can be enabled using the\r\n`useregistry` option.\r\n\r\n### Command Line Configuration\r\n\r\nInput options only apply to dmdext.exe, because the DLL is called externally\r\nfrom VPM where no configuration is necessary (apart from enabling it in VPM).\r\n\r\nThe following parameters are valid for all of dmdext's commands:\r\n\r\n| Parameter              | Description                                                                                                                                                                                                                                             | Default |\r\n|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|\r\n| `--use-ini`            | Path to `DmdDevice.ini` to use instead of command line options. If no path is provided, the `DMDDEVICE_CONFIG` environment variable is used as fallback. If just `DmdDevice.ini` is provided, dmdext will look for it in the current working directory. | *none*  |\r\n| `-c, --color`          | Sets the color of a grayscale source that is rendered on an RGB destination.                                                                                                                                                                            | ff3000  |\r\n| `-q, --quit-when-done` | Exit the program when finished, e.g. when Pinball FX2 doesn't receive any frames anymore.                                                                                                                                                               | false   |\r\n| `--quit-after`         | Exit after n milliseconds. If set to -1, waits indefinitely or until source finishes when -q used.                                                                                                                                                      | -1      |\r\n| `--no-clear`           | Don't clear screen when quitting.                                                                                                                                                                                                                       | false   |\r\n| `-o, --output-to-file` | If set, writes all frames as PNG bitmaps to the provided folder.                                                                                                                                                                                        |         |\r\n\r\nNote that all options of dmdext.exe are also available via command line:\r\n\r\n```\r\ndmdext --help\r\ndmdext mirror --help\r\ndmdext play --help\r\ndmdext test --help\r\n```\r\n\r\n#### Mirror Command\r\n\r\nThe `mirror` command has the following additional parameters:\r\n\r\n| Parameter           | Description                                                                                                                                                                     | Default    |\r\n|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|\r\n| `-s, --source`      | Required. The source you want to retrieve DMD data from. One of: [ `pinballfx2`, `pinballfx3`, `pinballarcade`, `propinball`, `futurepinball`, `screen` ].                      | *n/a*      |\r\n| `-f, --fps`         | How many frames per second should be mirrored.                                                                                                                                  | 25         |\r\n| `--idle-after`      | Wait for number of milliseconds until clearing the screen. Disable with 0.                                                                                                      | 0          |\r\n| `--idle-play`       | Play this file while idleing instead of blank screen. Supported formats: JPG, PNG, GIF. Animated GIFs are supported.                                                            | *none*     |\r\n| `--position`        | *screen* - Position and size of screen grabber source. Four values: `\u003cLeft\u003e \u003cTop\u003e \u003cRight\u003e \u003cBottom\u003e`.                                                                            | 0 0 128 32 |\r\n| `--resize-to`       | *screen* - Resize captured screen to this size. Two values: \u003cWidth\u003e \u003cHeight\u003e.                                                                                                   | 128 32     |\r\n| `--grid-spacing`    | *screen* - How much of the white space around the dot should be cut off (grid size is defined by --resize-to). 1 means same size as the dot, 0.5 half size, etc. 0 for disable. | 0          |\r\n| `--propinball-args` | *propinball* - Arguments send from the Pro Pinball master process. Usually something like: `ndmd w0_0_0_0_w m392`. Will be set automatically when called through Pro Pinball.   |            |\r\n| `--fx3-legacy`      | *pinballfx3* - If set, don't use the memory grabber but the legacy screen grabber, like Pinball FX2.                                                                            | false      |\r\n| `--colorize`        | Enable or disable frame-by-frame colorization. Supported on `pinballfx3` (memory grabber) and `pinballarcade`.                                                                  | false      |\r\n\r\n#### Play Command\r\n\r\nThe `play` command has the following additional parameters:\r\n\r\n| Parameter           | Description                                                                    | Default |\r\n|---------------------|--------------------------------------------------------------------------------|---------|\r\n| `-f, --file`        | Path to the file to play. Currently supported file types: PNG, JPG, BIN (raw). | *none*  |\r\n\r\n#### Test Command\r\n\r\nThe `test` command just outputs a single image. This allows you to test different modes and resolutions without having\r\nto start a game.\r\n\r\n| Parameter  | Description                                                                                         | Default  |\r\n|------------|-----------------------------------------------------------------------------------------------------|----------|\r\n| `--format` | The frame format. One of `rgb24`, `gray2`, `gray4`, `coloredgray2`, `coloredgray4`, `coloredgray6`. | `rgb24`  |\r\n\r\nExamples:\r\n\r\n```\r\ndmdext test\r\ndmdext test --format gray2\r\n```\r\n\r\n### ZeDMD\r\n\r\nThe [ZeDMD library](https://github.com/PPUC/libzedmd) (`zedmd.dll`) is bundled with `DmdDevice.dll` and `dmdext.exe`.\r\nHowever, you can also replace this library with a newer version if you wish.\r\nTo do that, download the latest DLL from [here](https://github.com/PPUC/libzedmd/releases) and place it alongside\r\nwith `DmdDevice.dll` or `dmdext.exe`. Note that this might break compatibility, so check your log if ZeDMD suddenly stops\r\nworking.\r\n\r\n#### USB mode\r\n\r\nThis is the default mode for ZeDMD. You don't need to configure anything except setting `enabled` to `true` in\r\n`DmdDevice.ini` for `[zedmd]` or `[zedmdhd]`.\r\nBut in case you have multiple devices or run into issues with the auto-detection and other USB devices attached,\r\nyou can set a concrete COM port to use in `DmdDevice.ini` using `port`.\r\n\r\n#### WiFi mode\r\n\r\nAlternatively ZeDMD could be set to WiFi mode in its settings menu.\r\nIn `DmdDevice.ini` there are special devices named `[zedmdwifi]` and `[zedmdhdwifi]` to use it.\r\n\r\nTo run the ZeDMD in WiFi mode it needs WiFi credentials to establish the connection to your local network.\r\nTo configure these for the first time, ZeDMD opens it's own WiFi access point.\r\nYou can connect to it using `ZeDMD-WiFi` as SSID and `zedmd1234` as password.\r\nThen open a connection to `zedmd-wifi.local` in your browser and configure the device.\r\nZeDMD will remain reachable under this name even it becomes part of your local network.\r\nTherefore, a MDNS service is running on ZeDMD.\r\nIf you run into issues with that, you can directly connect to the IP address that is shown on top of the logo when ZeDMD gets powered. \r\nThat IP address has to be added as `wifi.address` to `DmdDevice.ini`.  \r\nYou can test with `dmdext.exe test -d zedmdwifi --zedmd-wifi-address=x.x.x.x` (replace `x.x.x.x` with the IP address shown on ZeDMD).\r\n\r\n\u003e [!WARNING]  \r\n\u003e ZeDMD will store the WiFi credentials internally! So ensure to erase them using one of the processes described\r\n\u003e above before giving your ZeDMD to someone else!\r\n\r\n### Colorization\r\n\r\nIf you are a PC monitor user or have an RGB display (PinDMDv3, PIN2DMD, Pixelcade or ZeDMD), you can enable frame-by-frame\r\ncolorization for games that are supported by the creators of the virtual pinball community. This means that the DMD will\r\nbe rendered in color, with up to 64 colors per frame.\r\n\r\nThere are two natively supported formats: Serum and VNI/PAL/PAC (originally only available for PIN2DMD displays). \r\nAdditionally, dmdext supports colorization plugins from third parties. \r\n\r\n#### Colorization File Location\r\n\r\nAll formats keep their files in the `altcolor` folder, which is located in the same folder as VPM (usually \r\n`Visual Pinball\\VPinMAME\\altcolor`). In this folder, every game has its separate folder, which contains the colorization\r\nfiles.\r\n\r\nDepending on the source, the game folders and colorization files are named differently:\r\n\r\n- In VPM, the game folders are named after the ROM name (e.g. `cp_16` for Champion Pub).\r\n- Serum files can be named anything, but must have the `.cRZ` extension.\r\n- VNI/PAL/PAC files can be named anything, but must have the `.vni`/`.pal`/`.pac` extension.\r\n- In Pinball Arcade and Pinball FX3, the games have different names. Scroll down for [a list of game names](#game-names)\r\n  at the time of writing.\r\n\r\nFor example, a structure for Champion Pub for all games and all color formats, could look like this (note that if both\r\na `.cRZ` and VNI/PAL/PAC files are present in the same game folder, the `.cRZ` file will be used):\r\n```\r\naltcolor\r\n├── cp_16\r\n│   ├── ChampionPub.cRZ\r\n│   ├── pin2dmd.pal\r\n│   └── pin2dmd.vni\r\n├── ChampionPub\r\n│   ├── ChampionPub.cRZ\r\n│   ├── pin2dmd.pal\r\n│   └── pin2dmd.vni\r\n├── BALLY_Champion_Pub\r\n│   ├── ChampionPub.cRZ\r\n│   ├── pin2dmd.pal\r\n│   ├── pin2dmd.vni\r\n└── 121\r\n    ├── ChampionPub.cRZ\r\n    ├── pin2dmd.pal\r\n    └── pin2dmd.vni\r\n```\r\n\r\n*Not about Serum*: The [library that does Serum colorization](https://github.com/zesinger/libserum) (`serum.dll`) is \r\nbundled with `DmdDevice.dll` and `dmdext.exe`. However, you can also replace this library with a newer version if you wish.\r\nTo do that, download the latest DLL from [here](https://github.com/zesinger/libserum/releases) and place it alongside\r\nwith `DmdDevice.dll` or `dmdext.exe`. Note that this might break compatibility, so check your log if Serum suddenly stops\r\nworking.\r\n\r\n#### Plugin Configuration\r\n\r\nEnabling colorization plugins is done through the `plugin.path` setting in `DmdDevice.ini`, or through the `--plugin` \r\ncommand line option in `dmdext.exe`. Additionally, you can specify the `plugin.passthrough` option, which will send \r\nframes to the plugin independently of the whether a colorization file is present or not. This is useful for frame \r\ndumping.\r\n\r\n`DmdDevice.ini` example:\r\n```ini\r\n; load plugins\r\nplugin.0.path = C:\\Visual Pinball\\VPinMAME\\pin2color.dll\r\nplugin.0.path64 = C:\\Visual Pinball\\VPinMAME\\pin2color64.dll\r\nplugin.0.passthrough = false\r\n```\r\nYou can add up to 10 plugins. The first plugin which has a colorization file present or passthrough enabled will be used.\r\n\r\nCommand line example:\r\n```bash\r\ndmdext.exe mirror --source pinballfx3 --colorize --plugin \"C:\\Visual Pinball\\VPinMAME\\pin2color.dll\" --plugin-passthrough\r\n```\r\n\r\nNote that the `--plugin` parameter needs to point to a DLL with the correct bitness, i.e. 64-bit `dmdext.exe` would need\r\nthe 64-bit version of the plugin.\r\n\r\nAlso note that without `passthrough` enabled, the plugin is disabled if no colorization file is present. \r\n\r\n#### Usage\r\n\r\nDepending on the source, enabling colorization is different:\r\n\r\n- In VPM, enter setup, open the ROM's game options and enable *Use external DMD (dll)* as well as *Colorize DMD*.\r\n- In Pinball Arcade and Pinball FX3, use the `--colorize` option when running `dmdext.exe`.\r\n\r\nColorizations in the VNI/PAL format or the plugin are able to emit selected frames at 256x64, which is twice the normal \r\nsize. In this case, all frames will be rendered at this resolution. Frames that aren't provided at 256x64 will be \r\nupscaled. In the native VNI/PAL/PAC colorizer, you can choose which upscale algorithm to use.\r\n\r\n- For the command line, use the `--scaler-mode` option. The default is `double`.\r\n- In DmdDevice.ini, set the `vni.scalermode` option.\r\n\r\n## Breaking Changes\r\n\r\n### v2.3.1\r\n\r\n- ZeDMD firmware versions before 5.1.4 aren't supported anymore.\r\n\r\n### v2.2.2\r\n\r\n- In DmdDevice.ini, the `[zedmd]` has been split into `[zedmd]`, `[zedmdhd]`, `[zedmdwifi]`, `[zedmdhdwifi]`.\r\n- ZeDMD HD devices don't use their built-in scaler anymore when attached to DMD Extension. They now leverage the common `scalermode` setting.\r\n- ZeDMD firmware versions before 3.6.0 aren't supported anymore.\r\n- Removed --scale-to-hd in favor of --scaler-mode. Set scaler mode to `none` if you want to disable scaling.\r\n\r\n### v2.1.1\r\n\r\n- In DmdDevice.ini, the `[ZeDMD]` has changed to `[zedmd]`.\r\n- ZeDMD firmware versions before 3.2.0 aren't supported anymore.\r\n\r\n### v1.8.0\r\n\r\n- Data types in configuration files are now culture invariant. Meaning if you are running under a Windows UI Culture such as German\r\n  which normally represents decimals with commas instead of periods you will need to change your configuration file (such as\r\n  DMDDevice.ini) to use periods for decimal data. The most common example would be those users who are using `dotsize` setting\r\n  in your DMDDevice.ini. This was done to standardize the format of numeric data accross different languages.\r\n- Hardware DMDs aren't probed per default anymore, unless you specifically set the destination. For most people that means that\r\n  you'll need to provide the `-d` option when running `dmdext.exe`.\r\n- If you are a PinDMDv3 user and are using colored ROMs, you'll want to [upgrade your firmware](https://github.com/freezy/dmd-extensions/wiki/PinDMD3:-How-to-flash-a-new-firmware).\r\n\r\n\r\n## Troubleshooting\r\n\r\n### Flickering with PinDMDv3\r\n\r\nSome users reported heavy flickering when running via PinballX. Seems that this\r\nis linked to the desktop settings. This seems to help:\r\n\r\n- Go to **My Computer**\r\n- Click on **Performance Information and Tools** on the bottom left\r\n- Click on **Adjust Visual Effects** at the top left.\r\n- When the Performance Window pops up, click on **Adjust for Best Appearance**.\r\n  All the boxes should automatically get check marked.\r\n- Click on **Apply**, and then OK to get out.\r\n\r\n*Thanks to xman72!*\r\n\r\n### Still flickering?\r\n\r\nTry boosting how fast dmdext grabs the frames. For example, for Pinball FX2, try:\r\n\r\n    dmdext mirror --source=pinballfx2 --no-virtual -q --fps 60\r\n\r\nDefault is 25, which seems too slow for some games.\r\n\r\n*Thanks smoke007 for the tip!*\r\n\r\n### DmdDevice.ini Ignored?\r\n\r\nDMD Extensions comes bundled in two versions: A library which is loaded by VPM\r\ncalled `DmdDevice.dll`, and an executable, `dmdext.exe` for all the other\r\napplications.\r\n\r\nThe executable ignores `DmdDevice.ini` because it's configured through command\r\nline options (that is, unless you specifically tell it to use a config file\r\nwith the `--use-ini` option).\r\n\r\n### Slow rendering on certain ROMs with VPM?\r\n\r\nUse VPM 3.1. If you can't wait there's a beta build [here](http://vpuniverse.com/forums/topic/3461-sambuild31-beta-thread/?page=2\u0026tab=comments#comment-39309).\r\n\r\n*Thanks to djrobx for the fix an all others at [#52](https://github.com/freezy/dmd-extensions/issues/52) for reporting.*\r\n\r\n### Weird positioning or no DMD visible at all?\r\n\r\nWhen you override *High DPI scaling* in the host app (e.g. `vpinballx.exe`),\r\ndmdext is put into a different coordinate system, so your `DmdDevice.ini`'s\r\nposition settings are applied differently. This can lead to wrong positioning\r\nor complete off-screen rendering.\r\n\r\n*Thanks to outhere for the tip!*\r\n\r\n### Unable to load DLL 'serum.dll'\r\n\r\nThis can happen if your system doesn't have the needed Visual C++ Redistributable installed. You can\r\ndownload it [here](https://aka.ms/vs/17/release/vc_redist.x86.exe).\r\n\r\n*Thanks Jewer76!*\r\n\r\n### Backglass covers segment displays\r\n\r\nTry unchecking \"backglass bring to front\" by right clicking the backglass ([source](https://github.com/freezy/dmd-extensions/issues/332)).\r\n\r\n*Thanks wiesshund!*\r\n\r\n## Reporting Bugs\r\n\r\nMake sure you include the application log, in its entirety. You can *usually* find\r\nit at the same place you copied your `DmdDevice.dll` or `dmdext.exe`. However, there\r\nare two premises for the log to be created:\r\n\r\n1. You need a log config file. If there's no log config file, no log is created.\r\n   The log config file is called `DmdDevice.log.config` for both `DmdDevice.dll` and \r\n   `DmdDevice64.dll`, and `dmdext.log.config` for `dmdext.exe`. They must be at\r\n   the same place as the DLL and EXE respectively.\r\n2. The user running the host app must have write permissions to the log folder.\r\n   Per default that's the current working directory. If you have copied the DLL to the\r\n   `Windows\\SysWOW64` folder, you don't have write access. In this case you need\r\n   to write the log elsewhere. You can do that by editing the log config file.\r\n   The format of the log file is XML. To change the log file location, find this line:\r\n\r\n       \u003ctarget xsi:type=\"File\" name=\"file\" fileName=\"DmdDevice.log\"\r\n\r\n   And change the `fileName` attribute to somewhere you can write, for example:\r\n\r\n       \u003ctarget xsi:type=\"File\" name=\"file\" fileName=\"C:\\Users\\youruser\\DmdDevice.log\"\r\n\r\nFor problems with DmdDevice.dll, specially with coloring, set the log level to\r\n`Trace` and reproduce the problem. You can do that by editing `DmdDevice.log.config`\r\nand changing:\r\n\r\n```xml\r\n\u003clogger name=\"*\" minlevel=\"Info\" writeTo=\"file\" /\u003e\r\n```\r\nto\r\n```xml\r\n\u003clogger name=\"*\" minlevel=\"Trace\" writeTo=\"file\" /\u003e\r\n```\r\n\r\nIf you have a crash, please also include which OS/bitness you're using. If it's\r\nabout the DLL, let us know where you copied the DLL and which host application\r\nyou're using (VPM's `setup.exe` or`vpinball.exe`, also which version).\r\n\r\nYou can post bugs at [VPUniverse](https://vpuniverse.com/forums/forum/175-dmd-extensions/), \r\nor preferably [here](https://github.com/freezy/dmd-extensions/issues).\r\n\r\n## Manual Installation\r\n\r\n1. [Download the .zip archive](https://github.com/freezy/dmd-extensions/releases),\r\n   copy its content to your hard drive, preferably in your `PATH`,\r\n   and unblock the `.exe` file (right-click, properties, unblock).\r\n2. Download and install the [Visual C++ Redistributables for Visual Studio 2017](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).\r\n3. If you haven't already, download and install the [.NET Framework 4.7.2](https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472).\r\n\r\nIf you want to use DMD Extensions with VisualPinMAME:\r\n\r\n1. Copy `DmdDevice.dll`, `DmdDevice64.dll`, `DmdDevice.ini` and `DmdDevice.log.config` \r\n   into your VPM folder (usually at `Visual Pinball\\VPinMAME`).\r\n2. Run the VPM setup\r\n3. Click on *Test*, select the game and click on *Game Options*.\r\n4. Enable *Use External DMD* and optionally disable *Show DMD*.\r\n\r\nYou can also set this as the default by selecting *Default Options* in the VPM\r\nsetup, however note that games that you've already configured won't be affected.\r\n\r\n## Game Names\r\n\r\n| Title                                | Pinball Arcade      | Pinball FX3                            | Pinball FX |\r\n|--------------------------------------|---------------------|----------------------------------------|------------|\r\n| AC/DC                                | `ACDC`              |                                        |            |\r\n| Attack From Mars                     | `AttackFromMars`    | `BALLY_Attack_from_Mars`               | `119`      |\r\n| Big Buck Hunter PRO                  | `BuckHunter`        |                                        |            | \r\n| Big Hurt                             | `BigHurt`           |                                        |            |\r\n| Black Rose                           | `BlackRose`         | `BALLY_BlackRose`                      | `118`      |\r\n| Bram Stoker's Dracula                | `Dracula`           |                                        |            |\r\n| Cactus Canyon                        | `CactusCanyon`      |                                        |            |\r\n| Champion Pub                         | `ChampionPub`       | `BALLY_Champion_Pub`                   | `121`      |\r\n| Cirqus Voltaire                      | `Cirqus`            | `BALLY_Cirqus_Voltaire`                | `127`      |\r\n| Creature of the Black Lagoon         | `Creature`          | `BALLY_Creature_from_the_Black_Lagoon` | `131`      |\r\n| Cue Ball Wizard                      | `CueBallWizard`     |                                        |            |\r\n| Doctor Who                           | `DoctorWho`         |                                        |            |\r\n| Dr. Dude and his Excellent Ray       | `DrDude`            | `BALLY_Dr_Dude`                        | `135`      |\r\n| Fish Tales                           | `FishTales`         | `WMS_Fish_Tales`                       | `108`      |\r\n| Funhouse                             | `FnHouse`           | `WMS_Funhouse`                         | `134`      |\r\n| Ghostbusters                         | `GhostBustersStern` |                                        |            |\r\n| Gladiators                           | `Gladiators`        |                                        |            |\r\n| Harley Davidson                      | `HarleyDavidson`    |                                        |            |\r\n| High Roller Casino                   | `HighRollerCasino`  |                                        |            |\r\n| Hurricane                            | `Hurricane`         | `WMS_Hurricane`                        | `126`      |\r\n| Indiana Jones: The Pinball Adventure |                     | `WMS_Indiana_Jones`                    | `133`      |\r\n| Indianapolis 500                     | `Indy500`           |                                        |            |\r\n| Jack·Bot                             | `JackBot`           |                                        |            |\r\n| Judge Dredd                          | `JudgeDredd`        |                                        |            |\r\n| Junk Yard                            | `JunkYard`          | `WMS_Junkyard`                         | `110`      |\r\n| Last Action Hero                     | `LastActionHero`    |                                        |            |\r\n| Mary Shelley's Frankenstein          | `Frankenstein`      |                                        |            |\r\n| Medieval Madness                     | `Mediev`            | `WMS_Medieval_Madness`                 | `109`      |\r\n| Monster Bash                         | `Monster`           | `WMS_Monster_Bash`                     | `130`      |\r\n| Mustang                              | `Mustang`           |                                        |            |\r\n| No Fear: Dangerous Sports            | `NoFear`            |                                        |            |\r\n| No Good Gofers                       | `Gofers`            | `WMS_No_Good_Gofers`                   | `128`      |\r\n| Party Zone                           | `PartyZone`         | `BALLY_Party_Zone`                     | `120`      |\r\n| Pistol Poker                         | `PistolPoker`       |                                        |            |\r\n| Red and Ted's Road Show              | `RoadShow`          | `WMS_Roadshow`                         | `125`      |\r\n| Rescue 911                           | `Rescue911`         |                                        |            |\r\n| Ripley's Believe it Or Not           | `Ripleys`           |                                        |            |\r\n| Safe Cracker                         | `SafeCracker`       | `BALLY_Safe_Cracker`                   | `122`      |\r\n| Scared Stiff                         | `ScaredStiff`       |                                        |            |\r\n| Space Station                        |                     | `WMS_Space_Station`                    | `129`      |\r\n| Starship Troopers                    | `StarshipTroopers`  |                                        |            |\r\n| StarTrek                             | `StarTrek`          |                                        |            |\r\n| StarTrek: The Next Generation        | `StarTrekTNG`       |                                        | `163`      |\r\n| Swords of Fury                       | `SwordsOfFury`      |                                        | `149`      |\r\n| Tales of the Arabian Nights          | `Totan`             | `WMS_Tales_of_the_Arabian_Nights`      | `132`      |\r\n| Teed Off                             | `TeedOff`           |                                        |            |\r\n| Terminator 2: Judgment Day           | `Terminator2`       |                                        |            |\r\n| The Addams Family                    | `AddamsFamily`      |                                        | `156`      |\r\n| The Getaway: High Speed 2            | `HighSpeed2`        | `WMS_Getaway`                          | `111`      |\r\n| The Machine: Bride of Pin·Bot        | `BridePB`           |                                        | `148`      |\r\n| Theatre of Magic                     | `TheaterOfMagic`    | `BALLY_TheatreOfMagic`                 | `117`      |\r\n| Twilight Zone                        | `TwilightZone`      |                                        | `162`      |\r\n| Whirlwind                            | `WhirlWind`         |                                        | `168`      |\r\n| White Water                          | `WhiteWater`        | `WMS_White_Water`                      | `124`      |\r\n| WHO dunnit                           | `WhoDunnit`         |                                        |            |\r\n| Whoa Nellie! Big Juicy Melons        | `WhoaNellie`        |                                        |            |\r\n| Wipeout                              | `Wipeout`           |                                        |            |\r\n| World Cup Soccer                     | `WorldCup`          |                                        | `157`      |\r\n| World Tour                           | `WorldTour`         |                                        |            |\r\n\r\n### x64 vs x86\r\n\r\n- For `dmdext.exe`, take the bitness of your OS. This is important for Pro\r\n  Pinball, where the bitness of the binary must be the same as dmdext's.\r\n- For `DmdDevice.dll`, we now recommend using the 64-bit version \r\n  (i.e. `DmdDevice64.dll`).\r\n\r\n\r\n## Build Instructions\r\n\r\n1. Download and install [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/)\r\n2. The unmanaged exports library needs MS Build tools, which come with .NET 3.5. [Install Instructions](https://docs.microsoft.com/en-us/dotnet/framework/install/dotnet-35-windows-10)\r\n3. *Recommended:* If you want `DmdDevice.dll` automatically copied to your VPM folder after build, point the `VPM_HOME` environment variable to your VPM installation folder.\r\n4. Clone the repo: `git clone https://github.com/freezy/dmd-extensions.git`\r\n5. After cloning the repo, you'll need to restore the [DllExport](https://github.com/3F/DllExport)\r\n   dependency. There is a script that does it for you. Go into the cloned repo and run:\r\n   ```cmd\r\n   DllExport -action Restore -sln-file DmdExtensions.sln\r\n   ```\r\n6. Open the `.sln` file in Visual Studio and build the solution.\r\n\r\nIf you want to build the installer, you'll need the [WiX Toolset v3](https://wixtoolset.org/docs/wix3/)\r\nand its [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=WixToolset.WixToolsetVisualStudio2022Extension).\r\n\r\nThen there is an issue with Fody third party addin that may give you an error\r\nith the $(IntermediateOutputPath). If this occurs, simply close Visual Studio\r\nand re-launch the DMD Extensions project and the issue will go away. [Reference](https://github.com/Fody/Fody/issues/629)\r\n\r\n\r\n## Credits\r\n\r\n- NoEx for the excellent TPA grabber code, as well as the Pinball FX3 memory grabber.\r\n- Tom Speirs, Lucky1, CarnyPriest and Russdx for their help on the DMD code\r\n- Lucky1 for instructions and details about the coloring features and Pin2DMD support.\r\n- DJRobX for helping with the dynamic coloring, better performance and much more.\r\n- mjrgh for debugging and optimizing stuff.\r\n- Adrian Page from Barnstorm for his help setting up the slave correctly.\r\n- Funkyman for 64 color support, 256x64 scaling options, bug fixes and code cleanup.\r\n- To Zen Studios for their support and for making Pinball FX!\r\n\r\n\u003ca title=\"IntelliJ IDEA\" href=\"https://www.jetbrains.com/resharper/\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/freezy/dmd-extensions/master/resharper.svg?sanitize=true\" alt=\"IntelliJ Resharper\" width=\"250\"\u003e\u003c/a\u003e\r\n\r\nFinally, thanks to JetBrains for their awesome tools and support of the Open Source Community!\r\n\r\n\r\n## License\r\n\r\nGPLv2, see [LICENSE](LICENSE).\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreezy%2Fdmd-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreezy%2Fdmd-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreezy%2Fdmd-extensions/lists"}