Getting started
Tutti is a tracker for orchestral sketches. Time runs down the screen in rows; each track is an instrument with its own cells for notes, velocity, articulation, dynamics and effects. Notes go out as MIDI to a DAW or sample library, or play through a built-in sketch synth.
- Pick a built-in song from the song list and press Space to loop the pattern. Esc stops.
- Click a note cell, set octave and step, and type notes on the piano-style keys (Z is C, S is C♯, X is D…).
- Press New for an empty song. It autosaves in this browser and the address bar remembers which song and pattern you had open.
The app runs in Chromium browsers (Chrome, Edge, Arc) for MIDI; the grid, pad and controller work in any modern browser, including Safari on iPhone and iPad.
The grid
A pattern is 64 rows by default, one sixteenth note per row, so four rows make a beat and sixteen a bar. Beats are shaded, bars are ruled, and rows, row size and meter are set per pattern in the pattern group. Changing the row size rescales the grid, not the music.
| cell | shows | entry |
|---|---|---|
| note | note name where a note starts, a line while it sustains | piano keys |
| vel | velocity, two hex digits | hex digits |
| art | articulation of the notes on that row | digits 1–9 |
| dyn | dynamics lane (CC1), hex, with a bar | hex digits, L ramp, S hold |
| fx | one command per row | a letter, then hex |
| bpm (gutter) | tempo lane, decimal | digits, L ramp, S hold |
The header names every cell, and the columns group in the menu shows or hides the vel, art, dyn and fx cells for all tracks while keeping their data. A track can have up to four note columns for divisi. Notes in one column never overlap: a new note cuts the one sounding, and a note cannot grow past the next. Click a track name to mute it; ⇧-click or long-press to solo. The status line under the grid always describes the cell under the cursor.
Keyboard
Moving
| ↑ ↓ | row |
| ← → | cell, wrapping across tracks |
| Tab ⇧Tab | track |
| PgUp PgDn or ⌘⇧↑ ⌘⇧↓ | bar |
| Home End or ⌘↑ ⌘↓ | first / last row |
Transport
| Space | loop the pattern, or stop |
| ⇧Space | loop from the cursor row |
| Return | play the song order |
| ⇧Return | arm real-time record (loops the pattern) |
| Esc | stop (or deselect) |
Entering
| Z–/ | notes from C of the octave (piano layout) |
| Q–P | notes an octave up |
| - = | octave down / up |
| ⇧- ⇧= | step down / up |
| [ ] | note shorter / longer |
| ⇧[ ⇧] | fewer / more note columns |
| 1–9 | articulation (art cell) |
| 0–F | velocity, dynamics, fx value |
| L S | ramp / hold a lane point |
| Delete | clear the cell |
| ⌘Z ⌘⇧Z | undo / redo, including track, mixer, key and order changes |
| ? ⌘? | quick keys panel / this guide in a new window |
Selection and batch edits
| ⇧↑ ⇧↓ ⇧← ⇧→ | extend the selection from the cursor; or drag with the mouse, ⇧-click to extend |
| ⌘A | select the track; again, the whole pattern |
| ⌘C ⌘X ⌘V | copy, cut, paste at the cursor |
| ⌘D | duplicate right below the selection |
| Delete | clear the selection |
| - = · ⇧- ⇧= | transpose a semitone · an octave |
| , . | transpose a scale degree in the song's key |
| [ ] | shorten / lengthen every selected note |
A toolbar appears with the selection and adds velocity up and down, an articulation list, Interpolate (ramp velocity, dynamics or tempo from the first row to the last), Fill (repeat the first row every step rows), Rnd vel, Rnd pitch (in key, within the selection's range) and Humanize (small random DEL on rows with notes). Paste lines cells up by kind: notes land on note columns, a dynamics run on a dynamics column.
Key and scale
Set the song's key in the key group, or tick this pattern to give the current pattern its own key for a modulation or a relative-major section. Entry stays chromatic, but the pad dims out-of-scale keys, , . and −deg / +deg move a selection by scale degrees, Rnd pitch draws from the key, and the controller's single-step nudge follows the scale. Scales: major, natural, harmonic and melodic minor, dorian, phrygian, lydian, mixolydian, pentatonics, whole tone, chromatic.
FX column
Each track's fx cell takes one command per row. Press the command's first letter, then two hex digits for its value.
| command | value | effect |
|---|---|---|
CHA chance | 00–FF | probability the row's notes play; FF always, 80 about half |
RET retrigger | count | play each note that many times, evenly across its length |
DEL delay | xx/256 row | push the row's notes behind the beat |
ARP arpeggio | two nibbles | cycle root, +first, +second semitones each row |
TSP transpose | signed byte | shift the track from this row until the next TSP (F9 is −7) |
EXP expression | shape, depth | 1 swell, 2 sfz, 3 fade in, 4 fade out; then depth 0–F |
Groove
A groove stretches and shrinks rows in a cycle without moving notes. Choose a preset in the pattern group (swing 8ths light, medium, hard; swing 16ths) or type a custom list of multipliers such as 1.33 0.67. Playback, export and the playing-row highlight all follow it.
Patterns, arrangement, live
+ adds a pattern with the current one's settings. The arrangement chips are the song order: click a chip to open that pattern, drag to reorder, × to remove, + to append the current pattern. The text field beside them accepts indices directly, with an optional repeat such as 0x2 1 0.
Repeats and chains
Each chip's … opens the entry: a repeat count, and for every track a choice of which pattern it plays during that entry. A track that follows another pattern loops or clips it to the entry's length, so a one-bar bass figure in pattern B can run under a four-bar melody in pattern A without copying it. The chip shows ×N and a ⛓ badge, and while that entry plays the grid header marks each chained track with the pattern it is sounding. The entry's own pattern sets the length, tempo lane and groove.
While a pattern loops, choosing another pattern (selector or chip) queues it; it takes over when the loop ends and the status shows next. Solo a track with ⇧-click or a long press on its name: with any solo on, only soloed tracks sound.
Mixer and tracks
The mixer sidebar (output group) shows each track with M, S, volume and pan. Tap a name to jump to that track. Volume and pan go out as CC7 and CC10 and are applied by the preview. Tracks… opens the tracks panel to add any instrument as a track, rename, change instrument, channel or columns, reorder and remove. A track's channel is shown in the grid header.
Touch and the pad
On a phone a tab bar at the bottom switches between Pattern (the grid with the pad), Arrange (order chips, pattern settings, key), Mixer and Tracks. Sounds stays in the menu's output group.
Tap a cell to place the cursor, drag to scroll, long-press to clear a cell. The pad under the grid appears on touch screens (or tick pad in the entry group). Its key row follows the cell: a piano for notes, hex for velocity and dynamics, digits for tempo, commands for fx, articulation names for the art cell. The other rows move the cursor, switch track, toggle sel (drag selects instead of scrolling), clear, undo, change octave and step, note length, and play.
Game controller
Pair a Bluetooth or USB controller and press any button so the browser lists it. The scheme follows LSDJ. Works on iPhone and iPad.
| d-pad / left stick | move the cursor (hold to repeat) |
| LB / RB | previous / next track |
| LT / RT | a bar up / down |
| A + up / down | nudge the value under the cursor (a scale degree with a key set) |
| A + left / right | nudge by an octave, 16 or 10 bpm; next fx command |
| A tap | enter the last pitch on an empty cell and advance; audition an existing note |
| B | clear the cell or selection; held with the d-pad, extend the selection |
| X / Y | audition / cycle articulation |
| Start | play or stop the pattern |
| Back | undo; held: + Start plays the song, + B copies, + X cuts, + A pastes, + Y duplicates |
MIDI out, MIDI in, export
Out to a DAW or sampler
Press Enable MIDI in the output group and choose an output. On macOS open Audio MIDI Setup → IAC Driver and tick Device is online; on Windows install loopMIDI and add a port. In Bitwig add Settings → Controllers → Generic → MIDI Keyboard with the IAC bus as input, set each instrument track's note input to that controller on the channel shown in Tutti's header, and arm it.
Each track sends on its own channel. Articulation keyswitches default to C1–G1 in list order (Kontakt shows these as C0–G0); the dynamics lane drives CC1 and the expression lane CC11; the mixer sends CC7 and CC10. Edit the instrument table in src/core/instruments.js to match your library.
In from a keyboard
Choose an input after enabling MIDI. Played notes go into the cursor cell with their velocity and advance by step; chords spread across note columns. The sustain pedal skips a step, the mod wheel writes dynamics. WebMIDI is not available on iOS.
Real-time record
Press ● Rec or ⇧Return to arm; the pattern loops if it is not playing. Played notes land on the row the loop is passing, in the first free note column of the cursor's track (columns grow up to four for chords), and releasing the key sets the length. Stop disarms, and the whole pass is one undo step.
Export
Export .mid writes a type 1 Standard MIDI File at 960 PPQ: a conductor track with tempo and meter, then one track per instrument with a program change, notes, controllers and keyswitches. Or drop the file on a DAW arranger.
Songs, autosave, files
Install it. Tutti is an installable web app: use your browser's install or Add to Home Screen option and it opens full screen with its own icon. Once opened it works offline, and the instruments you have played stay available without a network.
Every song you create, load or edit is saved in this browser a moment after each change, and the address bar names the open song and pattern (#song=…&pat=…), so a refresh or a bookmark brings you back. Delete removes your song, or resets a built-in example to its original.
Save downloads the song as JSON; Load adds a saved file to the list. The format is described by a JSON Schema. Built-in examples are written in code with a compact line() notation in src/core/examples.js; copy one to sketch a piece in text.
The preview plays the samples sound by default: a bundled orchestra derived from VSCO 2 Community Edition (public domain), with sustain, staccato, pizzicato, tremolo, muted and roll articulations and two dynamic layers blended by the dynamics lane. Samples load per instrument the first time a song needs them, with progress in the status line; instruments without samples (the synths) and notes played before loading finishes use the sketch synth, which you can also choose outright in the output group. Neither replaces a real library over MIDI; they are for judging orchestration while you write.
Sound banks. The Sounds panel's banks bar loads other ensembles: Jazz combo (piano, vibraphone, tenor sax, upright bass, drum kit), Folk group (fiddle, folk harp, recorder, harmonica, frame drum, hand percussion) and Electronica (FM piano, clavisynth, drum machine, lead, pad, pluck), all from public-domain samples, or any bank.json by URL. The Symphony orchestra is the bank loaded by default and otherwise like any other: click its chip to unload it (instruments a song uses stay), or to hide it while a song uses it. The orchestra has a harp, a tuba and a sampled choir voice (Sonatina Symphonic Orchestra); folk adds banjo (a plucked-string model), an Irish flute (a baroque alto recorder standing in for a wooden flute), harmonica and a washboard kit; jazz adds a sampled classical guitar (FreePats) and alto and bass saxes derived from the tenor samples. The electronica drum machine covers the whole General MIDI percussion map (kick at C1, snare at D1, hats at F♯1 and A♯1, and so on up to the woodblocks at F5); the status line names the piece under the cursor. Loaded banks' instruments appear grouped in the Tracks panel's instrument list, so you can add a single instrument to an orchestral song. A song remembers the banks it uses and loads them when opened. Drum kits play on mapped notes only; the status line names the piece under the cursor.
Sounds… in the output group opens the sounds panel: each instrument's source, which articulations are real recordings and which fall back, an audition button (click an articulation to hear just that one), and tune, cents, level trim and release scale per instrument, remembered in this browser. Two scopes show the live output and the waveform of the sample that last played.
Writing a first phrase
Plan one chord per bar, for example A minor, F, C, G. Put the roots on Basses and Cellos with step 16. Give Violins II and Violas one chord tone each per bar, moving each voice to the nearest tone. Fill the middle with an open fifth on the two Horns columns. Add a pulse: pizzicato basses on beats 1 and 3, or staccato bassoon on step 2 alternating root and fifth, timpani on tonic and dominant with a roll into the repeat. Write the melody last on Violins I or Flute, chord tones on the beats, and shape the phrase with a dynamics ramp from 30 to 60 across the four bars. Add a pattern B, set the order to 0 0 1 1, and change only the last two chords.