This is NOT an Eyesy mode! This IS a Python program that will load most Eyesy modes and emulate many of the functions of the Eyesy device on your PC desktop! ๐๏ธ
It includes a 1280ร720 resolution display with knobs and buttons on a control panel below that correspond to the original Critter & Guitari hardware.
๐๏ธ As of March 2026 this project is essentially complete! This program is still technically incomplete and as such is a beta version. But I’ve completed the feature sets I’d originally intended and the program functions well; I’ve tried to recreate the basic Eyesy knob experience with some minor enhancements like multi-knob selection and knob randomization/reset. MIDI functionality is fully working as of v.44 with channel filtering, remappable CC, note triggers, and a built-in device selector. Knob and scene recording is something I am unlikely to develop further unless somebody asks. But I am pretty happy with this program โ it does what I set out to do.
To use it you’ll need to install Python 3.12 or 3.13 (see Known Issues below) and place your Eyesy Python modes in the emulator’s ‘modes’ folder. It is suggested you rename them from the standard ‘main.py’ to something more descriptive. Most standalone modes should work, but more complex modes that require external assets may or may not have problems. If you do try a mode that comes with its own folders, place those folders inside the emulator’s ‘modes’ folder as well โ but I make no guarantees they will work.
๐๏ธ Knobs on the emulator are virtual simulations of the knobs on the hardware and for the most part do whatever they are programmed by the mode to do, with one exception: to adjust the audio gain bias, hold the ‘Shift/2’ key while turning Knob 1, just like the original.
๐๏ธ Knobs are controlled onscreen by left-clicking and holding while you move the mouse to adjust their values, which are overlaid on the knob face along with a visual direction indicator. Q/W/E/R/T keys toggle the scroll-selectability of Knobs 1 through 5 with a visual highlight. You can select more than one knob and adjust multiple values simultaneously with the scroll wheel.
The role of the Eyesy’s button layout is played by the number keys 1 through 0, working in a similar fashion as follows:
๐๏ธ Knobs 1โ5 change value when you click on the knob with MOUSE ๐ฑ๏ธ
(QWERT keys toggle knob selection for ๐ scroll)
๐ฎ KEYS:
๐ 1 = System Status information overlay toggle
๐ 2 = Shift key (used with other knobs and buttons for extra functions)
๐ 3 = Persistence graphics mode OFF/ON toggle
๐ 4 & 5 = Cycle through available modes in the ‘modes’ folder โ hit ENTER to load
๐ 6 & 7 = Scroll through scenes saved in the ‘scenes’ folder
๐ 8 = Save Scene
๐ 9 = Screenshot (PNG format)
๐ 0 = Trigger button
๐ ENTER = Load the mode currently selected by 4 & 5
๐ Z = Restart current mode
๐ F = Toggle fullscreen mode
๐ P = Toggle pause
๐ X = Cycle through 60, 30 & 15 FPS modes
๐ C = Change control panel color
๐ SHIFT+/ = Randomize selected knob(s)
๐ / = Reset selected knob(s) to 0.5
๐ ” (quote) = Random foreground palette
๐ ; (semicolon) = Random background palette
๐ I = Toggle global inverted colors effect
๐ Escape = Quit
๐ F1 = Audio Device Options (console menu)
๐ F2 = MIDI Device Options (console menu)
๐จ To change foreground palettes: hold Shift (or 2) and press 4 or 5
๐จ To change background palettes: hold Shift (or 2) and press 6 or 7
[NOTE: Palettes are stored in a JSON file in the ‘palettes’ folder using the same basic structure as Critter & Guitari use on the Eyesy hardware, with one small difference. If this file is not found you will see a grey screen and a ‘Missing Palettes’ message. You can create your own palettes using their Palette Picker here: https://critterandguitari.github.io/cg-docs/EYESY/palette_picker/%5D
When the emulator first runs it will start with no mode active. Use the 4 and 5 keys to cycle through the available modes (displayed on the control panel) then hit ENTER to load one. To switch modes just repeat that process. The Z key restarts the current mode from scratch.
The F1 key opens an Audio Device Selector in the console, letting you choose between different system sound devices and microphones. The F2 key opens a MIDI Device Selector where you can choose your input device and MIDI channel. Both settings are saved to eyesy_config.json. Changes to the audio device may require a restart.
KNOWN ISSUES:
Complex asset-based modes may have issues โ make sure any required folders and assets are placed inside the emulator’s ‘modes’ folder.
Requires Python 3.12 or 3.13. Python 3.14 is not currently supported due to pygame compatibility. If you see a ‘No module named numpy’ error despite having it installed, this is likely the cause. Use ‘py -3.12’ to run the script on Windows if you have multiple Python versions installed.
Obviously the Eyesy Editor’s wifi web access doesn’t work here, so don’t even try. This should work on Windows 10/11, macOS, and Linux โ though Windows with a Realtek HD soundcard is what it’s been most thoroughly tested on.
I’ve included several of my own Eyesy modes as demonstration examples as well as most of C&G’s demos. Please feel free to replace them with modes of your own choosing โ though I do recommend checking out HypnoGrid.py and MetaBlobs.py, which are my personal favorites. MetaBlobs runs blazingly fast!
You WILL need Python installed to run this program. Generic disclaimer: “This software is provided on an ‘as is’ and ‘as available’ basis, without any warranties of any kind, express or implied. You agree to use the software at your own risk. The developers disclaim all warranties, including without limitation any implied warranties of merchantability, fitness for a particular purpose, and non-infringement. The developers will not be liable for any damages, direct or indirect, arising from the use or inability to use this software.”
I found this program to be a good way to get a sense of what Eyesy modes could look like running on more powerful hardware. It could also serve as a way for non-Eyesy owners to explore the various modes. The Eyesy is a great little device and Critter & Guitari are a neat company who deserve your support.
I know I’ve probably left something outโฆ but whatever. Enjoy!
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
UPDATE NOTES
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Beta v.44a – fixed the MIDI status overlay not appearing in fullscreen mode
Beta v.44 โ Major MIDI overhaul and several bug fixes.
New MIDI features: F2 now opens a MIDI device selector in the console, mirroring the audio selector. Lists all available PortMidi input devices by name and interface (CoreMIDI on macOS, ALSA on Linux, WinMM on Windows). Prompts for device number and MIDI channel (0 = omni, 1โ16 for a specific channel). Settings are saved to eyesy_config.json. All note and CC messages are now filtered by the configured channel. eyesy.midi_note is now a proper scalar integer tracking the most recently played note, matching the hardware API. When trigger_source is set to 1 or 2 in config, incoming note-on events will fire eyesy.trig = True. The CC-to-knob mapping is now remappable in eyesy_config.json โ the default is {20:1, 21:2, 22:3, 23:4, 24:5} to match the hardware, but any CC can be reassigned without touching the code. MIDI initialization now tries the saved device first and falls back to the system default, with clear OS-specific error guidance if nothing can be opened. The System Status overlay now shows the active MIDI device name, channel, and current midi_note value. Most of the time.
Bugs fixed: shift_active was referenced before being assigned on the very first keypress, which could cause a crash. Fixed by initializing it before the event loop. A duplicate pygame.event.get() call mid-frame was silently dropping input events because the first call had already drained the queue โ the redundant loop has been removed. In windowed mode while paused, the scaled surface was being computed but the blit call was commented out, causing a black window when resized. Fixed. find_stereo_mix_device() had a hardcoded check that always grabbed device index 1 regardless of its name, which could pick the wrong device depending on system configuration. Replaced with purely name-based matching, with ‘blackhole’ and ‘loopback’ added to the list for macOS users. A dead duplicate elif i == 6 branch in the scene/mode button handler has been removed.
Beta v.43c โ Oops! Broke the QWERT multi-knob latching in the last version. Fixed.
Beta v.43b โ Replaced the new pixels3d() inverted colors logic with a less CPU-hungry pixels2d() expression.
Beta v.43a โ Spent far too much time adding a global Inverted Colors effect. Hit the ‘I’ key to toggle.
Beta v.43 โ Added more MIDI functionality including CC mapping for Knobs 1โ5 and MIDI Clock tempo sync. Added two new keyboard shortcuts: the ‘ and ; keys now randomly select a foreground and background palette respectively. Added a font.ttf file to the modes folder for modes that look for the Eyesy’s root font โ replaced with a UNSCII font, which uses an enormous extended Unicode character set including retrocomputing graphics like PETSCII. It’s a large font, but worth it. See the lightly edited ‘T โ Font Recedes2’ mode for a good demonstration. (More on UNSCII: http://viznut.fi/unscii/) Also included most of the basic modes from Critter & Guitari’s 3.0 OS release, all renamed and dropped into the modes folder ready to go. An images folder with a curated selection of images has been added to the modes folder as well.
Beta v.42 โ Added basic MIDI functionality via pygame.midi.
Beta v.41a โ Reintroduced some misplaced console output. Paused status text bumped to big font. QWERT multi-selection now works with knob randomize/reset. Light grey removed from control panel color options and replaced with Lichen and Denim.
Beta v.41 โ QWERT knob selection keys are now multi-toggle enabled. You can still click and drag on a knob, but the scroll wheel only works if one or more QWERT keys are active. Knobs stay selected until their key is pressed again. Added PAUSE on the P key โ a visual indicator appears on the status overlay. Mode buttons 4 & 5 now immediately load the next mode without needing ENTER (except at startup for the first load). Z and ENTER still work to reload the current mode. Cinnamon added to the control panel color palette.
Beta v.40 โ QWERT multi-key toggling for knobs is back! Scroll wheel only works when a QWERT key is toggled on, indicated by a ring around the selected knob(s). The ‘Original’ palette has returned โ turns out it wasn’t a duplicate grayscale at all, but a special palette the Eyesy singles out for randomized color behavior. That magic has been faithfully recreated here as palette zero, now titled ‘(un)Original’. It captures a lot of the Eyesy’s signature look and I’m glad to have it back. Over 30 new palette options added as well. Replace your old default_palettes.json with the new one. Lots of duplicate code removed.
Beta v.39 โ Major refactoring sweep. QWERT behavior made more consistent and universally available. Removed a duplicate palette entry. Added Licorice and Strawberry to the console color choices. Big stuff.
Beta v.38 โ Scene saving and loading added. Use 8 to save current knob values, palette info, and mode filename. Keys 6 & 7 scroll through saved scenes. Experimental window resizability added for lower-resolution users. Chocolate added as a control panel color option.
Beta v.37 โ A whole new version that started out as a tweak, then became several more tweaks, and somewhere along the way probably fixed some compatibility issues. A lot of it involved removing unnecessary clamping. The output looks a lot like the hardware but isn’t identical โ and I’m okay with that. Arguably the emulator runs modes ‘better,’ but really just means ‘differently’ and ‘faster’ than the hardware, which I do own and which handles the Python a little differently. (Old Lua modes are being cheerfully ignored since they’re not a thing in EyesyOS 3.x.) This version works great. System Status overlay now available in fullscreen! Randomized knob toggle split into two keys: ‘?’ randomizes, ‘/’ resets to 0.5. QWERT now supports multi-knob selection.
Beta v.36b โ Complete refactoring of stereo audio input and the color system, with a monochromatic fallback. Nudging it closer to the hardware’s behavior. More modes should now run safely. Code cleanup and a couple of new control panel color schemes.
Beta v.35 โ Found the source of the FPS drop and fixed it โ it was the FPS ticker display itself. Ticker moved to the window title bar, updating only a couple of times per second. Layout changes: knobs and buttons now prominently centered on the control panel. Version numbering refactored after recovering a fragment of my sanity. The scoundrels responsible have been sacked.
Beta v.27k โ Volume meter bars moved to the System Status overlay. Spent way too much time getting palette preview strips in there, but it was the right thing to do.
Beta v.27j โ Removed most built-in palette code due to indexing issues. JSON palettes only now, which looks much more authentic anyway. Palette preview strips added to the System Status panel.
Beta v.27i โ Added support for the original JSON palette file, now living in a ‘palettes’ folder. 43 palettes based on the Eyesy defaults available for foreground and background.
Beta v.27h โ Added QWERT keys corresponding to Knobs 1โ5 for scroll wheel control, including in fullscreen. Clever users will quickly discover you can control two knobs simultaneously. Knob indicator line also made more logically oriented.
Beta v.27g โ Changed the ‘R’ key to ‘Z’. Added ‘/’ key to toggle between randomized knob values and 0.5.
Beta v.27f โ Fullscreen mode, toggled with the ‘F’ key.
Beta v.27e โ Mode display repositioned, button spacing adjusted.
Beta v.27d โ Backward-compatibility fixes. Control panel color can now be changed with the ‘C’ key.
Beta v.26 โ Added handler for auto_clear and reworked persistence drawing. Added handler for eyesy.screengrab. Most modes should actually work now. No MIDI yet.
Beta v.25 โ ALL MODES WORK! Recoded the audio pipeline. Fixed LFO and background color handling. Added stereo volume meters and fixed audio triggering.
Beta v.20 โ Most modes work! Kludge eyesy.audio_r callback recode!
Beta v.15 โ Added support for color_picker_lfo() and fixed a duplicate display_surface misexpression.
Beta v.14 โ CPU throttling options added. X key cycles through 15, 30, and 60 FPS. Version info added to the program display. Launch palette changed to something more colorful than grey.
Beta v.13 โ First public beta.

OMG I can’t wait to try this out! This is something I’ve wished existed for a long time.
Can confirm your Analog Video synth mode runs pretty well on it. Notwithstanding the palette limitations.
:O
Here’s a quick Python install guide to help you get started:
——————————————————————————–
๐ 1. INSTALLATION (One-Time Setup)
——————————————————————————–
The Knobulator runs on Python. Follow these steps to prepare your system:
Step A: Install Python
– Go to https://www.python.org/downloads/
– Download the latest version for Windows or macOS.
– โ ๏ธ IMPORTANT (Windows): During install, check the box that says:
“Add Python to PATH”.
Step B: Install the Libraries
– Open your Terminal (macOS) or PowerShell/Command Prompt (Windows).
– Copy, paste, and run this command:
pip install numpy sounddevice pygame
——————————————————————————–
๐ 2. FILE STRUCTURE
——————————————————————————–
For the program to run correctly, keep these files in the same folder:
[FOLDER]
โโโ eyesy_emu_beta43b.py <– The Program
โโโ /modes <– 100+ Mode files (.py)
โโโ /palettes <– default_palette.json
โโโ /scenes <– Your saved scenes
โโโ /grabs <– Your screenshots will go here
——————————————————————————–
๐น๏ธ 3. HOW TO START
——————————————————————————–
1. Open your Terminal or PowerShell.
2. Navigate to the install folder (e.g., cd C:\EYESY_EMU).
3. Type:
python eyesy_emu_beta43b.py
great work, i like the modes you’ve made too!
Im guessing this is a good way to beta test your own modes and that they should theoretically work ok on the Eyesy hardware?
Yes, Damian. Precisely so. Thank you for your kind words. The only modes that I’ve had issues with are modes that load OTHER modes like the Randomizer. (I’d assume because I handle folder structure a bit differently than the hardware.) But most of my recent modes were developed on the Knobulator. The CPU throttling feature is used to simulate the less-powerful CPU on the Eyesy to aid in scaling whatever is going on in your mode properly.