Future Composer JS is a browser-based editor and player for Atari 8-bit Future Composer music files. It supports loading, playing, and editing .FC, .BIN, and .SAP files, and can export edited songs back to the uncompressed .FC format.
The player is an accurate JavaScript port of the original 6502 Future Composer player, using MAME-accurate POKEY chip emulation. No installation is required — open fc_app.html in any modern browser.
| Supported Formats | Description |
|---|---|
| .FC | Uncompressed Future Composer file (editor native format) |
| .BIN | Compiled FC binary (player + music data) |
| .SAP | Atari SAP archive (TYPE B — extracts BIN block automatically) |
The screen is divided into four panels. The active panel is highlighted with a bright border. Press Tab to cycle between panels.
| Panel | Description |
|---|---|
| Track Editor (top-left) | Song sequence — which patterns play on each channel |
| Pattern Editor (top-right) | Note, instrument, and duration data for one pattern |
| Instrument Editor (bottom-left) | 4 parameters per instrument (envelope, distortion, arp, effect) |
| Envelope Editor (bottom-right) | Volume/timbre envelope bytes for one envelope |
Drag and drop a .FC, .BIN, or .SAP file onto the drop zone at the bottom of the screen, or click it to open a file browser.
After loading, the editor populates all four panels with the song data and begins playback automatically.
| Button | Action |
|---|---|
| PLAY | Start playback from beginning |
| STOP | Stop playback |
| REW | Rewind to beginning (without stopping) |
| NEW | Create a blank new song |
| SAVE | Export current song as .FC file |
| Volume slider | Master output volume |
| Key | Action |
|---|---|
| Tab | Cycle focus: Track → Pattern → Instrument → Envelope → Track |
| Space | Toggle play / stop |
| Esc | Stop playback |
| F1 | Set octave 1 |
| F2 | Set octave 2 |
| F3 | Set octave 3 |
| F4 | Set octave 4 |
The current octave, instrument number, and duration index are always shown in the status bar at the top.
The Track Editor shows the song sequence across 3 channels. Each row contains pattern numbers (hex) for channels 1, 2, and 3. Special markers control looping, ending, transposition, and AUDCTL.
| Value | Meaning |
|---|---|
00–3F | Play pattern number (hex) |
80–8F | Set transposition (raw 0–15; default 8 = no shift; 88 = default) |
40 xx | Set AUDCTL to xx (2-byte command) |
FE | End of song |
FF | Loop: reset to beginning |
| Key | Action |
|---|---|
| ↑ / ↓ | Move cursor up / down |
| ← / → | Move cursor left / right (between channels 1–3) |
| 0–9, A–F | Enter hex pattern number (two keystrokes: first digit then second) |
| Shift+0–F | Enter transpose byte (80–8F) |
| L | Insert loop marker (FF) at cursor |
| E | Insert end marker (FE) at cursor |
| Enter | Jump to Pattern Editor for the pattern number under cursor |
| Insert | Insert empty row at cursor position |
| Delete | Delete row at cursor position |
| + / - | Increment / decrement pattern number at cursor |
The Pattern Editor shows the contents of one pattern (0–63). A pattern is a sequence of commands: instrument selects, duration sets, and notes, terminated by FF (end of pattern).
| Range | Meaning |
|---|---|
00–3F | Note (index into frequency table; see note names below) |
40–7F | Set duration: byte & 0x1F = index into duration table |
80–9F | Select instrument: byte & 0x1F = instrument number (0–31) |
FF | End of pattern |
| Key | Action |
|---|---|
| ↑ / ↓ | Move cursor up / down |
| Piano keys (see below) | Enter note at current octave using current instrument & duration |
| Ctrl+0–9 | Set duration index 0–9 |
| Shift+0–V | Select instrument 0–31 (hex: 0–9, then A–V) |
| + / - | Next / previous pattern number |
| Insert | Insert empty byte at cursor |
| Delete | Delete byte at cursor |
| Backspace | Set FF (end of pattern) at cursor |
| 0–9, A–F | Direct hex value entry for current byte |
Notes are entered using the PC keyboard as a piano. Two rows cover two octaves at a time (controlled by the current octave setting F1–F4).
Lower row (current octave): Upper row (octave+1): Black keys: S D G H J 2 3 5 6 7 White keys: Z X C V B N M Q W E R T Y U Z=C S=C# X=D D=D# C=E V=F G=F# B=G H=G# N=A J=A# M=B Q=C 2=C# W=D 3=D# E=E R=F 5=F# T=G 6=G# Y=A 7=A# U=B (one octave higher)
The current octave is shown in the status bar. Each note press inserts the note byte and advances the cursor. The current instrument and duration are automatically prepended if they differ from the previous values in the pattern.
| Note Index | Name | Note Index | Name |
|---|---|---|---|
| 00–07 | N00–N07 (sub-audible range) | 20 | E-3 |
| 08 | C-1 | 21 | F-3 |
| 09 | C#1 | 22 | F#3 |
| 0A | D-1 | 23 | G-3 |
| 0B | D#1 | 24 | G#3 |
| 0C | E-1 | 25 | A-3 |
| 0D | F-1 | 26 | A#3 |
| 0E | F#1 | 27 | B-3 |
| 0F | G-1 | 28 | C-4 |
| 10 | G#1 | 29 | C#4 |
| 11 | A-1 | 2A | D-4 |
| 12 | A#1 | 2B | D#4 |
| 13 | B-1 | 2C | E-4 |
| 14 | C-2 | 2D | F-4 |
| 15 | C#2 | 2E | F#4 |
| 16 | D-2 | 2F | G-4 |
| 17 | D#2 | 30 | G#4 |
| 18 | E-2 | 31 | A-4 |
| 19 | F-2 | 32 | A#4 |
| 1A | F#2 | 33 | B-4 |
| 1B | G-2 | 34–3F | C-5 and above |
| 1C | G#2 | ||
| 1D | A-2 | ||
| 1E | A#2 | ||
| 1F | B-2 |
The Instrument Editor shows 4 parameters for the currently selected instrument (0–31).
| Field | Range | Description |
|---|---|---|
| Envelope | 00–1F | Index of the volume/timbre envelope to use |
| Distort | 00–FF | POKEY distortion value — ORed with each envelope byte for AUDCx. Common values: A0=pure tone, C0=white noise, E0=gritty buzz |
| Arpeggio | 00–FF | Arpeggio depth in semitones. 0=none. Alternates between base note and base+depth each frame. |
| Effect | 00–FF | Pitch effect. 00=none. 01–7F=table vibrato (±1 semitone wave). 80–FF=continuous slide up (+2 AUDF per frame). |
| Key | Action |
|---|---|
| ↑ / ↓ | Move between fields (Envelope → Distort → Arpeggio → Effect) |
| ← / → | Decrement / increment current field value by 1 |
| 0–9, A–F | Hex entry for current field (two keystrokes) |
| + / - | Next / previous instrument number |
A0 (pure square wave) for melody channels and C0 (white noise) for percussion.The Envelope Editor shows the byte sequence for the currently selected envelope (0–31). Each byte controls the POKEY AUDCx register for one frame.
| Range | Meaning |
|---|---|
00–7F | Volume/timbre byte — ORed with instrument Distort → AUDCx. Lower nibble = volume (0=silent, F=loudest). Higher nibble contributes to distortion. |
80–FE | Direct AUDC write — written as-is to AUDCx, and AUDFx is forced to 0 (mutes pitch). Used for percussive clicks. |
FF | End of envelope — hold last AUDC value indefinitely (sustain) |
| Key | Action |
|---|---|
| ↑ / ↓ | Move cursor up / down |
| ← / → | Decrement / increment byte value at cursor |
| 0–9, A–F | Hex entry for byte at cursor (two keystrokes) |
| + / - | Next / previous envelope number |
| Insert | Insert 00 byte at cursor |
| Delete | Delete byte at cursor |
| Backspace | Set FF (end of envelope) at cursor |
0F 0E 0D 0C 0B 0A 09 08 07 FF — the volume decays from 0F to 07 then holds. The FF at the end causes the last value (08) to be held indefinitely.Click the SAVE button (or press Ctrl+S) to export the current song as an uncompressed .FC file. The file will be downloaded to your browser's download folder.
The exported .FC file can be loaded back into the editor, played in any FC-compatible player, or compiled with the original Future Composer tool on the Atari.
| Offset | Size | Content |
|---|---|---|
$0000 | 2 | Identifier: 26 23 |
$0002 | 1 | Tempo (frames per beat unit) |
$0003 | 256 | Track 1 data |
$0103 | 256 | Track 2 data |
$0203 | 256 | Track 3 data |
$0303 | 128 | 32 instruments × 4 bytes |
$0383 | ... | 64 patterns (FF-terminated each) |
| ... | ... | 32 envelopes (FF-terminated each) |
The duration table has 32 entries. Entry 0 holds the tempo value. Entry n = (n+1) × tempo frames. A tempo of 6 gives durations: 6, 12, 18, 24, ... frames per note.
In patterns, duration bytes are 40–7F: the index is byte & 0x1F (0–31).
Transposition is stored as a raw unsigned value 0–15. The default is 8 (written as track byte 88). The note frequency is looked up at index note + transpose. Because the frequency table has 8 unused entries at the start, transpose=8 means "no transposition" into the musical range.
Transpose values: 80=transpose 0 (shift down 8), 88=transpose 8 (default/no shift), 8F=transpose 15 (shift up 7).
| Value | Effect |
|---|---|
00 | None |
01–7F | Table vibrato: ±1 semitone wave using fixed 8-frame pattern [0,0,+1,+1,0,0,−1,−1]. Phase is NOT reset on new notes. |
80–FF | Continuous slide: AUDF increments by 2 each frame (pitch slides upward). Stops at $FF. |
Future Composer uses 3 logical channels mapped to 4 POKEY hardware channels:
| FC Channel | POKEY Channels | Clock | Frequency Formula |
|---|---|---|---|
| Ch 0 (bass) | CHAN1 + CHAN2 joined (16-bit) | 1.79 MHz | 1,773,447 / (2 × (AUDF1×256 + AUDF0 + 7)) |
| Ch 1 (melody) | CHAN3 | 64 kHz | 63,337 / (AUDF2 + 1) |
| Ch 2 (melody) | CHAN4 | 64 kHz | 63,337 / (AUDF3 + 1) |
Default AUDCTL = $50 (CH1_HICLK + CH12_JOINED). Channel 0 (bass) always uses the 16-bit joined mode for extended low-frequency range. The bass AUDC output is on AUDC1 (CHAN2), not AUDC0.
0F 0E 0C 0A 08 06 04 02 FF.To reuse a pattern on multiple channels: in the Track Editor, simply enter the same pattern number on different channels at the desired rows.
For a percussion hit on a melody channel (Ch 1 or Ch 2): create an instrument with Distort C0 (white noise). In the envelope, use direct bytes (80–FE) for the initial click, then volume bytes for decay. Example: AF 8F 0C 09 06 03 01 FF.
Channel 0 is always the bass channel (16-bit POKEY mode). Use it for low, sustained notes. Notes N00–N07 (indices below 8) are in the sub-audible range and are shown as N00–N07 in the pattern display.
The tempo is set in the duration table. Shorter duration values = faster notes. Duration index 0 = 1×tempo frames, index 1 = 2×tempo frames, etc. A typical FC song uses tempo 6, giving durations of 6, 12, 18 frames per note.
GLOBAL Tab Cycle panel focus (Track → Pattern → Inst → Env) Space Play / Stop Esc Stop F1–F4 Set octave 1–4 TRACK EDITOR ↑↓←→ Navigate rows / channels 0–F Enter pattern number (2 hex digits) Shift+0–F Enter transpose byte (80–8F) L Insert loop (FF) E Insert end (FE) Enter Jump to pattern under cursor Ins/Del Insert / delete row +/- Increment / decrement pattern number PATTERN EDITOR ↑↓ Navigate rows Z S X D C V G B H N J M Notes (lower octave) Q 2 W 3 E R 5 T 6 Y 7 U Notes (upper octave) Ctrl+0–9 Set duration index Shift+0–V Select instrument (0–31) +/- Next / previous pattern Ins/Del Insert / delete byte Backspace Set FF (end) 0–F Direct hex entry INSTRUMENT EDITOR ↑↓ Select field ←→ Decrement / increment value 0–F Hex entry (2 digits) +/- Next / previous instrument ENVELOPE EDITOR ↑↓ Navigate rows ←→ Decrement / increment byte 0–F Hex entry (2 digits) +/- Next / previous envelope Ins/Del Insert / delete byte Backspace Set FF (end)