MCPcopy Index your code
hub / github.com/emprcl/signls

github.com/emprcl/signls @v0.8.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.1 ↗ · + Follow
956 symbols 2,229 edges 74 files 193 documented · 20%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Signls

GitHub release (latest SemVer) GitHub Workflow Status

:notebook: User Manual • :tv: See it in action

Signls (pronounced signals) is a non-linear, generative midi sequencer designed for music composition and live performance. It's cross-platform (Linux, macOS et Windows) and it runs in the terminal (TUI).

It takes inspiration from Orca and Nodal.

Feel free to open an issue.

signls screenshot

Installation

Supported platforms

Prebuilt binaries are available for the following platforms:

OS Architectures
Linux x86-64 (amd64), arm64
macOS Intel (amd64), Apple Silicon (arm64)
Windows x86-64 (amd64)

The Linux arm64 build covers the 64-bit Raspberry Pi OS (Raspberry Pi 3 and later).

Quick-install

On Linux or macOS, you can install the latest release with this script:

curl -sSL empr.cl/get/signls | bash

The script downloads the right binary for your system, installs it to ~/.local/bin and adds it to your PATH.

Homebrew (macOS & Linux)

brew tap emprcl/tap
brew trust emprcl/tap
brew install signls

Manual installation

Download the last release for your platform.

Then:

# Extract files
mkdir -p signls && tar -zxvf signls_VERSION_PLATFORM.tar.gz -C signls
cd signls

# Run signls
./signls

Build it yourself

You'll need go 1.26.4 minimum. Although you should be able to build it for either linux, macOS or Windows, it has only been tested on linux.

# Linux
sudo apt-get install libasound2-dev
make GOLANG_OS=linux build

# macOS
make GOLANG_OS=darwin build

# Windows
make GOLANG_OS=windows build

# Raspberry Pi OS
sudo apt install libasound2-dev
make GOLANG_OS=linux GOLANG_ARCH=arm64 build

Usage

# Run signls
./signls

# Display current version
./signls --version

Hit ? to see all keybindings. esc to quit.

Files location

Signls stores its config.json and bank files in your user config directory:

OS Location
Linux / macOS ~/.config/emprcl/signls/ (or $XDG_CONFIG_HOME/emprcl/signls/)
Windows %AppData%\emprcl\signls\

You can override either with an explicit path using the --config and --bank flags.

Some companion apps that receive MIDI for testing Signls: - Webmidi synths - Enfer (github) works only on linux - QSynth

Keyboard mapping

Keys mapping is fully customizable. After running signls for the first time, a config.json is created in your config directory. You can edit all the keys inside it.

You can select one of the default keyboard layouts available:

# QWERTY
./signls --keyboard qwerty

# AZERTY
./signls --keyboard azerty

# QWERTY MAC
./signls --keyboard qwerty-mac

# AZERTY MAC
./signls --keyboard azerty-mac

Default keyboard mapping

For qwerty keyboards, here's the default mapping:

  • space play or stop
  • tab show bank
  • 1 ... 9 add nodes
  • move cursor
  • shift+ multiple selection (or modify alt parameter mode in edit mode)
  • ctrl+ modify selected node direction (modify parameter or alt parameter value)
  • . text edit mode for selected parameter
  • backspace remove selected nodes (or grid in bank)
  • enter edit selected nodes
  • m toggle selected nodes mute
  • M mute/unmute all selected nodes
  • / trigger selected node
  • - = modify tempo
  • ' ; modify root note
  • " : modify scale
  • ctrl+c x v copy, cut, paste selection
  • escape exit parameter edit or bank selection
  • f2 edit midi configuration
  • f10 fit grid to window
  • ? show help
  • ctrl+q quit

Bank management

Each time you start Signls, a json file (default: default.json, in your config directory) containing 32 grid slots is loaded. For selecting a different file, use the --bank flag (relative or absolute path):

./signls --bank my-grids.json

Each time you change grid or quit the program, the current grid is saved to the file.

Acknowledgments

Signls uses a few awesome packages: - gomidi/midi for all midi communication - charmbracelet/bubbletea as the main TUI framework - charmbracelet/lipgloss for making things beautiful

Extension points exported contracts — how you extend this code

EmitterBehavior (Interface)
EmitterBehavior defines the behavior of different types of emitters. [7 implementers]
core/common/interface.go
Param (Interface)
(no doc) [23 implementers]
ui/param/param.go
Audible (Interface)
Audible represents an interface for nodes that trigger notes. [2 implementers]
core/music/interface.go
Midi (Interface)
Midi provides a way to interct with midi devices. [2 implementers]
midi/midi.go
Copyable (Interface)
Copyable represents an interface for nodes that can be copied. [16 implementers]
core/common/interface.go
Command (Interface)
(no doc) [4 implementers]
core/music/meta/commad.go
Node (Interface)
Node represents a general interface for any element that can exist on the grid. [4 implementers]
core/common/interface.go
Tickable (Interface)
Tickable represents an interface for nodes that have an internal time-related state. [3 implementers]
core/common/interface.go

Core symbols most depended-on inside this repo

Note
called by 158
core/music/interface.go
Value
called by 58
ui/param/param.go
RandomAmount
called by 56
core/common/interface.go
Color
called by 31
core/common/interface.go
SetRandomAmount
called by 31
core/common/interface.go
Set
called by 23
core/common/interface.go
Value
called by 21
core/music/meta/commad.go
Computed
called by 21
core/common/interface.go

Shape

Method 788
Function 81
Struct 63
Interface 13
TypeAlias 11

Languages

Go100%

Modules by API surface

core/field/grid.go44 symbols
midi/midi.go39 symbols
core/common/interface.go35 symbols
ui/ui.go28 symbols
ui/param/param.go28 symbols
filesystem/bank.go27 symbols
ui/param/key.go20 symbols
ui/param/destination.go20 symbols
core/node/euclid.go20 symbols
ui/param/direction.go19 symbols
core/node/emitter.go19 symbols
ui/param/threshold.go18 symbols

For agents

$ claude mcp add signls \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact