[1] logo [2] • [3]about • [4]signls □ [5]Overview □ [6]Installation ☆ [7]Linux & macOS ☆ [8]Windows ☆ [9]Build it yourself □ [10]Usage ☆ [11]Basic commands ☆ [12]Keyboard mapping ☆ [13]MIDI □ [14]Workflow ☆ [15]User Interface ☆ [16]Grid ☆ [17]Nodes ☆ [18]Signals ☆ [19]Parameters ☆ [20]Note parameters ☆ [21]CC parameters ☆ [22]Timing ☆ [23]Transposition ☆ [24]Randomization ☆ [25]Bank □ [26]Nodes reference ☆ [27] Bang ☆ [28] Euclid ☆ [29] Pass ☆ [30] Spread ☆ [31] Cycle ☆ [32] Dice ☆ [33] Toll ☆ [34] Zone ☆ [35] Hole • [36]sektron Overview • [37]source code • [38]report an issue ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [39]Signls by emprcl Signls (pronounced signals) is a non-linear, generative MIDI sequencer designed for music composition and live performances, all within the terminal. It allows you to create complex, evolving musical patterns using a grid-based approach. You can place nodes on the grid, and these nodes can emit signals, relay them, or trigger MIDI notes. There are 9 different types of nodes to explore, each with its own unique behavior. With Signls, you can generate dynamic, generative music, meaning that the patterns evolve and change over time. It's designed to give you a powerful creative tool to build intricate sequences without being stuck in a rigid timeline or structure. It takes inspiration from [40]Orca and [41]Nodal. Features • Non-linear sequencing: unlike traditional sequencers, Signls doesn't force you into a single direction. Your sequences can move and shift in multiple ways, allowing for complex and unique arrangements. • Randomize everything: create evolving musical patterns that shift over time, adding depth and unpredictability to your compositions. • Live performance: designed to be used in real-time, making it a adequate tool for live performances where improvisation is key. • Keyboard first: Signls operates directly from your terminal, giving you control in a simple, lightweight environment, where everything is controllable via keyboard. • Cross-platform: runs on Linux, macOS, and Windows Installation Signls is available for Linux, macOS and Windows. [42]Download the last release for your platform. Linux & macOS In your terminal: # Extract files mkdir -p signls && tar -zxvf signls_VERSION_PLATFORM.tar.gz -C signls cd signls # Run signls ./signls Windows We recommend using [43]Windows Terminal with a good monospace font like [44]Iosevka to display Signls correctly on Windows. Some specific Windows [45]bugs regarding unicode characters prevent us to display some UI elements (randomization indicator or non-empty bank slot) but it should not degrade the experience that much. Unzip the archive and, in the same directory, run: .\signls.exe Replace ./signls by .\signls.exe for every following commands. Build it yourself You can also [46]build it yourself if your want to. Usage Basic commands # Run signls ./signls # Display current version ./signls --version Hit ? to see all keybindings. esc to quit. Keyboard mapping Keys mapping is fully customizable. After running signls for the first time, a config.json is created. 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 keybindings 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) • . modify 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 Key binding reference • [47]qwerty • [48]qwerty mac • [49]azerty • [50]azerty mac MIDI Signls doesn't generate sound on its own, but it works seamlessly with MIDI software or hardware. You can connect it to your favorite synthesizers, virtual instruments, or any MIDI-compatible devices for live performances or production. On each [51]node, you can configure NoteOn and NoteOff messages, using [52]note parameters. Each node can also send up to 8 CC messages, using [53]CC parameters. Press the f2 to open the MIDI configuration menu, where you can adjust three parameters: • Clock: enable or disable clock send messages • Transport: enable or disable transport start and stop messages • Device: select the midi output device Use ← and → to navigate between the parameters, and modify their values with ctrl+↑ and ctrl+↓. On macOS, you might need to [54]enable the IAC driver if you're only using webmidi instruments. Some companion apps that receive MIDI for testing Signls: • [55]Webmidi synths • [56]Enfer ([57]github) works only on linux • [58]QSynth Workflow User Interface UI 1 1. Grid: The [59]grid is where you place [60]nodes. Each nodes displays its type and emit/relay directions. Signals are displayed in white. 2. Cursor: The cursor is the tool to place, select or edit nodes. 3. Selection indicator: Shows the currently selected [61]nodes. 4. Mode indicator: Shows the current mode - move, [62]edit or [63]bank. 5. Selector position: Shows the current selector position. 6. Grid size: Shows the current grid size. Useful to know if the grid is bigger than the current terminal window. 7. Tempo: Shows the current [64]tempo in bpm (beats per minute). 8. Play status: Shows if the grid is currently playing (▶) or stopped (■). Also shows the number of 1/16 notes since it started to play. 9. Root key: Shows the current [65]root key. 10. Scale: Shows the current [66]scale. 11. Bank: Shows the currently selected grid in the [67]bank, and the name of the bank (which is the bank filename). 12. Control zone: Shows either [68]grid informations and parameters (move mode), selected [69]node parameters (edit mode) or [70]bank grid slots ( bank mode). Grid The grid serves as a canvas for your sequencing, where you control the flow of MIDI signals across various [71]nodes. You can start or stop the grid's underlying sequencer by pressing space. By default, the size of the grid adapts to your terminal size. If you increase the terminal window, the grid will expand accordingly. However, if you decrease the terminal size, the grid remains unchanged to prevent the accidental loss of nodes outside the visible bounds. You can still scroll through the grid even if the terminal is smaller. If you want to force the grid to resize and match the terminal (which may result in some nodes being deleted), you can press f10 to do so manually. Nodes Nodes can perform three main functions based on their type: • they can emit new signals • they can relay incoming signals to up to 4 directions • they can trigger MIDI messages To add nodes on the grid, move the cursor using the arrow keys and press keys 1 to 9 to choose one of the [72]9 available node types. To remove nodes from the grid, move the cursor using the arrow keys and press backspace. You can manually trigger a node by using /. You can mute nodes to temporarily silence their behavior: • Press m to toggle mute on the selected nodes. • Press M to force mute sync across all selected nodes, ensuring they are all muted or unmuted together. This is useful for controlling which nodes are active during live performances or while experimenting with different parts of your sequence. You can easily manage nodes on the grid by copying, cutting, and pasting them using the usual key bindings: • ctrl+C to copy, • ctrl+X to cut • ctrl+V to paste. To move nodes in bulk, you can select multiple nodes by holding shift + ↑ ↓ ← → to define a selection area. This makes it easy to reposition or replicate parts of your sequence. Signals A key feature of each node is the direction in which it emits or relays signals . You can configure up to four directions: up, down, left, and right. To modify a node's directions, move the cursor to the desired node and press Ctrl + ↑ ↓ ← → to add or remove directions. The way a node uses these directions (one or multiple) depends on its specific behavior. directions Parameters Each node has adjustable parameters that you can edit to modify its behavior. To enter node editing mode, move the cursor to the node you want to modify and press enter. The available parameters will appear in the control bar at the bottom. You can navigate between parameters using ← → key and switch between parameter pages with using ↑ ↓ keys. To change a parameter value, press ctrl+↑ to increase or ctrl+↓ to decrease it. You can edit a parameter value precisely by pressing the . key. This opens a text input where you can type the value manually. Press enter to confirm the change. Each node parameter can have up to four alternative values: • Main 1 Ctrl+↑/↓: adjusts the main value • Main 2 Ctrl+←/→: adjusts a second value, often used for randomization • Alt 1 Shift+↑/↓: adjusts a third alternative value • Alt 2 Shift+←/→: adjusts a fourth alternative value We will refer to these as Main 1, Main 2, Alt 1, and Alt 2 for simplicity Each node (except "The Hole") shares five common MIDI parameters. UI 2 Parameters are displayed in two parts if an alternative value (for example [73] randomization) is set: 1. the actual value: here F5 for the key or 100 for the velocity 2. the alternative value: here +8 for the key or -18 for the velocity You can edit multiple nodes at once by selecting them together.The common parameters for all selected nodes will be displayed, and any changes you make will apply to all of them simultaneously. Note parameters The first parameter page will display the note parameters. Key (key): key of the MIDI note • Value Range: A1 - G10 • Main 1: key value for the note • Main 2: randomization range • Alt 1: unused • Alt 2: note modes (random | silent) Velocity (vel): intensity of the MIDI note • Value Range: 0 - 127 • Main 1: velocity value for the note • Main 2: randomization range • Alt 1: unused • Alt 2: unused Length (len): duration of the MIDI note. • Value Range: 1/64 - inf • Main 1: length value of the note • Main 2: randomization range • Alt 1: unused • Alt 2: unused Channel (cha): MIDI channel • Value Range: 1 - 16 • Main 1: channel value • Main 2: randomization range • Alt 1: unused • Alt 2: unused Probability (prb): the chance of triggering the MIDI note • Value Range: 0 - 100 • Main 1: probability value • Main 2: unused • Alt 1: unused • Alt 2: unused CC parameters On the second parameter page, you can configure up to 8 MIDI CC messages which will be sent alongside the note messages. CC (cc): the control change message • Value Range: 0 - 127 • Main 1: cc value • Main 2: randomization range • Alt 1: cc number (only for cc mode) • Alt 2: message mode - disabled, cc, after touch, pitch bend, program change Timing Each position on the grid represents a 1/16 note. You can adjust the tempo (in beats per minute, or BPM) to control how fast signals move across the grid. To modify the tempo, simply press = to increase the BPM or - to decrease it, allowing you to set the pace of your sequence in real time. Transposition The MIDI notes assigned to each node are fixed. However, when the root key or scale of the grid is changed, these notes are transposed according to the new root key and scale. This means the original note values are shifted in relation to the grid's updated musical context, allowing you to easily adjust the overall harmony without manually changing the notes on each node. The transposition happens relative to the set root and scale, providing a flexible way to experiment with different keys and tonalities. To modify the root key and scale, use: • ' ; to decrease and increase the root key • " : to cycle through the available scales Available scales include the chromatic scale, the 7 diatonic modes, a few pentatonic scales and a tetratonic scale: • chromatic • ionian • dorian • phrygian • lydian • mixolydian • aeolian • locrian • pentatonic major • pentatonic minor • hirajoshi • iwato • tetratonic Randomization You can apply randomization to most node parameters. When editing randomization, you can specify positive or negative randomization values. For example, if you set the velocity to 80+5, the random value will be picked between 80 and 85. If you set the velocity to 80-5, the random value will be picked between 75 and 80. This allows for subtle variations in your sequences, adding a layer of unpredictability while keeping control over the range of changes. Randomized node keys will always conform to the current [74]scale. Bank You manage your projects using a bank. When you start the program, you can provide a bank JSON file, or if none is provided, a default file (default.json) will be created or loaded automatically. Each bank can store up to 32 grids. ./signls --bank my-grids.json The grids are saved automatically whenever you make changes or exit the program, so you never have to worry about losing progress. To load a specific grid from the bank, press tab to switch to the bank view, then use the arrow keys to select a grid slot and press enter to load it. This allows you to quickly swap between different configurations during live performances or while working on different projects. UI 3 The ̠character under the grid number indicates that the grid slot is not empty. Like nodes, you can copy, cut and paste grids in the bank. Nodes reference Here is a reference guide for all the node types available in Signls. Each node has common [75]note parameters (except for the Hole) like key, velocity, length, channel, and probability. Some nodes also have extra parameters that give them unique behavior. bang Bang • Description: emits a signal when the grid starts playing and relays signals on all configured directions • Key binding: 1 • Extra Parameters: none euclid Euclid • Description: emits signals based on the euclidean rhythm algorithm, ensuring an even distribution of steps across the grid. Relays signals on all configured directions • Key binding: 2 • Extra Parameters: □ Steps (stp): number of total steps in the pattern ☆ Value Range: 1 - 128 ☆ Main 1: steps value ☆ Main 2: randomization range ☆ Alt 1: unused ☆ Alt 2: unused □ Triggers (trg): number of signals to emit within the total steps ☆ Value Range: 1 - 128 ☆ Main 1: triggers value ☆ Main 2: randomization range ☆ Alt 1: unused ☆ Alt 2: unused □ Offset (off): shifts the start point of the pattern ☆ Value Range: 0 - 128 ☆ Main 1: offset value ☆ Main 2: randomization range ☆ Alt 1: unused ☆ Alt 2: unused pass Pass • Description: passes signals through without affecting their direction. No direction configuration is possible • Key binding: 3 • Extra Parameters: none spread Spread • Description: relays signals on all configured directions, distributing them evenly • Key binding: 4 • Extra Parameters: None cycle Cycle • Description: relays signals in a clockwise direction, starting from the "up" direction, one at a time • Key binding: 5 • Extra Parameters: none dice Dice • Description: relays signals in a randomly selected direction each time it is triggered • Key binding: 6 • Extra Parameters: none toll Toll • Description: relays signals on all configured directions, but only after being triggered a specific number of times • Key binding: 7 • Extra Parameters: □ Threshold (thd): the number of times the node must be triggered before it relays a signal ☆ Value Range: 1 - no upper limit ☆ Main 1: offset value ☆ Main 2: randomization range ☆ Alt 1: unused ☆ Alt 2: unused zone Zone • Description: relays signals on all configured directions and immediately propagates the trigger to all neighboring nodes, making it ideal for triggering chords • Key binding: 8 • Extra Parameters: none hole Hole • Description: instantly teleports the signal to a specified location on the grid without triggering any notes • Key binding: 9 • Extra Parameters: □ Destination (dest): The coordinate of the destination ☆ Value Range: 1 - grid width/height ☆ Main 1: y-coordinate value of the destination ☆ Main 2: x-coordinate value of the destination ☆ Alt 1: randomization range for the y-coordinate ☆ Alt 2: randomization range for the y-coordinate References: [1] https://empr.cl/ [2] javascript:void(0); [3] https://empr.cl/ [4] https://empr.cl/signls/ [5] https://empr.cl/signls/#overview [6] https://empr.cl/signls/#installation [7] https://empr.cl/signls/#linux-macos [8] https://empr.cl/signls/#windows [9] https://empr.cl/signls/#build-it-yourself [10] https://empr.cl/signls/#usage [11] https://empr.cl/signls/#basic-commands [12] https://empr.cl/signls/#keyboard-mapping [13] https://empr.cl/signls/#midi [14] https://empr.cl/signls/#workflow [15] https://empr.cl/signls/#user-interface [16] https://empr.cl/signls/#grid [17] https://empr.cl/signls/#nodes [18] https://empr.cl/signls/#signals [19] https://empr.cl/signls/#parameters [20] https://empr.cl/signls/#note-parameters [21] https://empr.cl/signls/#cc-parameters [22] https://empr.cl/signls/#timing [23] https://empr.cl/signls/#transposition [24] https://empr.cl/signls/#randomization [25] https://empr.cl/signls/#bank [26] https://empr.cl/signls/#nodes-reference [27] https://empr.cl/signls/#bang [28] https://empr.cl/signls/#euclid [29] https://empr.cl/signls/#pass [30] https://empr.cl/signls/#spread [31] https://empr.cl/signls/#cycle [32] https://empr.cl/signls/#dice [33] https://empr.cl/signls/#toll [34] https://empr.cl/signls/#zone [35] https://empr.cl/signls/#hole [36] https://empr.cl/sektron/ [37] https://github.com/emprcl/signls [38] https://github.com/emprcl/signls/issues/new [39] https://emprcl.itch.io/signls [40] https://100r.co/site/orca.html [41] https://nodalmusic.com/ [42] https://emprcl.itch.io/signls [43] https://apps.microsoft.com/detail/9n0dx20hk701 [44] https://typeof.net/Iosevka/ [45] https://github.com/emprcl/signls/issues/5 [46] https://github.com/emprcl/signls?tab=readme-ov-file#build-it-yourself [47] https://github.com/emprcl/signls/blob/7d9c8016e99fc9c973f61764fb9801d92eee21db/filesystem/keymap.go#L183 [48] https://github.com/emprcl/signls/blob/7d9c8016e99fc9c973f61764fb9801d92eee21db/filesystem/keymap.go#L244 [49] https://github.com/emprcl/signls/blob/7d9c8016e99fc9c973f61764fb9801d92eee21db/filesystem/keymap.go#L62 [50] https://github.com/emprcl/signls/blob/7d9c8016e99fc9c973f61764fb9801d92eee21db/filesystem/keymap.go#L123 [51] https://empr.cl/signls/#nodes [52] https://empr.cl/signls/#note-parameters [53] https://empr.cl/signls/#cc-parameters [54] https://discussions.apple.com/thread/8096575?answerId=32319872022&sortBy=rank#32319872022 [55] https://synth.playtronica.com/ [56] https://neauoire.github.io/Enfer/ [57] https://github.com/neauoire/Enfer [58] https://qsynth.sourceforge.io/ [59] https://empr.cl/signls/#grid [60] https://empr.cl/signls/#nodes [61] https://empr.cl/signls/#nodes [62] https://empr.cl/signls/#parameters [63] https://empr.cl/signls/#bank [64] https://empr.cl/signls/#timing [65] https://empr.cl/signls/#transposition [66] https://empr.cl/signls/#transposition [67] https://empr.cl/signls/#bank [68] https://empr.cl/signls/#grid [69] https://empr.cl/signls/#parameters [70] https://empr.cl/signls/#bank [71] https://empr.cl/signls/#nodes [72] https://empr.cl/signls/#nodes-reference [73] https://empr.cl/signls/#randomization [74] https://empr.cl/signls/#transposition [75] https://empr.cl/signls/#parameters