Repository navigation
Getting Started
Well, technically, you could manually press the keys in-game, but that’s tricky. Let’s get you set up!
Download the latest release from the project Releases page. You have several options:
-
Installer (
AutoMidiPlayer_<version>_setup.exe): Guided installation with desktop and start menu shortcuts. -
Portable (
AutoMidiPlayer_<version>_win-x64-portable.zip): Recommended for a zero-install, standalone experience that includes all necessary runtimes. Extract it and runAutoMidiPlayer.exe. -
Framework-dependent (
AutoMidiPlayer_<version>_win-x64-net-install.zip): Compact package for systems that already have the .NET 10 Desktop Runtime installed.
Note
If you get a SmartScreen popup, click on "More info" and then "Run anyway" The reason this appears is because the application is not signed. Signing costs money which can get very expensive.
git clone https://github.com/Jed556/AutoMidiPlayer.git
cd AutoMidiPlayer
dotnet publish AutoMidiPlayer.WPF -r win-x64 -c Release --self-contained false -p:PublishSingleFile=trueFor other runtimes, visit the RID Catalog and change the runtime value.
git clone https://github.com/Jed556/AutoMidiPlayer.git
cd AutoMidiPlayer
dotnet buildgit clone https://github.com/Jed556/AutoMidiPlayer.git
cd AutoMidiPlayer
dotnet publishThe process for adding or adjusting notes and keyboard mappings has a few discrete steps. Below is a friendly checklist along with example snippets to help you get started.
-
Create or select a game folder
- Go to
AutoMidiPlayer.WPF/Core/Games/and either open the existing game directory or create a new one with the game's name.
- Go to
-
Prepare layout & instruments subfolders
- In the game folder make sure you have two items:
-
KeyboardLayout.cs– holds any custom key‑assignment maps. -
Instrumentsdirectory – contains one.csfile for each instrument.
-
- Look at
Heartopia/orGenshin/for real examples; the structure is identical.
- In the game folder make sure you have two items:
-
Add or edit instrument config files
- Inside
Instruments, you can copy and paste an existing config (e.g.Piano.cs) and then adjust fields such asgame,name, and thenoteslist. - Specify additional
keyboardLayoutsif the instrument uses a different mapping.
public static readonly InstrumentConfig MyNewInstrument = new( game: "MyGame", name: "Special Harp", notes: [ 60, 62, 64, 65, 67 ], // C4,D4,E4,F4,G4 keyboardLayouts: [ MyGameLayouts.QWERTY ] );
- Inside
-
Create a keyboard layout (if necessary)
-
Edit
KeyboardLayout.csand add aKeyboardLayoutConfigwith string entries for each note. -
Use plain strings like
"q"for normal keys,"^a"for Ctrl+A, and"^"for the caret key itself. -
Use a single uppercase character like
"A"when you want Shift+A. Shifted symbols like"!"also work through the character map. -
If the game has pre-composed chord keys, define them separately with
chordKeyStrokes. These keys do not add entries to the one-key-per-notekeysmapping.internal static readonly KeyboardLayoutConfig QWERTY = new( name: "QWERTY", keys: ["q", "w", "e", "r", "t", "y", "u"], sustainKey: VirtualKeyCode.SPACE // Optional: define pedal keys );
If you need a Ctrl modifier, keep the same
keysarray and prefix the note with^in the entry, for example"^a".For chord keys, pass the corresponding virtual keys in a separate
chordKeyStrokeslist. ThekeyIndexused by each chord must match its position in that list:internal static readonly KeyboardLayoutConfig QWERTYMelody = new( name: "QWERTY (Melody)", keys: ["a", "s", "d", "f", "g", "h", "j"], chordKeyStrokes: [ new(VirtualKeyCode.VK_Q), new(VirtualKeyCode.VK_W), new(VirtualKeyCode.VK_E), ] );
Then declare the chords on the instrument with pitch classes (
0= C,2= D, etc.). Pitch classes are octave-independent, so[0, 4, 7]matches any C-major chord:chordPads: [ new("C", [0, 4, 7], keyIndex: 0), new("G", [2, 7, 11], keyIndex: 1), new("Am", [0, 4, 9], keyIndex: 2), ]
-
-
Register the game in
GameRegistry.cs- Add a new
GameDefinitionentry to theAllGameslist so the app knows about your game. For example:
new GameDefinition( id: "MyGame", displayName: "My Game Title", instrumentGameName: "MyGame", imageResourcePath: "pack://application:,,,/Resources/MyGame.png", processNames: ["MyGameExe"], defaultExeName: "MyGame.exe", defaultSearchPaths: [ @"C:\Program Files\MyGame\MyGame.exe", ], getLocation: () => Settings.MyGameLocation, setLocation: v => Settings.Modify(s => s.MyGameLocation = v), getIsActive: () => Settings.ActiveMyGame, setIsActive: v => Settings.Modify(s => s.ActiveMyGame = v) ),
- Add a new
You might be wondering… “so where’s the part where I actually play a song?” 😅
Don’t worry, this is it.
- Add a song from a MIDI file (or explore the Discover tab to download one in-app).
- Enable only the tracks you want.
- Select target game, instrument, and keyboard layout.
- Adjust speed or transpose if needed.
- Press Play!
No Preview yet
But if your song doesn’t sound quite right or isn’t playing properly, don’t worry, that’s normal at first. Head over to How To Use to learn how to properly configure songs and get the best playback.