User Guide
RMT Compose is a composition tool where every note is an expression, not a coordinate. A note's pitch, start time and duration are written as ratios and references to other notes, so a change propagates through everything that depends on it.
Start with Getting Started if you have not opened the app yet. This guide covers what each part of the interface does and how to work with it.
Interface
- Workspace — the canvas: navigation, selection, and every drag gesture
- Top Bar — transport, view controls, the settings gear, the "+" menu
- Module Bar — the library of draggable modules
- Note Widget — read and edit a note's expressions
- Settings — the five-tab panel behind the gear
- Themes & Appearance — presets and per-colour overrides
- Keyboard Shortcuts — the complete key and gesture list
- Mobile — the touch gesture set on phones and tablets
Working with Notes
- Creating Notes — the "Add Note / Silence" section
- Editing Notes — change pitch, timing and duration
- Multi-Note Selection — marquee, group drag, group delete, Copy to Modules
- Transposing with Arrows — transpose by a configurable interval
- Expressions — the DSL
- Dependencies — how notes reference each other
Tuning Systems
- Pure Ratios — just intonation with exact fractions
- Equal Temperament — how TET works here
- 12-TET — standard Western tuning
- 19-TET — better thirds, more notes
- 31-TET — high-resolution microtonal
- Bohlen-Pierce — a tritave-based scale
- Custom TET — build your own division
Modules
- Module Library — what ships in the library and where it lives
- Loading Modules — import from the library or from a file
- Saving Modules — export your work
- Creating Modules — build one from scratch
- Module Format — the JSON schema
Playback
- Transport Controls — play, pause, stop, loop
- Playhead Tracking — follow the playhead during playback
- Instruments — the nine built-in sounds
- Audio and Effects — reverb, stereo width, the limiter
Quick reference
Expression basics
Expressions are written in the DSL. base is the BaseNote; [N] is the note with id N — the number drawn in brackets at the top-left of every note rectangle.
base.f # the BaseNote's frequency
[3].f * (3/2) # a perfect fifth above note 3
[3].t + [3].d # starts exactly when note 3 ends
beat(base) * 2 # two beats longProperty shortnames:
| Property | Write it as |
|---|---|
| frequency | f, freq, frequency |
| startTime | t, s, start, startTime |
| duration | d, dur, duration |
| tempo | tempo |
| beatsPerMeasure | bpm, beatsPerMeasure |
| measureLength | ml, measureLength |
Common intervals
Multiply a frequency by a ratio.
| Interval | Ratio | Expression |
|---|---|---|
| Unison | 1/1 | base.f |
| Minor third | 6/5 | base.f * (6/5) |
| Major third | 5/4 | base.f * (5/4) |
| Perfect fourth | 4/3 | base.f * (4/3) |
| Perfect fifth | 3/2 | base.f * (3/2) |
| Octave | 2/1 | base.f * 2 |
Equal-temperament steps
^ is the power operator. One step up from the previous note:
| System | Step expression |
|---|---|
| 12-TET | [1].f * 2 ^ (1/12) |
| 19-TET | [1].f * 2 ^ (1/19) |
| 31-TET | [1].f * 2 ^ (1/31) |
| Bohlen-Pierce | [1].f * 3 ^ (1/13) |
These are the expressions the shipped Scale Systems modules actually use.
Legacy JavaScript syntax
Older modules store expressions as method chains. They still load and still evaluate.
module.baseNote.getVariable('frequency').mul(new Fraction(3, 2))
module.getNoteById(3).getVariable('startTime').add(module.getNoteById(3).getVariable('duration'))Keyboard and gestures
| Input | Action |
|---|---|
Ctrl/Cmd + Z | Undo |
Ctrl/Cmd + Y or Ctrl/Cmd + Shift + Z | Redo |
| Wheel over the canvas | Zoom |
| Drag empty canvas | Pan |
| Shift + drag empty canvas | Marquee-select notes |
| Shift + click a note | Toggle it in or out of the selection |
| Shift + click Play | Loop playback |
| Long-press (touch, 500 ms) | The touch stand-in for Shift |
The full list, including what each Escape does, is on the Keyboard Shortcuts page.