FUTURE COMPOSER

VERSION 1.32 — MUSIC EDITOR FOR ATARI XL/XE
POKEY · 4 channels 16-bit linkage (ch1+2) 50 Hz player 64 patterns · 32 envelopes · 32 sounds FC-format output

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.

CH 1+2
Linked into one 16-bit voice (high pitch resolution / bass). Set via AUDCTL bit 4.
CH 3
Independent voice — primary motif.
CH 4
Independent voice — secondary motif / counter-melody.
PLAYER
Must be called 50× per second (NTSC: VBI). Reads STATUS each call.
// keyboard Entry to the main menu is via ^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:

$030E
STATUS byte offset (relative to module load address)
+1
PLAY entry point (= load address + 1)
+0
RUN marker — set to GO pointer before INIT
STATUS bitValueMeaning
bit 6$40Restart playback procedure
bit 7$80Pause / suspend music playback
$00Normal 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.

// errata — INIT vs PLAY The C-Create module exposes two distinct entry points: a one-shot INIT routine and the 50 Hz PLAY tick. They are not the same address.
  • 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.
SAP-wrapped FC modules expose INIT via the 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.

// memory hazard The playback procedure uses memory cells $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.
// SKCTL If the SKCTL register ($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:

TRACKS
High-level song layout. Pattern playback order, transposition, AUDCTL, end-of-song.
PATTERNS
Note sequences. 64 patterns × 256 entries max, with LEN / SND commands.
ENVELOPES
Volume + distortion envelopes. 32 envelopes × 64 values, 1/50 sec resolution.
SOUNDS
Timbres / instruments. 32 sounds: envelope link, distortion, chord, slide, vibrato.

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

HexCommandDescription
$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).
// cursor The position marker inside the patterns editor is the blue cursor — it identifies the value being described by the user. Cursor position is changed with the cursor keys. ^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

CommandDescription
C-1Enter note C1
C#1Enter note C♯1
LEN.01Set duration of next note. The value applies until the next LEN command. Range: $01–$20.
SND.01Set timbre / sound for next note. Sound applies until the next SND command. Range: $00–$1F.

Sample piano (click any key to copy hex)

CC-1
C♯C#1
DD-1
D♯D#1
EE-1
FF-1
F♯F#1
GG-1
G♯G#1
AA-1
A♯A#1
BB-1
CC-2

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

TAB
Field navigation between command columns.
^INSERT
Insert empty lines.
^DELETE
Delete a line.
S.01
Shorthand instead of SND.01.
L.00
Shorthand instead of LEN.00.
// confirm Confirmation of a newly entered command is via 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)

00A:F → 0

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
FieldDescription
01Number of the edited sound
OBNumber of the envelope used
ZSound distortion (as in BASIC)
GMinimum volume level (independent of envelope used)
AKChord 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.
SValue $8..$F causes a so-called slide at every playback of a note.
WAny value entered causes notes to be played with vibrato.
// distortion + envelope interaction If the definition of a given sound contains a distortion value and the envelope it uses also contains a distortion value, the value written to the registers is determined by executing:
(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

KeyFunction
^1, ^2, ^3Change the number of the edited track
^4, ^5, ^6Enable / disable individual channels
^IReturn to main menu
^GSet the GO pointer (= number of the first value taken from tracks at start of playback)
^VSet 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

KeyAction
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.
// hang protection Improper data layout for the playing procedure may cause the system to hang. For example, the following data is not allowed in any of the tracks:
00: 85 FF 00 00 00 00 00 00
08: 00 00 00 00 00 00 00 00
If 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:

+0000
2 B
FC file marker — value $26 $23
+0002
1 B
SP pointer data
+0003
3 × 256 B
Track data (3 tracks × 256 bytes each)
+0303
128 B
Sound (SND) data — 32 × 4 bytes
+0383
var · 64 blocks
Pattern contents. Each block length depends on pattern fill. End of block marked by $FF.
var · 32 blocks
Envelope data. Each block length depends on individual envelope length. End of block marked by $FF.
// note The playback procedure attached to modules uses memory cells $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

$1C..$1F
Used by the player attached to modules — not preserved
$26..$29
Used by the playback procedure — values destroyed

Module-relative offsets

+0
RUN — GO pointer marker (set before INIT, contains 0 when saved)
+1
PLAY — 50 Hz tick entry (always at module base + 1)
+$030E
STATUS — control byte (bit 6 = restart, bit 7 = pause)
(module-specific)
INIT — one-shot initialiser. Not at a fixed offset. Recorded by C-Create at module export; in SAP-wrapped FC modules it appears on the INIT nnnn header line.

Hardware registers

$D208
AUDCTL — set via track command $40. Default $50. Bit 4 = link channel 1+2.
$D20F
SKCTL (53775) — must contain value 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

HexMnemonicOperandEffect
$00–$3FPLAYPlay pattern N
$40AUDCTLnext byteSet $D208
$8XTRSPnibbleTranspose ±semitones
$FEENDEnd music
$FFLOOPLoop from start

All editor entry hotkeys

KeyGoes to
^IMain menu
^OEnvelope editor
^SSound / timbre editor
^CCopy patterns dialog
^GSet GO pointer
^VSet shortest-note duration (1–8)
^1/^2/^3Switch edited track
^4/^5/^6Toggle channels on/off
ESCExit current editor
^CLEARDelete value under cursor
^INSERTInsert $00 under cursor
TABMove between command columns
^DELETEDelete a line

Capacity limits

3
Tracks (256 bytes each)
64
Patterns (max 255 commands each)
256
Max entries per pattern (data limit)
32
Envelopes ($00–$1F, max 64 values)
32
Sounds / timbres (4 bytes each)
$01–$20
LEN range (note duration)
$00–$1F
SND range (timbre selector)
1–8
^V — shortest-note SPEED divider

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.

▼ DROP FILE HERE OR CLICK TO BROWSE ▼ accepts .sap · .fc · .obx · .xex · raw $26 $23 modules

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


          
// privacy Files are parsed entirely in your browser — nothing is uploaded. Reload the page to clear.
// END OF MANUAL
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.