FUTURE COMPOSER
Future Composer is a music editor for entering, composing and playing back musical data on Atari 8-bit computers. The editor handles the POKEY sound chip and gives the user three independent voices: voices 1 and 2 are linked into a single 16-bit channel, while voices 3 and 4 remain separate, allowing two independent motifs to play simultaneously.
Main menu access: ^I (Shift+I) — exits any editor: ESC
Overview // 0x00
The program is a music editor for entering, arranging and playing back music data. The editor controls the Atari sound generators by giving the user three independent sound channels — this is achieved by combining sound generators 1 and 2 into one 16-bit channel. Channels 3 and 4 are not linked and allow playback of two independent motifs.
^I (Shift+I). All editors are exited at any time with ESC.
Module Generation & STATUS Byte // 0x02
Playback initiation and procedure restart are controlled by the STATUS byte:
| STATUS bit | Value | Meaning |
|---|---|---|
| bit 6 | $40 | Restart playback procedure |
| bit 7 | $80 | Pause / suspend music playback |
| — | $00 | Normal playback (both bits cleared) |
Action is selected the moment the corresponding bit is set. During normal playback, both bits are cleared.
For the playback procedure to operate correctly, it must be called 50 times per second. On every entry into the player, the STATUS register is tested and based on it the program continues execution.
- PLAY is always at
MODULE+1— call it 50× per second from VBI. - INIT is at a module-specific address chosen by the C-Create generator. It is not at a fixed offset. You must record this address when you save the module.
INIT nnnn header line and PLAY via PLAYER nnnn (which always equals load address + 1). Setting STATUS bit 6 only restarts a track that has already been initialised — bit 6 alone does not perform first-time init.
Correct startup sequence
; ----------------------------------------
; Future Composer — start music from top
; ----------------------------------------
MODULE = $9000 ; load address chosen in C menu
RUN = MODULE ; +$0000 GO pointer marker
PLAY = MODULE+1 ; +$0001 50 Hz tick entry
STATUS = MODULE+$030E ; control byte
INIT = $9017 ; module-specific (saved by C-Create)
lda #3 ; SKCTL guard (manual p.2)
sta $D20F
lda #0 ; STATUS clear: normal play
sta STATUS
jsr INIT ; ONE-shot — separate from PLAY
; ...now call PLAY 50 Hz from VBI
The RUN marker contains the value of the GO pointer set in the FC editor. This marker must be set before calling the playback initialisation procedure. RUN is the address of the data in the track where the music we want to start playing begins. While saving the module, the RUN marker contains 0.
$26..$29 (their values are destroyed). Additionally, the procedure attached to modules uses zero-page $1C..$1F and does not restore them to their original contents.
$D20F = 53775) was not set after an I/O operation, you must write the value 3 to it for correct player operation.
Editor System // 0x03
The FC editor consists of several sub-editors:
You can leave any editor at any time by pressing ESC.
Track Editor // 0x04
The data contained in tracks is the program for the music playback procedure. It contains data on sound transposition, the order in which patterns are played, and the end or repetition of the entire piece from the beginning.
Track command set
| Hex | Command | Description |
|---|---|---|
| $00–$3F | Play pattern N | Plays the pattern with the given number (0–63). |
| $40 | Set AUDCTL ($D208) | The value to be written into AUDCTL must be supplied as the next data byte in the track. Remember to set bit 4 (channel-1+2 link). Default value written by FC: $50. |
| $8X | Change transposition | Transposition value is determined by the nibble X. Default: $88. X = $7..$0 = transpose down. X = $9..$F = transpose up. |
| $FE | End of music | Stops playback (terminator). |
| $FF | Loop / restart | Begins reading data from the start of the pattern (loop the song). |
^CLEAR and ^INSERT change the pattern length without tedious re-typing of values. ^CLEAR = delete data under cursor. ^INSERT = insert $00 under cursor.
The maximum number of entries per single pattern is 256 (regardless of the type and number of commands).
Pattern Editor // 0x05
The pattern editor is used for defining and notating note sequences for the track editor.
Entry to the pattern editor occurs the moment the pattern cursor is set to a value identifying the pattern number and RETURN is pressed. If the pattern contains data, it is displayed in the PATTERN window. Where data is written is determined by the cursor.
Pattern editor commands
| Command | Description |
|---|---|
| C-1 | Enter note C1 |
| C#1 | Enter note C♯1 |
| LEN.01 | Set duration of next note. The value applies until the next LEN command. Range: $01–$20. |
| SND.01 | Set timbre / sound for next note. Sound applies until the next SND command. Range: $00–$1F. |
Sample piano (click any key to copy hex)
It is possible to enter 64 independent patterns, each containing up to 255 commands. You can move within patterns using the cursor keys.
Editor keys
SND.01.LEN.00.RETURN. Values entered into SND and LEN must be in hexadecimal form.
Envelope Editor // 0x06
This editor allows you to determine the volume of a sound and to set its momentary distortion. Entry to the envelope editor is via the ^O key. The number of the edited envelope is shown by the OBW indicator. Change the edited envelope using - and =.
An envelope can contain up to 64 values, with its end marked by the .. sign. The values contained in the envelope determine the volume level with an accuracy of 1/50 sec.
Envelope structure
NR : XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY-XY
NR — number of the edited envelope value
X — sound distortion (analogous values to those used with
the SOUND instruction in BASIC). Values are entered
simultaneously with pressing the SHIFT key.
Y — volume level (0..F)
Visual demo (synthetic ADSR-style envelope)
It is possible to create and use up to 32 envelopes (range $00–$1F). Inside the envelope editor you can navigate using + and *. While the envelope is being created, a graphic representation of it is generated above the editor line.
Sound / Timbre Editor // 0x07
The sound editor allows you to determine the timbres of sounds defined by the SND instruction in the pattern editor. Entry to the sound editor is via the ^S key. The number of the edited sound is determined by the OBW indicator. Change the edited sound using - and =.
Editor format
01 : OB : ZG-AK-SW
| Field | Description |
|---|---|
| 01 | Number of the edited sound |
| OB | Number of the envelope used |
| Z | Sound distortion (as in BASIC) |
| G | Minimum volume level (independent of envelope used) |
| AK | Chord play — artificial chord imitation. Alternately (every 1/50 sec) the proper note is played, followed by a note shifted up by as many semitones as the value of AK. |
| S | Value $8..$F causes a so-called slide at every playback of a note. |
| W | Any value entered causes notes to be played with vibrato. |
(value from envelope) ORA (Z) = value written
Pattern Copying & Misc Editor Keys // 0x08
Copying patterns
Since copying patterns is often necessary, the COPY option (activated by pressing ^C) is provided. You then enter the number of the source pattern and the number of the destination pattern.
Other editor commands
| Key | Function |
|---|---|
| ^1, ^2, ^3 | Change the number of the edited track |
| ^4, ^5, ^6 | Enable / disable individual channels |
| ^I | Return to main menu |
| ^G | Set the GO pointer (= number of the first value taken from tracks at start of playback) |
| ^V | Set the duration of the shortest sound (range 1–8) |
Duration formula
duration = (SPEED × LEN) / 50 [seconds]
example: LEN.20 ($20 = 32) and SPEED = 8
time = (8 × 32) / 50 = 5.12 sec
Function Keys // 0x09
| Key | Action |
|---|---|
| OPTION | Start music playback. All player parameters are zeroed and assume values according to the editor settings (be careful when more than one piece of music is stored in one module). The start address of the data to be played is contained in the GO pointer. |
| SELECT | Pause music playback. The "place" where the player was paused is not lost. Music can be resumed at any time by pressing START. |
| START | Resume music playback from the moment remembered by the program. (When the program is started, continuation pointers are set to the start of the tracks.) |
| START + SELECT | Fast-forward — pressing this sequence causes 4× speed playback. After releasing the keys, playback speed returns to its previous value. |
| HELP | Toggles the location of the "execution time" indicator (red bar at the top of the screen) of the music playback procedure. The indicator shows the indicative time the playback procedure runs when ANTIC displays text-mode data or empty lines (top position of the indicator). |
| RESET | Stop the playback procedure by resetting the computer. |
00: 85 FF 00 00 00 00 00 00 08: 00 00 00 00 00 00 00 00If the procedure executing the music is started, it will enter an infinite loop with no exit (
$85 = transpose down, $FF = read data from beginning of track).
In such a case, to restore normal program operation, press RESET. After reset, music playback will be suspended and the erroneous notation can be corrected.
NOTE: Pressing RESET does not cause loss of data!
FC File Format (Save) // 0x0A
FC data save format via the S (Save) option:
$1C..$1F. The program does not return their original contents to them — preserve before calling the player if needed.
Memory Map & Hardware // 0x0B
Zero-page usage by player
Module-relative offsets
INIT nnnn header line.Hardware registers
3 after I/O for correct player operation.Module placement constraints
load address ∈ [$0400, $FFFF − module_length] module is NOT relocatable — must be loaded at the address chosen during creation in the C menu.
Quick Reference Card // 0x0C
All track commands
| Hex | Mnemonic | Operand | Effect |
|---|---|---|---|
| $00–$3F | PLAY | — | Play pattern N |
| $40 | AUDCTL | next byte | Set $D208 |
| $8X | TRSP | nibble | Transpose ±semitones |
| $FE | END | — | End music |
| $FF | LOOP | — | Loop from start |
All editor entry hotkeys
| Key | Goes to |
|---|---|
| ^I | Main menu |
| ^O | Envelope editor |
| ^S | Sound / timbre editor |
| ^C | Copy patterns dialog |
| ^G | Set GO pointer |
| ^V | Set shortest-note duration (1–8) |
| ^1/^2/^3 | Switch edited track |
| ^4/^5/^6 | Toggle channels on/off |
| ESC | Exit current editor |
| ^CLEAR | Delete value under cursor |
| ^INSERT | Insert $00 under cursor |
| TAB | Move between command columns |
| ^DELETE | Delete a line |
Capacity limits
Minimal player init template
; ===========================================================
; FUTURE COMPOSER 1.32 — corrected player wiring
; matches actual C-Create module layout (verified vs SAP)
; ===========================================================
opt h- ; raw block, no Atari exe header
org $9000 ; <-- match address chosen in C menu
; module is NOT relocatable
MODULE = *
RUN = MODULE ; +$0000 GO pointer marker (lo/hi)
PLAY = MODULE+1 ; +$0001 50 Hz tick entry
STATUS = MODULE+$030E ; control byte (bit6=restart, bit7=pause)
; INIT is module-specific — get its address from C-Create save
; or from the SAP "INIT" line. NOT at a fixed offset.
INIT = $9017 ; <-- replace with your module's INIT
ins "music.bin" ; raw FC module body
;-------------- one-shot init: call ONCE before VBI install -----
.proc music_start
lda #3 ; SKCTL guard (manual p.2)
sta $D20F
lda #0 ; STATUS clear: normal play
sta STATUS
jsr INIT ; <-- separate from PLAY
rts
.endp
;-------------- 50 Hz tick: install on VVBLKD ($0224) -----------
.proc music_tick
jsr PLAY ; reads STATUS internally
jmp $E45F ; XITVBV
.endp
;-------------- transport controls (set STATUS, take effect on
; the next tick — the player polls STATUS) --------
.proc music_restart ; rewind track to top
lda #$40 ; bit 6
sta STATUS
rts
.endp
.proc music_pause ; freeze playback
lda #$80 ; bit 7
sta STATUS
rts
.endp
.proc music_resume ; clear both bits
lda #0
sta STATUS
rts
.endp
Module Inspector // 0x0D
Drop a .sap, raw FC module, or Atari executable below. The inspector parses the file, locates PLAY / INIT / STATUS, decodes the STATUS byte live, and emits a ready-to-paste MADS template with the actual addresses filled in.
Detection
STATUS Byte Decoder
Mini 6502 disassembly at INIT and PLAY entries (verifies the FC STATUS-poll signature). Limited subset — covers the ops actually used by FC players.
at PLAY
at INIT
Future Composer v1.32 © 1991 SPEKTRA
Studio Komputerowe SPEKTRA, 21-422 Stanin, Poland
Original Polish manual scanned by atarionline.pl / T'DARK SOFT '91
Translated & reformatted as interactive HTML — preserves all original technical specs.
All rights to the original software belong to SPEKTRA.