A native macOS app for remotely viewing and controlling a Korg Kronos synthesizer over Ethernet. It streams the Kronos LCD in real time, forwards touch / button / wheel / keyboard input back to the instrument, and adds an FTP file manager, touch calibration, an audio VU meter, a performance monitor, and a MIDI piano.
This is a native SwiftUI/AppKit port of the PySide6 app
KronosScreenRemotePy — no Python/Qt
runtime required. It talks to the same companion daemon running on the Kronos hardware.
- Live screen streaming — 800×600 8-bit palette-indexed LCD over TCP, full-frame and PackBits change-only (dirty-rect) modes, rendered via CoreGraphics.
- Selectable scaling quality — status-bar picker: CoreGraphics Nearest/Low/Medium/High (CPU), Core Image Lanczos/Bicubic (GPU), and EPX pixel-art 2× (CPU).
- Touch injection — click / drag the LCD (with inverse-calibration mapping).
- Control surface — mode buttons, number pad, data wheel, EXIT/ENTER, bank select.
- Value slider — INC/DEC and a 0–127 slider mirroring the front-panel VALUE control.
- Keyboard capture — forwards your Mac keystrokes to the Kronos (Linux keycode mapping), including numpad, modifiers, and shifted remaps.
- Zoom loupe — magnifier over the LCD (Ctrl-scroll to change zoom).
- Screenshots — save / quick-save / copy-to-clipboard / open folder.
- Touch calibration — 3×3–5×5 warp-mesh editor with bias dots, undo/redo, persisted to
cal_data.json. - FTP file manager — dual-pane browser (local ⇄ Kronos SD): list/upload/download/rename/ delete/mkdir.
- Audio VU meter — real-time L/R metering via AVAudioEngine, with a device picker.
- Performance monitor — SYSINFO dashboard: CPU graph, memory, storage, temperatures, fan.
- MIDI keyboard — dockable 88-key piano drawer (⌘⌥K): send notes to the Kronos (MIDI OUT) and mirror notes played on the Kronos (MIDI IN, highlighted in green), with port pickers, channel/velocity controls, and a panic button.
- Layout & window — Full / Focused presets, hide panels, window-size presets, aspect-locked (no letterbox), always-on-top.
| macOS | 14+ |
| Xcode | 16+ |
| Tooling | XcodeGen (brew install xcodegen) |
| Network | Ethernet to a Korg Kronos running the companion daemon (stream TCP 7373, control 7374, FTP 21) |
The .xcodeproj is generated from project.yml (and is git-ignored).
xcodegen generate
xcodebuild -project KronosScreenRemote.xcodeproj -scheme KronosScreenRemote \
-configuration Debug -derivedDataPath ./DerivedData build
open "DerivedData/Build/Products/Debug/KronosScreenRemote.app"Tests (offline unit tests always run; live hardware tests are opt-in via KRONOS_HOST):
xcodebuild -project KronosScreenRemote.xcodeproj -scheme KronosScreenRemote test
KRONOS_HOST=192.168.100.15 xcodebuild ... test # also exercises real hardwareSettings are stored at
~/Library/Application Support/KronosScreenRemote/settings.json (JSON, schema-compatible with
the Python app).
Sources/
App/ @main App, AppState (+Input/UI/Cal/Capture), menus, Telemetry, CalEditor,
FrameInterpolation, Resources
Protocol/ StreamClient, ControlClient, PackBits, KeyMap, KeyboardCapture, FTPClient
Models/ AppSettings (Codable), CalMesh
Store/ SettingsStore, CalStore
Views/ FrameView/Renderer/Scalers, ControlSurface, ValueSlider, StatusBar, Settings,
FileManager, Perf, VuMeter, Piano, MainView
Audio/ AudioMeter (AVAudioEngine + CoreAudio)
MIDI/ MIDIManager (CoreMIDI)
Resources/ button art, boot/mode refs, cal_data.json, app icon
Tests/ protocol, calibration, render, perf-parse, VU, piano, MIDI (+ live hardware)
Networking uses Network.framework (NWConnection). MIDI uses CoreMIDI (independent of the
KSCR daemon). The LCD renders through an AppKit NSView.draw path so overlays (zoom loupe,
calibration mesh) compose cleanly.
Port of the PySide6 KronosScreenRemote by Enigmahack. Requires the KronosScreenRemoteDaemon on the Kronos.
Licensed under the GNU General Public License v3.0 — the same license as the original Python app. See LICENSE.
